gpt4 book ai didi

delphi - DBGrid 中的复选框

转载 作者:行者123 更新时间:2023-12-03 14:57:15 28 4
gpt4 key购买 nike

我的问题是如何在 Delphi 7 中的 dbgrid 中设置一个带有复选框项目的列。

提前致谢。

最佳答案

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

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

private      
GridOriginalOptions : TDBGridOptions;

在 OnCellClick 事件中,如果字段为 bool 值,则切换并将更改发布到数据库

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;

绘制网格 bool 字段的复选框

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,Rect, DFC_BUTTON, CtrlState[Column.Field.AsBoolean]);
end;
end;

现在是新部分,在 bool 列中禁用单元格编辑。关于 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;

就是这样!

关于delphi - DBGrid 中的复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9019819/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com