Warum kann ich im Listenfeld keine doppelten Werte haben?Wenn ich das ausführe:
lb = List Box({"qwerqwerr", "qwerqwerr"});
nwTest = New Window("Test ListBox Duplicate values", lb);Ich erhalte ein Listenfeld mit nur einer Zeile. Warum?
List Box akzeptiert Listen, Listen können doppelte Werte haben. Warum kann Lis Box keine doppelten Werte haben?
Wenn ich eine Liste mit doppelten Werten an das Listenfeld übergebe, wird im Listenfeld nicht die Liste angezeigt, die jetzt mit zusätzlichen Warnungen oder Fehlern übergeben wurde.
Ist das beabsichtigt? Warum? Irgendwelche Problemumgehungen?
Erweiterte statistische ModellierungVersuchsplanungBetreff: Warum kann ich im Listenfeld keine doppelten Werte haben?Sie haben zwei verschiedene String-Col-Boxen in zwei verschiedenen Fenstern mit demselben Namen benannt. Die zweite Zuweisung überschreibt also die erste.
Komisches Verhalten => egal in welchem Fenster ich drücke, das zweite Fenster wird aktualisiert.
Betreff: Warum kann ich im Listenfeld keine doppelten Werte haben?Dieses „Steuerelement“ ist ein zusammengesetztes Objekt, das mit einem Umrissrahmen beginnt. Sie können die Struktur (Anzeigebaum) untersuchen, indem Sie mit der rechten Maustaste auf das Umrissfeld klicken und Bearbeiten > Baumstruktur anzeigen auswählen. Die Liste wird in einem Listenfeld angezeigt, dem gleichen Objekt, mit dem Sie begonnen haben.

Betreff: Warum kann ich im Listenfeld keine doppelten Werte haben?Du sagtest, " Sie hätten andere Namen für „scb“ verwenden sollen – das führte zu einem ziemlich lustigen Verhalten, so wie es jetzt ist. " Wie so?
Betreff: Warum kann ich im Listenfeld keine doppelten Werte haben?Verstanden, danke!
Sie hätten andere Namen für „scb“ verwenden sollen – das führte zu einem ziemlich lustigen Verhalten, so wie es jetzt ist.
Wie auch immer, welches Steuerelement wird hier verwendet:

In meinem Skript habe ich eine ähnliche GUI verwendet, um zwei Spalten abzugleichen, nur dass das Ganze etwas komplexer ist und die zweiten Spalten möglicherweise viele Hilfsspalten enthalten, die nicht in der Zeile „height=height“ angezeigt werden sollen. Daher besteht die Möglichkeit doppelter Werte.
Im Moment habe ich es so eingerichtet, dass es als „Höhe=Höhe;Geschlecht,Name,Alter“ angezeigt wird, um alles eindeutig zu machen, aber idealerweise würde ich nur die Hauptspalten anzeigen wollen.
Betreff: Warum kann ich im Listenfeld keine doppelten Werte haben?Ich bin damit einverstanden, dass in der Dokumentation darauf hingewiesen wird, dass das Listenfeld eindeutige Elemente in der bereitgestellten Liste verwendet. Das Listenargument muss keine eindeutigen Elemente enthalten. Jeder, der die Dokumentation nutzt, sollte vorbereitet sein; das heißt, jedes mögliche Verhalten wird erwartet.
Auch wenn Ihre Beispiele hypothetisch sind, hängt die Wahl eines Objekts von seinem Zweck ab. Hier sind zwei Ansätze, die auf Ihrem Beispiel der Anzeige einer Liste von Schritten basieren, die möglicherweise nicht über den gesamten Pfad hinweg eindeutig sind. Eine Methode verwendet eine direkte Aktualisierung und die andere verwendet eine Liste von Schritten zur Persistenz. (Beim ersten Ansatz könnte die Liste bei Bedarf aus dem Zeichenfolgenspaltenfeld abgerufen werden.)
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 )
)
)
)
);Betreff: Warum kann ich im Listenfeld keine doppelten Werte haben?Ich verstehe, dass List Box keine Liste ist. Es ist so akzeptiert Listen als Eingabe. Nirgendwo in der Dokumentation heißt es, dass die Liste nur eindeutige Werte haben muss. Es war ein unerwartetes Verhalten.
Stellen Sie sich zum Beispiel vor, Sie hätten ein Textfeld, das Zeichenfolgen als Eingabe akzeptiert. Diese Zeichenfolge wird also in einem Feld angezeigt, es sei denn, sie beginnt mit dem Buchstaben „a“.Es würde einfach nichts angezeigt, wenn die Zeichenfolge mit „a“ beginnt. Und es ist nirgendwo dokumentiert. Was für eine Schande für jemanden, der versucht herauszufinden, warum das Textfeld manchmal leer ist, oder?
Betreff: Warum kann ich im Listenfeld keine doppelten Werte haben?1. Ein Listenfeld ist keine Liste. Es verfügt nicht über die genauen Erwartungen oder Schnittstellen als Datenstruktur. Es handelt sich um eine interaktive, wechselseitige Kommunikation. Ein assoziatives Array würde „das Problem“ lösen. Viele Benutzer sind mit diesen Strukturen nicht vertraut oder vertraut mit ihnen, finden es aber natürlich, mit einer Liste zu arbeiten. Die Liste ist lediglich ein Argument, um die notwendigen Daten bereitzustellen, damit das Listenfeld seine Funktion erfüllen kann. Praktischerweise werden Duplikate automatisch verworfen.
2. Da es sich bei dem Listenfeld um ein Objekt handelt, das eine Liste eindeutiger Auswahlmöglichkeiten darstellt und die Interaktion mit dem Benutzer erleichtert, der ein oder mehrere Elemente auswählen muss, ist es die falsche Wahl für eine UI-Komponente, bei der Duplikate auftreten. Sie müssen für Ihren Zweck ein anderes Objekt auswählen. Ihr Anwendungsfall muss eine geordnete Liste der an anderer Stelle in der Benutzeroberfläche getroffenen Auswahlen speichern. Für diesen Zweck könnte ein String-Spaltenfeld eine gute Wahl sein.
Betreff: Warum kann ich im Listenfeld keine doppelten Werte haben?@David_Burnham , @Mark_Bailey Und @txnelson
Mein Punkt ist zweierlei:
1. Wenn es Listen als Eingabe akzeptiert, sollte es diese nicht ändern und so anzeigen, wie sie sind. Grundsätzlich ist es kein gutes Verhalten, wenn die Steuerung nicht anzeigt, was eingegeben wurde. Wenn es eindeutig sein muss, lassen Sie keine Listen zu, sondern machen Sie es zu assoziativen Arrays, in denen Schlüssel Zeilen sind und Werte entweder ignoriert werden oder etwas anderes sind. Oder werfen Sie zumindest eine Art Warnung oder Ausnahme aus, wenn eine Liste mit doppelten Werten als Eingabe bereitgestellt wird.
2. Wie unterscheidet man identische Werte? Nun ja, die Liste ist doch geordnet, oder? Ich kann mir viele Anwendungsfälle vorstellen, in denen Benutzer diese Art von Steuerung verwenden würden, um Schritte im Algorithmus, Sätze identischer Objekte, die der Benutzer zusammengestellt hat, auszuführende Berichte usw. widerzuspiegeln.
Ich habe zum Beispiel vier Tasten: „Links“, „Rechts“, „Hoch“ und „Runter“. Der Benutzer muss einen Algorithmus einrichten, um ein bestimmtes Ergebnis zu erzielen. Er programmiert dies, indem er nacheinander Tasten drückt. Mit jedem Tastendruck wird ein Schritt zu einer Liste hinzugefügt. Erstellen Sie eine Liste mit Schritten. Diese Liste enthält identische Schritte. Rechts, rechts, oben, rechts, unten, unten, links. Dies ist eine Liste. Wo würde ich eine solche Liste anzeigen, wenn nicht in etwas namens List Box()?
Betreff: Warum kann ich im Listenfeld keine doppelten Werte haben?Als @Mark_Bailey Wie angegeben, verhält sich das Listenfeld konstruktionsbedingt so.
Das Listenfeld ist als Benutzeroberflächenelement konzipiert, um einem Benutzer die Auswahl eines Werts aus einer Liste zu ermöglichen, z. B. {"ImpurityA", "ImpurityB", "ImpurityC", "ImpurityD"}.Wenn Sie eine Liste wie {"ImpurityA", "ImpurityB", "ImpurityC", "ImpurityD", "ImpurityB"} präsentieren, woher weiß der Benutzer, ob er das 1. von 2. "ImpurityB" auswählen soll?Logischerweise sollte dem Benutzer eine eindeutige Werteliste angezeigt werden, und genau das macht das Listenfeld.
Aber ich habe Verständnis für die Frage, da ich normalerweise eine ListBox als Scroll-Protokoll verwende, in das ich Nachrichten schreibe.Was dann zu Problemen führt, wenn ich eine Zeile ins Protokoll schreiben möchte, die bereits geschrieben wurde, da ich dieselbe Zeile nicht zweimal haben kann.In diesem Anwendungsfall greife ich normalerweise darauf zurück, eine Zeichenfolgennachricht mit Zeilenumbrüchen zu pflegen und die Zeichenfolge mithilfe eines mehrzeiligen Textfelds anzuzeigen.
Wenn der Anwendungsfall Ist Damit ein Benutzer eine Auswahl treffen kann, gibt es vermutlich sekundäre Informationen, die zwischen den beiden ImpurityBs im obigen Beispiel unterscheiden. In diesem Fall können Sie eine Liste zusammengesetzter Elemente erstellen, die im Listenfeld angezeigt werden sollen:
{"ImpurityA/Batch1",ImpurityB/Batch1", ..., "Impurity B/Batch2"}
Betreff: Warum kann ich im Listenfeld keine doppelten Werte haben?Das Listenfeld dient dazu, Elemente zur Auswahl auf der Benutzeroberfläche anzuzeigen. Sie haben nur auf das Verhalten dieses Objekts hingewiesen. Wie würde ein Benutzer wissen, welchen Artikel er haben möchte, wenn er den gleichen Wert hat? Vielleicht würde eine andere Präsentationsbox Ihren Zweck erfüllen, die Sie nicht geteilt haben.
Betreff: Warum kann ich im Listenfeld keine doppelten Werte haben?Ich habe keine Dokumentation gefunden, die angibt, dass in einem Listenfeld nur eine eindeutige Liste von Werten angezeigt wird, aber bei meinen Tests scheint es, dass nur ein einziger Eintrag für jeden spezifischen Wert in dem mit dem Listenfeld verknüpften Listenfeld angezeigt wird () Objekt..