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.
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).
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.
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.
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')]);
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.;
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;
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.