procedure TForm13.DBGrid1CellClick(Column: TColumn);
begin
  if (Column.Field.FieldName = 'aboolean') then
  begin
    DBGrid1.SelectedField.DataSet.Edit;
    if DBGrid1.SelectedField.AsInteger = 0 then
      DBGrid1.SelectedField.AsInteger := 1
    else if DBGrid1.SelectedField.AsInteger = 1 then
      DBGrid1.SelectedField.AsInteger := 0;
    DBGrid1.SelectedField.DataSet.Post;
  end;

end;
//=========================================================================
 procedure TForm13.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
  CtrlState: array [Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or   DFCS_CHECKED); // CheckBox1 列 要用到的
begin 
 if (Column.Field.FieldName = 'aboolean') then
    with CheckBox1 do
    begin
      DBGrid1.Canvas.FillRect(Rect);
      if Column.Field.AsInteger = 0 then
        drawframecontrol(DBGrid1.Canvas.Handle, Rect, dfc_button,      CtrlState[False])
      else
        drawframecontrol(DBGrid1.Canvas.Handle, Rect, dfc_button,      CtrlState[True]);
    end;

end;
//==============================================================================
procedure TForm13.FormCreate(Sender: TObject);
   DBGrid1.Options:= DBGrid1.Options-[ dgEditing];  //CheckBox1 不要 双击后,出现 0的Edit显示
end;
//==============================================================================
procedure TForm13.DBGrid1TitleClick(Column: TColumn);  //CheckBox1专用
var
  i: Integer;
begin
  if (Column.Field.FieldName = 'aboolean') then
  begin
    FDQuery1.First; // 游标回滚
    DBGrid1.SelectedRows.CurrentRowSelected := True; // 第一行被选中

    if trim(Column.Title.Caption) = '全选' then
    begin
      for i := 0 to DBGrid1.DataSource.DataSet.RecordCount - 1 do
      begin
        DBGrid1.Fields[3].DataSet.Edit;          //3为  ChechBox1所在的列序号
        DBGrid1.Fields[3].AsInteger := 1;
        DBGrid1.Fields[3].DataSet.Post;
        DBGrid1.DataSource.DataSet.next;
      end;
      Column.Title.Caption := '全消';
    end
    else
    begin
      for i := 0 to DBGrid1.DataSource.DataSet.RecordCount - 1 do
      begin
        DBGrid1.Fields[3].DataSet.Edit;
        DBGrid1.Fields[3].AsInteger := 0;
        DBGrid1.Fields[3].DataSet.Post;
        DBGrid1.DataSource.DataSet.next;
      end;
      Column.Title.Caption := '全选';
    end;
    FDQuery1.First; // 游标回滚
    DBGrid1.SelectedRows.CurrentRowSelected := True; // 选中第一行
  end;
end