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
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.