[JMP17.0.0]
私が取り組んでいるプロジェクト ファイルには多くのデータ テーブルが含まれており、それぞれのデータ テーブルには、出力としてジャーナルを生成するために使用する比較的長時間実行されるスクリプトが含まれています。別のテーブルに個別のスクリプトを用意し、それぞれのテーブル スクリプトを呼び出し、個々の仕訳帳を 1 つの仕訳帳にまとめて最終レポートを作成します。[おそらくこのアプローチをもっとクリーンにできたはずですが、私はフルタイム (またはパートタイム) のプログラマーではありません。]
個々のテーブル スクリプトの実行後に実行の進行状況を追跡するために、ある種の「X/Y が完了しました」更新進行状況バー/メッセージ ボックスを実装したいと考えていました。
これは、私がどのようにして現在の解決策に辿り着いたのかについての物語です。
TL;DR – 一人で賢いアプローチを考え出すのに 1 日を費やした後、私は 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() に出会いました。これは基本的に、私がやりたかったことをすべて 2 行の簡潔なコードで実行します。もっと早くそれに気づいていればよかったのにと思います。テキストだけでなく、真の進行状況バーを本当に作りたければ、おそらく Caption() は機能しないのではないかと思います。しかし、これをそれほど派手にする必要はありませんでした。
ご聴取ありがとうございました。
ジョエル
Discovery Summit の JMP ユーザー エクスペリエンス ラボ (またはそれに類似したもの) に参加したとき、それがプロジェクトを初めて使用したときの 1 つでした (以前にもプロジェクトを使用していましたが、ウィンドウ スチールのためすぐにやめました)。 私はユーザビリティに関する提案をいくつか行い、いくつかをウィッシュリストの項目にしました。
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;"><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></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">Re: プログレスバー – 私の個人的な旅 (プロジェクト環境でのウィンドウの操作に関する質問も)</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;"><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></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>また、ドキュメント ライブラリの「Send Inrofmation to a User」セクションを教えていただき、ありがとうございます。StatusMsg() を使用してステータス バーにメッセージを送信する方法もあるようです。Caption() への呼び出しを StatusMsg() への呼び出しに置き換えることで、ポップアップ ウィンドウを必要としたり、私が行っていたようにプロジェクト レイアウトをいじったりすることなく、同じ効果を得ることができます。そのバージョンも以下に掲載しました。</P><P>[編集: StatusMsg() オプションをもう少し試してみたところ、ステータスに送信される他のスクリプト関連 (ただしスクリプト化されていない) メッセージの数に応じて、進行状況バーを永続的に表示し続けるのは難しいことがわかりました。スクリプトの実行中はバーが表示されます。Caption() アプローチは引き続き正常に機能し、ほとんどのシナリオで 2 つのアプローチの中で最も優れていると考えられます。]</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( " ");-ジョエル