問題
在許多情況下,當您使用滑塊控制數值變量時,您還需要一個可編輯的數字顯示器來顯示變量的值,並允許您手動設置變量的值。
當前執行此操作的方法是創建兩個顯示對象:一個 Number Edit Box() 和一個 Slider Box()。您必須以它們連接的方式對此進行編碼。此外,數字編輯框與手動輸入值的更改交互的方式(使用 <
我經常發現自己不得不花大量時間閱讀關於如何創建這些對像以及如何連接它們的腳本指南。 (我希望有一個像這樣的內置 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 食譜中的帖子:使用 Eval Insert、Eval Expr、Parse 和 Substitute 將一個表達式插入另一個表達式
如果我應該在“JMP 願望清單”中添加滑塊框()可以選擇連接數字編輯框(),或者創建一個執行此功能的新顯示對象,我會更加努力。
涼爽的! 您可以在不重新創建文本框的情況下設置文本框的內容,這使示例更易於閱讀:
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 ) )
)
);