Componente aggiuntivo JMP: isolamento di più istanze tramite namespaceCiao comunità JMP,
Sto sviluppando un componente aggiuntivo per JMP che crea finestre, memorizza variabili globali e richiama funzioni. Tutto funziona correttamente con una singola istanza, ma quando l'utente avvia il componente aggiuntivo due volte, le due istanze condividono lo stesso ambito globale e le variabili iniziano a entrare in conflitto (una finestra sovrascrive lo stato dell'altra).
Ho inizializzato il mio script con i nomi predefiniti qui(1), ho persino creato un mio nuovo spazio (ns = newspace() ) e ho inserito tutte le variabili al suo interno, ma continuo ad avere il conflitto. Conosco lo spazio dei nomi window, ma voglio anche evitare conflitti sulle variabili al di fuori della finestra.
// 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" );
)
);
Automazione e scriptingOggetto: Re: Componente aggiuntivo JMP — Isolamento di più istanze tramite namespaceSe ogni finestra è indipendente, consiglio di utilizzare il namespace window, progettato proprio per questo scopo:
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);
Oggetto: Re: Componente aggiuntivo JMP — Isolamento di più istanze tramite namespaceL'opzione più semplice è usare lo spazio dei nomi della finestra. Credo che la seconda opzione più semplice (se ignoriamo la finestra di contesto) sia usare uno spazio dei nomi denominato, SE è possibile assegnargli un nome. Un'altra possibilità sarebbe quella di utilizzare uno spazio dei nomi denominato, raccogliere i valori in liste o array associativi e accedervi. Anche gli spazi dei nomi anonimi dovrebbero funzionare, ma richiederanno un lavoro aggiuntivo per accedere allo spazio dei nomi corretto all'interno della finestra.
Oggetto: Re: Componente aggiuntivo JMP — Isolamento di più istanze tramite namespaceCiao, grazie per la risposta. Implementerò il namespace della finestra, ma la parte in cui estraggo le variabili al di fuori della finestra è un po' complicata perché il nome della finestra è lo stesso se eseguo più istanze.
Oggetto: Re: Componente aggiuntivo JMP — Isolamento di più istanze tramite namespaceUn accorgimento utile in questo caso è richiamare tutto dalla finestra anziché avviare uno script e poi richiedere l'input dell'utente a metà dell'esecuzione. Anche se non è necessario l'input dell'utente immediatamente, si potrebbe aprire una finestra con la scritta "Avvio in corso..." e poi, nello script On Open(), inserire tutto ciò che si aveva prima della finestra, ma utilizzando variabili con ambito di finestra o locale. Con script lunghi, questo approccio può diventare ingestibile, ma in tal caso si potrebbe considerare di suddividere il codice in diverse funzioni definite prima della finestra, o addirittura in file diversi.
Ad esempio, il componente aggiuntivo "Colonna di convalida per i dati di processo delle serie temporali" è scritto in questo modo. Si noti come UpdateUI sia definito in questo script alla riga 274 prima che venga chiamata la funzione New Window (ci scusiamo se questo causa problemi ai futuri lettori), e poi venga chiamato quando si preme un pulsante alla riga 670 e quando vengono aggiornati altri campi.
Si noti che questa funzione richiama variabili `window:` in diversi punti del codice; lo scopo principale di questa funzione è aggiornare l'interfaccia utente. Per la maggior parte dei componenti aggiuntivi, non consiglio questo approccio: è preferibile passare tutte le informazioni necessarie come argomenti/parametri e utilizzare variabili locali all'interno della funzione, restituendo solo i risultati.
Oggetto: Re: Componente aggiuntivo JMP — Isolamento di più istanze tramite namespacePotresti anche non avere problemi a utilizzare semplicemente il namespace "here" se stai eseguendo il componente aggiuntivo. Non funzionerà se lo esegui dalla stessa finestra dello script, MA se esegui lo script da finestre separate, dovrebbe funzionare.