TListBox dan TComboBox Delphi menampilkan daftar item - string dalam daftar "yang dapat dipilih". TListBox menampilkan daftar yang dapat digulir, TComboBox menampilkan daftar drop-down.
Properti umum untuk semua kontrol di atas adalah Item Properti. Item menentukan daftar string yang akan muncul di kontrol ke pengguna. Pada waktu desain, ketika Anda mengklik dua kali properti Item, "Editor Daftar String" memungkinkan Anda menentukan item string. Properti Items sebenarnya adalah turunan tipe TStrings.
Dua String Per Item di ListBox?
Ada situasi ketika Anda ingin menampilkan a daftar string kepada pengguna, misalnya dalam kontrol kotak daftar, tetapi juga memiliki cara untuk menyimpan satu string tambahan di sepanjang yang ditampilkan kepada pengguna.
Terlebih lagi, Anda mungkin ingin menyimpan / melampirkan lebih dari sekedar string "polos" ke string, Anda mungkin ingin melampirkan objek ke item (string).
Kotak daftar. Item - TStrings "Tahu" Objek!
Berikan objek TStrings sekali lagi melihat dalam sistem Bantuan. Itu ada
Benda properti yang mewakili satu set objek yang terkait dengan masing-masing string di properti Strings - di mana properti String merujuk string yang sebenarnya dalam daftar.Jika Anda ingin menetapkan string kedua (atau objek) untuk setiap string dalam kotak daftar, Anda perlu mengisi properti Item saat run-time.
Meskipun Anda dapat menggunakan Kotak daftar. Item. Menambahkan metode untuk menambahkan string ke daftar, untuk mengaitkan objek dengan setiap string, Anda perlu menggunakan pendekatan lain.
Itu Kotak daftar. Item. AddObject Metode menerima dua parameter. Parameter pertama, "Item" adalah teks dari item tersebut. Parameter kedua, "AObject" adalah objek yang terkait dengan item.
Perhatikan bahwa kotak daftar memperlihatkan Tambahkan Barang metode yang melakukan hal yang sama dengan Item. AddObject.
Dua String untuk Satu String
Karena kedua Item. AddObject dan AddItem menerima variabel tipe TObject untuk parameter kedua mereka, sebuah baris seperti:
// kompilasi kesalahan!
ListBox1.Items. AddObject ('zarko', 'gajic');
akan menghasilkan kesalahan kompilasi: E2010 Jenis yang tidak kompatibel: 'TObject' dan 'string'.
Anda tidak bisa begitu saja menyediakan string untuk objek karena dalam Delphi for Win32 nilai string bukan objek.
Untuk menetapkan string kedua ke item kotak daftar, Anda perlu "mengubah" variabel string menjadi objek - Anda memerlukan objek TString khusus.
Integer untuk sebuah String
Jika nilai kedua yang perlu Anda simpan bersama dengan item string adalah nilai integer, Anda sebenarnya tidak memerlukan kelas TInteger khusus.
ListBox1.AddItem ('Zarko Gajic', TObject (1973));
Baris di atas menyimpan angka integer "1973" bersama dengan string "Zarko Gajic" yang ditambahkan.
Typecast langsung dari integer ke objek dibuat di atas. Parameter "AObject" sebenarnya adalah pointer 4-byte (alamat) dari objek yang ditambahkan. Karena di Win32 sebuah integer menempati 4 byte - hard disk semacam itu dimungkinkan.
Untuk mendapatkan kembali integer yang terkait dengan string, Anda perlu mengembalikan "objek" ke nilai integer:
// tahun == 1973
tahun: = Integer (ListBox1.Items. Objek [ListBox1.Items. IndexOf ('Zarko Gajic')]);
Kontrol Delphi untuk sebuah String
Kenapa berhenti di sini? Menetapkan string dan integer ke string dalam kotak daftar, seperti yang baru saja Anda alami, sepotong kue.
Karena kontrol Delphi sebenarnya adalah objek, Anda dapat melampirkan kontrol ke setiap string yang ditampilkan di kotak daftar.
Kode berikut menambah keterangan ListBox1 (kotak daftar) dari semua kontrol TButton pada formulir (letakkan ini di event handler OnCreate formulir) bersama dengan referensi untuk setiap tombol.
var idx: integer; mulaiuntuk idx: = 0 untuk -1 + ComponentCount melakukanmulaijika Komponen [idx] adalah TButton kemudian ListBox1.AddObject (TButton (Components [idx]). Caption, Components [idx]); akhir; akhir;
Untuk secara pemrograman "klik" tombol "kedua", Anda dapat menggunakan pernyataan berikut:
TButton (ListBox1.Items. Objek [1]) .Klik;
Saya Ingin Menetapkan Objek Kustom Saya ke Item String
Dalam situasi yang lebih umum Anda akan menambahkan instance (objek) dari kelas kustom Anda sendiri:
Tipe TStudent = kelaspribadi fName: string; tahun: integer; publikProperti Nama: string membaca fName; Properti Tahun: integer Baca tahun; konstruktor Membuat(const nama: tali; const tahun: integer); akhir;... konstruktor TStudent. Membuat(const nama: tali; const tahun: integer); mulai fName: = name; tahun: = tahun; akhir; mulai// tambahkan dua string / objek -> siswa ke daftar ListBox1.AddItem ('John', TStudent. Buat ('John', 1970)); ListBox1.AddItem ('Jack', TStudent. Buat ('Jack', 1982)); // ambil siswa pertama - John pelajar: = ListBox1.Items. Objek [0] sebagai TStudent; // tampilkan tahun John ShowMessage (IntToStr (pelajar. Tahun)); akhir;
Apa yang Anda Buat Anda Harus Gratis
Inilah yang dikatakan Bantuan tentang objek dalam keturunan TStrings: objek TStrings tidak memiliki objek yang Anda tambahkan dengan cara ini. Objek yang ditambahkan ke objek TStrings masih ada bahkan jika instance TStrings dihancurkan. Mereka pasti hancur secara eksplisit oleh aplikasi.
Ketika Anda menambahkan objek ke string - objek yang Anda buat - Anda harus memastikan Anda membebaskan memori yang ditempati, atau Anda akan memiliki kebocoran memori
Prosedur kustom generik FreeObjects menerima variabel tipe TStrings sebagai satu-satunya parameter. FreeObjects akan membebaskan objek yang terkait dengan item dalam daftar string Dalam contoh di atas, "siswa" (kelas TStudent) dilampirkan ke string dalam kotak daftar, ketika aplikasi akan ditutup (bentuk utama acara OnDestroy, misalnya), Anda perlu membebaskan memori ditempati:
FreeObjects (ListBox1.Items);
Catatan: Anda hanya memanggil prosedur ini ketika objek yang ditetapkan untuk item string dibuat oleh Anda.