Speichern Sie einen String zusammen mit einem String in Delphis ListBox

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 Items-Eigenschaft doppelklicken, können Sie im "String List Editor" String-Elemente angeben. Die Items-Eigenschaft ist tatsächlich ein Nachkomme vom Typ TStrings.

Zwei Zeichenfolgen pro Element in einer ListBox?

Es gibt Situationen, in denen Sie a anzeigen möchten Liste der Zeichenfolgen an den Benutzer, zum Beispiel im Listenfeld, aber auch eine Möglichkeit dazu Speichern Sie eine weitere zusätzliche Zeichenfolge entlang der dem Benutzer angezeigten.

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

instagram viewer

ListBox. Gegenstände - TStrings "kennt" Objekte!

Geben Sie dem TStrings-Objekt einen weiteren Blick in das Hilfesystem. Da ist der Objekte Eigenschaft, die eine Reihe von Objekten darstellt, die jedem der Objekte zugeordnet sind Saiten in der Strings-Eigenschaft - wobei die Strings-Eigenschaft auf die tatsächlichen Strings in der Liste verweist.

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

Während Sie die verwenden können ListBox. Artikel. Hinzufügen Methode zum Hinzufügen von Zeichenfolgen zur Liste, zum Zuordnen eines Objekts zu jeder Zeichenfolge, müssen Sie einen anderen Ansatz verwenden.

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

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

Zwei Saiten für eine Saite

Da beide Artikel. AddObject und AddItem akzeptieren eine Variable vom Typ TObject für ihren zweiten Parameter, eine Zeile wie:

// Kompilierungsfehler!
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 einen String

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 obigen Zeile wird die Ganzzahl "1973" zusammen mit der hinzugefügten Zeichenfolge "Zarko Gajic" gespeichert.

Oben wird eine direkte Typumwandlung von einer Ganzzahl zu einem Objekt vorgenommen. Der Parameter "AObject" ist tatsächlich der 4-Byte-Zeiger (Adresse) des hinzugefügten Objekts. Da in Win32 eine Ganzzahl 4 Bytes belegt, ist eine solche harte Umwandlung möglich.

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

// Jahr == 1973
Jahr: = Ganzzahl (ListBox1.Items. Objekte [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 gerade erlebt haben, ein Kinderspiel.

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

Der folgende Code ergänzt die ListBox1-Beschriftungen (Listenfeld) aller TButton-Steuerelemente in einem Formular (fügen Sie diese in den OnCreate-Ereignishandler des Formulars ein) zusammen mit dem Verweis auf jede Schaltfläche.

var idx: Ganzzahl; Startzum idx: = 0 zu -1 + ComponentCount tunStartwenn Komponenten [idx] ist TButton dann ListBox1.AddObject (TButton (Components [idx]). Caption, Components [idx]); Ende; Ende; 

Um programmgesteuert auf die Schaltfläche "Zweiter" zu "klicken", können Sie die nächste Anweisung verwenden:

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

Ich möchte dem Zeichenfolgenelement meine benutzerdefinierten Objekte zuweisen

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

Art TStudent = KlassePrivat fName: string; fJahr: Ganzzahl; ÖffentlichkeitEigentum Name: Zeichenfolge gelesen fName; Eigentum Jahr: Ganzzahl lesen Jahr; Konstrukteur Erstellen(const Name: Zeichenfolge; const Jahr: ganze Zahl); Ende;... Konstrukteur TStudent. Erstellen(const Name: Zeichenfolge; const Jahr: ganze Zahl); Start fName: = Name; fJahr: = Jahr; Ende; Start// füge zwei String / Objekte -> Schüler zur Liste hinzu ListBox1.AddItem ('John', TStudent. Erstellen ('John', 1970)); ListBox1.AddItem ('Jack', TStudent. Create ('Jack', 1982)); // Schnapp dir den ersten Schüler - John student: = ListBox1.Items. Objekte [0] wie T Student; // Johns Jahr anzeigen ShowMessage (IntToStr (Student). Jahr)); Ende; 

Was Sie erstellen, müssen Sie freigeben

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 wird. Sie müssen explizit zerstört durch die Anwendung.

Wenn Sie Zeichenfolgen Objekte hinzufügen - Objekte, die Sie erstellen - müssen Sie sicherstellen, dass Sie den belegten Speicher freigeben, sonst haben Sie eine Speicherleck

Eine generische benutzerdefinierte Prozedur FreeObjects akzeptiert eine Variable vom Typ TStrings als einzigen Parameter. FreeObjects gibt alle Objekte frei, die einem Element in der Zeichenfolgenliste zugeordnet sind. Im obigen Beispiel werden "Schüler" (TStudent-Klasse) angehängt Als Zeichenfolge in einem Listenfeld müssen Sie den Speicher freigeben, wenn die Anwendung geschlossen werden soll (z. B. OnDestroy-Ereignis im Hauptformular) belegt:

 FreeObjects (ListBox1.Items); 

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