我在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;
复选框会添加到第一列,但会带有标题,如下所示:
如何删除此标题是真还是假?
答案 0 :(得分:2)
您当前问题的答案是使用以下代码:
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中的标题被绘制。
不要过分抱怨, 但是,因为如果你点击其中一个复选框,你会立即看到 这个有限的复选框支持实现的问题:单击复选框 激活网格的inplace编辑器,它取代了复选框图像 编辑ftBoolean字段的文本,即“True”或“False”。但是,你的q 没有问过编辑所以这个答案应该停在这里,我想。
如果您想要更全面的复选框支持,只需谷歌
delphi dbgrid复选框
并且,在第一次点击中,
第二个答案应该告诉你更多。此外,我认为您会发现很多第三方DBGrid替换包括对复选框的支持等。
答案 1 :(得分:1)
我设法通过将布尔字段的DisplayValues属性分配给空值(例如TField.DisplayValues:=';')来解决此问题。
请注意,您可以更改将在DBGrid单元中显示的内容,而不是True / False。例如,您可以通过设置TField.DisplayValues:='Yes; No'将其更改为显示Yes / No。因此,如果将其设置为空值,则不会显示任何内容。
P.S。我正在使用Delphi XE3。