Número variable de GraphBoxes. ¿Cómo puedo identificar a qué GB estoy enviando 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>Automatización y scripting</LINGO-LABEL></LINGO-LABS>Re: Número variable de GraphBoxes. ¿Cómo puedo identificar a qué GB estoy enviando clics?Cada vez que un usuario hace clic en una imagen, Mousetrap recibe la orden de llamar
statusmsg( variablename)
So: it will execute statusmsg( variablename), check for the current content of variablenamea and display it.
Como habrás notado y probado: tienes que forzar que la variable se evalúe de alguna manera.
La cuestión:
almacenar el resultado en otra variable ( msg ) deja con el mismo problema: sólo otro nombre de variable.
Lo que quieres hacer:
Para cada imagen, evalúe previamente el nombre de la imagen y el disparador, por ejemplo:
statusmsg("samurai_jack.jpg")En el 90% de los casos, esta preevaluación se puede realizar mediante Eval(Eval Expr()).
Para los restantes, utilice Eval(Substitute())
Manejo de expresiones en JMP: trucos y trampas
Eval (Eval Expr( h=graphbox(
<<ADD image=""></ADD>
Re: Número variable de GraphBoxes. ¿Cómo puedo identificar a qué GB estoy enviando clics?Jajaja ya lo descubrí
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
Re: Número variable de GraphBoxes. ¿Cómo puedo identificar a qué GB estoy enviando clics?Sí, este es un problema bastante grave en JSL. Lamentablemente, no hay documentación que indique qué argumentos se evalúan y cuáles se "transfieren". Y, a veces, no es nada fácil averiguarlo:
¿Head evalúa su argumento?
Le pedí al soporte de JMP una lista oficial de funciones que evalúan o no evalúan su argumento. Lamentablemente, no existe dicha lista.
Otro enfoque: utilizar algún resaltado de sintaxis avanzado en el editor JSL: ¿la función evalúa su argumento?
Espero que se implemente con algunos de los próximos lanzamientos...
En realidad, muchas(!!!) funciones en JSL no evalúan (algunos de) sus argumentos antes de usarlos.
¡Este enfoque es extremadamente poderoso!
El ejemplo más destacado de "recién transferido":
New column (.... Formula(<U>Expression gets just transferred</U>))
Lo mismo ocurre con Mouse Trap.
Si lo piensas de nuevo, es muy amable por parte de JMP que no evalúa el argumento : )
Desea cambiar el mensaje de estado cada vez que el usuario hace clic en la imagen, no en el momento en que ejecuta el código.
Por otro lado: para agregar la imagen a la Ventana, JMP tiene que abrir el archivo de imagen y, para ello, mirar la variable.
NB: A veces, es útil reemplazar un argumento con Eval(argumento).
A veces.
Aquí: no.