Betreff: Variablenverhalten in JSL-Funktionengzmorgan, Danke für den Einblick. Die aktuelle window () -Lösung sah aus, als wäre sie die einfachste Lösung, aber sie funktionierte nicht für mich ... zumindest nicht so, wie ich versucht habe, sie zu codieren. Ich habe versucht, hauptsächlich den Befehl eval sub() für die meisten Variablen zu verwenden, was funktioniert, aber nicht für nw (meine neue Fenstervariable) oder _cw für das aktuelle Fenster. Ich habe wahrscheinlich nur etwas übersehen, aber es ist ok.
Am Ende bin ich auf Ihren anderen Vorschlag zurückgekommen, den Vince zuvor vorgeschlagen hatte, den Fensternamensraum. Ich hatte bisher keine Probleme damit.
In Bezug auf den Anwendungsersteller bin ich mir dessen bewusst, habe es aber nicht verwendet. Ich programmiere im Allgemeinen nur meine eigene GUI und Funktionen und erstelle das Add-in manuell. Es fiel mir schwer, die Set-Funktion und das (oder Selbst) und das, was was aufrief, zu verstehen, aber ich glaube, ich verstehe jetzt ... Ich schaue mir das genauer an.
Danke an alle für die Inputs. Ich schätze die verschiedenen Ansätze / Vorschläge sehr. Mein Skript nimmt eine Reihe verwandter Parameter und zeichnet sie auf verschiedene Arten, aber es dauert ein paar Minuten, es einzurichten und manuell auf die Parameter zu klicken und es dann zu exportieren. Mit diesen Aktualisierungen und einer Schleife aus einer Masterdatei kann ich das Skript von einem separaten aufrufenden Skript anstelle der GUI aufrufen und es nicht einen Satz von Diagrammen, sondern N Diagramme generieren lassen. Früher brauchte ich ein paar Stunden ... jetzt sind es zehn Sekunden.Natürlich hat es lange gedauert, bis ich hierher gekommen bin, aber ich kann das jahrelang wiederverwenden.
Betreff: Variablenverhalten in JSL-FunktionenHoppla!Vergessen zu erwähnen, dass Sie statt "this" und Fensternamensräumen auch einfach auf das aktuelle Fenster verweisen können.Ich habe das alternative Skript angehängt,
Betreff: Variablenverhalten in JSL-FunktionenIch wollte vorschlagen, den Window Namespace zu verwenden, was ein guter Vorschlag ist.Normalerweise verwende ich keine Funktionen für UI-Fenster.Eine andere Methode, um auf lokale Objekte zu verweisen, besteht darin, die Set-Funktion zu verwenden und diese in den Griff zu bekommen. Das Skript ist unten.Ich habe einfachere Druckanweisungen verwendet.Vielleicht möchten Sie den Application Builder ausprobieren, es erfordert eine kleine Investition, um zu lernen, wie er funktioniert, aber er kann praktisch sein.
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show (A);
show(B);
show(Z);
nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
<<SET function=""></SET>Betreff: Variablenverhalten in JSL-FunktionenDanke Vince. Ich wusste nichts über den Fensternamensraum. Das könnte gut gehen, ich werde es versuchen.
Im Moment habe ich meinen GUI-Teil in einer Datei, und ich beabsichtige, die Variablen an das zu übergeben, was ich die Hauptfunktion nenne. Ich würde entweder die GUI von einer Add-In-Symbolleiste aus aufrufen oder ein kleines benutzerdefiniertes Skript ausführen, das N-mal durchläuft und das Hauptskript für N Sätze von Eingabeparametern aufruft. Die Wiederverwendbarkeit könnte hier ein Problem sein, aber das Überschreiben von Variablen spielt möglicherweise keine Rolle ... Ich werde sehen, wie es geht. Vielen Dank für Ihre Hilfe.
Betreff: Variablenverhalten in JSL-FunktionenDas Problem, wenn Sie dies mit Globals oder globalen Namensräumen tun, ist die Wiederverwendbarkeit (die Sie möglicherweise nicht interessiert).
wenn Sie myFun zweimal mit zwei verschiedenen Schaltflächen ausführen (sagen wir, Sie möchten in der Lage sein, Ihr Fenster zu sandboxen und zwei Instanzen davon auszuführen).Sie haben eine Kollision und der zweite Aufruf überschreibt den ersten.
Siehe unten.
names default to here(1);
new namespace("test");
test:myFun = Function({A1, Z1},{Default Local},
test:A = A1;
test:Z = Z1;
test:A[2] = 10;
test:B = 2*test:A;
show(test:A);
show(test:B);
show(test:Z);
//::g_b = b;
//::g_z = z;
test:nw = new window("test",
vlistbox(
textbox(test:Z),
textbox(char(test:B)),
buttonbox("Show array B (works)",
show(test:B)
),
buttonbox("Show string Z (works)",
show(test:Z)
),
buttonbox("show and close (works)",
show(test:Z, test:B); test:nw << closewindow())
)
)
);
x = [2,3];
y ="string";
test:myFun(x,y);
test:myFun([12, 14], "something else");
Wenn Sie einen Namensraum verwenden, empfehle ich die Verwendung des Fenster-Namensraums. Es wird automatisch gelöscht, wenn das Fenster weg ist, und Sie haben keine Kollision zwischen zwei identischen Fenstern.
names default to here(1);
myFun = Function({A1, Z1},{DEFAULT LOCAL},
A = A1;
Z = Z1;
A[2] = 10;
B = 2*A;
show(A);
show(B);
show(Z);
//::g_b = b;
//::g_z = z;
nw = new window("test",
window:B = B; //uses the builtin window namespace
window:Z = Z; //works because this is a glue statement that returns the last thing
window:box = vlistbox( //which in this case is the vlistbox
textbox(window:Z),
textbox(char(window:B)),
buttonbox("Show array B (works)",
show(window:B)
),
buttonbox("Show string Z (works)",
show(window:Z)
),
buttonbox("show and close (works)",
show(window:Z, window:B); window:box << closewindow())
)
);
);
x = [2,3];
y ="string";
myFun(x,y);
myFun([12, 14], "something else");Betreff: Variablenverhalten in JSL-FunktionenDanke Vince. Ich hatte nicht an eval(substitute(expr())) gedacht. Bei einigen meiner komplexeren Skripte denke ich, dass es zu schwierig sein könnte, den Überblick darüber zu behalten, was wo ersetzt wurde. Mein Code ist nicht gerade gut organisiert und das Debuggen wäre schwierig.Betreff: Variablenverhalten in JSL-FunktionenDanke, Ihre globale Idee hat mich auf eine andere Idee gebracht.Die Tatsache, dass die Variablen global sind, stört mich nicht so sehr, aber wenn sie global sein müssen, würde ich sie lieber in einen geschlossenen Namespace einbinden.
Ich glaube nicht, dass der Befehl clear globals() mich hier beißen würde, aber er hat mich mit meinen Rückruffunktionen erwischt (meine globalen Rückrufvariablen wurden von einem anderen Skript mit clear globals() gelöscht).Ich hatte JMP eine E-Mail geschickt und sie schlugen zwei Alternativen vor: Schützen Sie die globalen Variablen, indem Sie sie sperren oder in einen eigenen Namespace einfügen. Der Namensraum war in Bezug auf die Robustheit tatsächlich einfacher.
Wie auch immer, der aktualisierte Code unten scheint in Ordnung zu funktionieren. Der Nachteil ist die zusätzliche Eingabe von "test:" für jedes Mal, wenn ich auf eine Variable verweise. Mir ist klar, dass ich es möglicherweise nicht für jede Variablenverwendung im Skript benötige, aber andererseits ist es wahrscheinlich eine gute Praxis, und da es sich bei dieser speziellen Verwendung um einen globalen Namensraum handelt, kann ich den Variableninhalt sehen, indem ich mit dem Mauszeiger über die Variablennamen fahre.
Beachten Sie die Verwendung von A1 und Z1. Ich konnte Test:A und Test:Z nicht zuweisen.
Fehler: Argument sollte in Zugriff oder Auswertung von 'Function' aufgeführt werden , Function/*###*/({test:A, test:Z}, .....
Ich werde sehen, ob ich das mit mehreren Dateien zum Laufen bekomme.
new namespace("test");
test:myFun = Function({A1, Z1},{Default Local},
test:A = A1;
test:Z = Z1;
test:A[2] = 10;
test:B = 2*test:A;
show(test:A);
show(test:B);
show(test:Z);
//::g_b = b;
//::g_z = z;
test:nw = new window("test",
vlistbox(
textbox(test:Z),
textbox(char(test:B)),
buttonbox("Show array B (works)",
show(test:B)
),
buttonbox("Show string Z (works)",
show(test:Z)
),
buttonbox("show and close (works)",
show(test:Z, test:B); test:nw << closewindow())
)
)
);
test:x = [2,3];
test:y ="string";
test:myFun(x,y);Betreff: Variablenverhalten in JSL-FunktionenIch musste auf das Setzen globaler Variablen zurückgreifen, damit das funktioniert.Es scheint, dass der Dialogfeldcode die Variablen nicht richtig sehen kann.Dies ist keine großartige Lösung, da es den Zweck, lokale Variablen in einer Funktion zu haben, zunichte macht.
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show(A);
show(B);
show(Z);
::g_b = b;
::g_z = z;
::g_nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
show(::g_B)
),
buttonbox("Show string Z (does not work)",
show(::g_Z)
),
buttonbox("show and close (does not work)",
show(::g_Z, ::g_B); ::g_nw << closewindow())
)
)
);
x = [2,3];
y ="string";
myFun(x,y);Betreff: Variablenverhalten in JSL-FunktionenB hat bei mir nicht einmal funktioniert.
So mache ich normalerweise GUI-Sachen.Es ist zu kompliziert für das Beispiel, das Sie gegeben haben, aber ich denke, es zeigt ein paar verschiedene Methoden.
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
Eval(
Substitute(
Expr(
nw = new window("test",
vlistbox(
textbox(char(DV_Z)),
textbox(char(DV_B)),
buttonbox("Show array B (works)",
show([]||DV_B); //otherwise you run into an invalid matrix token
),
buttonbox("Show string Z (does not work)",
//show([]||DV_Z); //shouldn't work, you can't make a string a matrix
show(DV_Z);
//or
show(list(DV_Z));
),
buttonbox("show and close (does not work)",
<<SET function=""></SET>Variablenverhalten in JSL-Funktionen
Meine Skripte bestehen im Allgemeinen aus zwei Hauptkomponenten: Eine Hauptfunktion, gefolgt vom GUI-Code, alles in derselben Datei. Normalerweise verwende ich Variablen, die im Here-Namespace enthalten sind, erhalte die Variablen aus Benutzereingaben und rufe die Hauptfunktion über ein Schaltflächenfeld „OK“ auf. Ich übergebe der Hauptfunktion keine Variablen und verwende nur die Variablen, die im Skript „OK“ zugewiesen wurden. Ich denke darüber nach, mindestens eines meiner Skripte so zu ändern, dass es eine Datei mit der GUI und eine zweite Datei mit der Hauptfunktion gibt. Bevor ich das tue, überprüfe ich, wie das innerhalb einer JSL-Datei funktioniert. Unten finden Sie ein vereinfachtes Beispiel, bei dem die GUI umgangen und Variablen lediglich nach der Definition der Funktion, aber vor dem Aufruf definiert werden.
Mir ist aufgefallen, dass das Debuggen nach der Ausführung eines Skripts schwieriger ist, denn wenn ich mit der Maus über das x und y fahre, kann ich den Inhalt in der Statusleiste am unteren Rand des Fensters sehen. Dies gilt jedoch nicht für die lokalen Variablen A, B, Z und nw. Ich frage mich, ob jemand irgendwelche Tipps dazu hat.
Ich bin mir auch nicht sicher, wie ich über das Schaltflächenfeld-Skript auf die Variableninhalte zugreifen soll. Wenn Sie den folgenden Code ausführen, können Sie sehen, dass A, B, Z wie erwartet im Protokoll angezeigt werden (kurz vor der Erstellung des neuen Fensters) und B und Z auch in den Textfeldern des neuen Fensters angezeigt werden, jedoch in der Schaltfläche Das Box-Skript kann nicht direkt auf diese Variablen zugreifen. Ich konnte eval(parse(eval insert())) verwenden, um das Array B abzurufen, aber ich konnte die Zeichenfolge Z nicht abrufen.Gibt es direktere Methoden, um dies zum Laufen zu bringen?
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show (A);
show(B);
show(Z);
nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
show(parse(Eval(Parse(Eval Insert(
"\[^"char(B)"^]\"
)))))
),
buttonbox("Show string Z (does not work)",
show(Eval(Parse(Eval Insert(
"\[^"char(Z)"^]\"
))))
),
buttonbox("show and close (does not work)", show(Z, B); nw << closewindow())
)
)
);
x = [2,3];
y="string";
myFun(x,y);
Danke,
Mike
Automatisierung und SkripterstellungQualitäts- und Verfahrenstechnik