JMPアドイン - 名前空間を使用して複数のインスタンスを分離するJMPコミュニティの皆様、こんにちは。
ウィンドウを作成し、グローバル変数を保存し、関数を呼び出すJMPアドインを開発しています。単一のインスタンスではすべて正常に動作しますが、ユーザーがアドインを2回起動すると、2つのインスタンスが同じグローバルスコープを共有し、変数が競合し始めます(一方のウィンドウがもう一方のウィンドウの状態を上書きします)。
スクリプトを初期化する際に、名前のデフォルト値を 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" );
)
);
自動化とスクリプト作成Re: 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);
Re: JMPアドイン — 名前空間を使用した複数インスタンスの分離最も簡単な方法は、ウィンドウの名前空間を使用することです。コンテキストボックスを無視すれば、次に簡単な方法は、名前付き名前空間に名前を付けられる場合、それを使用することだと思います。その次は、1つの名前付き名前空間を利用して、値をリストや連想配列に収集し、それらにアクセスする方法です。匿名名前空間も機能するはずですが、ウィンドウ内の正しい名前空間にアクセスするために、追加の作業が必要になります。
Re: JMPアドイン — 名前空間を使用した複数インスタンスの分離こんにちは、ご回答ありがとうございます。ウィンドウ名前空間を実装しますが、ウィンドウ外の変数を抽出する部分が少し難しいです。複数のインスタンスを実行するとウィンドウ名が同じになってしまうためです。
Re: JMPアドイン — 名前空間を使用した複数インスタンスの分離ここで役立つのは、スクリプトを開始してから途中で入力を求めるのではなく、ウィンドウからすべてを呼び出すことです。すぐにユーザー入力が必要ない場合でも、「開始中...」と表示されるウィンドウを開き、On Open() スクリプトで、ウィンドウの前に記述したすべての処理を、ウィンドウスコープまたはローカルスコープの変数を使って記述できます。スクリプトが長くなると、この方法は扱いにくくなることがありますが、その場合は、ウィンドウの前に定義された複数の関数、あるいは別のファイルに分割することを検討してください。
例えば、時系列処理データアドインの検証列は次のように記述されています。このスクリプトでは、新しいウィンドウが呼び出される前の274行目でUpdateUIが定義され(将来の読者にとって不都合な場合は申し訳ありません)、その後、 670行目でボタンが押されたときや他のフィールドが更新されたときに呼び出されることに注意してください。
この関数は、あちこちで window: 変数を呼び出していることに注意してください。この関数の主な目的は、ユーザーインターフェイスを更新することです。ほとんどのアドインでは、この方法は推奨しません。必要な情報はすべて引数/パラメータとして渡し、関数内でローカル変数をすべて使用し、結果のみを返すようにしてください。
Re: JMPアドイン — 名前空間を使用した複数インスタンスの分離アドインを実行している場合は、ここで名前空間を使用するだけで全く問題ない場合もあります。同じスクリプトウィンドウから実行すると動作しませんが、別々のスクリプトウィンドウから実行すれば動作するはずです。