delphi Windows 原生的三态复选框 TTreeView 控件  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi Windows 原生的三态复选框 TTreeView 控件


Windows 原生的三态复选框 TTreeView 控件

最近我不得不创建一个带有树状控件的 Delphi VCL 表单。使用 Delphi 应该是小菜一碟:只需TTreeView在表单上放置一个控件,我就快到了。但是有一个问题:我想在每个节点中都有复选框。更糟糕的是:复选框可以包含三种不同的状态(选中、未选中、部分)。


CheckTreeViewSample.png


我很少需要构建复杂的 GUI 应用程序(我很幸运),因此我希望在最近的 VCL 中,我必须使用的只是在TTreeView组件中启用某种属性。令我失望的是,树视图中没有对复选框的这种支持。


由于我不想在这个项目中使用 3rd 方控件,我不得不找到一种方法来手动执行此操作。我用谷歌搜索,我能找到的只是解决问题的旧方法:为复选框状态创建图像,并使用StateIndex属性来读/写复选框状态。我简直不敢相信这仍然是 2021 年的做法。


经过更多研究,我发现 Windows Vista 及更高版本(抱歉,XP 的人,我们最终必须向前推进)为允许三态复选框的本机树视图控件提供了扩展样式。这正是我想要的。我真的很恼火,我不得不为选中状态、未选中状态、部分状态“创建”(找到某处)图像……更糟糕的是,我必须找到正常 dpi 和高 dpi 版本。使用 Windows 原生的三态复选框是我的选择。


启用三态复选框就像使用一行代码修改Windows控件的扩展样式一样简单,添加TVS_EX_PARTIALCHECKBOXES样式:


TreeView_SetExtendedStyle(TreeView1.Handle, TVS_EX_PARTIALCHECKBOXES, TVS_EX_PARTIALCHECKBOXES);

但由于我需要更多——检查和修改复选框状态、自动选择子节点等,我将它的所有内容都包装在一个TTreeView帮助程序下,并使其在CheckTreeView GitHub 存储库中可用。


另一个优点是这不是一个不同的组件,因此无需安装任何包并在运行时使用不同的类。只需使用常规TTreeView组件。


启用三态复选框

由于它只是一个类助手,要使用它,只需将单元添加 CheckTreeView 到您的表单单元中:


  使用 {...},CheckTreeView;

然后只需调用 EnableTristateCheckboxes 方法:


  TreeView1.EnableTristateCheckboxes;

这足以为所有节点添加复选框,并在用户单击复选框或选中节点时更改节点选中状态 space 。


读取或更改节点的检查状态

您可以使用 CheckState 节点的属性来读取或修改复选框的状态:


  节点:= TreeView1.Selected;

  case Node.CheckState 的

    csUnchecked: Node.Text := 'unchecked';

    csChecked: Node.Text := 'checked';

    csPartial: Node.Text := 'partial';

  结尾;

  TreeView1.Selected.CheckState := csChecked;

自动检查状态

如果您希望 TTreeView 控件在用户选中/取消选中节点时自动执行这些操作:


选中/取消选中修改节点的所有子项;

根据子节点的校验状态更新父节点校验状态;

只允许选中/取消选中修改节点的状态。

然后添加 OnMouseDown 和 OnKeyPress 事件处理程序的 TTreeView 组成部分,并添加以下代码:


过程 TForm6.TreeView1KeyPress(Sender: TObject; var Key: Char);

开始

  TreeView1.HandleKeyPress(Key);

结尾;


过程 TForm6.TreeView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

开始

  TreeView1.HandleMouseDown(Button, Shift, X, Y);

结尾;

就是这样,我希望你喜欢它。从 GitHub 获取它:https : //github.com/landgraf-dev/CheckTreeView并通过在下面添加您的评论让我知道您的想法!



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.03850793838501 seconds