Dirancang untuk memungkinkan pengguna untuk melihat dan mengedit data dalam kisi tabular, the DBGrid menyediakan berbagai cara untuk menyesuaikan cara data itu mewakili data "nya". Dengan begitu banyak fleksibilitas, a Delphi pengembang selalu dapat menemukan cara baru untuk membuatnya lebih kuat.
Salah satu fitur yang hilang dari TDBGrid adalah bahwa tidak ada opsi untuk secara otomatis menyesuaikan lebar kolom tertentu agar benar-benar sesuai dengan lebar klien grid. Saat Anda mengubah ukuran komponen DBGrid saat runtime, lebar kolom tidak diubah ukurannya.
Jika lebar DBGrid lebih besar dari lebar total semua kolom, Anda akan mendapatkan area kosong tepat setelah kolom terakhir. Di sisi lain, jika lebar total semua kolom lebih besar dari lebar DBGrid, bilah gulir horizontal akan muncul.
Secara otomatis menyesuaikan lebar kolom DBGrid
Ada satu prosedur praktis yang dapat Anda ikuti yang memperbaiki lebar kolom DBGrid selektif ketika grid diubah ukurannya saat runtime.
Penting untuk dicatat bahwa, biasanya, hanya dua hingga tiga kolom dalam DBGrid yang sebenarnya perlu diubah ukurannya secara otomatis; semua kolom lainnya menampilkan beberapa data "statis-lebar". Misalnya, Anda selalu dapat menentukan lebar tetap untuk kolom yang menampilkan nilai dari bidang data yang direpresentasikan dengan TDateTimeField, TFloatField, TIntegerField, dan yang serupa.
Terlebih lagi, Anda mungkin akan membuat (pada waktu desain) komponen persisten menggunakan editor Fields, untuk menentukan bidang dalam dataset, propertinya, dan urutannya. Dengan objek keturunan TField, Anda dapat menggunakan properti Tag untuk menunjukkan bahwa kolom tertentu yang menampilkan nilai untuk bidang itu harus berukuran otomatis.
Ini adalah gagasannya: Jika Anda ingin sebuah kolom menyesuaikan secara otomatis ruang yang tersedia, tetapkan nilai integer untuk properti Tag descendant TField yang menunjukkan lebar minimum kolom yang sesuai.
Prosedur FixDBGridColumnsWidth
Sebelum Anda mulai, di Acara OnCreate untuk objek Formulir yang berisi DBGrid, tentukan kolom apa yang perlu diubah ukurannya secara otomatis dengan menetapkan nilai bukan nol untuk properti Tag dari objek TField yang sesuai.
prosedur TForm1.FormCreate (Pengirim: TObject);
mulai// atur kolom yang dapat diotomatiskan dengan menetapkan
// Lebar Minim pada properti Tag.
// menggunakan nilai tetap: 40 px
Table1.FieldByName ('FirstName'). Tag: = 40;
// menggunakan nilai variabel: lebar
// teks judul kolom default Table1.FieldByName ('LastName'). Tag: = 4 + Kanvas. TextWidth (Table1.FieldByName ('LastName'). DisplayName);
akhir;
Dalam kode di atas, Table1 adalah komponen TTable yang terhubung ke a Komponen DataSource, yang dihubungkan dengan DBGrid. Properti Table1.Table menunjuk ke tabel Karyawan DBDemos.
Kami telah menandai kolom yang menampilkan nilai-nilai untuk bidang FirstName dan LastName yang dapat disetel ulang secara otomatis. Langkah selanjutnya adalah memanggil FixDBGridColumnsWidth kami di pengendali event OnResize untuk Formulir:
prosedur TForm1.FormResize (Pengirim: TObject);
mulai FixDBGridColumnsWidth (DBGrid1);
akhir;
catatan: Semua ini masuk akal jika properti Align dari DBGrid termasuk salah satu dari nilai berikut: alTop, alBottom, alClient, atau alCustom.
Akhirnya, inilah kode prosedur FixDBGridColumnsWidth:
prosedur FixDBGridColumnsWidth (const DBGrid: TDBGrid);
var i: integer; TotWidth: integer; VarWidth: integer; ResizableColumnCount: integer; AColumn: TColumn;
mulai// total lebar semua kolom sebelum mengubah ukuran
TotWidth: = 0;
// bagaimana membagi ruang ekstra di grid
VarWidth: = 0;
// berapa banyak kolom yang perlu diubah ukurannya secara otomatis
ResizableColumnCount: = 0;
untuk i: = 0 untuk -1 + DBGrid. Kolom Menghitung dobegin
TotWidth: = TotWidth + DBGrid. Kolom [i] .Lebar;
jika DBGrid. Kolom [i] .Luar. Tandai 0 kemudian
Inc (ResizableColumnCount);
akhir;
// tambahkan 1px untuk garis pemisah kolomjika dgColLines di DBGrid. Pilihan kemudian
TotWidth: = TotWidth + DBGrid. Kolom Menghitung;
// tambahkan lebar kolom indikatorjika dgIndicator di DBGrid. Pilihan kemudian
TotWidth: = TotWidth + IndicatorWidth;
// lebar vale "kiri"
VarWidth: = DBGrid. ClientWidth - TotWidth;
// Sama-sama mendistribusikan VarWidth
// ke semua kolom yang dapat disetel ulang otomatisjika ResizableKolom Kolom> 0 kemudian
VarWidth: = varWidth div ResizableColumnCount;
untuk i: = 0 untuk -1 + DBGrid. Kolom Menghitung dobegin
AColumn: = DBGrid. Kolom [i];
jika Sebuah kolom. Bidang. Tandai 0 maka mulailah
Sebuah kolom. Lebar: = AColumn. Lebar + Lebar Lebar;
jika Sebuah kolom. Lebar itu
Sebuah kolom. Lebar: = AColumn. Bidang. Menandai;
akhir;
akhir;
akhir; (* FixDBGridColumnsWidth *)