//Kod bir siteden alıntıdır
TDBGrid nesnesi bildiğiniz üzere son derece kullanışlı imkanlar sunar veri tabanı programcılarına. Ancak gözden kaçan ,bir özellik vardır ki, aslında pek umursanmasa da tasarım açısından dikkat çekicidir. Programlama esnasında alanların (field) uzunlukları komponent tarafından otomatik olarak veya bizim vereceğimiz sınırlarla atanacaktır. Kullanıcı run-time olarak sütun genişliğini ayarladığında boş bir sütun ile karşılaşılacaktır. Daha doğrusu sütunların toplam genişlik boyutu altına düşüldüğünde, boş bir sütun ile karşılaşırız.
Şimdi sütun genişliklerinin otomatik olarak grid içerisine ölçülendirme işlemini gerçekleştirelim. Örnek veri tabanımızda üç veri alanı bulunsun. Genelde kullandığımız yöntem grid alanlarının ölçülerinin sabit olarak verilmesidir. İşin püf noktası otomatik ölçülendirme için kullanacağımız alanı belirlemek ve TField nesnesi yardımı ile Tag özelliğini kullanmak.
Şimdi program kodunu inceleyelim:
Formun OnCreate olayına, hareketli ölçülendirme için kullanacağımız alanı belirlemeli ve minimum ölçü değerini vermeliyiz. Daha önce de söylediğimiz gibi TField nesnesinden yola çıkacağız.
procedure TForm1.FormCreate(Sender: TObject);
begin //Tag özelliğine minimum değer atamasını yapıyoruz.
Table1.FieldByName('FirstName').Tag := 40; Table1.FieldByName('LastName').Tag := 4 + Canvas.TextWidth( Table1.FieldByName('LastName').DisplayName);
end;
Yukarıda Table1 nesnesi TTable dan türeme ve bir TDataSource nesnesi ile TDBGrid yani DBGrid1 nesnesine bağlanıyor. Table1 nesnesi DBDemos->Employee veri tabanına bağlanıyor. Örnek olarak “FirstName” ve “LastName” alanlarını seçelim. Bu alanlar için otosize olayını gerçekleştireceğiz. Formun OnResize seçeneğinden “FixDBGridColumnsWidth” procedure ünü çağıralım ve tabîki ilgili grdi nesnesini de.
procedure TForm1.FormResize(Sender: TObject);
begin
FixDBGridColumnsWidth(DBGrid1);
end;
Note: this all makes sense if the Align property of the DBGrid includes one of following values: alTop, alBottom, alClient or alCustom.
Şimdi procedure için kodu yazalım.
procedure FixDBGridColumnsWidth(const DBGrid: TDBGrid);
var
i : integer;
TotWidth : integer;
VarWidth : integer;
ResizableColumnCount : integer;
AColumn : TColumn;
begin
//Resize işleminden önce tüm kolonlaın width özelliğini 0 yapalım
TotWidth := 0; //fazlalık boş alanları nasıl paylaştıracağımızı ayarlayalım
VarWidth := 0; //resize için gerekli kolon sayısını ayarlayalım
ResizableColumnCount := 0;
for i := 0 to -1 + DBGrid.Columns.Count do begin TotWidth := TotWidth + DBGrid.Columns[i].Width;
if DBGrid.Columns[i].Field.Tag <> 0 then
Inc(ResizableColumnCount); end;
//kolonların ayrılması için 1 px lik boşluk ayıralım
if dgColLines in DBGrid.Options then TotWidth := TotWidth + DBGrid.Columns.Count;
if dgIndicator in DBGrid.Options then TotWidth := TotWidth + IndicatorWidth; VarWidth := DBGrid.ClientWidth - TotWidth;
if ResizableColumnCount > 0 then
VarWidth := varWidth div ResizableColumnCount; for i := 0 to -1 + DBGrid.Columns.Count do begin AColumn := DBGrid.Columns[i];
if AColumn.Field.Tag <> 0 then begin AColumn.Width := AColumn.Width + VarWidth;
if AColumn.Width < AColumn.Field.Tag then AColumn.Width := AColumn.Field.Tag;
end;
end;
end;