Opbevar en streng sammen med en streng i Delphis ListBox

Delphis TListBox og TComboBox viser en liste over elementer - strenge i en "valgbar" liste. TListBox viser en rullbar liste, TComboBox viser en rulleliste.

En fælles egenskab for alle ovennævnte kontroller er Elementer ejendom. Elementer definerer en liste over strenge, der vises i kontrollen for brugeren. Når du dobbeltklikker på egenskaben Elementer på designtidspunktet, giver "String List Editor" dig mulighed for at specificere strengelementer. Egenskaben Items er faktisk en efterkommer af typen TStrings.

To strenge pr. Artikel i en ListBox?

Der er situationer, hvor du vil vise en liste over strenge til brugeren, for eksempel i listeboksstyringen, men har også en måde at gøre det på gem en yderligere streng langs den, der vises for brugeren.

Hvad mere er, kan du måske gemme / vedhæfte mere end bare en "almindelig" streng til strengen, skal du muligvis vedhæft et objekt til emnet (streng).

ListBox. Elementer - TStrings "kender" objekter!

Giv TStrings-objektet endnu et kig i Hjælp-systemet. Der er

instagram viewer
objekter egenskab, der repræsenterer et sæt objekter, der er knyttet til hver af strygere i egenskaben Strings - hvor egenskaben Strings refererer til de faktiske strenge på listen.

Hvis du vil tildele en anden streng (eller et objekt) til hver streng i listefeltet, skal du udfylde egenskaben Items på kørselstidspunktet.

Mens du kan bruge ListBox. Elementer. Tilføje metode til at tilføje strenge til listen, for at knytte et objekt til hver streng, skal du bruge en anden tilgang.

Det ListBox. Elementer. AddObject metoden accepterer to parametre. Den første parameter, "Element", er teksten til varen. Den anden parameter, "AObject" er det objekt, der er knyttet til emnet.

Bemærk, at listefelt udsætter AddItem metode, der gør det samme som varer. AddObject.

To strenge til en streng

Da begge varer. AddObject og AddItem accepterer en variabel af typen TObject for deres anden parameter, en linje som:

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

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

Du kan ikke blot levere en streng til objektet, da i Delphi for Win32 er strengværdier ikke objekter.

For at tildele en anden streng til listeboksen skal du "transformere" en strengvariabel til et objekt - du har brug for et brugerdefineret TString-objekt.

Et heltal til en streng

Hvis den anden værdi, du har brug for at gemme sammen med strengelementet, er en heltalværdi, behøver du faktisk ikke en brugerdefineret TInteger-klasse.

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

Linjen ovenfor gemmer heltalnummeret "1973" sammen med den tilføjede "Zarko Gajic" streng.

En direkte typecast fra et heltal til et objekt er lavet ovenfor. Parameteren "AObject" er faktisk 4-byte-markøren (adresse) på det tilføjede objekt. Da i Win32 et helt tal har 4 byte - er en sådan hård cast mulig.

For at få det heltal, der er knyttet til strengen, tilbage, skal du kaste "objektet" tilbage til heltalværdien:

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

En Delphi-kontrol til en streng

Hvorfor stoppe her? Tildeling af strenge og heltal til en streng i en listefelt er, som du lige har oplevet, et stykke kage.

Da Delphi-kontroller faktisk er objekter, kan du knytte en kontrol til hver streng, der vises i listefeltet.

Følgende kode tilføjes til ListBox1 (listefelt) billedtekster for alle TButton-kontrollerne på en formular (placer dette i formens OnCreate-begivenhedshåndterer) sammen med henvisningen til hver knap.

Var idx: heltal; begyndetil idx: = 0 til -1 + ComponentCount gørebegyndehvis Komponenter [idx] er TButton derefter ListBox1.AddObject (TButton (Components [idx]). Billedtekst, Components [idx]); ende; ende; 

For at programmisk "klikke" på "anden" -knappen kan du bruge den næste sætning:

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

Jeg vil tildele mine tilpassede objekter til strengemnet

I en mere generisk situation tilføjede du forekomster (objekter) af dine egne tilpassede klasser:

type TStudent = klasseprivat fName: streng; fJær: heltal; offentligejendom Navn: streng læst fname; ejendom År: heltal Læs fYear; konstruktør Skab(const navn: snor; const år: heltal); ende;... konstruktør TStudent. Skab(const navn: snor; const år: heltal); begynde fName: = navn; år: = år; ende; begynde// tilføj to streng / objekter -> studerende på listen ListBox1.AddItem ('John', TStudent. Opret ('John', 1970)); ListBox1.AddItem ('Jack', TStudent. Opret ('Jack', 1982)); // tag den første studerende - John studerende: = ListBox1.Items. Objekter [0] som TStudent; // Vis Johns år ShowMessage (IntToStr (studerende) År)); ende; 

Hvad du opretter skal du gratis

Her er, hvad Hjælpen har at sige om objekter i TStrings-efterkommere: TStrings-objektet ejer ikke de objekter, du tilføjer på denne måde. Objekter, der føjes til TStrings-objektet, findes stadig, selvom TStrings-forekomsten er ødelagt. Det skal de være eksplicit ødelagt af ansøgningen.

Når du føjer objekter til strenge - objekter, du opretter - skal du sørge for at frigøre den besatte hukommelse, ellers har du en hukommelsestab

En generisk brugerdefineret procedure FreeObjects accepterer en variabel af typen TStrings som dens eneste parameter. FreeObjects frigiver objekter, der er tilknyttet et element i strengelisten I eksemplet ovenfor er "studerende" (TStudent-klasse) knyttet til en streng i en listeboks, når applikationen er ved at blive lukket (hovedformular OnDestroy-begivenhed, f.eks.), skal du frigøre hukommelsen optaget:

 FreeObjects (ListBox1.Items); 

Bemærk: Du kalder kun denne procedure, når objekter, der er tildelt strengelementer, blev oprettet af dig.

instagram story viewer