JMP 外掛程式 — 使用命名空間隔離多個實例JMP社群的各位朋友,大家好!
我正在開發一個 JMP 插件,它可以創建視窗、儲存全域變數並呼叫函數。單一實例運作一切正常,但當使用者啟動插件兩次時,兩個實例共享同一個全域作用域,導致變數衝突(一個視窗的狀態覆蓋了另一個視窗的狀態)。
我已將腳本初始化為預設名稱為 here(1),甚至建立了自己的新空間 (ns = newspace()) 並將所有變數放在其中,但仍有衝突。我知道視窗命名空間,但我也想避免視窗之外的變數發生衝突。
// Launch this script twice — second run breaks the first window
strLabel = "Instance A";
counter = 0;
win = New Window( "Test " || strLabel,
btn = Button Box( "Click me",
counter++;
btn << Set button name( strLabel || " clicked " || Char( counter ) || "x" );
)
);
自動化和腳本編寫回覆:JMP 外掛程式-使用命名空間隔離多個實例如果每個視窗都是獨立的,那麼我建議使用專為此設計的視窗命名空間:
Names default to here(1):
// Functions outside the window are still accessible
rand = function({}, floor(random uniform(10)));
win = New Window("Values",
show toolbars(0), show menu(0),
// You can put statements above display elements
window:randomvalue = rand();
v list box(
text box("Enter a value for this box:"),
// All references to display elements should be in the window namespace
window:teb = text edit box(""),
// Examples reading and writing values.
button box("Update random value", window:randomvalue = rand() ),
button box("Get values from this window",
window:tb << Set Text(
"Random value: " || char(window:randomvalue) ||
"\!NEntered Value: " || (window:teb << Get Text)
)
),
window:tb = text box("")
)
);
// You can get to this from outside the window, but make sure this namespace is protected too - for example from inside another window.
show(win:randomvalue, win:teb << Get Text);
回覆:JMP 外掛程式-使用命名空間隔離多個實例最簡單的選擇是使用視窗命名空間。我認為第二簡單的方法(如果忽略上下文框)是使用命名空間,前提是你可以為它們命名。再進一步,可以使用一個命名空間,並將值收集到列表/關聯數組中,然後存取這些列表/關聯數組。匿名命名空間應該也可以,但這需要一些額外的工作才能在視窗內存取正確的命名空間。
回覆:JMP 外掛程式-使用命名空間隔離多個實例您好,感謝您的回答。我會實現視窗命名空間,但是提取視窗外部變數的部分有點困難,因為如果我運行多個實例,視窗名稱是相同的。
回覆:JMP 外掛程式-使用命名空間隔離多個實例這裡有個小技巧:所有操作都直接從視窗調用,而不是先啟動腳本,然後在運行過程中請求使用者輸入。即使你不需要立即輸入用戶信息,也可以打開一個顯示「正在啟動…」的窗口,然後在 `On Open()` 函數中,把窗口打開之前的所有程式碼都放到窗口打開之前,但使用窗口或局部作用域的變量。對於較長的腳本,這種方法可能會變得難以管理,這時你可以考慮將這些程式碼拆分成不同的函數,這些函數在視窗打開之前定義,甚至放在不同的檔案中。
例如,時間序列過程資料插件的「驗證列」就是這樣寫的。請注意,在呼叫「新視窗」之前,腳本第274 行定義了 UpdateUI(如果這給以後的讀者造成了困擾,請諒解),然後在第 670 行按下按鈕以及其他欄位更新時調用它。
請注意,此函數在許多地方都呼叫了 `window` 變數——函數的主要目的是更新使用者介面。對於大多數插件,我不建議這樣做,應該將所需的所有資訊作為參數傳遞,然後在函數內部使用所有局部變量,並將結果僅傳回給函數。
回覆:JMP 外掛程式-使用命名空間隔離多個實例如果你運行的是插件,那麼直接使用這裡的命名空間可能就完全沒問題了。如果從同一個腳本視窗運行,則無法正常工作;但如果從不同的腳本視窗運行,則應該可以正常工作。