问题
在许多情况下,当您使用滑块框来控制数值变量时,您还需要一个可编辑的数字显示器来显示变量的值,这样您就可以手动设置变量的值。
当前执行此操作的方法是创建两个显示对象:数字编辑框 () 和滑块框 ()。您必须以连接它们的方式对其进行编码。此外,数字编辑框与手动输入值的更改(使用 <
我经常发现自己不得不花很多时间阅读有关如何创建这些对象以及如何连接它们的脚本指南。 (我希望有一个像这样的内置 JMP 显示对象)
解决方案
我创建了一个函数 SliderNumberEditBox(),它创建了一个计算表达式,同时创建了两个显示框。 这些展示盒将按上述方式连接。它以字符串作为参数,这些字符串定义了对数字编辑框的引用、数字编辑框的初始值、对滑块框的引用、滑块框的上下范围、滑块控制的变量框,以及可选的,手动更新数字编辑框时要运行的表达式,以及更改滑块框时要运行的表达式。(请注意,表达式必须定义为字符串,并且必须对要在字符串中引用的保留字符使用适当的转义序列)。
SliderNumberEditBox = Function( {nebref, nebinitval, sbref, sblower, sbupper, sbvar, nebFunction = "", sbFunction = ""},
Eval(
Parse(
"H List Box(" || nebref || " = Number Edit Box(" || nebinitval || ",
<<SET function=""></SET>该函数使用字符串连接为显示框创建表达式的完整字符串版本,然后将字符串解析为表达式并返回计算后的表达式。
句法
SliderNumberEditBox(用于引用数字编辑框的字符串,数字编辑框初始值的字符串,用于引用滑块框的字符串,滑块较低范围的字符串,滑块上限范围的字符串,滑块控制的变量的字符串, <手动更改数字编辑框时要评估的表达式的字符串表示> , <滑块更改时要评估的表达式的字符串表示> )
k = 1;
SliderNumberEditBox(
"_neb1",
Char( k ),
"_sb1",
"0",
"2",
"k")
返回下面的评估表达式
H List Box(
_neb1 = Number Edit Box(
0.5,
<<SET function=""></SET>
例子
SliderNumberEditBox = Function( {nebref, nebinitval, sbref, sblower, sbupper, sbvar, nebFunction = "", sbFunction = ""},
Eval(
Parse(
"H List Box(" || nebref || " = Number Edit Box(" || nebinitval || ",
<<SET function=""></SET>创建一个看起来像这样的窗口(我将滑块框更改为不同的值)

我在社区中寻找使用 Eval/Eval Expr 的一些很好的例子,当我遇到这个时,我想我会分享我使用表达式构建而不是字符串连接的 SliderNumberEditBox 函数的实现。
传递给函数的许多参数不再是字符串,现在有一个选项 nsName 参数用于提供变量应该存在的命名空间的名称(默认为全局)。
SliderNumberEditBox = Function( {nebref, nebinitval, sbref, sblower, sbupper, sbvar,
nsName = "global", nebFunction = Expr(), sbFunction = Expr()},
Eval( // evaluate to create the diplay boxes
Eval Expr( // evaluate everything wrapped with Expr()
H List Box(
// Create the Number Edit Box
// As Scoped() is used when the variable names are to be dynamic
As Scoped( Expr( nsName ), Expr( nebref ) ) = Number Edit Box(
Expr( nebinitval ),
<<SET function=""></SET>
任何对表达构建感兴趣的人都可以查看@ih JSL Cookbook 中的帖子:使用 Eval Insert、Eval Expr、Parse 和 Substitute 将一个表达式插入另一个表达式
如果我应该将 Slider Box() 有一个连接的 Number Edit Box() 的选项添加到“JMP Wish List”,或者创建一个执行此功能的新显示对象,我会更感兴趣。
凉爽的! 您可以设置文本框的内容而无需重新创建它,这使得该示例更易于阅读:
k = 1;
_nw = New Window( "Slider Number Edit Box",
_vlb = V List Box(
SliderNumberEditBox(
"_neb1",
Char( k ),
"_sb1",
"0",
"2",
"k",
"_tb << settext(\!"The number is \!" || char(k))",
"_tb << settext(\!"The number is \!" || char(k))"
),
_tb = Text Box( "The number is " || Char( k ) )
)
);