Nombre variable de GraphBoxes. Comment puis-je identifier à quel Go j'envoie des clics ?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>Automatisation et scripts</LINGO-LABEL></LINGO-LABS>Ré: Nombre variable de GraphBoxes. Comment puis-je identifier à quel Go j'envoie des clics ?Chaque fois qu'un utilisateur clique sur une image, Mousetrap reçoit l'ordre d'appeler
statusmsg( variablename)
So: it will execute statusmsg( variablename), check for the current content of variablenamea and display it.
Comme vous l'avez remarqué et essayé : vous devez forcer la variable à être évaluée d'une manière ou d'une autre.
Le problème :
stocker le résultat dans une autre variable ( msg ) vous laisse avec le même problème - juste un autre nom de variable.
Ce que tu veux faire :
Pour chaque image, pré-évaluez le nom de l'image et déclenchez par exemple
statusmsg("samurai_jack.jpg")Dans 90% des cas, cette pré-évaluation peut être réalisée via Eval(Eval Expr()).
Pour les autres, utilisez Eval(Substitute())
Gestion des expressions dans JMP : astuces et trappes
Eval (Eval Expr( h=graphbox(
<<ADD image=""></ADD>
Ré: Nombre variable de GraphBoxes. Comment puis-je identifier à quel Go j'envoie des clics ?Lol j'ai compris
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
Ré: Nombre variable de GraphBoxes. Comment puis-je identifier à quel Go j'envoie des clics ?Oui, c'est un problème assez courant dans JSL. Malheureusement, il n'existe aucune documentation indiquant quels arguments sont évalués et quels arguments sont simplement « transférés ». Et parfois, ce n'est pas du tout facile à découvrir :
Est-ce que Head évalue son argument ?
J'ai demandé au support JMP une liste officielle des fonctions qui évaluent / n'évaluent pas leur argument. Malheureusement, il n'existe pas de liste de ce type.
Une autre approche : utiliser une coloration syntaxique avancée dans l'éditeur JSL - la fonction évalue-t-elle son argument ?
J'espère que cela sera implémenté avec certaines des prochaines versions....
En fait, de nombreuses (!!!) fonctions en JSL n'évaluent pas (certains de) leurs arguments avant de les utiliser.
Cette approche est extrêmement puissante !
L'exemple le plus frappant de « je viens de transférer » :
New column (.... Formula(<U>Expression gets just transferred</U>))
Il en va de même pour Mouse Trap.
Si vous y réfléchissez bien, c'est très gentil de la part de JMP de ne pas évaluer l'argument : )
Vous souhaitez modifier le message d'état chaque fois que l'utilisateur clique sur l'image, et non au moment où vous exécutez le code.
D'autre part : pour ajouter l'image à la fenêtre, JMP doit ouvrir le fichier image - et pour ce faire : regarder dans la variable.
NB : Parfois, il est utile de remplacer un argument par Eval(argument).
Parfois.
Ici : non.