Variable Anzahl von GraphBoxen. Wie kann ich feststellen, an welches GB ich Klicks sende?nw = new window("graphs", vlb = v list box());
dirname = "jpegs";
set default directory(dirname);
foreach({jpeg}, files in directory(dirname), // dexter.jpg, samurai_jack.jpg, spongebob.jpg
img = new image(jpeg);
msg = eval insert("\!"^jpeg^\!"");
h = graphbox(
<<ADD image=""></ADD>The above gives me
3 graphboxes :white_heavy_check_mark:</img>with three correctly rendered images, :white_heavy_check_mark:</img>but StatusMsg always sends "Spongebob.jpg". (Without the evalinsert(), just sending jpeg to StatusMsg, it throws an error.)
I want StatusMsg to give me the name of the image whose graphbox I clicked on.
Basically, I can kinda sorta imagine two routes:
1. Eval and related functions? I still haven't dug into that side of JSL very deeply.
2. Xpath? Maybe log the image name in a List; index will correspond with the frame box number.
<LINGO-LABS id="lingo-labs-797481" slang="en-US" mode="UPDATE"><LINGO-LABEL>Automatisierung und Skripting</LINGO-LABEL></LINGO-LABS>Betreff: Variable Anzahl von GraphBoxen. Wie kann ich feststellen, an welches GB ich Klicks sende?Wenn ein Benutzer auf ein Bild klickt, erhält Mousetrap den Befehl zum Aufrufen
statusmsg( variablename)
So: it will execute statusmsg( variablename), check for the current content of variablenamea and display it.
Wie Sie bemerkt und versucht haben: Sie müssen die Auswertung der Variablen irgendwie erzwingen.
Das Problem:
Wenn Sie das Ergebnis in einer anderen Variable ( msg ) speichern, haben Sie dasselbe Problem – nur mit einem anderen Variablennamen.
Was Sie tun möchten:
Für jedes Bild wird der Bildname vorab ausgewertet und es wird ausgelöst, z. B.
statusmsg("samurai_jack.jpg")In 90 % der Fälle kann diese Vorab-Auswertung über Eval(Eval Expr()) erfolgen.
Für die übrigen verwenden Sie Eval(Substitute())
Ausdrucksbehandlung in JMP: Tipps und Falltüren
Eval (Eval Expr( h=graphbox(
<<ADD image=""></ADD>
Betreff: Variable Anzahl von GraphBoxen. Wie kann ich feststellen, an welches GB ich Klicks sende?Lol, ich habe es herausgefunden
foreach({jpeg}, files in directory(jpegs),
img = new image(jpeg);
h = Eval(
Eval Expr(
graphbox(
<<ADD image=""></ADD>It's not clear to me why `jpeg` needs the expr() and `img` doesn't, though. Both of those vars are 'born' on a per-loop basis
Betreff: Variable Anzahl von GraphBoxen. Wie kann ich feststellen, an welches GB ich Klicks sende?ja, das ist ein ziemliches Problem in JSL. Leider gibt es keine Dokumentation, welche Argumente ausgewertet werden - und welche Argumente einfach "übertragen" werden. Und manchmal ist es gar nicht so einfach, das herauszufinden:
Bewertet Head seine Argumentation?
Ich habe den JMP-Support um eine offizielle Liste von Funktionen gebeten, die ihr Argument auswerten/nicht auswerten. Leider gibt es keine solche Liste.
Ein anderer Ansatz: Verwenden Sie eine erweiterte Syntaxhervorhebung im JSL-Editor – wertet die Funktion ihr Argument aus?
Ich hoffe, es wird in einigen der nächsten Versionen implementiert …
Tatsächlich bewerten viele(!!!) Funktionen in JSL (einige) ihrer Argumente nicht, bevor sie verwendet werden.
Dieser Ansatz ist äußerst wirkungsvoll!
Das prominenteste Beispiel für „gerade übertragen“:
New column (.... Formula(<U>Expression gets just transferred</U>))
Dasselbe gilt für Mausefallen.
Wenn Sie noch einmal darüber nachdenken – es ist sehr nett von JMP, dass es das Argument nicht auswertet : )
Sie möchten die Statusmeldung immer dann ändern, wenn der Benutzer auf das Bild klickt – und nicht in dem Moment, in dem Sie den Code ausführen.
Andererseits: Um das Bild zum Fenster hinzuzufügen, muss JMP die Bilddatei öffnen – und dazu: in die Variable schauen.
NB: Manchmal ist es hilfreich, ein Argument durch Eval(Argument) zu ersetzen.
Manchmal.
Hier: nein.