Créer un script de bouton dans une boucle forJ'essaie de générer une boîte de table avec un nombre de lignes qui sera variable. Je veux que chaque ligne ait un bouton qui fera une fonction à une variable correspondante dans une liste.
Problème actuel : les scripts de la boucle for n'interprètent pas eval expr comme je m'y attendais. Le script résultant attaché à chaque case à cocher doit imprimer que le bouton 1, 2 ou 3 a été enfoncé. Au lieu de cela, il indique toujours 4. L'objectif final est d'effectuer une opération sur UserText[i] lorsque la case est cochée.
Quelqu'un peut-il aider à expliquer ce que je fais mal? Merci!
Question bonus : j'utilise des cases à cocher car elles sont plus petites que les boîtes à boutons et les boîtes à boutons ne semblent pas être redimensionnables. Idéalement, il ne s'agirait que de petites icônes cliquables. Existe-t-il un moyen convivial de créer un petit "x" cliquable au lieu d'un bouton complet ?
Version JMP : 16
Names Default To Here( 1 );
UserText = {"default 1", "default 2", "default 3"};
win2 = New Window( "Select files",
tb = Table Box(
Col Box( "Text", {} ),
Col Box( "Button", {} ),
),
tb << set row borders(1);
);
//for loop to add a number of rows with a small button next to each one
For( i = 1, i <= N Items( UserText ), i++,
tb << add row(
{Text Box( UserText[i], <<SET width=""></SET>ScriptRe : Créer un script de bouton dans une boucle forBonjour,
Tu étais très proche.
Si vous utilisez Eval ( EvalExpr ( ) ) pour envelopper l'intégralité de l'instruction tb << add row () comme ci-dessous, vous obtiendrez le comportement que vous recherchez :
//for loop to add a number of rows with a small button next to each one
For( i = 1, i <= N Items( UserText ), i++,
eval(evalexpr(
tb << add row(
{Text Box( UserText[i], <<SET width=""></SET>Re : Créer un script de bouton dans une boucle forVoici ma façon à l'ancienne de gérer cela
Names Default To Here( 1 );
UserText = {"default 1", "default 2", "default 3"};
win2 = New Window( "Select files",
tb = Table Box(
Col Box( "Text", {} ),
Col Box( "Button", {} ),
),
tb << set row borders(1);
);
//for loop to add a number of rows with a small button next to each one
For( i = 1, i <= N Items( UserText ), i++,
tb << add row(
{Text Box( UserText[i], <<SET width=""></SET>Re : Créer un script de bouton dans une boucle forMa méthode est un peu plus compliquée en utilisant XPath et Contient(), mais dans certains cas, elle peut être plus robuste (et vous pouvez l'étendre à d'autres éléments à côté de la case à cocher si vous modifiez le XPath)
Names Default To Here(1);
UserText = {"default 1", "default 2", "default 3"};
win2 = New Window("Select files",
tb = Table Box(Col Box("Text", {}), Col Box("Button", {}), Col Box("Third", {})),
tb << set row borders(1)
);
expr_tablebox_get_checkbox_idx = Expr(
row_idx = Contains((this << parent) << XPath("//CheckBoxBox"), this);
);
expr_tablebox_get_column_idx = Expr(
col_idx = Contains(((this << parent) << parent) << Get Names, (this << parent) << get heading)
);
expr_check_box = Expr(
expr_tablebox_get_checkbox_idx;
expr_tablebox_get_column_idx;
Show(row_idx, col_idx);
);
For Each({txt}, UserText,
tb << Add Row(
{Text Box(txt, << Set Width),
cb = Check Box({""}, << Set Function(function({this},
expr_check_box
))
),
cb = Check Box({""}, << Set Function(function({this},
expr_check_box
))
)
};
);
);
</CODE>En utilisant cette méthode, vous pouvez rencontrer des problèmes où les expressions sont évaluées correctement en fonction de l'endroit où vous les appelez, donc ce ne devrait pas être la première méthode à essayer</P>
<P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-601493" slang="en-US" mode="NONE">Re : Créer un script de bouton dans une boucle for</LINGO-SUB><LINGO-BODY id="lingo-body-601493" slang="en-US" mode="NONE"><P>Je suis revenu car hier soir je pensais, "cela peut aussi être fait avec Xpath et contient". Le poste de Jarmo était déjà là ; l'exemple que j'ai mis ci-dessous est assez similaire, mais attribue toutes les fonctions de case à cocher à la fois avec une instruction Xpath, une fois que vous avez construit la table. Cela devient l'une de mes façons préférées de gérer ce genre de chose.</P>
<P> </P>
<PRE><CODE class=" language-jsl">Names Default To Here( 1 );
UserText = {"default 1", "default 2", "default 3"};
win2 = New Window( "Select files",
tb = Table Box( Col Box( "Text", {} ), Col Box( "Button", {} ), << set row borders(1) );
);
//add rows with a small button next to each one
For each ( { txt, i }, UserText,
tb << add row( {Text Box( txt, <<SET width=""></SET>
Re : Créer un script de bouton dans une boucle forMerci! Je vais devoir passer un peu plus de temps à comprendre celui-ci, je n'ai pas utilisé la fonction set et je ne comprends pas très bien le comportement après une lecture rapide du guide de script et de quelques exemples. Je prévois une situation dans laquelle j'aurai besoin de fonctionnalités comme celle-ci, donc je vais mettre cela à l'esprit pendant un moment et revenir si ce moment vient.
Pour confirmer quelque chose de basique qui ne semble pas être explicitement indiqué dans le matériel : lors de la définition d'une fonction, est-ce que "ceci" est un terme prédéfini dans JSL qui pointera vers l'objet auquel la fonction est attachée ? Je vois quelques exemples qui utilisent 'this' dans l'argument de la fonction set sans apparaître ailleurs dans la définition de la fonction (je suis sûr à environ 60% que j'utilise les termes corrects). Les fonctions mathématiques de base sont intuitives telles que MyFn = fonction ({x,y}, x + y ), mais ensuite les choses semblent gagner en complexité très rapidement lorsque nous entrons dans les objets.
Re : Créer un script de bouton dans une boucle forC'est juste le premier paramètre lorsqu'il est utilisé avec << Set Function (car il n'a pas à être ce , semble que l'index de script JMP17 utilise cette boîte Par exemple). Et ce premier argument est une référence à cette boîte spécifique dans laquelle cette fonction est définie.Cette page d'aide peut fournir des informations supplémentaires avec quelques exemples :
Guide de script > Afficher les arborescences > Construire des fenêtres personnalisées > Définir la fonction et définir le script
De plus, avec certaines boîtes d'affichage, vous pourrez peut-être utiliser plusieurs paramètres avec << Set Function . Vous pouvez les voir dans l'index des scripts (si vous pouvez les trouver, cela peut parfois être un peu délicat)
