Lagre en streng (eller et objekt) med en streng i en ListBox eller ComboBox

Forstå TStrings.AddObject-metoden

Programmeringsspråk

Getty Images/ermingut





Delphis TListBox og TComboBox viser en liste over elementer - strenger i en 'valgbar' liste. TListBox viser en rullbar liste, TComboBox viser en rullegardinliste.

En felles egenskap for alle kontrollene ovenfor er Varer eiendom. Elementer definerer en liste over strenger som vil vises i kontrollen for brukeren. Ved utforming, når du dobbeltklikker på egenskapen Items, lar 'String List Editor' deg spesifisere strengelementer. Items-egenskapen er faktisk en etterkommer av typen TStrings.



To strenger per element i en listeboks?

Det er situasjoner når du ønsker å vise en liste over strenger til brukeren, for eksempel i listeboksen kontroll, men også ha en måte å lagre en ekstra streng langs den som vises for brukeren .

I tillegg vil du kanskje lagre/feste mer enn bare en 'vanlig' streng til strengen, du vil kanskje feste et objekt til elementet (streng) .



ListBox.Items - TStrings 'Knows' Objects!

Gi TStrings-objektet enda en titt i hjelpesystemet. Det er Objekter egenskap som representerer et sett med objekter som er knyttet til hver av strenger i Strings-egenskapen - der Strings-egenskapen refererer til de faktiske strengene i listen.

Hvis du vil tilordne en andre streng (eller et objekt) til hver streng i listeboksen, må du fylle ut egenskapen Items under kjøring.

Mens du kan bruke ListBox.Items.Add metode for å legge til strenger i listen, for å knytte et objekt til hver streng, må du bruke en annen tilnærming.

De ListBox.Items.AddObject metoden aksepterer to parametere. Den første parameteren, 'Item', er teksten til elementet. Den andre parameteren, 'AObject' er objektet som er knyttet til elementet.



Merk at listeboksen viser AddItem metode som gjør det samme som Items.AddObject.

To strenger for en streng

Siden både Items.AddObject og AddItem godtar en variabel av typen TObject for sin andre parameter, vil en linje som:



|_+_|

vil resultere i en kompileringsfeil: E2010 Inkompatible typer: 'TObject' og 'string' .

Du kan ikke bare oppgi en streng for objektet siden i Delphi for Win32 er strengverdier ikke objekter.



For å tilordne en andre streng til listebokselementet, må du 'transformere' en strengvariabel til et objekt - du trenger et tilpasset TString-objekt.

Et heltall for en streng

Hvis den andre verdien du må lagre sammen med strengelementet er en heltallsverdi, trenger du faktisk ikke en egendefinert TInteger-klasse.



|_+_|

Linjen over lagrer heltallstallet '1973' sammen med den ekstra 'Zarko Gajic'-strengen.

En direkte typecast fra et heltall til et objekt er laget ovenfor. 'AObject'-parameteren er faktisk 4-byte-pekeren (adressen) til objektet som er lagt til. Siden i Win32 et heltall opptar 4 byte - en slik hard cast er mulig.

For å få tilbake heltallet knyttet til strengen, må du kaste 'objektet' tilbake til heltallsverdien:

|_+_|

En Delphi-kontroll for en streng

Hvorfor stoppe her? Å tilordne strenger og heltall til en streng i en listeboks er, som du nettopp opplevde, et stykke kake.

Siden Delphi-kontroller faktisk er objekter, kan du knytte en kontroll til hver streng som vises i listeboksen.

Følgende kode legger til ListBox1 (listeboks) bildetekstene til alle TButton-kontrollene på et skjema (plasser dette i skjemaets OnCreate-hendelsesbehandler) sammen med referansen til hver knapp.

|_+_|

For å programmere 'klikke' den 'andre' knappen, kan du bruke neste setning:

|_+_|

Jeg vil tilordne mine egendefinerte objekter til strengelementet

I en mer generisk situasjon vil du legge til forekomster (objekter) av dine egne tilpassede klasser:

|_+_|

Det du lager må du frigjøre

Her er hva hjelpen har å si om objekter i TStrings-etterkommere: TStrings-objektet eier ikke objektene du legger til på denne måten. Objekter lagt til TStrings-objektet eksisterer fortsatt selv om TStrings-forekomsten er ødelagt. Det må de være eksplisitt ødelagt av søknaden.

Når du legger til objekter i strenger - objekter du lager - må du sørge for at du frigjør minnet som er okkupert, ellers vil du ha en hukommelsestap

En generisk tilpasset prosedyre FreeObjects godtar en variabel av typen TStrings som eneste parameter. FreeObjects vil frigjøre alle objekter knyttet til et element i strenglisten. I eksemplet ovenfor blir 'studenter' (TSstudentklasse) knyttet til en streng i en listeboks, når applikasjonen er i ferd med å lukkes (hovedformen OnDestroy-hendelse, for eksempel), må du frigjøre minnet som er okkupert:

|_+_|

Merk: Du kaller denne prosedyren bare når objekter tilordnet strengelementer ble opprettet av deg.