[JMP 17.0.0]
我一直在处理一个项目文件,其中有许多数据表,每个数据表都有一个相对长时间运行的脚本,我用它来生成日志作为输出。我在另一个表中有一个单独的脚本,它调用每个单独的表脚本,然后将各个日记帐整理成一个日记帐以创建最终报告。[我可能可以使这种方法更加简洁,但我不是一个全职(甚至部分)时间编码员。]
我想实现某种“X of Y 已完成”更新进度条/消息框,以在执行每个单独的表脚本后跟踪运行进度。
这是关于我如何得出当前解决方案的故事。
TL;DR – 在花了一天时间想出了一个对我来说很聪明的方法之后,我遇到了 Caption(),这本来是最容易做的事情。
但我仍然对如何在项目环境中操作窗口有一些一般性问题 - 所以如果您感兴趣,请继续关注我。
我在搜索讨论时遇到了几个很棒的实现想法,包括:
https://community.jmp.com/t5/Uncharted/Progress-Bar/ba-p/21160
https://community.jmp.com/t5/Uncharted/Progress-Bar-with-Cancel-Button/ba-p/433560#U433560
https://community.jmp.com/t5/Discussions/Suggestion-on-how-to-script-a-small-update-progress-window-for/mp/250419
但是,当我尝试在项目环境中实现这些解决方案时,创建的新进度栏始终会创建为项目中的新选项卡。 当该系列中的下一个脚本开始时,进度条窗口会被与该脚本关联的后续数据表操作所掩盖,因此您永远不会看到更新的进度消息。
一般问题#1:我无法弄清楚如何创建一个“弹出”窗口作为消息框而不是模态窗口。我的理解是,模态窗口会暂停脚本,直到用户与窗口交互,这是我不想要的。关于如何创建新的非模式窗口作为“弹出窗口”而不是新选项卡,我是否缺少一些东西?
[再次,我现在意识到有像 Caption() 这样的东西。但我仍然有一个普遍的问题,即项目中的所有新窗口是否都必须作为新选项卡而不是弹出窗口打开。]
一般问题#2:然后我想……也许有一种方法可以将这个新创建的进度条窗口停靠到项目布局中的另一个位置,以便它与其余操作分开 - 例如,New Window() << Dock( “正确的”)。但我一直没能找到类似的东西。有没有办法编写窗口的停靠位置脚本?
然后我花了很多时间学习项目布局如何工作以及如何编写脚本。我从这次练习中学到了很多东西。最后,我想出了一个脚本,可以临时更改项目布局,用自定义的“进度更新”窗口替换“最近的文件”窗口,该窗口可以完成我正在寻找的操作,然后恢复到“最近的文件”窗口“ 窗户。正如您可能想象的那样,这是一个相当笨拙的脚本,但它完成了工作。我试图尽可能地概括它,并将其附在此处,以防有人有兴趣了解它是如何工作的。
在一天中的某个时刻,我意识到也许有一种方法可以通过强制各个脚本创建的新窗口不可见来实现此目的,以便进度条窗口保持在顶部。但如果我事先想到的话,事情会做得更好。此时,我必须进行数百次脚本编辑才能实现此选项(如果可能的话)。
毕竟,今天早上我来上班是为了告诉你们所有这些故事,并且几乎立即遇到了 Caption() ——它基本上用两行简洁的代码完成了我想做的所有事情。我只是希望我早点意识到这一点。我想如果你真的想要一个真正的进度“栏”而不仅仅是文本,也许 Caption() 不起作用。但我真的不需要这那么花哨。
感谢您的聆听。
乔尔
当我参加发现峰会中的 JMP 用户体验实验室(或类似的实验室)时,这是我第一次使用项目(我之前使用过它们,但由于窗口被盗很快就停止了)。 我确实提出了一些可用性建议,并将其中一些变成了愿望清单项目。
添加选项以不包含 JMP 项目的所有窗口(与本主题相关)
将分组选项(按数据表)添加到 JMP 项目的选项卡/工作表/报表选择器 - JMP 用户社区
添加选项以在 JMP 项目中创建新报告,以便在数据表之后打开... - JMP 用户社区
改进 JMP 项目中的(非)独立内容管理(这是后来创建的)
偷窗仍然是我目前甚至没有尝试项目的主要原因。
幸运的是,标题可以在项目中使用,您甚至可以将其变成相当有用的进度条。 我不确定您使用 Caption() 创建了哪种类型的进度条,但我很快修改了我的进度条类,该类使用文本而不是显示框,因为相同的想法可以与标题一起使用
Names Default To Here(1);
// https://www.jmp.com/support/help/en/17.2/index.shtml#page/jmp/send-information-to-a-user.shtml
max_iteration = 20;
current_iteration = 1;
update_txt = Expr(
cur_val = Floor(current_iteration / (max_iteration / 10));
process_text = "Running...";
progress_done = Repeat(":black_large_square:", cur_val);
progress_left = Repeat(":white_large_square:", 10 - cur_val);
progress_text_line = Char(Round(100 * cur_val / 10, 2)) || "%";
progress_text = Eval Insert("^process_text^\!N^progress_done^^progress_left^\!N^progress_text_line^");
);
Caption({800, 900}, progress_text, Font("Arial Black"), Font Size(20), Text Color("blue"), Back Color("yellow"));
For(i = 1, i <= max_iteration, i++,
current_iteration = i;
update_txt;
Caption(progress_text, Font("Arial Black"), Font Size(20), Text Color("blue"), Back Color("yellow"));
wait(0.1);
);
Caption(remove);
</CODE></P>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jthi_0-1700199991012.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><span class="lia-inline-image-display-wrapper" image-alt="jthi_0-1700199991012.png" style="width: 186px;"><img src="https://us.v-cdn.net/6038925/uploads/images/58845i7B2DA85C421D9547/jthi_0-1700199991012.png" role="button" title="jthi_0-1700199991012.png" alt="jthi_0-1700199991012.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P>
<P> </P>
<P>明年我很可能会使用类似的东西,当时我必须编写一个使用 JMP 项目的脚本。</P></LINGO-BODY><LINGO-SUB id="lingo-sub-700215" slang="en-US" mode="NONE">回复:进度条 – 我的个人旅程(还有有关在项目环境中操作窗口的问题)</LINGO-SUB><LINGO-BODY id="lingo-body-700215" slang="en-US" mode="NONE"><P>哈哈 - 我最初的字幕尝试就这么简单:</P><P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jc510_2_0-1700254043192.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><span class="lia-inline-image-display-wrapper" image-alt="jc510_2_0-1700254043192.png" style="width: 186px;"><img src="https://us.v-cdn.net/6038925/uploads/images/58893iDA1A9DE7B3CD3C76/jc510_2_0-1700254043192.png" role="button" title="jc510_2_0-1700254043192.png" alt="jc510_2_0-1700254043192.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/14366" target="_blank">@jthi</A> - 你的解决方案肯定更优雅,我已经放弃了所有以前的方法,转而采用你的方法。谢谢你的建议,贾莫!</P><P>我必须对您的脚本进行一些编辑才能使其为我工作 - 我将 Caption() 参数的字符串从progress_text更改为update_txt,并将“black/white_large_square”替换为unicode字符。我还添加了一些行以使标题框在项目窗口中大致居中。我在下面发布了修改后的脚本。</P><P>还要感谢您向我指出文档库的“向用户发送信息”部分。现在我发现还有一种方法可以使用 StatusMsg() 向状态栏发送消息。通过将对 Caption() 的调用替换为对 StatusMsg() 的调用,您可以获得相同的效果,而无需弹出窗口或像我所做的那样弄乱项目布局。我还在下面发布了该版本。</P><P>[编辑:在更多地使用 StatusMsg() 选项之后,我发现可能很难保持进度条持续显示,具体取决于有多少其他与脚本相关的(但不是脚本化的)消息发送到状态当你的脚本运行时。Caption() 方法仍然可以正常工作,并且在大多数情况下可能是两种方法中最好的。]</P><P>对我来说,我已经从事项目一段时间了。我想我潜意识里知道这不是在项目中工作的要求,但我喜欢表格/选项卡组织方面。这是我第一次在项目工作中遇到重大问题,但在查看了您提出的其他潜在改进之后,我同意有些事情可以改进。</P><P>修改后的 Caption() 脚本:</P><PRE><CODE class=" language-jsl">Names Default To Here(1);
proj = This Project();
projWidth = proj << Get Width;
projHeight = proj << Get Height;
windowPos = proj << Get Window Position();
capPos_h = windowPos[1] + ( projWidth / 2) - 75;
capPos_v = windowPos[2] + ( projHeight / 2);
max_iteration = 20;
current_iteration = 1;
update_txt = Expr(
cur_val = Floor(current_iteration / (max_iteration / 10));
process_text = "Running...";
progress_done = Repeat("\!U2B1B", cur_val);
progress_left = Repeat("\!U2B1C", 10 - cur_val);
progress_text_line = " " || Char(Round(100 * cur_val / 10, 2)) || "%";
progress_text = Eval Insert("^process_text^\!N^progress_done^^progress_left^\!N^progress_text_line^");
);
Caption({capPos_h, capPos_v}, update_txt, Font("Arial Black"), Font Size(20), Text Color("blue"), Back Color("yellow"));
For(i = 1, i <= max_iteration, i++,
current_iteration = i;
Caption( update_txt, Font("Arial Black"), Font Size(20), Text Color("blue"), Back Color("yellow"));
Wait(0.1);
);
Caption(remove);
StatusMsg() 脚本:
Names Default To Here(1);
max_iteration = 20;
current_iteration = 1;
update_txt = Expr(
cur_val = Floor(current_iteration / (max_iteration / 10));
process_text = "Running...";
progress_done = Repeat("\!U2B1B", cur_val);
progress_left = Repeat("\!U2B1C", 10 - cur_val);
progress_text_line = " " || Char(Round(100 * cur_val / 10, 2)) || "%";
progress_text = Eval Insert("^process_text^\!N^progress_done^^progress_left^\!N^progress_text_line^");
);
For(i = 1, i <= max_iteration, i++,
current_iteration = i;
StatusMsg( update_txt);
Wait(0.1);
);
StatusMsg( "Done! " || progress_done || progress_left || progress_text_line);
Wait(2);
StatusMsg( " ");-乔尔