Stocați o șiruri împreună cu o șiruri în Delphi's ListBox

click fraud protection

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 pe articol într-o listă de buză?

Există situații când doriți să afișați un lista șirurilor la utilizator, de exemplu în caseta de listă de control, dar au, de asemenea, o modalitate de a stocați încă un șir suplimentar de-a lungul celui afișat utilizatorului.

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

ListBox. Articole - Obiecte „Cunoaște” TStrings!

instagram viewer

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 siruri de caractere în proprietatea Strings - unde proprietatea Strings face referire 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 la timpul de execuție.

În timp ce puteți utiliza funcția ListBox. Articole. Adăuga 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. Articole. 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 Elemente. 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 aloca 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 personalizat.

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
an: = număr întreg (ListBox1.Items). Obiecte [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 ListBox1 (caseta de listă) subtitrări ale tuturor controalelor TButton pe un formular (plasați-l în gestionarul de evenimente OnCreate) alături de referința la fiecare buton.

var idx: număr întreg; începepentru idx: = 0 la -1 + ComponentCount doîncepedacă Componente [idx] este TButton apoi ListBox1.AddObject (TButton (Componente [idx]). Titlu, 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.. Obiecte [1]) Click; 

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; publicproprietate Nume: șir citit fname; proprietate Anul: întreg citit fYear; constructor Crea(const Nume: şir; const an: număr întreg); Sfârșit;... constructor TStudent. Crea(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. Obiecte [0] la fel de TStudent; // afișează anul lui Ioan ShowMessage (IntToStr (student. An)); Sfârșit; 

Ceea ce creați trebuie să eliberați

Iată ce are de spus ajutorul despre 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 un pierdere 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șate la un șir într-o casetă de listă, când aplicația urmează să fie închisă (formularul principal eveniment OnDestroy, de exemplu), trebuie să eliberați memoria ocupat:

 FreeObjects (ListBox1.Items); 

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

instagram story viewer