Öyle yada böyle veritabanı ile uğraşanların dbgridde gösterdiği kayıtları renklendirme ihtiyacı olmuştur.
Genelde satır bazlı renklendirme ile problemlerimizi çözsede arada sütunlarında renklendirilmesini isteyen kullanıcılar olabiliyor. Genelde tüm satırın belli bir değere göre renklendirme üzerine kodlar var. Ancak alanın değerine göre sadece bir hücreyi renklendirmek istiyyorsak ne yapacağız. Bu makalede bu sorunun üzerine gideceğiz.
Renklendirme için gdbrid in "OndrawColumnCell" eventini kullanıyoruz.
Kod: Tümünü seç
if gdselected in state then
Begin
dbgItems.canvas.brush.Color:=vlAnaEkranCurrColor;
dbgItems.canvas.Font.Assign(vlAnaEkranCurrFont);
end else
begin
if dbgitems.datasource.dataset.fieldbyname('renkalani').asinteger=1 then
Begin
dbgItems.canvas.Brush.Color:=vlAnaEkranListeColor;
dbgItems.canvas.Font.Assign(vlAnaEkranListeFont);
End else
Begin
dbgItems.canvas.Brush.Color:=vlAnaEkranListeColor2;
dbgItems.canvas.Font.Assign(vlAnaEkranListeFont2);
End
end;
dbgItems.DefaultDrawColumnCell(rect,datacol,column,state);
vlAnaEkranCurrFont ve vlAnaEkranListeFont ise TFont tipinde global değişkenlerdir.
yukardaki kod ile dbgridde satırların rengini istediğim şekilde değiştirebiliyorum.
peki bu kodlarda belirli bir sütunun renginide belirli bir özelliğe göre değiştirmek istersem?
Dikkat etmemiz gerek nokta bu event ne zaman ve ne için tetikleniyor. hücrenin içindeki veri değiştiği veya hücre yeniden çizieceği zaman bu olay gerçekleşiyor. Event hücre için gerçekleştiğine göre eventin parametrelerinde hangi hücrenin çizileceği ile ilgili bir bilginin olması lazım. Eventin parametrelerini kontrol ettiğmizde
görüyoruz.procedure TfFatura.dbgItemsDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState)
Sender = Dbgrid,
Rect = Hücrenin koordinatları,
DataCol = dbgriddeki colonun indexi
Column = Sütun bilgileri
State = Hücrenin durumu hakkında bilgi verir. Hücrenin seçili olup olmadığını bu parametre ile anlarız.
Burda Column parametresinin Field özelliğini kullanarak hücreye yazılacak olan değere göre kodumuzu düzeltebiliriz. Kodumuza bir karşılaştırma daha ekliyoruz
Kod: Tümünü seç
if gdselected in state then
Begin
dbgItems.canvas.brush.Color:=vlAnaEkranCurrColor;
dbgItems.canvas.Font.Assign(vlAnaEkranCurrFont);
end else
begin
if dbgitems.datasource.dataset.fieldbyname('renkalani').asinteger=1 then
Begin
dbgItems.canvas.Brush.Color:=vlAnaEkranListeColor;
dbgItems.canvas.Font.Assign(vlAnaEkranListeFont);
End else
Begin
dbgItems.canvas.Brush.Color:=vlAnaEkranListeColor2;
dbgItems.canvas.Font.Assign(vlAnaEkranListeFont2);
End;
if column.field.fieldname='miktar' then
Begin //atıyorum stok listesinde miktarı azalan ları kırmızı gösterelim
if column.field.asinteger<=1 then
Begin
dbgItems.canvas.Brush.Color:=clred;
//eğer miktar alanını gösteriyorsak ve miktar 1 den küçük yada eşitse hücrenin rengini kırmızı yap dedik.
//eğer miktar 1 den büyükse diğer hücreler ile aynı renkte yazacak.
End;
End;
end;
dbgItems.DefaultDrawColumnCell(rect,datacol,column,state);