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