Przechowuj ciąg wraz z ciągiem w ListBox Delphi

TListBox i TComboBox Delphi wyświetlają listę pozycji - ciągów na liście „do wyboru”. TListBox wyświetla przewijaną listę, TComboBox wyświetla listę rozwijaną.

Wspólną właściwością wszystkich powyższych elementów sterujących jest Przedmiotów własność. Pozycje definiują listę ciągów, które pojawią się w kontrolce dla użytkownika. W czasie projektowania, po dwukrotnym kliknięciu właściwości Items, „Edytor list ciągów” umożliwia określenie elementów ciągów. Właściwość Items jest w rzeczywistości potomkiem typu TStrings.

Dwa ciągi znaków na element w ListBox?

Są sytuacje, gdy chcesz wyświetlić lista ciągów do użytkownika, na przykład w kontrolce pola listy, ale także sposób zapisz jeden dodatkowy ciąg wzdłuż tego wyświetlanego użytkownikowi.

Co więcej, możesz chcieć przechowywać / dołączać do łańcucha więcej niż zwykły „ciąg” dołącz obiekt do elementu (ciąg).

Skrzynka na listy. Przedmioty - TStrings „Zna” przedmioty!

Jeszcze raz spójrz na obiekt TStrings w systemie pomocy. Jest Obiekty właściwość reprezentująca zestaw obiektów powiązanych z każdym z nich

instagram viewer
smyczki we właściwości Strings - gdzie właściwość Strings odwołuje się do rzeczywistych ciągów na liście.

Jeśli chcesz przypisać drugi ciąg (lub obiekt) do każdego ciągu w polu listy, musisz wypełnić właściwość Items w czasie wykonywania.

Chociaż możesz korzystać z Skrzynka na listy. Przedmiotów. Dodaj Metoda dodawania ciągów do listy, aby skojarzyć obiekt z każdym ciągiem, będziesz musiał zastosować inne podejście.

The Skrzynka na listy. Przedmiotów. AddObject Metoda akceptuje dwa parametry. Pierwszy parametr „Element” to tekst elementu. Drugi parametr, „AObject”, to obiekt powiązany z przedmiotem.

Zauważ, że pole listy pokazuje Dodaj Przedmiot metoda, która robi to samo co Przedmioty. AddObject.

Dwa ciągi na jeden ciąg

Ponieważ oba przedmioty. AddObject i AddItem akceptują zmienną typu TObject dla drugiego parametru, taką linię:

// błąd kompilacji!
ListBox1.Items. AddObject („zarko”, „gajic”); 

spowoduje błąd kompilacji: E2010 Niezgodne typy: „TObject” i „string”.

Nie można po prostu podać ciągu dla obiektu, ponieważ w Delphi dla Win32 wartości ciągu nie są obiektami.

Aby przypisać drugi ciąg do elementu pola listy, musisz „przekształcić” zmienną ciąg w obiekt - potrzebujesz niestandardowego obiektu TString.

Liczba całkowita dla ciągu

Jeśli drugą wartością, którą musisz przechowywać wraz z elementem łańcucha, jest wartość całkowita, tak naprawdę nie potrzebujesz niestandardowej klasy TInteger.

 ListBox1.AddItem („Zarko Gajic”, TObject (1973)); 

W powyższej linii zapisana jest liczba całkowita „1973” wraz z dodanym ciągiem „Zarko Gajic”.

Bezpośredni typecast z liczby całkowitej na obiekt jest opisany powyżej. Parametr „AObject” jest w rzeczywistości 4-bajtowym wskaźnikiem (adresem) dodanego obiektu. Ponieważ w Win32 liczba całkowita zajmuje 4 bajty - możliwe jest tak trudne rzutowanie.

Aby odzyskać liczbę całkowitą związaną z łańcuchem, musisz rzutować „obiekt” z powrotem na wartość całkowitą:

// rok == 1973
year: = Integer (ListBox1.Items. Obiekty [ListBox1.Items. IndexOf („Zarko Gajic”)]); 

Kontrola Delphi dla łańcucha

Po co się tu zatrzymywać? Przypisywanie ciągów i liczb całkowitych do ciągu w polu listy to, jak się właśnie przekonałeś, bułka z masłem.

Ponieważ formanty Delphi są w rzeczywistości obiektami, możesz dołączyć formant do każdego łańcucha wyświetlanego w polu listy.

Poniższy kod dodaje do podpisów ListBox1 (pole listy) wszystkich kontrolek TButton w formularzu (umieść to w module obsługi zdarzeń OnCreate formularza) wraz z odniesieniem do każdego przycisku.

var idx: liczba całkowita; zaczynaćdla idx: = 0 do -1 + ComponentCount robićzaczynaćgdyby Komponenty [idx] jest TButton następnie ListBox1.AddObject (TButton (Składniki [idx]). Podpis, Składniki [idx]); koniec; koniec; 

Aby programowo „kliknąć” przycisk „drugi”, możesz użyć następnej instrukcji:

 TButton (ListBox1.Items. Obiekty [1]) Kliknij; 

Chcę przypisać moje niestandardowe obiekty do elementu string

W bardziej ogólnej sytuacji można dodać instancje (obiekty) własnych klas niestandardowych:

rodzaj TStudent = klasaprywatny fName: string; fRok: liczba całkowita; publicznywłasność Nazwa: ciąg przeczytany fName; własność Rok: liczba całkowita czytać rok; konstruktor Stwórz(const Nazwa: strunowy; const rok: liczba całkowita); koniec;... konstruktor TStudent. Stwórz(const Nazwa: strunowy; const rok: liczba całkowita); zaczynać fName: = nazwa; fRok: = rok; koniec; zaczynać// dodaj dwa listy / obiekty -> studentów do listy ListBox1.AddItem („John”, TStudent. Utwórz („John”, 1970)); ListBox1.AddItem („Jack”, TStudent. Utwórz („Jack”, 1982)); // weź pierwszego ucznia - Johna student: = ListBox1.Items. Obiekty [0] tak jak TStudent; // wyświetl rok Jana ShowMessage (IntToStr (student. Rok)); koniec; 

To, co tworzysz, musisz uwolnić

Oto, co Pomoc ma do powiedzenia na temat obiektów w potomkach TStrings: obiekt TStrings nie jest właścicielem obiektów dodawanych w ten sposób. Obiekty dodane do obiektu TStrings nadal istnieją, nawet jeśli instancja TStrings zostanie zniszczona. Muszą być wyraźnie zniszczone przez aplikację.

Kiedy dodajesz obiekty do ciągów - obiekty, które tworzysz - musisz upewnić się, że zwolnisz zajmowaną pamięć, w przeciwnym razie będziesz mieć wyciek pamięci

Ogólna niestandardowa procedura FreeObjects przyjmuje zmienną typu TStrings jako swój jedyny parametr. FreeObjects uwolni wszelkie obiekty związane z elementem na liście ciągów. W powyższym przykładzie „studenci” (klasa TStudent) są dołączeni do ciąg w polu listy, gdy aplikacja ma zostać zamknięta (na przykład główne zdarzenie OnDestroy), musisz zwolnić pamięć zajęty:

 FreeObjects (ListBox1.Items); 

Uwaga: Procedurę tę wywołujesz tylko wtedy, gdy obiekty przypisane do elementów ciągów zostały utworzone przez Ciebie.

instagram story viewer