加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – DBGrid中的CheckBox

发布时间:2020-12-15 09:40:11 所属栏目:大数据 来源:网络整理
导读:我的问题是如何在Delphi 7中的dbgrid中设置一个列,其中包含一个复选框项. 提前致谢. 解决方法 我测试的最简单,最完整的方法如下: 在单元的私有部分中,声明一个全局用于保留网格选项.在输入复选框列时临时禁用文本编辑后,它将用于恢复 – 因为这可能是Jordan
我的问题是如何在Delphi 7中的dbgrid中设置一个列,其中包含一个复选框项.

提前致谢.

解决方法

我测试的最简单,最完整的方法如下:

在单元的私有部分中,声明一个全局用于保留网格选项.在输入复选框列时临时禁用文本编辑后,它将用于恢复 – 因为这可能是Jordan Borisovin关于delphi.about.com文章提到的一个小错误

private      
  GridOriginalOptions : TDBGridOptions;

在OnCellClick事件中,如果field是boolean,则切换并将更改发布到数据库

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin  
  if (Column.Field.DataType=ftBoolean) then
  begin      
    Column.Grid.DataSource.DataSet.Edit;
    Column.Field.Value:= not Column.Field.AsBoolean;
    Column.Grid.DataSource.DataSet.Post;   
  end;
end;

绘制网格的布尔字段的复选框

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) ;
    if (VarIsNull(Column.Field.Value)) then
      DrawFrameControl(DBGrid1.Canvas.Handle,Rect,DFC_BUTTON,DFCS_BUTTONCHECK or DFCS_INACTIVE)
    else
      DrawFrameControl(DBGrid1.Canvas.Handle,CtrlState[Column.Field.AsBoolean]); 
  end;
end;

现在是新的部分,在布尔列中禁用单元格编辑.在OnColEnter和OnColExit事件上:

procedure TForm1.DBGrid1ColEnter(Sender: TObject);
begin
  if Self.DBGrid1.SelectedField.DataType = ftBoolean then
  begin
    Self.GridOriginalOptions := Self.DBGrid1.Options;
    Self.DBGrid1.Options := Self.DBGrid1.Options - [dgEditing];
  end;
end;

procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
  if Self.DBGrid1.SelectedField.DataType = ftBoolean then
    Self.DBGrid1.Options := Self.GridOriginalOptions;
end;

更重要的是,处理空格键以切换复选框

procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;  Shift: TShiftState);
begin
  if ((Self.DBGrid1.SelectedField.DataType = ftBoolean) and (key = VK_SPACE)) then
  begin
    Self.DBGrid1.DataSource.DataSet.Edit;
    Self.DBGrid1.SelectedField.Value:= not Self.DBGrid1.SelectedField.AsBoolean;
    Self.DBGrid1.DataSource.DataSet.Post;   
  end;      
end;

而已!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读