Pourquoi ne puis-je pas avoir de valeurs en double dans la zone de liste ?Si je lance ceci:
lb = List Box({"qwerqwerr", "qwerqwerr"});
nwTest = New Window("Test ListBox Duplicate values", lb);Je vais obtenir une zone de liste avec une seule ligne. Pourquoi?
List Box accepte les listes, les listes peuvent avoir des valeurs en double, pourquoi Lis Box ne peut-il pas avoir des valeurs en double ?
Si je passe une liste avec des valeurs en double à la zone de liste, ce qui est affiché dans la zone de liste n'est pas la liste qui a été transmise avec maintenant des avertissements ou des erreurs supplémentaires.
EST-ce par conception? Pourquoi? Des solutions de contournement ?
Modélisation statistique avancéeConception d'expériencesRe : Pourquoi ne puis-je pas avoir de valeurs en double dans la zone de liste ?Vous avez nommé deux String Col Boxes différentes dans deux fenêtres différentes du même nom. Ainsi, la deuxième affectation écrase la première.
Comportement amusant => peu importe les boutons dans lesquels j'appuie, la deuxième fenêtre se met à jour.
Re : Pourquoi ne puis-je pas avoir de valeurs en double dans la zone de liste ?Ce "contrôle" est un objet composite commençant par une boîte de contour. Vous pouvez examiner la structure (arborescence d'affichage) en cliquant avec le bouton droit de la souris sur la zone de contour et en sélectionnant Edition > Afficher l'arborescence. La liste est présentée dans une zone de liste, le même objet avec lequel vous avez commencé.

Re : Pourquoi ne puis-je pas avoir de valeurs en double dans la zone de liste ?Vous avez dit, " Vous auriez dû utiliser des noms différents pour "scb" - cela a entraîné un comportement assez amusant tel qu'il est maintenant. " Comment?
Re : Pourquoi ne puis-je pas avoir de valeurs en double dans la zone de liste ?Compris, merci!
Vous auriez dû utiliser des noms différents pour "scb" - cela a entraîné un comportement assez amusant tel qu'il est maintenant.
Quoi qu'il en soit, quel contrôle est utilisé ici :

Dans mon script, j'ai utilisé une interface graphique similaire pour faire correspondre deux colonnes, seul le tout est un peu plus complexe, et les deuxièmes colonnes peuvent avoir de nombreuses colonnes auxiliaires que je ne veux pas afficher dans la ligne "height=height". D'où la possibilité de valeurs en double.
Pour l'instant, je l'ai configuré pour qu'il s'affiche sous la forme "taille = taille; sexe, nom, âge" pour que tout soit unique, mais idéalement, je ne voudrais afficher que les colonnes principales.
Re : Pourquoi ne puis-je pas avoir de valeurs en double dans la zone de liste ?Je conviens que la documentation doit indiquer que la zone de liste utilisera des éléments uniques dans la liste fournie. L'argument de liste n'a pas besoin d'avoir des éléments uniques. Toute personne utilisant la documentation doit être préparée ; c'est-à-dire que tout comportement possible est attendu.
Ainsi même si vos exemples sont hypothétiques, le choix d'un objet dépend de sa finalité. Voici deux approches basées sur votre exemple d'affichage d'une liste d'étapes, qui peuvent ne pas être uniques sur l'ensemble du chemin. Une méthode utilise une mise à jour directe et l'autre utilise une liste d'étapes pour la persistance. (La première approche pourrait obtenir la liste à partir de la zone de colonne de chaîne, si nécessaire.)
Names Default to Here( 1 );
// directly update list of steps
New Window( "Move It 1",
H List Box(
Outline Box( "Control",
Line Up Box( N Col( 3 ),
Text Box( "" ),
Button Box( "Up",
scb << Add Element( "Up" )
),
Text Box( "" ),
Button Box( "Left",
scb << Add Element( "Left" )
),
Text Box( "" ),
Button Box( "Right",
scb << Add Element( "Right" )
),
,
Text Box( "" ),
Button Box( "Down",
scb << Add Element( "Down" )
),
Text Box( "" )
)
),
Outline Box( "Path",
Table Box(
scb = String Col Box( "Step", {} )
)
)
)
);
//use list as an intermediary structure
updatePath = Function( { list, text, obj },
Insert Into( list, Eval( text ) );
obj << Set( list );
Return( list );
);
path = List();
New Window( "Move It 2",
H List Box(
Outline Box( "Control",
Line Up Box( N Col( 3 ),
Text Box( "" ),
Button Box( "Up",
path = updatePath( path, "Up", scb );
),
Text Box( "" ),
Button Box( "Left",
path = updatePath( path, "Left", scb );
),
Text Box( "" ),
Button Box( "Right",
path = updatePath( path, "Right", scb );
),
Text Box( "" ),
Button Box( "Down",
path = updatePath( path, "Down", scb );
),
Text Box( "" )
)
),
Outline Box( "Path",
Table Box(
scb = String Col Box( "Step", path )
)
)
)
);Re : Pourquoi ne puis-je pas avoir de valeurs en double dans la zone de liste ?Je comprends que List Box n'est pas une liste. C'est que ça accepte listes en tant qu'entrée. Nulle part dans la documentation il n'est dit que la liste ne doit avoir que des valeurs uniques. C'était un comportement inattendu.
Imaginez, par exemple, que vous ayez une zone de texte qui accepte des chaînes en entrée. Ainsi, il afficherait cette chaîne dans une boîte, à moins qu'elle ne commence par la lettre 'a'.Cela ne montrerait rien si la chaîne commence par 'a'. Et ce n'est documenté nulle part. Quelle déception pour quelqu'un qui essaie de dépanner pourquoi cette zone de texte est parfois vide, n'est-ce pas ?
Re : Pourquoi ne puis-je pas avoir de valeurs en double dans la zone de liste ?1. Une zone de liste n'est pas une liste. Il n'a pas les attentes exactes ou l'interface en tant que structure de données. Il s'agit d'une communication interactive bidirectionnelle. Un tableau associatif résoudrait « le problème ». De nombreux utilisateurs ne sont pas familiers ou à l'aise avec ces structures, mais trouvent une liste naturelle avec laquelle travailler. La liste est simplement un argument pour fournir les données nécessaires à la zone de liste pour remplir sa fonction. De manière pratique, les doublons sont automatiquement supprimés.
2. Étant donné que la zone de liste est un objet pour présenter une liste de choix uniques et facilite l'interaction avec l'utilisateur qui doit sélectionner un ou plusieurs éléments, c'est le mauvais choix pour un composant d'interface utilisateur où des doublons apparaissent. Vous devez choisir un autre objet pour votre objectif. Votre cas d'utilisation doit stocker une liste ordonnée de sélections effectuées ailleurs dans l'interface utilisateur. Une boîte de colonne de chaîne pourrait être un bon choix à cette fin.
Re : Pourquoi ne puis-je pas avoir de valeurs en double dans la zone de liste ?@David_Burnham , @Mark_Bailey et @txnelson
Mon propos est double :
1. S'il accepte les listes en entrée, il ne doit pas les modifier et les afficher telles quelles. Fondamentalement, ce n'est pas un bon comportement lorsque le contrôle ne montre pas ce qui y a été introduit. S'il doit être unique - n'autorisez pas les listes, faites-en des tableaux associatifs où les clés sont des lignes, les valeurs sont soit ignorées, soit autre chose. Ou au moins lancer une sorte d'avertissement ou d'exception lorsque la liste avec des valeurs en double est fournie en entrée.
2. Comment distinguer des valeurs identiques ? Eh bien, il y a de l'ordre dans la liste, n'est-ce pas ? Je peux proposer de nombreux cas d'utilisation où l'utilisateur utiliserait ce type de contrôle pour refléter les étapes de l'algorithme, les ensembles d'objets identiques que l'utilisateur a assemblés, les rapports à exécuter, etc.
Par exemple, j'ai quatre boutons : "Gauche", "Droite", "Haut" et "Bas". L'utilisateur doit configurer un algorithme pour obtenir un certain résultat. Il le programme en appuyant successivement sur les boutons. Chaque pression sur un bouton ajoute une étape dans une liste. Faire une liste d'étapes. Cette liste contient des étapes identiques. Droite, droite, haut, droite, bas, bas, gauche. Ceci est une liste. Où afficherais-je une telle liste, si ce n'est dans quelque chose qui s'appelle List Box() ?
Re : Pourquoi ne puis-je pas avoir de valeurs en double dans la zone de liste ?Comme @Mark_Bailey indiqué, la zone de liste se comporte de cette façon par conception.
La zone de liste est conçue comme un élément d'interface utilisateur pour permettre à un utilisateur de sélectionner une valeur dans une liste, par exemple {"ImpurityA","ImpurityB","ImpurityC","ImpurityD"}.Si vous présentez une liste telle que {"ImpurityA","ImpurityB","ImpurityC","ImpurityD","ImpurityB"} comment l'utilisateur saura-t-il s'il doit sélectionner le 1er ou le 2ème "ImpurityB".Logiquement, l'utilisateur doit se voir présenter une liste unique de valeurs et c'est ce que fait la zone de liste.
Mais je suis sensible à la question car j'utilise couramment une ListBox comme journal de défilement dans lequel j'écris des messages.Ce qui pose alors des problèmes si je veux écrire une ligne dans le journal qui a déjà été écrite, car je ne peux pas avoir la même ligne deux fois.Dans ce cas d'utilisation, j'ai généralement recours au maintien d'un message de chaîne avec des sauts de ligne et affiche la chaîne à l'aide d'une zone de texte multiligne.
Si le cas d'utilisation est pour permettre à un utilisateur de faire une sélection, il y a probablement des informations secondaires qui font la distinction entre les deux ImpurityB dans l'exemple ci-dessus, auquel cas vous pouvez créer une liste d'éléments composites à afficher dans la zone de liste :
{"ImpureA/Lot1",ImpureB/Lot1", ..., "Impure B/Lot2"}
Re : Pourquoi ne puis-je pas avoir de valeurs en double dans la zone de liste ?La zone de liste est destinée à présenter les éléments à sélectionner dans l'interface utilisateur. Vous avez seulement souligné le comportement de cet objet. Comment un utilisateur saurait-il quel article il veut s'il a la même valeur ? Peut-être qu'une autre boîte d'affichage servirait votre objectif, que vous n'avez pas partagé.
Re : Pourquoi ne puis-je pas avoir de valeurs en double dans la zone de liste ?Je n'ai pas trouvé de documentation spécifiant que seule une liste unique de valeurs est affichée dans une zone de liste, mais lors de mes tests, il semble qu'une seule entrée soit affichée pour chaque valeur spécifique dans la zone de liste associée à la zone de liste () objet..