如何在dbgrid中使用复选框(use checkboxes in a dbgrid)

在Delphi中定制DBGrid的输出有很多方法和理由。一种方法是添加复选框,使结果在视觉上更具吸引力。...

在Delphi中定制DBGrid的输出有很多方法和理由。一种方法是添加复选框,使结果在视觉上更具吸引力。

Close up of pen and checkbox sign, studio shot

默认情况下,如果数据集中有布尔字段,DBGrid会根据数据字段的值将其显示为“True”或“False”。但是,如果选择使用“true”复选框控件来启用编辑字段,则效果会更好。

创建一个示例应用程序

在Delphi中启动一个新表单,并放置TDBGrid、TaToTable和TADOConnection、TDataSource。

将所有组件名称保留为第一次放入表单时的状态(DBGrid1、ADOQuery1、AdoTable1等)。使用对象检查器设置ADOConnection1组件(TADOConnection)的ConnectionString属性,以指向示例QuickiesContest.mdb MS Access数据库。

将DBGrid1连接到DataSource1,将DataSource1连接到ADOTable1,最后将ADOTable1连接到ADOConnection1。ADOTable1 TableName属性应指向Articles表(以使DBGrid显示Articles表的记录)。

如果已正确设置所有属性,则在运行应用程序时(假定ADOTable1组件的活动属性为True),默认情况下,DBGrid会根据数据字段的值将布尔字段的值显示为“True”或“False”。

dbgrid中的复选框

要在DBGrid的单元格中显示复选框,我们需要在运行时为我们提供一个复选框。

选择组件调色板上的“数据控件”页面,然后选择TDBCheckbox。在窗体上的任意位置放置一个-无论在何处,因为大多数情况下,它将不可见或漂浮在网格上。

提示:TDBCheckBox是一个数据感知控件,允许用户选择或取消选择单个值,该值适用于布尔字段。

接下来,将其Visible属性设置为False。将DBCheckBox1的颜色属性更改为与DBGrid相同的颜色(使其与DBGrid混合),并删除标题。

最重要的是,确保DBCheckBox1连接到数据源1和正确的字段。

请注意,可以在表单的OnCreate事件中设置上述所有DBCheckBox1的属性值,如下所示:

procedure TForm1.FormCreate(Sender: TObject);begin DBCheckBox1.DataSource := DataSource1; DBCheckBox1.DataField := 'Winner'; DBCheckBox1.Visible := False; DBCheckBox1.Color := DBGrid1.Color; DBCheckBox1.Caption := ''; //explained later in the article DBCheckBox1.ValueChecked := 'Yes a Winner!'; DBCheckBox1.ValueUnChecked := 'Not this time.'; end;

接下来是最有趣的部分。在DBGrid中编辑布尔字段时,我们需要确保DBCheckBox1位于DBGrid中显示布尔字段的单元格上方(“浮动”)。

对于包含布尔字段(在“Winner”列中)的其余(非聚焦)单元格,我们需要提供布尔值的一些图形表示(真/假)。这意味着您至少需要两个图形:一个用于选中状态(真值),另一个用于未选中状态(假值)。

实现这一点的最简单方法是使用Windows API DrawFrameControl函数直接在DBGrid的画布上绘制。

以下是DBGrid的OnDrawColumnCell事件处理程序中的代码,该事件处理程序在网格需要绘制单元格时发生。

procedure TForm1.DBGrid1DrawColumnCell( Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); const IsChecked : array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);var DrawState: Integer; DrawRect: TRect;beginif (gdFocused in State) thenbeginif (Column.Field.FieldName = DBCheckBox1.DataField) thenbegin DBCheckBox1.Left := Rect.Left + DBGrid1.Left + 2; DBCheckBox1.Top := Rect.Top + DBGrid1.top + 2; DBCheckBox1.Width := Rect.Right - Rect.Left; DBCheckBox1.Height := Rect.Bottom - Rect.Top; DBCheckBox1.Visible := True; endendelsebeginif (Column.Field.FieldName = DBCheckBox1.DataField) thenbegin DrawRect:=Rect; InflateRect(DrawRect,-1,-1); DrawState := ISChecked[Column.Field.AsBoolean]; DBGrid1.Canvas.FillRect(Rect); DrawFrameControl(DBGrid1.Canvas.Handle, DrawRect, DFC_BUTTON, DrawState); end; end; end;

要完成此步骤,我们需要确保离开单元格时DBCheckBox1不可见:

procedure TForm1.DBGrid1ColExit(Sender: TObject);beginif DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField then DBCheckBox1.Visible := Falseend;

我们只需要再处理两件事。

注意,在编辑模式下,所有击键都将进入DBGrid的单元格,我们必须确保它们被发送到复选框。对于复选框,我们主要感兴趣的是[Tab]和[Space]键[Tab]应将输入焦点移动到下一个单元格,[Space]应切换复选框的状态。

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);beginif (key = Chr(9)) then Exit; if (DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField) thenbegin DBCheckBox1.SetFocus; SendMessage(DBCheckBox1.Handle, WM_Char, word(Key), 0); end;end;

当用户选中或取消选中复选框时,复选框的标题可能会相应更改。请注意,DBCheckBox有两个属性(ValueChecked和ValueUnChecked),用于指定复选框在选中或未选中时表示的字段值。

此ValueChecked属性包含“是的,赢家!”,而ValueUnChecked等于“这次不是。”

procedure TForm1.DBCheckBox1Click(Sender: TObject);beginif DBCheckBox1.Checked then DBCheckBox1.Caption := DBCheckBox1.ValueChecked else DBCheckBox1.Caption := DBCheckBox1.ValueUnChecked;end;

运行该项目,您将在Winner字段的列中看到所有复选框。

  • 发表于 2021-09-04 07:22
  • 阅读 ( 157 )
  • 分类:数学

你可能感兴趣的文章

如何在google表单中插入复选框

...欢清单,那么你会喜欢这样的新闻:在Google表单中**一个复选框(或“勾选框”)同样容易。 ...

  • 发布于 2021-03-25 04:12
  • 阅读 ( 331 )

如何设置你的mac电脑每天自动开机

...相同。 要计划启动时间,请选中“启动或唤醒”旁边的复选框,然后选择日期和时间。在下拉菜单中,可以选择“周末”、“工作日”、“每天”或一周中的特定日期。 就在这一点之下,你还可以为你的Mac电脑安排一个每天睡...

  • 发布于 2021-04-01 22:41
  • 阅读 ( 214 )

为什么“高级属性”按钮有时会被“存档”复选框替换?

...”部分有时会显示“高级”按钮,但有时会显示“存档”复选框。为什么会这样来回切换?今天的超级用户问答帖子回答了一位好奇的读者的问题。 今天的问答环节是由SuperUser提供的,SuperUser是Stack Exchange的一个分支,是一个由...

  • 发布于 2021-04-07 13:57
  • 阅读 ( 97 )

如何在word文档中添加复选框

使用Microsoft Word创建调查或表格时,复选框使选项更易于阅读和回答。我们讨论了两个很好的选择。第一种方法非常适用于希望人们在Word文档中以数字方式填写的文档。如果您计划打印像待办事项列表这样的文档,那么第二个...

  • 发布于 2021-04-11 03:38
  • 阅读 ( 261 )

如何使用ssh-hop从windows转发密钥

...(WinSCP) In a WinSCP new connection tab, Enable the Advance opti*** checkbox. Go to the “SSH” -> “Authentication”. Check the “Allow agent forwarding” checkbox. Go to the “General Opti***” by clicking on “Preferences” -> “Preferences”. Enable Putty to be invoke...

  • 发布于 2021-04-12 04:08
  • 阅读 ( 199 )

更多最好的Windows7资源管理器提示和技巧

...项卡,然后在“高级设置”列表中选中“始终显示菜单”复选框,以便在该框中有一个复选标记。单击“确定”。 现在,标准菜单栏将始终在Windows资源管理器中可用。 在资源管理器中显示/隐藏驱动器号 默认情况下,显示Wind...

  • 发布于 2021-04-12 17:59
  • 阅读 ( 203 )

在windows xp中获取vista资源管理器样式的完整行选择和复选框

...你还在使用windowsxp,并且嫉妒Vista中的可选但非常有用的复选框功能,或者在details模式下选择完整的行,那么我们的一位读者昨天写了一篇关于这个问题的文章,为你提供了一个新的解决方案。 这个解决方案是以一个小的可执...

  • 发布于 2021-04-14 07:31
  • 阅读 ( 101 )

复选框症候群:为什么我们把钱花在我们不需要的东西上

...手有更多的功能就想买最新的闪亮的东西?我们称之为“复选框综合症”,或者仅仅因为升级而跳槽到一个新的小工具或产品,而不是因为它更好。在你为一个华丽的发布会上给观众留下深刻印象的技术规格清单而倾倒之前,停...

  • 发布于 2021-05-18 18:35
  • 阅读 ( 110 )

如何向word文档添加下拉列表

...供预定义选项的方式! 你知道你也可以在Word文档中添加复选框吗?这是另一种让人们在文档中选择项目的方法。 相关:如何在Word文档中添加复选框

  • 发布于 2021-07-14 08:26
  • 阅读 ( 93 )

安装并了解您的新windows、mac或linux计算机

...一个简单的实用程序,可以让你勾选你喜欢的应用程序的复选框,然后下载它们并在后台安装它们。这意味着不再需要在互联网上到处寻找和下载应用程序,也不再需要在下一步不动脑筋-->下一步->完成单击。如果...

  • 发布于 2021-07-28 01:08
  • 阅读 ( 217 )
gv098097
gv098097

0 篇文章

相关推荐