Zones de liste - la propriété "définir la sélection"<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Cette requête est liée à une de mes précédentes requêtes concernant la mise à niveau de certains scripts pour mieux utiliser les fonctionnalités de JMP 9 ( http://communities.sas.com/message/109908#109908 ), mais ce n'est pas tout à fait le même problème, je pense.Il s'agit essentiellement de redessiner une fenêtre contenant une list box dans laquelle une sélection a déjà été effectuée.Dans l'exemple simplifié suivant, j'effectue une sélection dans la liste A, puis je recrée la fenêtre dans laquelle la liste A apparaît avec une deuxième zone de liste (liste
dont le contenu dépend de la sélection effectuée dans A.Si l'utilisateur effectue une sélection dans la zone de liste B, la sélection finale apparaît dans la zone de texte en dessous.Si une sélection est effectuée dans la List Box A, une nouvelle liste de choix est fournie dans la List Box B à partir de laquelle l'utilisateur doit encore effectuer une sélection finale.L'exécuter dans JMP 8 fonctionne comme je le souhaite, tandis que l'exécuter dans JMP 9 crée une boucle infinie.Je pense comprendre pourquoi : la ligne que j'ai marquée d'un commentaire (qui met en évidence la sélection effectuée dans la List Box A avec une propriété "<< set selected" lorsque les deux list box A et B apparaissent dans la fenêtre) traite l'affectation comme si j'avais fait cette sélection en cliquant dessus et j'agis en conséquence.Évidemment, je pourrais simplement supprimer cette ligne, mais si je fais cela, l'utilisateur ne peut pas voir le chemin qui a conduit à la sélection finale dans les zones de liste - et il est nécessaire qu'il le fasse.Alternativement, je pourrais simplement inclure toutes les zones de liste dans la fenêtre depuis le début et ne pas redessiner la fenêtre du tout, mais dans la version réelle, l'utilisateur ne sait pas au départ combien de zones de liste il devra utiliser - et je ne veux pas vraiment afficher à l'écran plus de choses à la fois que ce qui est réellement nécessaire.
Liste_A = { "Andy" , "Bessie" , "Carrie" , "Davina" , "Eddie" } ;
Liste_B = {} ;
Expr_Redraw_NW = expression (
Liste_Box_A = Zone de liste ( Liste_A , évaluer ( Expr_Create_List_B )) ;
NO = nouvelle fenetre ( "Nouvelle fenetre" ,
HListeBoîte (
Panneau électrique ( "Premier choix" , Liste_Box_A ) ,
si ( Un choix > 0 ,
Panneau électrique ( "Second choix" ,
Liste_Box_B ,
Zone de texte ( " " ) ,
TextBox_Answer = Zone de texte ( "" )
)
)
)
) ;
si ( Un choix > 0 , Liste_Box_A << définir la sélection ( Un choix )) ; // Cette ligne provoque le problème ;
NO << déplacer la fenêtre ( 200 , 200 ) ;
) ;
Expr_Create_List_B = expression (
Préfixe = ( Liste_Box_A << être sélectionné )[ 1 ] ;
montrer ( Préfixe ) ;
Un choix = ( Liste_Box_A << obtenir les indices sélectionnés )[ 1 ] ;
montrer ( Un choix ) ;
Liste_B = {} ;
pour ( je = 1 , je <= 5 , je ++,
insérer dans ( Liste_B , Préfixe || " " || carboniser ( je ))
) ;
Liste_Box_B = Zone de liste ( Liste_B ,
B_Choix = ( Liste_Box_B << être sélectionné )[ 1 ] ;
TextBox_Answer << Définir le texte ( « La sélection est : » || B_Choix ) ;
NO << réafficher
) ;
NO << Fermer la fenêtre ;
évaluer ( Expr_Redraw_NW ) ;
) ;
Liste_Box_B = Zone de liste ( Liste_B , imprimer ( "" )) ;
TextBox_Answer = Zone de texte ( "" ) ;
Répondre = "" ;
Un choix = 0 ;
évaluer ( Expr_Redraw_NW ) ;
Quelqu'un peut-il voir un moyen simple de s'en sortir sans impliquer une restructuration substantielle de son fonctionnement ?J'ai un problème similaire dans trois ou quatre scripts, j'aimerais donc réduire au minimum les travaux de correction si je le peux.
Un grand merci pour toute aide reçue.
Zones de liste - la propriété "définir la sélection"Je n'ai pas trouvé de solution ultra simple. Une façon d’éliminer le risque de tomber dans le piège récursif consiste à établir une communication à sens unique entre les expressions clés.
Vous trouverez ci-dessous un exemple qui supprime/ajoute de manière conditionnelle la boîte de panneau contenant List_Box_B, au lieu de redessiner la fenêtre entière. Ainsi, la List Box A n'a pas besoin d'être mise à jour et tout le travail de redessin est appelé à partir du script dans List_Box_A sans « retour » de Expr_Create_List_B. Ce n'est peut-être pas aussi simple que vous l'espériez, mais cela semble fonctionner dans JMP9.
Liste_A = { "Andy" , "Bessie" , "Carrie" , "Davina" , "Eddie" } ;
Liste_B = {} ;
Expr_Redraw_NW = Expr (
List_Box_A = Zone de liste (
Liste_A ,
Éval ( Expr_Create_List_B ) ;
Essayez ( Panel_Box_B << delete ) ;
Si ( A_Choice > 0 ,
HL << Append ( Eval ( Expr_Panel_Box_B ) ) ;
A_Choix = 0 ; // pour activer la réinitialisation par contrôle-clic sur la sélection
);
);
Si ( A_Choice == 0 ,
NO = Nouvelle fenêtre ( "Nouvelle fenêtre" ,
HL = H Zone de liste (
Boîte de panneau ( "Premier choix" , List_Box_A ) ,
Si ( A_Choice > 0 ,
Éval ( Expr_Panel_Box_B )
)
)
)
);
NW << déplacer la fenêtre ( 200 , 200 ) ;
);
Expr_Create_List_B = Expr (
Essayer (
Prefix = ( List_Box_A << être sélectionné )[ 1 ] ;
Afficher ( Préfixe ) ;
A_Choice = ( List_Box_A << obtenir les indices sélectionnés )[ 1 ] ;
Afficher ( A_Choice ) ;
Liste_B = {} ;
Pour ( je = 1 , je <= 5 , je ++,
Insérer dans ( List_B , Préfixe || " " || Char ( i ) )
);
List_Box_B = Zone de liste (
Liste_B ,
B_Choice = ( List_Box_B << être sélectionné )[ 1 ] ;
TextBox_Answer << définir le texte ( "La sélection est : " || B_Choice ) ;
NW << réafficher
);
);
);
Expr_Panel_Box_B = Expr (
Panel_Box_B = Panel Box ( "Deuxième choix" ,
Liste_Box_B ,
Zone de texte ( " " ) ,
TextBox_Answer = Zone de texte ( " " )
)
);
List_Box_B = Zone de liste ( List_B , Print ( " " ) ) ;
TextBox_Answer = Zone de texte ( " " ) ;
Réponse = "" ;
A_Choix = 0 ;
Eval ( Expr_Redraw_NW ) ;
Listes déroulantes - la propriété « définir la sélection »Ingénieux ! Oui, cela résout parfaitement le problème, et de plus, cela me suggère une façon d'étendre le processus à une série de requêtes similaires. Un grand merci !
David