[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;"><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></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;"><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></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( " ");-喬爾