Ada banyak cara dan alasan untuk menyesuaikan output dari a DBGrid di Delphi. Salah satu caranya adalah dengan menambahkan kotak centang sehingga hasilnya lebih menarik secara visual.
Secara default, jika Anda memiliki bidang boolean di dataset Anda, DBGrid menampilkannya sebagai "Benar" atau "Salah" tergantung pada nilai bidang data. Namun, itu terlihat jauh lebih baik jika Anda memilih untuk menggunakan kontrol kotak centang "benar" untuk mengaktifkan pengeditan bidang.
Buat Aplikasi Contoh
Mulai formulir baru di Delphi, dan tempatkan TDBGrid, TADOTable, dan TADOConnection, TDataSource.
Biarkan semua nama komponen seperti saat pertama kali dimasukkan ke dalam formulir (DBGrid1, ADOQuery1, AdoTable1, dll.). Gunakan Object Inspector untuk mengatur properti ConnectionString komponen ADOConnection1 (TADOConnection) untuk menunjuk ke sampel QuickiesContest.mdb database MS Access.
Hubungkan DBGrid1 ke DataSource1, DataSource1 ke ADOTable1, dan akhirnya ADOTable1 ke ADOConnection1. Properti ADNTable1 TableName harus mengarah ke tabel Artikel (untuk membuat DBGrid menampilkan catatan tabel Artikel).
Jika Anda telah mengatur semua properti dengan benar, ketika Anda menjalankan aplikasi (mengingat bahwa properti Active dari komponen ADOTable1 adalah Benar) Anda akan melihat, secara default, DBGrid menampilkan nilai bidang boolean sebagai "Benar" atau "Salah" tergantung pada nilai data bidang.
Kotak centang dalam DBGrid
Untuk menunjukkan kotak centang di dalam sel DBGrid, kita harus membuatnya tersedia untuk kita saat run time.
Pilih halaman "Kontrol data" pada halaman Palet Komponen dan pilih a TDBCheckbox. Letakkan satu di mana saja pada formulir - tidak masalah di mana, karena sebagian besar waktu itu tidak akan terlihat atau mengambang di atas kotak.
Tip: TDBCheckBox adalah kontrol sadar data yang memungkinkan pengguna memilih atau membatalkan nilai tunggal, yang sesuai untuk bidang boolean.
Selanjutnya, tetapkan properti Terlihat ke Salah. Ubah properti Color dari DBCheckBox1 ke warna yang sama dengan DBGrid (sehingga menyatu dengan DBGrid) dan hapus Caption.
Yang paling penting, pastikan DBCheckBox1 terhubung ke DataSource1 dan ke bidang yang benar.
Perhatikan bahwa semua nilai properti DBCheckBox1 di atas dapat diatur dalam acara OnCreate formulir seperti ini:
prosedur TForm1.FormCreate (Pengirim: TObject);
mulai
DBCheckBox1.DataSource: = DataSource1;
DBCheckBox1.DataField: = 'Pemenang';
DBCheckBox1.Visible: = Salah;
DBCheckBox1.Color: = DBGrid1.Color;
DBCheckBox1.Caption: = '';
// dijelaskan nanti dalam artikel
DBCheckBox1.ValueChecked: = 'Ya Pemenang!';
DBCheckBox1.ValueUnChecked: = 'Tidak kali ini.';
akhir;
Apa yang terjadi selanjutnya adalah bagian yang paling menarik. Saat mengedit bidang boolean di DBGrid, kita perlu memastikan DBCheckBox1 ditempatkan di atas ("mengambang") sel di DBGrid yang menampilkan bidang boolean.
Untuk sel-sel (non-fokus) lainnya yang membawa bidang boolean (di kolom "Pemenang"), kita perlu memberikan beberapa representasi grafis dari nilai boolean (Benar / Salah). Ini berarti Anda memerlukan setidaknya dua gambar untuk menggambar: satu untuk kondisi yang dicentang (Nilai sebenarnya) dan satu untuk kondisi yang tidak dicentang (Nilai salah).
Cara termudah untuk mencapai ini adalah dengan menggunakan fungsi Windows API DrawFrameControl untuk menggambar langsung pada kanvas DBGrid.
Berikut kode dalam event handler DBDDD OnDrawColumnCell yang terjadi ketika grid perlu mengecat sel.
prosedur TForm1.DBGrid1DrawColumnCell (
Pengirim: TObject; const Rect: TRect; DataCol:
Bilangan bulat; Kolom: TColumn; Negara: TGridDrawState);
const IsChecked: Himpunan[Boolean] dari Integer =
(DFCS_BUTTONCHECK, DFCS_BUTTONCHECK atau DFCS_CHECKED);
var
DrawState: Integer;
DrawRect: TRect;
mulai jika (gdFocused di Negara) thenbeginif (Kolom. Bidang. FieldName = DBCheckBox1.DataField) maka mulailah
DBCheckBox1.Left: = Rect. Kiri + DBGrid1.Left + 2;
DBCheckBox1.Top: = Rect. Top + DBGrid1.top + 2;
DBCheckBox1.Width: = Rect. Kanan - Persegi. Kiri;
DBCheckBox1.Height: = Rect. Bawah - Persegi. Teratas;
DBCheckBox1.Visible: = Benar;
endendelsebeginif (Kolom. Bidang. FieldName = DBCheckBox1.DataField) maka mulailah
DrawRect: = Rect;
InflateRect (DrawRect, -1, -1);
DrawState: = ISChecked [Kolom. Bidang. AsBoolean];
DBGrid1.Canvas. FillRect (Rect);
DrawFrameControl (DBGrid1.Canvas. Menangani, DrawRect,
DFC_BUTTON, DrawState);
akhir;
akhir;
akhir;
Untuk menyelesaikan langkah ini, kita perlu memastikan DBCheckBox1 tidak terlihat ketika kita meninggalkan sel:
prosedur TForm1.DBGrid1ColExit (Pengirim: TObject);
mulai jika DBGrid1 .Pilih Terpilih. FieldName = DBCheckBox1.DataField kemudian
DBCheckBox1.Visible: = Salah
akhir;
Kami hanya perlu dua acara lagi untuk ditangani.
Perhatikan bahwa ketika dalam mode pengeditan, semua penekanan tombol menuju ke sel DBGrid, kita harus memastikan semuanya dikirim ke Kotak Centang. Dalam kasus Kotak Centang, kami terutama tertarik pada tombol [Tab] dan [Spasi]. [Tab] harus memindahkan fokus input ke sel berikutnya, dan [Spasi] harus mengaktifkan keadaan Kotak Centang.
prosedur TForm1.DBGrid1KeyPress (Pengirim: TObject; var Key: Char);
mulai jika (kunci = Chr (9)) lalu Keluar;
jika (DBGrid1. Pilihan Dipilih. FieldName = DBCheckBox1.DataField) maka mulailah
DBCheckBox1.SetFocus;
SendMessage (DBCheckBox1.Handle, WM_Char, word (Key), 0);
akhir;
akhir;
Mungkin pantas untuk Caption kotak centang untuk berubah karena pengguna memeriksa atau menghapus centang pada kotak. Perhatikan bahwa DBCheckBox memiliki dua properti (ValueChecked dan ValueUnChecked) yang digunakan untuk menentukan nilai bidang yang diwakili oleh kotak centang ketika dicentang atau tidak dicentang.
Properti ValueChecked ini berisi "Ya, Pemenang!", Dan ValueUnChecked sama dengan "Tidak kali ini."
prosedur TForm1.DBCheckBox1Click (Pengirim: TObject);
mulai jika DBCheckBox1.Checked kemudian
DBCheckBox1.Caption: = DBCheckBox1.ValueChecked
lain
DBCheckBox1.Caption: = DBCheckBox1.ValueUnChecked;
akhir;
Jalankan proyek dan Anda akan melihat kotak centang di seluruh kolom bidang Pemenang.