Delphi'nin ListBox'ında bir String ile birlikte bir String saklayın

click fraud protection

Delphi'nin TListBox ve TComboBox öğelerinin bir listesini görüntüler - "seçilebilir" bir listede dizeler. TListBox kaydırılabilir bir liste, TComboBox bir açılır liste görüntüler.

Yukarıdaki tüm kontroller için ortak bir özellik, Öğeler Emlak. Öğeler, kontrolde kullanıcıya görünecek dizelerin bir listesini tanımlar. Tasarım zamanında, Items özelliğini çift tıklattığınızda, "String List Editor" dize öğeleri belirtmenize izin verir. Items özelliği aslında TStrings tipi bir torundur.

Liste Kutusunda Öğe Başına İki Dize?

Bir görüntülemek istediğiniz durumlar vardır dizi listesi liste kutusu denetiminde kullanıcıya, ancak aynı zamanda bir kullanıcıya görüntülenen satır boyunca bir ek dize daha saklayın.

Dahası, dizeye yalnızca "düz" bir dizeden daha fazlasını depolamak / eklemek isteyebilirsiniz, öğeye bir nesne ekle (dize).

Liste kutusu. Eşyalar - TStrings Nesneleri "Bilir"!

Yardım sistemine TStrings nesnesine bir kez daha bakın. İşte Nesneler her biriyle ilişkilendirilmiş bir nesne kümesini temsil eden özellik

instagram viewer
Teller Dizeler özelliğinde - Dizeler özelliğinin listedeki gerçek dizelere başvurduğu.

Liste kutusundaki her dizeye ikinci bir dize (veya nesne) atamak istiyorsanız, Çalışma zamanında Items özelliğini doldurmanız gerekir.

Kullanırken Liste kutusu. Öğeler. Ekle listeye dize eklemek için yöntem, her dize ile bir nesneyi ilişkilendirmek için başka bir yaklaşım kullanmanız gerekir.

Liste kutusu. Öğeler. Nesne Ekle yöntemi iki parametreyi kabul eder. İlk parametre "Öğe" öğenin metnidir. İkinci parametre "AObject", öğeyle ilişkilendirilmiş nesnedir.

Liste kutusunun Öğe eklemek Öğeler ile aynı olan yöntem. Nesne Ekle.

Bir Dize için İki Dize

Her iki Öğeden beri. AddObject ve AddItem, ikinci parametreleri için TObject türünde bir değişkeni kabul eder.

//Derleme hatası!
ListBox1.Items. AddObject ('zarko', 'gajic'); 

derleme hatasına neden olur: E2010 Uyumsuz türler: 'TObject' ve 'string'.

Delphi for Win32 dize değerleri nesne olmadığından, nesne için bir dize sağlayamazsınız.

Liste kutusu öğesine ikinci bir dize atamak için, bir dize değişkenini bir nesneye "dönüştürmeniz" gerekir - özel bir TString nesnesine ihtiyacınız vardır.

Dize için Tamsayı

Dize öğesiyle birlikte depolamanız gereken ikinci değer bir tamsayı değeriyse, aslında özel bir TInteger sınıfına ihtiyacınız yoktur.

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

Yukarıdaki satır, eklenen "Zarko Gajic" dizesiyle birlikte "1973" tamsayısını saklar.

Yukarıda bir tamsayıdan bir nesneye doğrudan bir tiplendirme yapılır. "AObject" parametresi aslında eklenen nesnenin 4 baytlık işaretleyicisidir (adres). Win32'de bir tamsayı 4 bayt içerdiğinden, bu kadar zor bir döküm mümkündür.

Dize ile ilişkili tamsayıyı geri almak için, "object" i tam sayı değerine döndürmeniz gerekir:

// yıl == 1973
year: = Tamsayı (ListBox1.Items. [ListBox1.Items nesneler. IndexOf ('Zarko Gajic')]); 

Dize için Delphi Denetimi

Neden burada dursun? Liste kutusundaki bir dizeye dize ve tamsayı atamak, az önce deneyimlediğiniz gibi, çok kolay.

Delphi denetimleri aslında nesne olduğundan, liste kutusunda görüntülenen her dizeye bir denetim ekleyebilirsiniz.

Aşağıdaki kod, bir formdaki tüm TButton denetimlerinin ListBox1 (liste kutusu) altyazılarına ekler (bunu formun OnCreate olay işleyicisine yerleştirin) ve her düğmeye başvuru.

var idx: tam sayı; başlaiçin idx: = 0 için -1 + ComponentCount yapmakbaşlaEğer Bileşenler [IDX] dır-dir TButton sonra ListBox1.AddObject (TButton (Components [idx]). Başlık, Bileşenler [idx]); son; son; 

Programlı olarak "ikinci" düğmesini "tıklamak" için bir sonraki ifadeyi kullanabilirsiniz:

 TButton (ListBox1.Items.. Nesne [1]) tıklayın; 

Dize Öğesine Özel Nesnelerimi Atamak İstiyorum

Daha genel bir durumda, kendi özel sınıflarınızın örneklerini (nesnelerini) eklersiniz:

tip TStudent = sınıfözel fName: string; fYear: tamsayı; halka açıkEmlak Ad: dize okunması fName; Emlak Yıl: integer okumak fYear; inşaatçı Oluşturmak(const isim: sicim; const yıl: tamsayı); son;... inşaatçı TStudent. Oluşturmak(const isim: sicim; const yıl: tamsayı); başla fAd: = ad; yıl: = yıl; son; başla// listeye iki dize / nesne -> öğrenci ekle ListBox1.AddItem ('John', TStudent. Yarat ('John', 1970)); ListBox1.AddItem ('Jack', TStudent. Yarat ('Jack', 1982)); // ilk öğrenciyi yakala - John öğrenci: = ListBox1.Items. Nesne [0] gibi TStudent; // John'un yılını göster ShowMessage (IntToStr (öğrenci. Yıl)); son; 

Ne Oluşturursanız Ücretsiz Olmalısınız

Yardım'ın TStrings torunlarındaki nesneler hakkında söyledikleri şunlardır: TStrings nesnesi, bu şekilde eklediğiniz nesnelere sahip değil. TStrings nesnesine eklenen nesneler, TStrings örneği yok edilse bile hala mevcuttur. Olmalılar açıkça yok edildi uygulama tarafından.

Dizelere - oluşturduğunuz nesneler - nesne eklediğinizde, kullanılan belleği boşalttığınızdan emin olmanız gerekir; bellek sızıntısı

Genel bir özel yordam FreeObjects, TStrings türünde bir değişkeni tek parametresi olarak kabul eder. FreeObjects, dize listesindeki bir öğeyle ilişkili nesneleri serbest bırakır. Yukarıdaki örnekte, "öğrenciler" (TStudent sınıfı) liste kutusunda bir dize, uygulama kapanmak üzereyken (örneğin ana form OnDestroy olayı), belleği boşaltmanız gerekir meşgul:

 FreeObjects (ListBox1.Items); 

Not: Bu yordamı yalnızca dize öğelerine atanan nesneler sizin tarafınızdan oluşturulduğunda çağırırsınız.

instagram story viewer