Shranjevanje niza skupaj z nizom v seznamu Delphi's ListBox

Delphijevi TListBox in TComboBox prikazujejo seznam elementov - nizov na "izbiranem" seznamu. TListBox prikaže seznam, ki ga je mogoče premikati, TComboBox pa prikaže spustni seznam.

Skupna lastnost vseh zgornjih kontrol je Predmeti premoženje. Elementi določajo seznam nizov, ki se bodo pojavili v nadzoru uporabniku. Ob načrtovanju, ko dvokliknete lastnost Postavke, vam "Urejevalnik seznama nizov" omogoči določitev nizov. Lastnost Items je pravzaprav potomec vrste TStrings.

Dve struni na kos na seznamuBox?

Obstajajo situacije, ko želite prikazati a seznam strun do uporabnika, na primer v nadzornem polju seznama, vendar imajo tudi način, kako to storiti shrani še en dodaten niz vzdolž tistega, ki je prikazan uporabniku.

Še več, morda bi želeli v niz shraniti / priložiti več kot le "navaden" niz priloži predmet na element (niz).

ListBox. Predmeti - TStrings "Knows" Predmeti!

Predmetu TStrings še enkrat poglejte v sistem pomoči. Tu je tisto Predmeti lastnost, ki predstavlja niz predmetov, ki so povezani z vsakim od

instagram viewer
strune v lastnosti Strings - kjer lastnost Strings navaja dejanske nize na seznamu.

Če želite vsakemu nizu v seznamu okenca dodeliti drugi niz (ali predmet), morate med izvajanjem vstaviti lastnost Postavke.

Čeprav lahko uporabite ListBox. Predmeti. Dodaj Če želite dodati niz nizov na seznam, če želite predmet povezati z vsakim nizom, boste morali uporabiti drug pristop.

The ListBox. Predmeti. AddObject metoda sprejme dva parametra. Prvi parameter, "Postavka", je besedilo predmeta. Drugi parameter, "AObject", je objekt, povezan s postavko.

Upoštevajte, da je v seznamu prikazano polje AddItem metoda, ki deluje enako kot Predmeti. AddObject.

Dve struni za en niz

Ker sta obe predmeti. AddObject in AddItem sprejmeta spremenljivko tipa TObject za svoj drugi parameter, vrstico, kot je:

// napaka pri sestavljanju!
SeznamBox1.Items. AddObject ('zarko', 'gajic'); 

bo prišlo do napake pri prevajanju: E2010 Nezdružljive vrste: 'TObject' in 'string'.

Ne morete preprosto priskrbeti niza za predmet, saj v nizu vrednosti niza Delphi za Win32 niso predmeti.

Če želite elementu seznama dodeliti drugi niz, morate spremeniti niz spremenljivke v predmet - potrebujete predmet TString po meri.

Celoten niz za niz

Če je druga vrednost, ki jo morate shraniti skupaj z elementom niza, celo število, dejansko ne potrebujete razreda TInteger po meri.

 ListBox1.AddItem ('Žarko Gajić', TObject (1973)); 

V zgornji vrstici je shranjena cela številka "1973" in dodan niz "Žarko Gajić".

Zgoraj je izdelan neposreden tip iz celega števila v objekt. Parameter "AObject" je dejansko 4-bajtni kazalec (naslov) dodanega predmeta. Ker v Win32 celo število zaseda 4 bajte - takšen trdi odsek je mogoč.

Če želite vrniti celo število, povezano z nizom, morate "predmet" vrniti nazaj na celo število:

// leto == 1973
leto: = Integer (ListBox1.Items). Predmeti [ListBox1.Items. IndexOf ('Žarko Gajić')]); 

Delphi kontrola za niz

Zakaj bi se ustavili tukaj? Dodelitev nizov in celih nizov v seznamu polje je, kot ste pravkar doživeli, kos pogače.

Ker so kontrolniki Delphi pravzaprav predmeti, lahko na vsak niz, prikazan v seznamu, pripnete kontrolnik.

Naslednja koda doda seznamom ListBox1 (seznam okenc) vseh kontrolnikov TButton na obrazcu (to postavite v obdelovalec dogodkov v obliki OnCreate) skupaj s sklicevanjem na vsak gumb.

var idx: celo število; začetiza idx: = 0 do -1 + ComponentCount storizačetiče Komponente [idx] je TButton torej ListBox1.AddObject (TButton (Components [idx]). Napis, komponente [idx]); konec; konec; 

Če želite programsko "klikniti" drugi gumb, uporabite naslednji stavek:

 TButton (ListBox1.Items). Predmeti [1]) Kliknite; 

Postavki strune želim dodeliti svoje predmete po meri

V bolj splošni situaciji bi dodali primerke (predmete) lastnih razredov po meri:

tip TStudent = razredzasebno fName: string; let: celo število; javnostipremoženje Ime: branje niza fName; premoženje Leto: celo število prebrati LETO; konstruktor Ustvari (konst ime: vrvica; konst leto: celo število); konec;... konstruktor TStudent. Ustvari (konst ime: vrvica; konst leto: celo število); začeti fName: = ime; let: = leto; konec; začeti// na seznam dodajte dva niza / predmeta -> študente ListBox1.AddItem ('John', TStudent. Ustvari ('John', 1970)); ListBox1.AddItem ('Jack', TStudent. Ustvari ('Jack', 1982)); // zgrabite prvega učenca - Johna študent: = ListBox1.Items. Predmeti [0] kot TStudent; // prikaz Janezovo leto ShowMessage (IntToStr (študent) Leto)); konec; 

Kaj morate ustvariti, mora biti brez

Tukaj je tisto, kar Pomoč pove o predmetih v potomcih TStrings: objekt TStrings nima v lasti predmetov, ki jih dodate na ta način. Predmeti, dodani TStrings objektu, še vedno obstajajo, tudi če je primerek TStrings uničen. Morajo biti izrecno uničen z aplikacijo.

Ko dodate predmete v strune - predmete, ki jih ustvarite - morate poskrbeti, da boste sprostili zasedeni pomnilnik ali pa boste imeli puščanje spomina

Splošni postopek po meri FreeObjects sprejema spremenljivko tipa TStrings kot edini parameter. FreeObjects bo osvobodil vse predmete, povezane s elementom na seznamu nizov. V zgornjem primeru so "študentje" (razred TStudent) pritrjeni na niz v polju s seznamom, ko bo aplikacija zaprta (na primer glavni dogodek OnDestroy), morate sprostiti pomnilnik zasedena:

 FreeObjects (ListBox1.Items); 

Opomba: Ta postopek pokličete samo, ko ste sami ustvarili predmete, dodeljene elementom niza.