JMP-Add-in – Isolieren mehrerer Instanzen mit NamensräumenHallo JMP-Community,
Ich entwickle ein JMP-Add-In, das Fenster erstellt, globale Variablen speichert und Funktionen aufruft. Mit einer einzelnen Instanz funktioniert alles einwandfrei – startet der Benutzer das Add-In jedoch zweimal, teilen sich die beiden Instanzen denselben globalen Gültigkeitsbereich, und es kommt zu Variablenkonflikten (ein Fenster überschreibt den Zustand des anderen).
Ich habe mein Skript mit `Names default to here(1)` initialisiert und sogar einen eigenen neuen Namespace erstellt (`ns = newspace()`) und alle Variablen darin abgelegt, aber der Konflikt besteht weiterhin. Ich kenne den Window-Namespace, möchte aber auch Konflikte mit Variablen außerhalb des Window-Namespace vermeiden.
// 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" );
)
);
Automatisierung und SkripterstellungBetreff: JMP-Add-in – Isolieren mehrerer Instanzen mit NamensräumenWenn jedes Fenster unabhängig ist, empfehle ich die Verwendung des Window-Namespace, der genau für diesen Zweck entwickelt wurde:
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);
Betreff: JMP-Add-in – Isolieren mehrerer Instanzen mit NamensräumenDie einfachste Option ist die Verwendung des Fenster-Namensraums. Die zweiteinfachste (wenn wir den Kontextbereich außer Acht lassen) wäre die Verwendung benannter Namensräume, sofern diese benannt werden können. Alternativ könnte man einen benannten Namensraum verwenden, die Werte in Listen oder assoziativen Arrays sammeln und darauf zugreifen. Anonyme Namensräume funktionieren zwar auch, erfordern aber zusätzlichen Aufwand, um innerhalb des Fensters auf den richtigen Namensraum zuzugreifen.
Betreff: JMP-Add-in – Isolieren mehrerer Instanzen mit NamensräumenHallo, vielen Dank für Ihre Antwort. Ich werde den Window-Namespace implementieren, aber das Extrahieren von Variablen außerhalb des Window-Bereichs gestaltet sich etwas schwierig, da der Window-Name bei mehreren Instanzen gleich bleibt.
Betreff: JMP-Add-in – Isolieren mehrerer Instanzen mit NamensräumenEine hilfreiche Methode ist es, alle Aktionen direkt aus dem Fenster heraus aufzurufen, anstatt ein Skript zu starten und erst später nach Eingaben zu fragen. Selbst wenn Sie nicht sofort eine Benutzereingabe benötigen, können Sie ein Fenster mit der Meldung „Wird gestartet…“ öffnen und im Skript „Beim Öffnen“ alle Funktionen, die Sie bisher vor dem Fenster verwendet haben, nun mit Variablen im Fenster- oder lokalen Gültigkeitsbereich ausführen. Bei längeren Skripten kann dies schnell unübersichtlich werden. In diesem Fall könnten Sie die Funktionen in separate Funktionen aufteilen, die vor dem Fenster definiert werden, oder sie sogar in verschiedenen Dateien auslagern.
Beispielsweise ist die Validierungsspalte für das Add-In „Zeitreihenverarbeitungsdaten“ folgendermaßen implementiert. Beachten Sie, wie `UpdateUI` in diesem Skript in Zeile 274 definiert wird, bevor `New Window` aufgerufen wird (falls dies für zukünftige Leser zu Problemen führt, bitte ich um Entschuldigung). Anschließend wird `UpdateUI` aufgerufen, wenn in Zeile 670 eine Schaltfläche gedrückt wird und wenn andere Felder aktualisiert werden.
Beachten Sie, dass diese Funktion überall `window:`-Variablen aufruft – ihr Hauptzweck ist die Aktualisierung der Benutzeroberfläche. Für die meisten Add-Ins empfehle ich dies nicht. Übergeben Sie stattdessen alle benötigten Informationen als Argumente/Parameter und verwenden Sie innerhalb der Funktion ausschließlich lokale Variablen. Geben Sie anschließend nur die Ergebnisse zurück.
Betreff: JMP-Add-in – Isolieren mehrerer Instanzen mit NamensräumenWenn Sie das Add-In ausführen, können Sie sich möglicherweise auch einfach auf den Namespace hier verlassen. Es funktioniert nicht, wenn Sie es im selben Skriptfenster ausführen, aber wenn Sie das Skript in separaten Skriptfenstern ausführen, sollte es funktionieren.