上次"笑一笑"提供了一段代码如下:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if gdfocused in state then
  begin
    if column.FieldName='Zh' then
    begin
      form1.ComboBox1.Left:=rect.Left+form1.DBGrid1.Left;
      form1.ComboBox1.Top:=rect.Top+form1.DBGrid1.Top;
      form1.ComboBox1.Width:=rect.Right-rect.Left;
      form1.ComboBox1.Height:=rect.Bottom-rect.Top;
      form1.ComboBox1.Visible:=true;
    end;
  end;
end;   我先试了一下checkbox,可以为每条记录生成checkbox,但初始状态还是原来字段的数据,要点选的时侯才能出来,我怎么把初始状态与checkbox进行关联(比如1为选中);还有事件的触发,因为一个Form上有两个DBGRID(数据相关),我想点击checkbox的时侯,把值传到自己数据表的同时,把值也传到另一个的DBGIRD相应字段进行更新.
   谢谢!

解决方案 »

  1.   

    以前看过一种方法,是调用Api函数实现的
    效果很完美
    分数太少
    懒得动手
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, Grids, DBGrids,SHELLAPI, StdCtrls;type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        ADOQuery1: TADOQuery;
        DataSource1: TDataSource;
        procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);
        procedure DBGrid1CellClick(Column: TColumn);
        procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure DBGrid1ColEnter(Sender: TObject);
        procedure DBGrid1ColExit(Sender: TObject);
      private
        { Private declarations }
        PreOptions: TDBGridOptions;     //保存Dbgrid option值
        procedure SaveBoolean;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.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);
    begin
         //确保只有在逻辑字段才能插入组件
         if Column.Field.DataType = ftBoolean then
          begin
          DBGrid1.Canvas.FillRect(Rect);
          DrawFrameControl(DBGrid1.Canvas.Handle, Rect, DFC_BUTTON,  CtrlState[Column.Field.AsBoolean]);
          end;
    end;procedure TForm1.DBGrid1CellClick(Column: TColumn);
    begin
          if DBGrid1.SelectedField.DataType = ftBoolean then
             SaveBoolean();
    end;procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
         //确保该栏是逻辑字段和空格键在键盘中被敲击
          if ( Key = VK_SPACE ) and
          ( DBGrid1.SelectedField.DataType = ftBoolean ) then
          SaveBoolean();end;
    procedure TForm1.SaveBoolean;
    begin
          //保存结果
          DBGrid1.SelectedField.Dataset.Edit;
          DBGrid1.SelectedField.AsBoolean :=  not DBGrid1.SelectedField.AsBoolean;
          DBGrid1.SelectedField.Dataset.Post;
    end;procedure TForm1.DBGrid1ColEnter(Sender: TObject);
    beginif DBGrid1.SelectedField.DataType = ftBoolean then
    begin
         PreOptions := DBGrid1.Options;
         DBGrid1.Options := DBGrid1.Options - [dgEditing];
    end;
    end;procedure TForm1.DBGrid1ColExit(Sender: TObject);
    begin
          if DBGrid1.SelectedField.DataType = ftBoolean then
          DBGrid1.Options := PreOptions;
    end;end.