連結到資料夾中腳本的動態按鈕列表嘿,JMP 工作人員!
我希望獲得一些指導,了解如何擁有一個帶有按鈕的動態窗口,該按鈕可以連結到引用資料夾中的任何腳本。因此,如果資料夾中有兩個腳本,我將有一個帶有兩個按鈕框的視窗。如果我有 50 個,那麼我就會有 50 個按鈕盒。理想情況下,可能有一種方法可以動態地告訴視窗要排列按鈕框的「列」數量。
任何幫助,將不勝感激!
史蒂夫
自動化和腳本編寫回覆:連結到資料夾中腳本的按鈕的動態列表以下是使用作為 JMP 範例安裝的腳本的範例。如果您沒有 JMPPRO,則需要將目錄參考從 JMPPRO 變更為 JMP。另外,版本號 18 需要更改為您的版本號。
Names Default To Here( 1 );
dir = "C:\Program Files\JMP\JMPPRO\18\Samples\Scripts";
files = Files In Directory( dir );
For( i = N Items( files ), i >= 1, i--,
If( Word( -1, files[i], "." ) != "jsl",
Remove From( files, i, 1 )
)
);
theExpr = "";
For Each( {scr}, files,
theExpr = theExpr || ",ButtonBox(\!"" || Word( -2, scr, "./\" ) || "\!", include(\!""
|| dir || "\" || scr || "\!") )"
);
Eval(
Parse(
"nw = New Window( \!"Scripts\!",
Outline Box( \!"Select Script to Run\!",
Lineup Box( N Col( 4 )"
|| theExpr || " )
)
);"
)
);

我不喜歡使用 Eval(Parse()) 方法,但事實證明,對於我來說,使用更具可讀性的語法版本已經太晚了。這個方法可以完成這項工作。尋找其他社群成員來改進我的程式碼。
回覆:連結到資料夾中腳本的按鈕的動態列表@txnelson你可能不覺得這是最乾淨的程式碼,但它工作得非常好!感謝您的幫助和快速回覆!
史蒂夫
回覆:連結到資料夾中腳本的按鈕的動態列表
回覆:連結到資料夾中腳本的按鈕的動態列表Jim 程式碼的版本有點不同(Filter Each 來取得 .jsl 檔案列表,Eval(EvalExpr()) 來附加帶有路徑的按鈕)
Names Default To Here(1);
dir = "$SAMPLE_SCRIPTS/";
dir = Convert File Path(dir, windows);
files = Files In Directory(dir);
jslfiles = Filter Each({filename}, files, Word(-1, filename, ".") == "jsl");
// Not sure how you would like to determine column count, but with Lineup box it is fairly easy
lub = Lineup Box(N Col(4));
For Each({filename}, jslfiles,
Eval(EvalExpr(
lub << Append(Button Box(filename,
nw = New Window(Expr(filename),
Script Box(Load Text File(Expr(dir || filename)), "JSL", 600, 600)
);
));
));
);
nw = New Window("Scripts in " || dir,
Outline Box("Click to Open a Script",
lub
);
);
根據您正在執行的操作,您也可以考慮使用每個按鈕呼叫的函數/表達式。不過,以穩健的方式做到這一點確實需要一些額外的工作,因此了解如何創建這些更簡單的解決方案始終是一個好主意。
回覆:連結到資料夾中腳本的按鈕的動態列表@jthi和@txnelson如果我能再請教你們的想法:
如果我想新增一個數字編輯框,其中包含「排列」框的值,然後添加一個按鈕框,按下該按鈕框將應用數字編輯框中的值來更改視窗中腳本按鈕的方向,那會怎麼看?
所以像這樣的事情

回覆:連結到資料夾中腳本的按鈕的動態列表這可能會告訴你如何做到這一點
Names Default To Here(1);
init_cols = 4;
dir = "$SAMPLE_SCRIPTS/";
dir = Convert File Path(dir, windows);
files = Files In Directory(dir);
jslfiles = Filter Each({filename}, files, Word(-1, filename, ".") == "jsl");
// Not sure how you would like to determine column count, but with Lineup box it is fairly easy
lub = Lineup Box(N Col(init_cols));
For Each({filename}, jslfiles,
Eval(EvalExpr(
lub << Append(Button Box(filename,
nw = New Window(Expr(filename),
Script Box(Load Text File(Expr(dir || filename)), "JSL", 600, 600)
);
));
));
);
nw = New Window("Scripts in " || dir,
Outline Box("Click to Open a Script",
V List Box(
Lineup Box(N Col(2),
Button Box("Press to update Col count", << Set Function(function({this},
lub << N Col((this << sib) << get)
))),
Number Edit Box(init_cols)
),
lub
)
);
);
數位編輯框也可以在提交(<< Set Function())/更改(<< Set Number Changed())時觸發,因此您不一定需要按鈕