Stocați o șir (sau un obiect) cu o șir într-o ListBox sau ComboBox

Delphi TListBox și TComboBox afișează o listă de elemente - șiruri într-o listă „selectabilă”. TListBox afișează o listă derulabilă, TComboBox afișează o listă derulantă.

O proprietate comună pentru toate controalele de mai sus este Articole proprietate. Elementele definesc o listă de șiruri care vor apărea în control pentru utilizator. La momentul proiectării, atunci când faceți dublu clic pe proprietatea Elemente, „Editorul de liste de șiruri” vă permite să specificați elemente de șir. Proprietatea Item este de fapt un descendent de tip TStrings.

Două șiruri pentru fiecare articol dintr-o listă?

Există situații când doriți să afișați o listă de șiruri pentru utilizator, de exemplu în controlul casetei de listă, dar aveți o modalitate de a stocați încă un șir suplimentar de-a lungul celui afișat utilizatorului.

Mai mult decât atât, s-ar putea să doriți să stocați / să atașați mai mult decât doar un șir „simplu” la șir, s-ar putea să doriți atașați un obiect la element (șir).

ListBox.Items - Obiecte "Cunoaște" TStrings!

Dă obiectului TStrings încă o privire în sistemul de ajutor. Există Obiecte proprietate care reprezintă un set de obiecte care sunt asociate cu fiecare dintre șirurile din proprietatea Strings - unde proprietatea Strings face referință la șirurile reale din listă.

Dacă doriți să atribuiți un al doilea șir (sau un obiect) fiecărui șir din caseta de listă, trebuie să completați proprietatea Elemente în timpul rulării.

În timp ce puteți utiliza funcția ListBox.Items.Add metoda de a adăuga șiruri la listă, pentru a asocia un obiect cu fiecare șir, va trebui să utilizați o altă abordare.

ListBox.Items.AddObject metoda acceptă doi parametri. Primul parametru, „Item” este textul articolului. Al doilea parametru, „AObject” este obiectul asociat articolului.

Rețineți că caseta de listă expune Adaugare element metodă care face același lucru cu Item.AddObject.

Două corzi pentru o singură coardă

Deoarece ambele elemente.AddObject și AddItem acceptă o variabilă de tip TObject pentru al doilea parametru, o linie precum:

 // eroare de compilare! ListBox1.Items.AddObject ('zarko', 'gajic'); 

va duce la o eroare de compilare: E2010 Tipuri incompatibile: „TOBject” și „string”.

Nu puteți furniza pur și simplu o șir pentru obiect, întrucât în ​​Delphi pentru Win32, valorile șirului nu sunt obiecte.

Pentru a atribui un al doilea șir elementului din caseta de listă, trebuie să „transformați” o variabilă șir într-un obiect - aveți nevoie de un obiect TString.

Un număr întreg pentru o șir

Dacă a doua valoare pe care trebuie să o stocați împreună cu elementul șir este o valoare întreagă, de fapt nu aveți nevoie de o clasă personalizată TInteger.

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

Linia de mai sus stochează numărul întreg "1973" împreună cu șirul "Zarko Gajic" adăugat.

Mai sus se face un tipcast direct de la un număr întreg la un obiect. Parametrul "AObject" este de fapt indicatorul (adresa) pe 4 octeți al obiectului adăugat. Întrucât în ​​Win32, un număr întreg ocupă 4 octeți - o distribuție atât de dură este posibilă.

Pentru a recupera înapoi numărul întreg asociat cu șirul, trebuie să aruncați „obiectul” înapoi la valoarea integrală:

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

Un control Delphi pentru o coardă

De ce să ne oprim aici? Alocarea șirurilor și numerelor întregi unui șir dintr-o casetă de listă este, după cum tocmai ați experimentat, o bucată de tort.

Deoarece controalele Delphi sunt de fapt obiecte, puteți atașa un control la fiecare șir afișat în caseta de listă.

Următorul cod se adaugă la listele de listare ListBox1 (caseta de listă) a tuturor controalelor TButton pe un formular (plasați-l în gestionarul de evenimente OnCreate al formularului) împreună cu referința la fiecare buton.

 var   idx: număr întreg; începe   pentru idx: = 0 la -1 + ComponentCount do   începe     dacă Componente [idx] este TButton apoi ListBox1.AddObject (TButton (Componente [idx]). Subtitrare, Componente [idx]);   Sfârșit; Sfârșit; 

Pentru a face clic pe programatic pe butonul „al doilea”, puteți utiliza următoarea afirmație:

 TButton (ListBox1.Items.Objects [1]); clic. 

Vreau să alocăm obiectele mele personalizate elementului șir

Într-o situație mai generică, adăugați instanțe (obiecte) din propriile clase personalizate:

 tip   TStudent = clasă   privat     fNume: șir; fYear: integer;   public     proprietate Nume : șir citit fname;     proprietate Anul: întreg citit fYear;     constructor Crea(const Nume : şir; const an: număr întreg);   Sfârșit; ... constructor TStudent.Create (const Nume : şir; const an: număr întreg); începe   Nume: = nume; fYear: = an; Sfârșit; -------- începe   // adăugați două șiruri / obiecte -> studenți pe listă   ListBox1.AddItem ('John', TStudent.Create ('John', 1970)); ListBox1.AddItem ('Jack', TStudent.Create ('Jack', 1982));   // apucă-l pe primul student - Ioan   student: = ListBox1.Items.Objects [0] la fel de TStudent;   // afișează anul lui Ioan   ShowMessage (IntToStr (student.Year)); Sfârșit; 

Ceea ce creați trebuie să eliberați

Iată ce spune Help în legătură cu obiectele descendenților TStrings: obiectul TStrings nu deține obiectele pe care le adăugați în acest fel. Obiectele adăugate la obiectul TStrings există încă chiar dacă instanța TStrings este distrusă. Ei trebuie să fie distrus explicit prin cerere.

Când adăugați obiecte la șiruri - obiecte pe care le creați - trebuie să vă asigurați că eliberați memoria ocupată sau veți avea o scurgere de memorie

O procedură personalizată generică FreeObjects acceptă o variabilă de tip TStrings ca unic parametru. FreeObjects va elibera orice obiect asociat cu un element din lista de șiruri În exemplul de mai sus, „studenții” (clasa TStudent) sunt atașați unei șiruri într-o casetă de listă, când aplicația urmează să fie închisă (formularul principal eveniment OnDestroy, pentru exemplu), trebuie să eliberați memoria ocupată:

 FreeObjects (ListBox1.Items); 

Notă: Apelați această procedură doar atunci când obiectele alocate articolelor șir au fost create de dvs..