Delphi's TListBox en TComboBox geven een lijst met items weer - 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 Artikelen eigendom. Items definiëren een lijst met tekenreeksen die voor de gebruiker in het besturingselement verschijnen. Wanneer u tijdens het ontwerpen dubbelklikt op de eigenschap Items, kunt u met de "String List Editor" tekenreeksitems specificeren. De eigenschap Items is eigenlijk een afstammeling van het type TStrings.
Twee strings per item in een ListBox?
Er zijn situaties waarin u een lijst van strings aan de gebruiker, bijvoorbeeld in de keuzelijst, maar ook een manier 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" tekenreeks aan de tekenreeks opslaan / koppelen voeg een object toe aan het item (string).
Keuzelijst. Items - TStrings "weet" objecten!
Geef het TStrings-object nog een blik in het Help-systeem. Daar is de Voorwerpen eigenschap die een set objecten vertegenwoordigt die zijn gekoppeld aan elk van de snaren in de eigenschap Strings - waar de eigenschap Strings verwijst naar de werkelijke tekenreeksen in de lijst.
Als u aan elke tekenreeks in de keuzelijst een tweede tekenreeks (of een object) wilt toewijzen, moet u de eigenschap Items tijdens runtime invullen.
Terwijl u de kunt gebruiken Keuzelijst. Artikelen. Toevoegen methode om strings aan de lijst toe te voegen, om een object aan elke string te koppelen, moet je een andere benadering gebruiken.
De Keuzelijst. Artikelen. 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 de keuzelijst de Voeg item toe methode die hetzelfde doet als Items. AddObject.
Twee snaren voor één snaar
Aangezien beide items. AddObject en AddItem accepteren een variabele van het type TObject voor hun tweede parameter, een regel als:
// compileer fout!
ListBox1.Items. AddObject ('zarko', 'gajic');
zal resulteren in een compileerfout: E2010 Incompatibele typen: 'TObject' en 'string'.
U kunt niet zomaar een tekenreeks voor het object opgeven, omdat in Delphi voor Win32 tekenreekswaarden geen objecten zijn.
Om een tweede string aan het keuzelijstitem toe te wijzen, 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 stringitem moet opslaan een geheel getal is, heeft u eigenlijk geen aangepaste TInteger-klasse nodig.
ListBox1.AddItem ('Zarko Gajic', TObject (1973));
De regel hierboven slaat het gehele getal "1973" op, samen met de toegevoegde "Zarko Gajic" -reeks.
Een directe typecast van een geheel getal naar een object wordt hierboven gemaakt. De "AObject" parameter is eigenlijk de 4-byte pointer (adres) van het toegevoegde object. Aangezien in Win32 een geheel getal 4 bytes in beslag neemt, is zo'n harde cast mogelijk.
Om het gehele getal dat bij de string hoort terug te krijgen, moet je het "object" terugzetten naar de integerwaarde:
// jaar == 1973
jaar: = Integer (ListBox1.Items. Objecten [ListBox1.Items. IndexOf ('Zarko Gajic')]);
Een Delphi-besturing voor een string
Waarom hier stoppen? Het toewijzen van strings en gehele getallen aan een string in een keuzelijst is, zoals je net hebt ervaren, een fluitje van een cent.
Aangezien Delphi-besturingselementen eigenlijk objecten zijn, kunt u een besturingselement aan elke tekenreeks in de keuzelijst koppelen.
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; beginnenvoor idx: = 0 naar -1 + ComponentCount Doenbeginnenals Componenten [idx] is TButton vervolgens ListBox1.AddObject (TButton (Components [idx]). Bijschrift, Components [idx]); einde; einde;
Om programmatisch op de "tweede" knop te "klikken", kunt u de volgende instructie gebruiken:
TButton (ListBox1.Items. Objecten [1]) Klik op;
Ik wil mijn aangepaste objecten toewijzen aan het stringitem
In een meer algemene situatie zou u instanties (objecten) van uw eigen aangepaste klassen toevoegen:
type TStudent = klasseprivaat fName: string; fYear: geheel getal; openbaareigendom Naam: string gelezen fName; eigendom Jaar: geheel getal lezen fYear; constructeur Maken (const naam: draad; const jaar: geheel getal); einde;... constructeur TStudent. Maken (const naam: draad; const jaar: geheel getal); beginnen fName: = naam; fYear: = jaar; einde; beginnen// voeg twee string / objecten toe -> studenten 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. Objecten [0] net zo TStudent; // John's jaar weergeven ShowMessage (IntToStr (student. Jaar)); einde;
Wat u maakt, moet u gratis maken
Dit is wat de Help te zeggen heeft over objecten in TStrings-afstammelingen: het TStrings-object bezit niet de objecten die u op deze manier toevoegt. Objecten die aan het TStrings-object zijn toegevoegd, bestaan nog steeds, zelfs als de TStrings-instantie is vernietigd. Ze moeten zijn expliciet vernietigd door de applicatie.
Wanneer u objecten aan strings toevoegt - objecten die u maakt - moet u ervoor zorgen dat u het geheugen vrijmaakt, anders heeft u een geheugenlek
Een algemene aangepaste procedure FreeObjects accepteert een variabele van het type TStrings als enige parameter. FreeObjects zal alle objecten vrijmaken die aan een item in de stringlijst zijn gekoppeld. In het bovenstaande voorbeeld worden "studenten" (klasse TStudent) toegevoegd aan een tekenreeks in een keuzelijst, wanneer de toepassing op het punt staat te worden gesloten (bijvoorbeeld hoofdformulier OnDestroy-gebeurtenis), moet u het geheugen vrijmaken bezet:
FreeObjects (ListBox1.Items);
Opmerking: u roept deze procedure alleen aan wanneer u objecten hebt toegewezen die aan stringitems zijn toegewezen.