【问题标题】:Delphi checkox in a DBgridDBgrid中的Delphi复选框
【发布时间】:2018-05-17 12:39:39
【问题描述】:

我在 Delphi 10.1 中有我的应用程序。 我们在表单上使用了组件 DBGrid。我想在网格的第一列中添加复选框。所以在网格的drawcell上添加了以下代码:

const
CtrlState: array [boolean] of integer = 
 (DFCS_BUTTONCHECK,DFCS_BUTTONCHECK
or DFCS_CHECKED);   
var
  style: UINT;
 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) { grayed }
else
  DrawFrameControl(dbGrid1.Canvas.Handle, Rect, DFC_BUTTON,
    CtrlState[Column.Field.AsBoolean]); { checked or unchecked }
end;

复选框被添加到第一列,但与标题一起如下所示:

如何删除此标题 True 或 False?

【问题讨论】:

  • 您的网格的DefaultDrawing 属性是否设置为True 或False?

标签: delphi checkbox dbgrid


【解决方案1】:

解决您当前问题的方法是使用如下代码:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
    DataCol: Integer; Column: TColumn; State: TGridDrawState);
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) { grayed }
    else
      DrawFrameControl(dbGrid1.Canvas.Handle, Rect, DFC_BUTTON,
        CtrlState[Column.Field.AsBoolean]); { checked or unchecked }
  end
  else begin
    DBGrid1.DefaultDrawDataCell(Rect, Column.Field, State);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DBGrid1.Options := DBGrid1.Options + [dgEditing];
  DBGrid1.DefaultDrawing := False;
  CDS1.CreateDataSet;
  CDS1.InsertRecord([1, True]);
  CDS1.InsertRecord([2, False]);
  CDS1.First;
end;

(CDS1 是一个带有 ftAutoInc 字段和 ftBoolean 字段的 TClientDataSet)

如您所见,将网格的 DefaultDrawing 设置为 False 会阻止布尔值 DBGrid 中字段的 Caption 被绘制。

不要抱太大希望, 但是,因为如果您单击其中一个复选框,您将立即看到 复选框支持的这种有限实现的问题:单击复选框 激活网格的就地编辑器,它将复选框图像替换为 编辑 ftBoolean 字段的文本,即“True”或“False”。但是,您的 q 没有询问编辑,所以我认为这个答案应该到此为止。

如果您想要更全面的复选框支持,只需 google

delphi dbgrid 复选框

而且,在第一次命中时,

CheckBox in a DBGrid

第二个答案应该告诉你更多。另外,我想你会发现相当多的第 3 方 DBGrid 替代品包括对复选框的支持等。

【讨论】:

  • 这个答案有帮助吗?
【解决方案2】:

我设法通过将布尔字段的 DisplayValues 属性分配给 TField.DisplayValues := ';' 之类的空值来解决此问题。

请注意,您可以更改它将在 DBGrid 单元格中显示的内容,而不是 True/False。例如,您可以通过设置 TField.DisplayValues := 'Yes;No' 将其更改为显示 Yes/No。因此,如果您将其设置为空值,它将不会显示任何内容。

附:我正在使用 Delphi XE3。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多