1.
unit OneCheckDBGrid;interfaceuses
  Windows, Messages, SysUtils, Classes, Controls, Grids, DB, DBGrids,Dialogs;
type
  TCheckedNotifyEvent = procedure (Sender: TObject;Column:TColumn) of object;
  
  TOneCheckDBGrid = class(TDBGrid)
  private
    FDisplayCheckColumnNo:Integer;
    FIsSet:Boolean;
    FSetChecked:TCheckedNotifyEvent;
    FOriginalOptions:TDBGridOptions;
    FMyFieldNo:Integer;
    procedure SetDisplayCheckColumnNo(const Value: Integer);
  //  procedure InternalSetDisplayCleckColumnNo(const Value:Integer);
    procedure DoSetChecked(Sender:TObject;Column:TColumn);
    { Private declarations }
  protected
    { Protected declarations }
    procedure ColEnter;override;
    procedure ColExit;override;
    procedure CellClick(Column: TColumn); override;    procedure DrawColumnCell(const Rect: TRect; DataCol: Integer;
      Column: TColumn; State: TGridDrawState); override;
  public
    { Public declarations }
  published
    { Published declarations }
    property DisplayCheckColumnNo:Integer read FDisplayCheckColumnNo write SetDisplayCheckColumnNo;
    property OnCheckedChange:TCheckedNotifyEvent read FSetChecked write FSetChecked;
  end;procedure Register;implementationprocedure Register;
begin
  RegisterComponents('Samples', [TOneCheckDBGrid]);
end;{ TOneCheckDBGrid }procedure TOneCheckDBGrid.CellClick(Column: TColumn);
begin
  inherited;
  if FIsSet and(Column.Index = FDisplayCheckColumnNo)then
    DoSetChecked(Self,Column);
end;procedure TOneCheckDBGrid.ColEnter;
begin
  if FIsSet and (SelectedField.FieldNo = FMyFieldNo)then
  begin
    FOriginalOptions := Options;
    Options := Options - [dgEditing];
  end;      
  inherited;
end;procedure TOneCheckDBGrid.ColExit;
begin
  if FIsSet and (SelectedField.FieldNo = FMyFieldNo)then
    Options := FOriginalOptions;
  inherited;
end;procedure TOneCheckDBGrid.DoSetChecked(Sender: TObject;Column:TColumn);
begin
  if Assigned(DataSource.DataSet) then
  begin
    FOriginalOptions := Options;
    Options := Options - [dgEditing];
    with DataSource.DataSet do
    begin
      Edit;
      if CanModify then
      Column.Field.AsBoolean := not Column.Field.AsBoolean;
      Post; 
    end;
    Options := FOriginalOptions;
    if Assigned(FSetChecked) then
      FSetChecked(Sender,Column);
  end;
end;procedure TOneCheckDBGrid.DrawColumnCell(const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
  CtrlState:array[Boolean] of Integer = (DFCS_BUTTONCHECK,DFCS_BUTTONCHECK or DFCS_CHECKED);
var
  b:Boolean;
begin
  inherited;
  if FIsSet and (Column.Index = FDisplayCheckColumnNo) then
  begin    Canvas.FillRect(Rect);
    b := Column.Field.AsBoolean;
    DrawFrameControl(Canvas.Handle,Rect,DFC_BUTTON,CtrlState[b]);{Column.Field.AsBoolean]);}
  end;
end;
        
procedure TOneCheckDBGrid.SetDisplayCheckColumnNo(const Value: Integer);
begin
  if not (csDesigning in ComponentState) then
  begin
    FIsSet := (Value >= 0)and(Value < Columns.Count)and(Columns[Value].Field.DataType = ftBoolean);
    if FIsSet then
    begin
      FDisplayCheckColumnNo := Value;
      FMyFieldNo            := Columns[Value].Field.FieldNo;
    end;
  end;
end;end.
我根据别人的东东改的,你看看也许就知道了