Delphi中为TreeView添加单选和复选框
发布时间:2006-08-01 09:42:45 来源:天极开发 网友评论 0 条 打开电脑,进入Windows操作系统,在资源管理器的左边栏中清楚地显示了系统管理的所有磁盘的信息以及各个磁盘所容纳的文件与文件夹(如图一)。这种常见的显示方式是由一个根节点和若干个子节点构成的,这被称为“树形结构”。这种树形结构的用途非常广泛,在很多常用软件中都出现过它的身影。Windows中将这种结构封装为“树形控件”,即TreeView控件,它与ListView、Button等一样都属于系统自带的通用公共控件。在Delphi中,TreeView也被封装成了VCL组件,它的位置在“Win32组件”面板上,是我们最常用的几个组件之一。
Delphi自带的TreeView组件可以显示树形结构,也可以为每个节点指定不同的图标来区分各自的功能。但在平时的使用中,我们发现它并不能嵌入CheckBox或者是RadioButton组件,这样用户就不能直观地选择某一部分节点或某个节点。如何来解决这个问题呢?我们思考之后发现,有两种思路可以完成前面所述的任务。一种是在TreeView组件的基础上继承的它的功能,并添加所要的功能(使TreeView能嵌入CheckBox或者是RadioButton组件)即重写一个组件。另一种是利用用户的错觉,将CheckBox或者是RadioButton所能实现的外观用两种状态的图片(一种是选中状态另一种是未选中状态)来交替显示,走迂回路线来完成任务。我们来分析一下这两种方法的优缺点:第一种方法要重写一个组件,显然难度较大,所用时间较长;第二种方法,利用TreeView组件本身就具备的显示图标功能,简便易行,所用时间短,能够完成需求。比较之后,我们选择作用第二种方法,先来看一下完成之后的效果(如图二),应该说是达到了目的,现在我们来细述一下完成的过程:
首先,我们在Win32面板上选择ImageList组件,设置它的StateImages属性,包括两种状态的图标,一种是选中状态,另一种是未先中状态。
其次,我们调用ToggleTreeView过程(实现方法见后文),实现在鼠标单击和键盘选择的状态下改变状态图标的功能。
ToggleTreeView过程实现代码如下:
![]() |
Delphi自带的TreeView组件可以显示树形结构,也可以为每个节点指定不同的图标来区分各自的功能。但在平时的使用中,我们发现它并不能嵌入CheckBox或者是RadioButton组件,这样用户就不能直观地选择某一部分节点或某个节点。如何来解决这个问题呢?我们思考之后发现,有两种思路可以完成前面所述的任务。一种是在TreeView组件的基础上继承的它的功能,并添加所要的功能(使TreeView能嵌入CheckBox或者是RadioButton组件)即重写一个组件。另一种是利用用户的错觉,将CheckBox或者是RadioButton所能实现的外观用两种状态的图片(一种是选中状态另一种是未选中状态)来交替显示,走迂回路线来完成任务。我们来分析一下这两种方法的优缺点:第一种方法要重写一个组件,显然难度较大,所用时间较长;第二种方法,利用TreeView组件本身就具备的显示图标功能,简便易行,所用时间短,能够完成需求。比较之后,我们选择作用第二种方法,先来看一下完成之后的效果(如图二),应该说是达到了目的,现在我们来细述一下完成的过程:
![]() |
首先,我们在Win32面板上选择ImageList组件,设置它的StateImages属性,包括两种状态的图标,一种是选中状态,另一种是未先中状态。
其次,我们调用ToggleTreeView过程(实现方法见后文),实现在鼠标单击和键盘选择的状态下改变状态图标的功能。
ToggleTreeView过程实现代码如下:
| procedure ToggleTreeViewCheckBoxes( Node :TTreeNode; cUnChecked, //CheckBox未选中状态 cChecked, //CheckBox选中状态 cRadioUnchecked, //RadioButtion未选中状态 cRadioChecked :integer); // RadioButtion选中状态 var tmp:TTreeNode; begin if Assigned(Node) then begin //如果当前是未选中状态则变为选中状态 if Node.StateIndex = cUnChecked then Node.StateIndex := cChecked //如果当前是选中状态则变为未选中状态 else if Node.StateIndex = cChecked then Node.StateIndex := cUnChecked else if Node.StateIndex = cRadioUnChecked then begin tmp := Node.Parent; if not Assigned(tmp) then tmp := TTreeView(Node.TreeView).Items.getFirstNode else tmp := tmp.getFirstChild; while Assigned(tmp) do begin if (tmp.StateIndex in [cRadioUnChecked,cRadioChecked]) then tmp.StateIndex := cRadioUnChecked; tmp := tmp.getNextSibling; end; Node.StateIndex := cRadioChecked; end; // if StateIndex = cRadioUnChecked end; // if Assigned(Node) end; |
- 推荐阅讯
- VFP9.0中设计与使用表单和报表
- Delphi面向对象的编程方法(六)
- COM组件设计与应用之VC6中用ATL写组件
- 关于9行代码导致系统崩溃的分析整理
- Delphi面向对象的编程方法(五)
- 5天玩转NoahWeb逻辑层--第一天
- 论《金瓶梅》与项目管理中人际关系协调
- Delphi深度探索之外壳执行操作记录器
- 开发Delphi对象式数据管理功能(九)
- Oracle数据库日常维护手册
- 阅读排行
- 1.全面剖析Delphi 2006新增特性
- 2.用Delphi开发视频聊天软件
- 3.用Win32 API枚举应用程序窗口和进程
- 4.软件的架构与设计模式之什么是架构
- 5.软件的架构与设计模式之模式的种类
- 6.Delphi中为TreeView添加单选和复选框
- 7.用Delphi实现24位真彩色图标
- 8.VS.NET2005 Beta2初体验之感受2005
- 9.程序界面设计模式慨述
- 10.没落的奇迹 谁会买下Delphi?
- 专题教程
- Windows Server-Windows Server文档-Windows Server新闻-Windows Ser PostgreSQL-PostgreSQL文档-PostgreSQL新闻-PostgreSQL专家
- WebLogic-WebLogic文档-WebLogic新闻-WebLogic专家 FreeBSD-FreeBSD文档-FreeBSD新闻-FreeBSD专家
- Linux-内核 GUI KDE Gnome DNS FTP 安全 安装-Linux专区 Windows-AD IIS ServerCore 虚拟化 安全 HPC-Windows专区
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册


