链接到文件夹中的脚本的动态按钮列表嘿,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 的代码略有不同(过滤每个文件以获取 .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
)
);
);
数字编辑框也可以在提交(<< 设置函数())/更改(<< 设置数字更改())时触发,因此您不一定需要按钮