procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
w, h: integer;
old: TColor;
begin
with DBGrid1.Canvas do begin
FillRect(Rect);
if Column.Field.DataType=ftBoolean then begin
w:=(Rect.Right+Rect.Left) div 2;
h:=(Rect.Bottom+Rect.Top) div 2;
Pen.Width:=1;
DrawFrameControl(Handle, Classes.Rect(w-7, h-7,
w+7, h+7), DFC_BUTTON, DFCS_BUTTONCHECK);
if Column.Field.AsBoolean then begin
Pen.Width:=2;
old:=Pen.Color;
Pen.Color:=clBlack;
MoveTo(w-3, h);
LineTo(w-1, h+3);
LineTo(w+3, h-3);
Pen.Color:=old;
end;
end else begin
TextOut(Rect.Left+2, Rect.Top+2, Column.Field.Value);
end;
end;
end;
A másik kérdéses esemény az OnCellClick. Ez akkor jön létre, ha a felhasználó rákattint valamely cellára. Amikor ezt tapasztaljuk, akkor ellenőriznünk kell, hogy ez logikai típusú mező-e. Ha igen, akkor válik szükségessé az új értékadás, mely logikai típus esetén az aktuális érték ellenkezője lesz. Érték adás előtt, ha adattáblánk nem lenne szerkesztő vagy beszúró üzemmódban, akkor ezen változtatnunk kell és szerkesztő üzemmódba kell helyeznünk azt, különben hibaüzenetet kapunk.
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
if Column.Field.DataType=ftBoolean then begin
if not (Table1.State in [dsInsert, dsEdit]) then begin
Table1.Edit;
end;
Column.Field.AsBoolean:=not Column.Field.AsBoolean;
end;
end;