Przechowuj ciąg (lub obiekt) za pomocą ciągu w ListBox lub ComboBox

Zrozumienie metody TStrings.AddObject

Język programowania

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.