Esto lo vi en Internet, no recuerdo donde, y funciona razonablemente bien.
Código Delphi
[-]
unit MiUnidad;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, DBCtrls, StdCtrls, Mask, Db, DBTables, ComCtrls, ToolWin,
Grids, DBGrids, Menus, Buttons,Registry, ImgList, USelDatos, Limite;
Const
CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
.....
implementation
procedure TForm.DBGCellClick(Column: TColumn);
begin
if (Column.Field.DataType = ftBoolean) then
begin
Column.Field.DataSet.Edit;
Column.Field.AsBoolean := not Column.Field.AsBoolean;
Column.Field.Dataset.Post;
end;
end;
procedure TForm.DBGKeyPress(Sender: TObject; var Key: Char);
begin
with TDBgrid(Sender) do
begin
if (Key = ' ') and (SelectedField.DataType = ftBoolean) then
begin
SelectedField.Dataset.Edit;
SelectedField.AsBoolean := not SelectedField.AsBoolean;
SelectedField.Dataset.Post;
end;
end;
end;
procedure TForm.DBGDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
with TDBgrid(Sender) do
begin
if Column.Field.DataType = ftBoolean then
begin
Canvas.FillRect(Rect);
DrawFrameControl(Canvas.Handle, Rect, DFC_BUTTON, CtrlState[Column.Field.AsBoolean]);
end;
end;
end;
procedure TForm.DBGColEnter(Sender: TObject);
begin
if TDBgrid(Sender).SelectedField.DataType = ftBoolean then
TDBgrid(Sender).Options := TDBgrid(Sender).Options - [dgEditing];
end;
procedure TForm.DBGColExit(Sender: TObject);
begin
if TDBgrid(Sender).SelectedField.DataType = ftBoolean then TDBgrid(Sender).Options := Opciones;
end;
end.