Salvestage keelpill koos stringiga Delphi nimekirjas Box

Delphi TListBox ja TComboBox kuvavad üksuste loendi - stringid "valitavas" loendis. TListBox kuvab keritavat nimekirja, TComboBox kuvab ripploendi.

Kõigi ülaltoodud juhtelementide ühine omadus on Esemed vara. Üksused määratlevad stringide loendi, mis kuvatakse kasutajale juhtelemendis. Kujunduse tegemise ajal, kui topeltklõpsate atribuuti Üksused, võimaldab "Stringiloendi redaktor" teil määrata stringiüksused. Üksuste omadus on tegelikult TStringi tüüpi järeltulija.

Kaks stringi üksuse kohta loendikastis?

On olukordi, kus soovite kuvada a keelpillide loetelu kasutajale, näiteks loendikasti juhtelemendis, aga ka teil on võimalus seda teha salvestage lisaks kasutajale kuvatavale veel üks täiendav string.

Veelgi enam, võiksite salvestada / kinnitada stringi külge rohkem kui lihtsalt tavalise stringi, võiksite seda teha objekti juurde lisamine (string).

Loendikast. Esemed - TStrings "teab" objekte!

Andke objektile TStrings veel üks kord spikrisüsteemis pilk. Seal on Objektid atribuut, mis tähistab objektide kogumit, mis on seotud iga atribuudiga

instagram viewer
keelpillid atribuudis Strings - kus atribuut Stringid viitab loendis olevatele tegelikele stringidele.

Kui soovite määrata igale stringi jaoks loendikastis teise stringi (või objekti), peate atribuudi Üksused asustama käitamisajal.

Kuigi saate kasutada Loendikast. Esemed. Lisama meetod stringi lisamiseks loendisse ja objekti seostamiseks iga stringi abil peate kasutama muud lähenemisviisi.

Loendikast. Esemed. AddObject meetod aktsepteerib kahte parameetrit. Esimene parameeter "Üksus" on üksuse tekst. Teine parameeter "AObject" on objektiga seotud objekt.

Pange tähele, et loendikast paljastab AddItem meetod, mis teeb sama mis üksused. AddObject.

Kaks keelt ühe keelpilli jaoks

Kuna mõlemad esemed. AddObject ja AddItem aktsepteerivad TObject tüüpi muutujat nende teise parameetri jaoks, rea nagu:

// kompileeri viga!
Loendiboks1.üksused. AddObject ('zarko', 'gajic'); 

toob kaasa kompileerimisvea: E2010 sobimatud tüübid: 'TObject' ja 'string'.

Objekti stringi lihtsalt sisestada ei saa, kuna Delphi for Win32 korral pole stringi väärtused objektid.

Teise stringi lisamiseks loendikasti üksusele peate stringi muutuja objektiks "muundama" - vajate kohandatud TStringi objekti.

Stringi täisarv

Kui teine ​​väärtus, mida peate koos stringiüksusega salvestama, on täisarv, ei vaja te tegelikult kohandatud TIntegeri klassi.

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

Ülaltoodud rida salvestab täisarvu "1973" koos lisatud stringi "Zarko Gajic".

Ülal on tehtud otsene kirjatüüp täisarvust objektile. Parameeter "AObject" on tegelikult lisatud objekti 4-baidine osuti (aadress). Kuna Win32-s võtab täisarv 4 baiti, on selline kõva ülekandmine võimalik.

Stringiga seotud täisarvu tagasi saamiseks peate "objekti" tagasi täisarvu juurde laskma:

// aasta == 1973
aasta: = täisarv (nimekiriBox1.üksused. Objektid [ListBox1.Items. IndexOf ('Zarko Gajic')]); 

Delphi juhtnöör keelpillidele

Miks siin peatuda? Stringide ja täisarvude määramine stringi jaoks loendikastis on nagu äsja kogenud, tükk kooki.

Kuna Delphi juhtelemendid on tegelikult objektid, saate juhtelemendi lisada igale loendikastis kuvatavale stringile.

Järgmine kood lisab kõigi TButtoni juhtelementide loendikasti1 (loendikasti) pealdised vormile (pange see vormi OnCreate'i sündmuste käitlejasse) koos viitega igale nupule.

var idx: täisarv; alustadajaoks idx: = 0 kuni -1 + ComponentCount tehaalustadakui Komponendid [idx] on TB nupp siis ListBox1.AddObject (TButton (komponendid [idx]). Tiitrid, komponendid [idx]); lõpp; lõpp; 

Programmiliselt "teise" nupu klõpsamiseks võite kasutada järgmist avaldust:

 TBnupp (loeteluboks1.üksused. Objektid [1]) Klõpsake; 

Soovin keelteüksusele omistada oma kohandatud objektid

Üldisemas olukorras lisate oma kohandatud klasside eksemplarid (objektid):

tüüp TStudent = klassprivaatne fName: string; fYear: täisarv; avalikvara Nimi: keelpill loetud fName; vara Aasta: täisarv loe FYear; ehitaja Loo (const nimi: nöör; const aasta: täisarv); lõpp;... ehitaja TStudent. Loo (const nimi: nöör; const aasta: täisarv); alustada fName: = nimi; fYear: = aasta; lõpp; alustada// lisage nimekirja kaks stringi / objekti -> õpilast ListBox1.AddItem ('John', TStudent. Loo ('John', 1970)); ListBox1.AddItem ('Jack', TStudent. Loo ('Jack', 1982)); // haara esimene õpilane - Johannes õpilane: = ListBox1.Items. Objektid [0] kui TStudent; // kuva Johannese aasta ShowMessage (IntToStr (õpilane. Aasta)); lõpp; 

Mida loote, peate vabaks saama

Sellel on spikri ütlus TStringsi järeltulijate objektide kohta: objekt TStrings ei oma objekte, mille sel viisil lisate. Objektile, mis on lisatud TStringsi objektile, on see olemas, isegi kui TStringsi eksemplar hävitatakse. Nad peavad olema hävitatud selgesõnaliselt rakenduse poolt.

Kui lisate stringidele objekte - loodud objekte -, peate kindlasti vabastama hõivatud mälu. Vastasel juhul on teil a mäluleke

Üldine kohandatud protseduur FreeObjects aktsepteerib ainsa parameetrina muutuja tüüpi TStrings. FreeObjects vabastab kõik stringide loendi üksusega seotud objektid. Ülaltoodud näites on "õpilased" (TStudentide klass) lisatud string loendikastis, kui rakendus peagi suletakse (näiteks OnDestroy põhisündmus), peate mälu vabastama hõivatud:

 FreeObjects (ListBox1.Items); 

Märkus. Kutsute seda protseduuri ainult siis, kui olete loonud stringielementidele määratud objektid.

instagram story viewer