Comment générer des boutons dans une boucle ?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'essaie de générer des boutons dans une boucle (un bouton pour chaque colonne). Les boutons sont créés correctement sauf que lorsque le bouton exécute son script, il exécutera toujours le script du dernier bouton créé - au lieu du script qui a été passé à l'objet boîte à boutons lors de sa création.
Ainsi, il semble que le bouton n'obtienne qu'une référence au script - et si le script est modifié, le bouton changera de fonction. J'ai essayé d'envisager une solution de contournement avec un tableau de scripts, mais le problème est que je ne peux transmettre aucun argument pour l'objet bouton (par exemple, indexer le script du tableau à exécuter).
Question : Existe-t-il un moyen dans jsl de créer des boutons dans une boucle avec différents scripts/comportements ? Par exemple, existe-t-il un moyen de transmettre des arguments/données à l'objet bouton lors de sa création ???
Mon code :
NamesDefaultToHere(1);
dt = table de données actuelle();
dtCols = dt << Get Column Names( Numeric, Continuous );
// Expression d'affichage de la distribution pour strParam
Expr_ShowDistribution = Expr(
Nouvelle fenêtre( Char(strParam),
Distribution(
Distribution continue(
Column( strParam ) //Nous spécifions notre paramètre
),
EnvoyerVersRapport(
Dispatch( {}, "Distribution", OutlineBox, Set Title( "" ) ),
)
)
)
);
// Fenêtre principale
Nouvelle fenêtre("Fenêtre principale",
ob = OutlineBox("Boutons",
TextBox("Boutons de débogage", Définir le style de police("Gras"))
);
);
// Créer un bouton qui ne sort que pour se connecter
BB = Button Box( "ClickMe", Show("Clicked"));
ob << Ajouter(BB);
// Créer des boutons pour afficher les distributions
Pour( je = 1, je <= NItems(dtCols), je++,
Expr_ButtonAction = Substitute(NameExpr(Expr_ShowDistribution),
Expr(strParam), Eval(Char(dtCols )) );
Show(NameExpr(Expr_ButtonAction)); // L'expression est différente pour chaque bouton.
BB = Bouton Boîte( Char(dtCols ), Eval(Expr_ButtonAction));
ob << Ajouter(BB);
);
Re : Comment générer des boutons dans une boucle ?Votre exemple devrait fonctionner si les deux dernières lignes de la boucle, c'est-à-dire
BB = Boîte à boutons ( Carboniser ( dtCols [ je ]) , Éval ( Expr_ButtonAction )) ;
ob << Ajouter ( BB ) ;
sont remplacés par
Éval ( Expr éval ( ob << Ajouter ( Boîte à boutons ( Carboniser ( dtCols [ je ] ) , Expr ( Nom Expr ( Expr_ButtonAction ) ) ) ) ) ) ;
Pas la solution la plus évidente. Ici, je pense que l'approche de "manipulation de chaînes" comme dans l'exemple de PMroz est plus simple.
Re : Comment générer des boutons dans une boucle ?Bonne idée, mais pas mise en œuvre.Pour l'instant, je suggérerais d'utiliser le nom du bouton comme clé d'un tableau associatif.
Re : Comment générer des boutons dans une boucle ?Le Définir la fonction() L'approche semblerait être plus utile si je pouvais attacher des données utilisateur au bouton, par exemple en ajoutant des paires clé-valeur à un tableau associatif.Est-ce possible?
Re : Comment générer des boutons dans une boucle ?Un script de bouton peut être une fonction avec un paramètre "this" qui fait référence au bouton, ce qui signifie que le bouton peut trouver son nom ou sa boîte parent.
Nouvelle fenêtre( "exemple", v = V List Box() );
f = Function( {this}, Show( this << getbuttonname ) );
Pour( i = 1, i < 10, i++,
v << append( Button Box( "number" || Char( i ), Set Function( f ) ) )
);

Le paramètre "Set Function" est la clé pour que cela fonctionne.Dans votre exemple, je pense que les noms des boutons peuvent être les noms des colonnes.Le VListBox dans l'exemple est nommé "v" afin que des boîtes à boutons puissent y être ajoutées.
Re : Comment générer des boutons dans une boucle ?Voici une implémentation qui fonctionne.J'ai changé l'expression de distribution en fonction, puis j'ai dû jouer avec evalinsert, parse, eval pour que cela fonctionne.
afficher la distribution = fonction ({ nom de colonne } , { Locale par défaut } ,
dist_expr = evalinsert (
"\[Distribution( Distribution nominale( colonne(:nom("^nom_colonne^")) ) )]\" ) ;
eval ( analyser ( dist_expr )) ;
) ;
// Fenêtre principale
Nouvelle fenetre ( "Fenêtre principale" ,
ob = ContourBox ( "Boutons" ,
Zone de texte ( "Boutons de débogage" , Définir le style de police ( "Gras" ))
) ;
) ;
// Créer un bouton qui ne sort que pour se connecter
BB = Boîte à boutons ( "Cliquez-moi" , Montrer ( "Clic" )) ;
ob << Ajouter ( BB ) ;
dt = ouvrir ( "$sample_data\Big Class.jmp" ) ;
dtcols = dt << obtenir les noms de colonnes ( chaîne ) ;
pour ( je = 1 , je <= articles ( dtcols ) , je ++,
expression_bouton = evalinsert ( "\[one_button = bouton boîte("^dtcols ^", showdistribution("^dtcols ^"))]\" ) ;
eval ( analyser ( expression_bouton )) ;
ob << ajouter ( un_bouton ) ;
) ;