¿Cómo generar botones dentro de un bucle?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Estoy tratando de generar botones dentro de un ciclo (un botón para cada columna). Los botones se crean correctamente, excepto que cuando el botón ejecuta su secuencia de comandos, siempre ejecutará la secuencia de comandos del último botón creado, en lugar de la secuencia de comandos que se pasó al objeto de cuadro de botón cuando se creó.
Entonces, parece que el botón solo obtiene una referencia al script, y si se cambia el script, el botón cambiará su función. Intenté considerar una solución alternativa con una serie de secuencias de comandos, pero el problema es que no puedo pasar ningún argumento para el objeto de botón (por ejemplo, indexar qué secuencia de comandos ejecutar en la matriz).
Pregunta: ¿Hay alguna forma en jsl de que uno pueda crear botones dentro de un ciclo con diferentes scripts/comportamiento? Por ejemplo, ¿hay alguna forma de pasar argumentos/datos al objeto de botón cuando se crea?
Mi código:
NombresPredeterminadoHastaAquí(1);
dt = Tabla de datos actuales ();
dtCols = dt << Obtener nombres de columnas (numérico, continuo);
// Expresión para mostrar la distribución de strParam
Expr_ShowDistribution = Expr(
Nueva ventana( Char(strParam),
Distribución(
Distribución continua (
Column( strParam ) //Especificamos nuestro parámetro
),
Enviar a informe (
Despacho( {}, "Distribución", Esquema, Establecer Título( "" ) ),
)
)
)
);
// Ventana principal
Nueva ventana ("Ventana principal",
ob = EsquemaCuadro("Botones",
TextBox("Botones de depuración", Establecer estilo de fuente("Negrita"))
);
);
// Crear botón que solo da salida a registro
BB = Cuadro de botones ("ClickMe", Show ("Clicked"));
ob << Agregar (BB);
// Crear botones para mostrar distribuciones
For( i = 1, i <= NIelementos(dtCols), i++,
Expr_ButtonAction = Sustituir (NombreExpr (Expr_ShowDistribution),
Expr(strParam), Eval(Char(dtCols )) );
Show(NombreExpr(Expr_ButtonAction)); // La expresión es diferente para cada botón.
BB = Cuadro de botón( Char(dtCols ), Eval(Expr_ButtonAction));
ob << Agregar (BB);
);
Re: ¿Cómo generar botones dentro de un bucle?Su ejemplo debería funcionar si las dos últimas filas dentro del ciclo, es decir
CAMA Y DESAYUNO = Caja de botones ( Carbonizarse ( dtCols [ i ]) , evaluar ( Expr_ButtonAction )) ;
transmisión exterior << Adjuntar ( CAMA Y DESAYUNO ) ;
se reemplazan con
evaluar ( Expr evaluación ( transmisión exterior << Adjuntar ( Caja de botones ( Carbonizarse ( dtCols [ i ] ) , exp. ( Nombre Expr. ( Expr_ButtonAction ) ) ) ) ) ) ;
No es la solución más obvia. Aquí, creo que el enfoque de "manipulación de cadenas" como en el ejemplo de PMroz es más simple.
Re: ¿Cómo generar botones dentro de un bucle?Buena idea, pero no implementada.Por ahora, sugeriría usar el nombre del botón como clave para una matriz asociativa.
Re: ¿Cómo generar botones dentro de un bucle?El Establecer función () El enfoque parecería ser más útil si pudiera adjuntar algunos datos de usuario al botón, por ejemplo, agregando pares clave-valor a una matriz asociativa.¿Es eso posible?
Re: ¿Cómo generar botones dentro de un bucle?Una secuencia de comandos de botón puede ser una función con un parámetro "este" que hace referencia al botón, lo que significa que el botón puede encontrar su nombre o su cuadro principal.
Nueva ventana( "ejemplo", v = V List Box() );
f = Function({this}, Show(this << getbuttonname ) );
Para( i = 1, i < 10, i++,
v << agregar (Cuadro de botones ("número" || Char (i), Establecer función (f)))
);

El parámetro "Establecer función" es la clave para que esto funcione.En su ejemplo, creo que los nombres de los botones podrían ser los nombres de las columnas.El VListBox en el ejemplo se llama "v", por lo que se le pueden agregar cuadros de botones.
Re: ¿Cómo generar botones dentro de un bucle?Aquí hay una implementación que funciona.Cambié la expresión de distribución a una función y luego tuve que jugar con evalinsert, parse, eval para que funcionara.
distribucion de espectaculos = función ({ nombre_columna } , { Local predeterminado } ,
dist_expr = Evalinsert (
"\[Distribución(Distribución Nominal(columna(:nombre("^column_name^")) ) )]\" ) ;
evaluar ( analizar gramaticalmente ( dist_expr )) ;
) ;
// Ventana principal
Nueva ventana ( "Ventana principal" ,
transmisión exterior = ContornoCuadro ( "Botones" ,
Caja de texto ( "Botones de depuración" , Establecer estilo de fuente ( "Atrevido" ))
) ;
) ;
// Crear botón que solo da salida a registro
CAMA Y DESAYUNO = Caja de botones ( "Haz click en mi" , Espectáculo ( "Hacer clic" )) ;
transmisión exterior << Adjuntar ( CAMA Y DESAYUNO ) ;
dt = abierto ( "$sample_data\Gran Clase.jmp" ) ;
dtcols = dt << obtener nombres de columna ( cadena ) ;
para ( i = 1 , i <= artículos ( dtcols ) , i ++,
botón_expr = Evalinsert ( "\[one_button = cuadro de botón("^dtcols ^", mostrar distribución("^dtcols ^"))]\" ) ;
evaluar ( analizar gramaticalmente ( botón_expr )) ;
transmisión exterior << adjuntar ( un_boton ) ;
) ;