Module complémentaire JMP — Isolation de plusieurs instances à l'aide d'espaces de nomsBonjour la communauté JMP,
Je développe un module complémentaire JMP qui crée des fenêtres, stocke des variables globales et appelle des fonctions. Tout fonctionne correctement avec une seule instance, mais lorsque l'utilisateur lance le module deux fois, les deux instances partagent le même espace de noms global et des conflits de variables apparaissent (une fenêtre écrase l'état de l'autre).
J'ai initialisé mon script avec les noms par défaut ici (1), j'ai même créé mon propre espace de noms (ns = newspace()) et j'y ai placé toutes les variables, mais le conflit persiste. Je connais l'espace de noms de la fenêtre, mais je souhaite également éviter les conflits avec les variables situées en dehors de cet espace.
// 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" );
)
);
Automatisation et scriptageRe : Module complémentaire JMP — Isolation de plusieurs instances avec des espaces de nomsSi chaque fenêtre est indépendante, je recommande d'utiliser l'espace de noms de fenêtre, conçu précisément à cet effet :
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 : Module complémentaire JMP — Isolation de plusieurs instances avec des espaces de nomsL'option la plus simple est d'utiliser l'espace de noms de la fenêtre. La deuxième option la plus simple (en ignorant la boîte de contexte) serait d'utiliser un espace de noms nommé, si cela est possible. Ensuite, il faudrait utiliser un espace de noms nommé, collecter les valeurs dans des listes ou des tableaux associatifs et y accéder. Les espaces de noms anonymes devraient également fonctionner, mais cela nécessitera un travail supplémentaire pour accéder à l'espace de noms approprié au sein de la fenêtre.
Re : Module complémentaire JMP — Isolation de plusieurs instances avec des espaces de nomsBonjour, merci pour votre réponse. Je vais implémenter l'espace de noms de la fenêtre, mais la partie où j'extrais les variables hors de la fenêtre est un peu difficile car le nom de la fenêtre est le même si j'exécute plusieurs instances.
Re : Module complémentaire JMP — Isolation de plusieurs instances avec des espaces de nomsUne astuce consiste à tout appeler depuis la fenêtre plutôt que de lancer un script et de demander une saisie en cours d'exécution. Même si vous n'avez pas besoin d'une saisie utilisateur immédiatement, vous pouvez ouvrir une fenêtre affichant « Démarrage… », puis, dans le script `OnOpen()`, placer tout ce qui précède actuellement l'ouverture de la fenêtre, en utilisant des variables de portée locale ou de fenêtre. Avec des scripts longs, cette approche peut devenir complexe ; dans ce cas, il peut être judicieux de répartir le code dans différentes fonctions définies avant l'ouverture de la fenêtre, voire dans des fichiers distincts.
À titre d'exemple, le module complémentaire « Colonne de validation pour les données de traitement de séries temporelles » est écrit de la manière suivante. Notez que la fonction UpdateUI est définie dans ce script à la ligne 274, avant l'appel à « Nouvelle fenêtre » (veuillez nous excuser si cela pose problème aux lecteurs ultérieurs), puis qu'elle est appelée lorsqu'on clique sur un bouton à la ligne 670 et lors de la mise à jour d'autres champs.
Notez que cette fonction utilise fréquemment les variables `window`, car son objectif principal est la mise à jour de l'interface utilisateur. Pour la plupart des extensions, je déconseille cette approche : transmettez toutes les informations nécessaires en tant qu'arguments/paramètres, puis utilisez les variables locales à l'intérieur de la fonction et ne renvoyez que les résultats.
Re : Module complémentaire JMP — Isolation de plusieurs instances avec des espaces de nomsVous pouvez tout à fait vous contenter de cet espace de noms si vous exécutez le module complémentaire. Cela ne fonctionnera pas si vous l'exécutez depuis la même fenêtre de script, mais cela devrait fonctionner si vous l'exécutez depuis des fenêtres de script distinctes.