Speichern Sie eine Zeichenfolge (oder ein Objekt) mit einer Zeichenfolge in einer ListBox oder ComboBox

Delphis TListBox und TComboBox zeigen eine Liste von Elementen an - Zeichenfolgen in einer "auswählbaren" Liste. TListBox zeigt eine scrollbare Liste an, die TComboBox zeigt eine Dropdown-Liste an.

Eine gemeinsame Eigenschaft aller oben genannten Steuerelemente ist die Artikel Eigentum. Elemente definieren eine Liste von Zeichenfolgen, die dem Benutzer im Steuerelement angezeigt werden. Wenn Sie zur Entwurfszeit auf die Eigenschaft Items doppelklicken, können Sie im "String List Editor" String-Elemente angeben. Die Items-Eigenschaft ist eigentlich ein Nachkomme vom Typ TStrings.

Zwei Zeichenfolgen pro Element in einer ListBox?

Es gibt Situationen, in denen Sie dem Benutzer eine Liste von Zeichenfolgen anzeigen möchten, beispielsweise im Listenfeld-Steuerelement, aber auch eine Möglichkeit dazu haben Speichern Sie eine weitere Zeichenfolge neben der Zeichenfolge, die dem Benutzer angezeigt wird.

Darüber hinaus möchten Sie möglicherweise mehr als nur eine "einfache" Zeichenfolge speichern / an die Zeichenfolge anhängen ein Objekt an den Gegenstand anhängen (String).

ListBox.Items - TStrings "kennt" Objekte!

Sehen Sie sich das TStrings-Objekt noch einmal im Hilfesystem an. Da ist der Objekte Eigenschaft, die eine Reihe von Objekten darstellt, die den einzelnen Zeichenfolgen in der Strings-Eigenschaft zugeordnet sind. Dabei verweist die Strings-Eigenschaft auf die tatsächlichen Zeichenfolgen in der Liste.

Wenn Sie jeder Zeichenfolge im Listenfeld eine zweite Zeichenfolge (oder ein Objekt) zuweisen möchten, müssen Sie die Items-Eigenschaft zur Laufzeit füllen.

Während Sie die verwenden können ListBox.Items.Add Um der Liste Zeichenfolgen hinzuzufügen und jeder Zeichenfolge ein Objekt zuzuordnen, müssen Sie einen anderen Ansatz verwenden.

Das ListBox.Items.AddObject Methode akzeptiert zwei Parameter. Der erste Parameter, "Artikel", ist der Text des Artikels. Der zweite Parameter, "AObject", ist das Objekt, das dem Objekt zugeordnet ist.

Beachten Sie, dass das Listenfeld die Artikel hinzufügen Methode, die dasselbe wie Items.AddObject macht.

Zwei Saiten für eine Saite

Da sowohl Items.AddObject als auch AddItem eine Variable vom Typ TObject für ihren zweiten Parameter akzeptieren, lautet die Zeile wie folgt:

 // Kompilierfehler! ListBox1.Items.AddObject ('zarko', 'gajic'); 

führt zu einem Kompilierungsfehler: E2010 Inkompatible Typen: 'TObject' und 'string'.

Sie können nicht einfach eine Zeichenfolge für das Objekt angeben, da in Delphi für Win32 Zeichenfolgenwerte keine Objekte sind.

Um dem Listenfeldelement eine zweite Zeichenfolge zuzuweisen, müssen Sie eine Zeichenfolgenvariable in ein Objekt "transformieren" - Sie benötigen ein benutzerdefiniertes TString-Objekt.

Eine Ganzzahl für eine Zeichenfolge

Wenn der zweite Wert, den Sie zusammen mit dem Zeichenfolgenelement speichern müssen, ein ganzzahliger Wert ist, benötigen Sie tatsächlich keine benutzerdefinierte TInteger-Klasse.

 ListBox1.AddItem ('Zarko Gajic', TObject (1973)); 

In der oberen Zeile wird die Ganzzahl "1973" zusammen mit der hinzugefügten Zeichenfolge "Zarko Gajic" gespeichert.

Eine direkte Typumwandlung von einer Ganzzahl zu einem Objekt erfolgt oben. Der Parameter "AObject" ist der 4-Byte-Zeiger (Adresse) des hinzugefügten Objekts. Da in Win32 eine Ganzzahl 4 Bytes belegt - eine solche harte Besetzung ist möglich.

Um die mit der Zeichenfolge verknüpfte Ganzzahl zurückzugewinnen, müssen Sie das "Objekt" auf den Ganzzahlwert zurücksetzen:

 // Jahr == 1973 year: = Integer (ListBox1.Items.Objects [ListBox1.Items.IndexOf ('Zarko Gajic')]); 

Ein Delphi-Steuerelement für einen String

Warum hier aufhören? Das Zuweisen von Zeichenfolgen und Ganzzahlen zu einer Zeichenfolge in einem Listenfeld ist, wie Sie soeben erlebt haben, ein Kinderspiel.

Da Delphi-Steuerelemente tatsächlich Objekte sind, können Sie jedem im Listenfeld angezeigten String ein Steuerelement hinzufügen.

Der folgende Code fügt den Beschriftungen ListBox1 (Listbox) aller TButton-Steuerelemente in einem Formular (fügen Sie dies in die OnCreate-Ereignisbehandlungsroutine des Formulars ein) zusammen mit dem Verweis auf jede Schaltfläche hinzu.

 var   idx: integer; Start   zum idx: = 0 zu -1 + ComponentCount tun   Start     wenn Komponenten [idx] ist TButton dann ListBox1.AddObject (TButton (Components [idx]). Caption, Components [idx]);   Ende; Ende; 

Um die "zweite" Schaltfläche programmgesteuert "anzuklicken", können Sie die folgende Anweisung verwenden:

 TButton (ListBox1.Items.Objects [1]). Klicken Sie auf; 

Ich möchte meine benutzerdefinierten Objekte dem Zeichenfolgenelement zuweisen

In einer allgemeineren Situation würden Sie Instanzen (Objekte) Ihrer eigenen benutzerdefinierten Klassen hinzufügen:

 Art   TStudent = Klasse   Privat     fName: string; Jahr: Ganzzahl;   Öffentlichkeit     Eigentum Name : Zeichenfolge gelesen fName;     Eigentum Jahr: Ganzzahl lesen Jahr;     Konstrukteur Erstellen(const Name : Zeichenfolge; const Jahr: ganze Zahl);   Ende;… Konstrukteur TStudent.Create (const Name : Zeichenfolge; const Jahr: ganze Zahl); Start   fName: = name; Jahr: = Jahr; Ende; -------- Start   // füge zwei string / objects -> students zur Liste hinzu   ListBox1.AddItem ('John', TStudent.Create ('John', 1970)); ListBox1.AddItem ('Jack', TStudent.Create ('Jack', 1982));   // Nimm den ersten Schüler - John   student: = ListBox1.Items.Objects [0] wie TStudent;   // Johns Jahr anzeigen   ShowMessage (IntToStr (student.Year)); Ende; 

Was du erschaffst, musst du befreien

In der Hilfe wird Folgendes zu Objekten in TStrings-Nachkommen gesagt: Das TStrings-Objekt besitzt nicht die Objekte, die Sie auf diese Weise hinzufügen. Dem TStrings-Objekt hinzugefügte Objekte sind auch dann noch vorhanden, wenn die TStrings-Instanz zerstört wurde. Sie müssen explizit zerstört von der Anwendung.

Wenn Sie Zeichenfolgen Objekte hinzufügen - Objekte, die Sie erstellen -, müssen Sie sicherstellen, dass Sie den belegten Speicher freigeben, da sonst ein Speicherverlust auftritt

Eine generische benutzerdefinierte Prozedur FreeObjects akzeptiert eine Variable vom Typ TStrings als einzigen Parameter. FreeObjects gibt alle Objekte frei, die mit einem Element in der Zeichenfolgenliste verknüpft sind. Im obigen Beispiel werden "students" (TStudent-Klasse) an eine Zeichenfolge in einem Listenfeld angehängt, wenn die Anwendung geschlossen werden soll (OnDestroy-Hauptformularereignis, z Beispiel), müssen Sie den belegten Speicher freigeben:

 FreeObjects (ListBox1.Items); 

Hinweis: Sie rufen diese Prozedur nur auf, wenn Objekte, die Zeichenfolgenelementen zugewiesen sind, von Ihnen erstellt wurden.