Speichern Sie einen String (oder ein Objekt) mit einem String in einer ListBox oder ComboBox
TStrings.AddObject-Methode verstehen

Getty Images/ermingut
Delphis TListBox und TComboBox zeigen eine Liste von Elementen an – Zeichenketten 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 ' Zeichenfolgenelemente angeben. Die Items-Eigenschaft ist eigentlich ein Nachkomme des TStrings-Typs.
Zwei Strings pro Element in einer ListBox?
Es gibt Situationen, in denen Sie a anzeigen möchten Liste der Saiten an den Benutzer, zum Beispiel im Listenfeld-Steuerelement, sondern auch eine Möglichkeit haben Speichern Sie eine weitere zusätzliche Zeichenfolge neben der dem Benutzer angezeigten .
Darüber hinaus möchten Sie möglicherweise mehr als nur eine 'einfache' Zeichenfolge an der Zeichenfolge speichern / anhängen ein Objekt an das Element anhängen (String) .
ListBox.Items - TStrings 'kennt' Objekte!
Sehen Sie sich das TStrings-Objekt noch einmal im Hilfesystem an. Da ist die Objekte -Eigenschaft, die einen Satz von Objekten darstellt, die jedem der zugeordnet sind Saiten in der Eigenschaft „Strings“ – wobei die Eigenschaft „Strings“ auf die tatsächlichen Zeichenfolgen in der Liste verweist.
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.Elemente.Hinzufügen Methode zum Hinzufügen von Zeichenfolgen zur Liste, um jeder Zeichenfolge ein Objekt zuzuordnen, müssen Sie einen anderen Ansatz verwenden.
Das ListBox.Items.AddObject Die Methode akzeptiert zwei Parameter. Der erste Parameter „Item“ ist der Text des Items. Der zweite Parameter, 'AObject', ist das dem Element zugeordnete Objekt.
Beachten Sie, dass das Listenfeld die Artikel hinzufügen -Methode, die dasselbe tut wie Items.AddObject.
Zwei Saiten für eine Saite
Da sowohl Items.AddObject als auch AddItem eine Variable vom Typ TObject für ihren zweiten Parameter akzeptieren, wird eine Zeile wie folgt angezeigt:
|_+_|
führt zu einem Kompilierfehler: E2010 Inkompatible Typen: 'TObject' und 'string' .
Sie können nicht einfach einen String für das Objekt angeben, da Stringwerte in Delphi für Win32 keine Objekte sind.
Um dem Listbox-Element einen zweiten String zuzuweisen, müssen Sie eine String-Variable in ein Objekt „transformieren“ – Sie benötigen ein benutzerdefiniertes TString-Objekt.
Eine Ganzzahl für einen String
Wenn der zweite Wert, den Sie zusammen mit dem Zeichenfolgenelement speichern müssen, ein ganzzahliger Wert ist, benötigen Sie eigentlich keine benutzerdefinierte TInteger-Klasse.
|_+_|
Die obige Zeile speichert die Ganzzahl „1973“ zusammen mit der hinzugefügten Zeichenfolge „Zarko Gajic“.
Oben wird eine direkte Typumwandlung von einer Ganzzahl in ein Objekt vorgenommen. Der Parameter „AObject“ ist eigentlich der 4-Byte-Zeiger (Adresse) des hinzugefügten Objekts. Da in Win32 ein Integer 4 Bytes belegt, ist ein solcher Hardcast möglich.
Um die mit der Zeichenfolge verknüpfte ganze Zahl zurückzubekommen, müssen Sie das „Objekt“ wieder auf den ganzzahligen Wert umwandeln:
|_+_|Ein Delphi-Steuerelement für einen String
Warum hier aufhören? Das Zuweisen von Strings und Ganzzahlen zu einem String in einem Listenfeld ist, wie Sie gerade erfahren haben, ein Kinderspiel.
Da Delphi-Steuerelemente eigentlich Objekte sind, können Sie jedem im Listenfeld angezeigten String ein Steuerelement zuweisen.
Der folgende Code fügt den Beschriftungen ListBox1 (Listenfeld) aller TButton-Steuerelemente in einem Formular hinzu (platzieren Sie dies in der OnCreate-Ereignisbehandlungsroutine des Formulars), zusammen mit der Referenz auf jede Schaltfläche.
|_+_|Um programmgesteuert auf die „zweite“ Schaltfläche zu „klicken“, können Sie die nächste Anweisung verwenden:
|_+_|Ich möchte dem String-Element meine benutzerdefinierten Objekte zuweisen
In einer allgemeineren Situation würden Sie Instanzen (Objekte) Ihrer eigenen benutzerdefinierten Klassen hinzufügen:
|_+_|Was Sie erschaffen, müssen Sie befreien
Hier ist, was die Hilfe über Objekte in TStrings-Nachkommen zu sagen hat: 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 wird. Sie müssen ausdrücklich zerstört durch die Anwendung.
Wenn Sie Strings Objekte hinzufügen – Objekte, die Sie erstellen – müssen Sie sicherstellen, dass Sie den belegten Speicher freigeben, oder Sie haben einen Speicherleck
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 „Studenten“ (Klasse TStudent) an eine Zeichenfolge in einem Listenfeld angehängt, wenn die Anwendung geschlossen werden soll (OnDestroy-Ereignis des Hauptformulars, z Beispiel), müssen Sie den belegten Speicher freigeben:
|_+_|Hinweis: Sie rufen diese Prozedur nur auf, wenn Objekte, die String-Elementen zugeordnet sind, von Ihnen erstellt wurden.