Lagre en streng sammen med en streng i Delphis ListBox

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 ovennevnte kontroller er elementer eiendom. Elementer definerer en liste over strenger som skal vises i kontrollen for brukeren. Når du dobbeltklikker på Items-egenskapen, kan du med "String List Editor" spesifisere strengelementer på designtidspunktet. Items-egenskapen er faktisk en etterkommer av typen TStrings.

To strenger per vare i en ListBox?

Det er situasjoner når du vil vise en liste over strenger til brukeren, for eksempel i listebokskontrollen, men har også en måte å gjøre det på lagre en ekstra streng sammen med den som vises til brukeren.

Dessuten kan det være lurt å lagre / knytte mer enn bare en "vanlig" streng til strengen, det kan være lurt knytte et objekt til elementet (streng).

ListBox. Elementer - TStrings "kjenner" -objekter!

Gi TStrings-objektet enda et blikk i hjelpesystemet. Det er

instagram viewer
objekter eiendom som representerer et sett med objekter som er assosiert med 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 inn egenskapen Items på kjøretid.

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

De ListBox. Elementer. AddObject metoden godtar to parametere. Den første parameteren "Element" er tekstens artikkel. Den andre parameteren "AObject" er objektet som er tilknyttet elementet.

Legg merke til at listefeltet utsetter AddItem metode som gjør det samme som varer. AddObject.

To strenger for en streng

Siden begge varene. AddObject og AddItem aksepterer en variabel av typen TObject for deres andre parameter, en linje som:

// kompiler feil!
ListBox1.Items. AddObject ('zarko', 'gajic'); 

vil resultere i en kompilasjonsfeil: E2010 Ukompatible typer: 'TObject' og 'string'.

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

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

Et heltall for en streng

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

 ListBox1.AddItem ('Zarko Gajic', TObject (1973)); 

Linjen over lagrer heltalet "1973" sammen med den tilsatte "Zarko Gajic" -strengen.

En direkte typecast fra et heltall til et objekt er laget ovenfor. Parameteren "AObject" er faktisk 4-byte-pekeren (adressen) til objektet som er lagt til. Siden i Win32 har et helt tall 4 byte - en så hard rollebesetning er mulig.

For å få tilbake heltallet tilknyttet strengen, må du kaste "objektet" tilbake til heltalverdien:

// år == 1973
år: = Heltall (ListBox1.Items. Objekter [ListBox1.Items. IndexOf ('Zarko Gajic')]); 

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

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) -tekstene til alle TButton-kontrollene på et skjema (plasser dette i skjemaets OnCreate-hendelsesbehandler) sammen med henvisning til hver knapp.

Var idx: heltall; begynnetil idx: = 0 til -1 + ComponentCount gjørebegynnehvis Komponenter [idx] er TButton deretter ListBox1.AddObject (TButton (Components [idx]). Bildetekst, Components [idx]); slutt; slutt; 

For å programmisk "klikke" på "andre" -knappen, kan du bruke den neste setningen:

 TButton (ListBox1.Items.. Objekter [1]) Klikk; 

Jeg vil tilordne mine egendefinerte objekter til strengevaren

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

type TStudent = klasseprivat fName: streng; fYear: heltall; offentligeiendom Navn: streng lest fname; eiendom År: heltall lese fYear; konstruktør Skape(konst Navn: string; konst år: heltall); slutt;... konstruktør TStudent. Skape(konst Navn: string; konst år: heltall); begynne fName: = navn; år: = år; slutt; begynne// legg til to streng / objekter -> elever på listen ListBox1.AddItem ('John', TStudent. Create ('John', 1970)); ListBox1.AddItem ('Jack', TStudent. Create ('Jack', 1982)); // ta tak i den første studenten - John student: = ListBox1.Items. Objekter [0] som TStudent; // vis Johns år ShowMessage (IntToStr (student). År)); slutt; 

Det du oppretter må du gratis

Her er hva Hjelpen har å si om objekter i TStrings etterkommere: TStrings-objektet eier ikke objektene du legger til på denne måten. Objekter som er 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 objekter til strengene - objekter du oppretter - må du sørge for å frigjøre det okkuperte minnet, ellers har du en hukommelsestap

En generisk tilpasset prosedyre FreeObjects godtar en variabel av typen TStrings som den eneste parameteren. FreeObjects vil frigjøre alle objekter tilknyttet et element i strenglisten. I eksemplet ovenfor er "studenter" (TStudent-klasse) knyttet til en streng i en listeboks, når applikasjonen er i ferd med å stenges (for eksempel hovedskjema OnDestroy-hendelse), må du frigjøre minnet okkupert:

 FreeObjects (ListBox1.Items); 

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