Przechowuj ciąg (lub obiekt) za pomocą ciągu w ListBox lub ComboBox
Zrozumienie metody TStrings.AddObject
Getty Images/ermgut
TListBox i TComboBox firmy Delphi wyświetlają listę elementów - ciągów znakó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 kontrolek jest Przedmiotów własność. Elementy definiują listę ciągów, które będą wyświetlane użytkownikowi w kontrolce. W czasie projektowania, po dwukrotnym kliknięciu właściwości Items, „Edytor listy ciągów” pozwala określić elementy ciągu. Właściwość Items jest w rzeczywistości potomkiem typu TStrings.
Dwa ciągi na element w ListBox?
Są sytuacje, w których chcesz wyświetlić a lista ciągów do użytkownika, na przykład w kontrolce pola listy, ale mają również sposób na: zapisz jeszcze jeden dodatkowy ciąg wzdłuż tego wyświetlanego użytkownikowi .
Co więcej, możesz chcieć przechowywać/dołączać do niego coś więcej niż tylko „zwykły” ciąg, możesz chcieć dołączyć obiekt do przedmiotu (ciąg) .
ListBox.Items — TStrings „zna” obiekty!
Jeszcze raz spójrz na obiekt TStrings w systemie pomocy. Jest Obiekty właściwość, która reprezentuje zbiór obiektów, które są powiązane z każdym z smyczki we właściwości Ciągi — gdzie właściwość Ciągi 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 użyć ListBox.Items.Add metoda dodawania ciągów do listy, aby skojarzyć obiekt z każdym ciągiem, będziesz musiał użyć innego podejścia.
The ListBox.Items.AddObject metoda przyjmuje dwa parametry. Pierwszy parametr „Pozycja” to tekst pozycji. Drugi parametr, „AObject” to obiekt powiązany z elementem.
Zauważ, że pole listy ujawnia Dodaj Przedmiot metoda, która działa tak samo jak Items.AddObject.
Dwie struny na jedną strunę
Ponieważ zarówno Items.AddObject, jak i AddItem akceptują zmienną typu TObject jako drugi parametr, wiersz taki jak:
|_+_|
spowoduje błąd kompilacji: E2010 Niezgodne typy: „TObject” i „string” .
Nie możesz po prostu podać ciągu znaków dla obiektu, ponieważ w Delphi dla Win32 wartości ciągów nie są obiektami.
Aby przypisać drugi ciąg do elementu pola listy, musisz „przekształcić” zmienną ciągu w obiekt — potrzebujesz niestandardowego obiektu TString.
Liczba całkowita w łańcuchu
Jeśli druga wartość, którą musisz przechowywać wraz z elementem ciągu, jest wartością całkowitą, w rzeczywistości nie potrzebujesz niestandardowej klasy TInteger.
|_+_|
Powyższy wiersz przechowuje liczbę całkowitą „1973” wraz z dodanym ciągiem „Zarko Gajic”.
Powyżej dokonano bezpośredniego rzutowania typu z liczby całkowitej na obiekt. Parametr „AObject” jest w rzeczywistości 4-bajtowym wskaźnikiem (adresem) dodanego obiektu. Ponieważ w Win32 liczba całkowita zajmuje 4 bajty - takie twarde rzutowanie jest możliwe.
Aby odzyskać liczbę całkowitą powiązaną z łańcuchem, musisz rzutować „obiekt” z powrotem na wartość całkowitą:
|_+_|Kontrola Delphi dla struny
Dlaczego tu się zatrzymać? Przypisywanie łańcuchów i liczb całkowitych do łańcucha w polu listy to, jak właśnie przekonałeś się, bułka z masłem.
Ponieważ kontrolki Delphi są w rzeczywistości obiektami, możesz dołączyć kontrolkę do każdego łańcucha wyświetlanego w polu listy.
Poniższy kod dodaje podpisy ListBox1 (pole listy) wszystkich kontrolek TButton w formularzu (umieść to w obsłudze zdarzeń OnCreate formularza) wraz z odwołaniem do każdego przycisku.
|_+_|Aby programowo „kliknąć” przycisk „drugi”, możesz użyć następnej instrukcji:
|_+_|Chcę przypisać moje niestandardowe obiekty do elementu ciągu
W bardziej ogólnej sytuacji dodałbyś instancje (obiekty) własnych niestandardowych klas:
|_+_|Musisz uwolnić to, co tworzysz
Oto, co Help ma do powiedzenia na temat obiektów w potomkach TStrings: obiekt TStrings nie jest właścicielem obiektów, które dodajesz 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 — obiektów, które tworzysz — musisz upewnić się, że zwolniłeś zajętą pamięć, w przeciwnym razie będziesz mieć wyciek pamięci
Ogólna procedura niestandardowa FreeObjects akceptuje zmienną typu TStrings jako jedyny parametr. FreeObjects zwolni wszystkie obiekty powiązane z elementem na liście ciągów W powyższym przykładzie „students” (klasa TStudent) są dołączane do ciągu w polu listy, gdy aplikacja ma zostać zamknięta (formularz główny zdarzenie OnDestroy, na przykład), musisz zwolnić zajętą pamięć:
|_+_|Uwaga: Ta procedura jest wywoływana tylko wtedy, gdy zostały utworzone przez Ciebie obiekty przypisane do elementów łańcuchowych.