Sla een string (of een object) met een string op in een ListBox of ComboBox

Delphi's TListBox en TComboBox tonen een lijst met items - tekenreeksen in een "selecteerbare" lijst. TListBox geeft een schuifbare lijst weer, de TComboBox geeft een vervolgkeuzelijst weer.

Een gemeenschappelijke eigenschap van alle bovenstaande besturingselementen is de items eigendom. Items definiëren een lijst met tekenreeksen die in het besturingselement aan de gebruiker worden weergegeven. Tijdens het ontwerp, wanneer u dubbelklikt op de eigenschap Items, kunt u met de "String List Editor" tekenreeksitems opgeven. De eigenschap Items is eigenlijk een afstammeling van het TStrings-type.

Twee tekenreeksen per item in een ListBox?

Er zijn situaties waarin u een lijst met tekenreeksen aan de gebruiker wilt weergeven, bijvoorbeeld in de keuzelijstbesturing, maar ook een manier hebt om sla nog een extra string op naast de string die aan de gebruiker wordt getoond.

Bovendien wilt u misschien meer dan alleen een "gewone" string opslaan / koppelen aan de string, misschien wilt u dat ook voeg een object toe aan het item (string).

ListBox.Items - TStrings "Kent" objecten!

Geef het TStrings-object nog een kijkje in het Help-systeem. Daar is de Voorwerpen eigenschap die een set objecten vertegenwoordigt die zijn gekoppeld aan elk van de strings in de eigenschap Strings - waarbij de eigenschap Strings verwijst naar de werkelijke strings in de lijst.

Als u een tweede string (of een object) aan elke string in de keuzelijst wilt toewijzen, moet u de eigenschap Items tijdens runtime invullen..

Terwijl u de kunt gebruiken ListBox.Items.Add methode om tekenreeksen aan de lijst toe te voegen, om een ​​object aan elke tekenreeks te koppelen, moet u een andere aanpak gebruiken.

De ListBox.Items.AddObject methode accepteert twee parameters. De eerste parameter, "Item" is de tekst van het item. De tweede parameter "AObject" is het object dat aan het item is gekoppeld.

Merk op dat in de keuzelijst het Voeg item toe methode die hetzelfde doet als Items.AddObject.

Twee snaren voor één snaar

Omdat beide Items.AddObject en AddItem een ​​variabele van het type TObject accepteren voor hun tweede parameter, een regel als:

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

resulteert in een compileerfout: E2010 Incompatibele typen: 'TObject' en 'string'.

U kunt niet eenvoudig een string voor het object opgeven, omdat in Delphi voor Win32 stringwaarden geen objecten zijn.

Om een ​​tweede string toe te wijzen aan het item in de keuzelijst, moet u een stringvariabele in een object "transformeren" - u hebt een aangepast TString-object nodig.

Een geheel getal voor een tekenreeks

Als de tweede waarde die u samen met het tekenreeksitem moet opslaan, een geheel getal is, hebt u eigenlijk geen aangepaste TInteger-klasse nodig.

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

In de bovenstaande regel wordt het gehele getal "1973" opgeslagen, samen met de toegevoegde "Zarko Gajic" -reeks.

Een directe typecast van een geheel getal naar een object is hierboven gemaakt. De parameter "AObject" is feitelijk de 4-byte-pointer (adres) van het toegevoegde object. Omdat in Win32 een geheel getal 4 bytes in beslag neemt - zo'n harde cast is mogelijk.

Om het gehele getal terug te krijgen dat aan de tekenreeks is gekoppeld, moet u het "object" terugbrengen naar de waarde van het gehele getal:

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

Een Delphi-besturing voor een string

Waarom zou je hier stoppen? Het toewijzen van tekenreeksen en gehele getallen aan een tekenreeks in een keuzelijst is een fluitje van een cent.

Aangezien Delphi-besturingselementen eigenlijk objecten zijn, kunt u een besturingselement koppelen aan elke tekenreeks die in de keuzelijst wordt weergegeven.

De volgende code wordt toegevoegd aan de ListBox1 (keuzelijst) bijschriften van alle TButton-besturingselementen op een formulier (plaats dit in de OnCreate-gebeurtenishandler van het formulier) samen met de verwijzing naar elke knop.

 var   idx: geheel getal; beginnen   voor idx: = 0 naar -1 + ComponentCount Doen   beginnen     als Componenten [idx] is TButton vervolgens ListBox1.AddObject (TButton (Components [idx]). Caption, Components [idx]);   einde; einde; 

Om programmatisch op de "tweede" knop te "klikken", kunt u de volgende instructie gebruiken:

 TButton (ListBox1.Items.Objects [1]) Klik op.; 

Ik wil mijn aangepaste objecten toewijzen aan het tekenreeksitem

In een meer generieke situatie zou u instanties (objecten) van uw eigen aangepaste klassen toevoegen:

 type   TStudent = klasse   privaat     fName: string; fJaar: geheel getal;   openbaar     eigendom Naam : tekenreeks lezen fname;     eigendom Jaar: geheel getal lezen fYear;     bouwer Create (const naam : draad; const jaar: geheel getal);   einde; ... bouwer TStudent.Create (const naam : draad; const jaar: geheel getal); beginnen   fName: = naam; fJaar: = jaar; einde; -------- beginnen   // voeg twee string / objecten -> studenten toe aan de lijst   ListBox1.AddItem ('John', TStudent.Create ('John', 1970)); ListBox1.AddItem ('Jack', TStudent.Create ('Jack', 1982));   // pak de eerste student - John   student: = ListBox1.Items.Objects [0] net zo TStudent;   // display John's jaar   ShowMessage (IntToStr (student.Jaar)); einde; 

Wat je maakt moet je gratis

Dit is wat de Help te zeggen heeft over objecten in TStrings-afstammelingen: het TStrings-object is niet de eigenaar van de objecten die u op deze manier toevoegt. Objecten toegevoegd aan het TStrings-object bestaan ​​nog steeds, zelfs als de TStrings-instantie is vernietigd. Ze moeten zijn expliciet vernietigd door de applicatie.

Wanneer u objecten toevoegt aan tekenreeksen (objecten die u maakt), moet u ervoor zorgen dat u het bezet geheugen vrijmaakt, anders hebt u een geheugenlek

Een generieke aangepaste procedure FreeObjects accepteert een variabele van het type TStrings als zijn enige parameter. FreeObjects maakt alle objecten vrij die zijn gekoppeld aan een item in de stringlijst. In het bovenstaande voorbeeld zijn "studenten" (klasse TStudent) gekoppeld aan een string in een keuzelijst, wanneer de toepassing wordt afgesloten (hoofdformulier OnDestroy-gebeurtenis, voor bijvoorbeeld), moet u het beschikbare geheugen vrijmaken:

 FreeObjects (ListBox1.Items); 

Opmerking: u roept deze procedure alleen aan als u objecten hebt toegewezen aan tekenreeksitems.