//1.引用单元
uses Commctrl ; //2.定义私有过程
procedure tvToggleCheckbox(TreeView: TTreeView;Node: TTreeNode;isclick:boolean =false);
procedure SetChecked(Node: TTreeNode; Checked: Boolean);
function IsChecked(Node: TTreeNode): Boolean; //3.过程体代码
//检查某个节点是否被 选中
function TForm1.IsChecked(Node: TTreeNode): Boolean;
var
TvItem :TTVItem;
begin
TvItem.Mask := TVIF_STATE;
TvItem.hItem := Node.ItemId;
TreeView_GetItem(Node.TreeView.Handle, TvItem);
Result := (TvItem.State and TVIS_CHECKED) = TVIS_CHECKED;
end;
//让 某个节点被 选中
procedure TForm1.SetChecked(Node: TTreeNode; Checked: Boolean);
var
TvItem :TTVItem;
begin
FillChar(TvItem, SizeOf(TvItem), );
with TvItem do
begin
hItem := Node.ItemId;
Mask := TVIF_STATE;
StateMask := TVIS_STATEIMAGEMASK;
if Checked then
TvItem.State :=TVIS_CHECKED
else
TvItem.State :=TVIS_CHECKED shr ;
TreeView_SetItem(Node.TreeView.Handle, TvItem);
end;
end;
// 对节点中所有 子节点 都 选中或 未选中 状态
procedure TForm1.tvToggleCheckbox(TreeView: TTreeView;
Node: TTreeNode ;isclick :boolean=false);
var CurNode, ParentNode, GrandSonNode,sonNode: TTreeNode;
flg1: boolean;
begin
CurNode :=node;
with TreeView do
begin
if IsChecked(CurNode) then //
begin
sonNode := CurNode.GetFirstChild; //遍历子树,选中 则子节点 全部 为选中;
while sonNode<>nil do
begin
SetChecked(sonNode, true);
tvToggleCheckbox(TreeView,sonNode,true);
sonNode := sonNode.GetNextSibling;
end;
ParentNode:= CurNode.Parent; //父;
if ParentNode<>nil then
begin
if not isChecked(parentNode) then
begin
GrandSonNode := ParentNode.GetFirstChild; //遍历子树;
flg1 := false;
while GrandSonNode<>nil do
begin
if (not IsChecked(GrandSonNode)) then //true,有未选中
flg1 := true;
if flg1 then //已有、退出loop;
GrandSonNode := nil
else
GrandSonNode := GrandSonNode.GetNextSibling;
end;
SetChecked(ParentNode, not flg1);
tvToggleCheckbox(TreeView,ParentNode,false);
end;
end; // end parentNode 不等于空
end
else if not IsChecked(CurNode) then
begin
ParentNode := CurNode.Parent; //父;
if ParentNode<>nil then
begin
if isChecked(parentNode) then
begin
SetChecked(ParentNode, false);
tvToggleCheckbox(TreeView,ParentNode);
end;
end; //end parentnode
if (isclick) then
begin
sonNode := CurNode.GetFirstChild; //遍历子树,未选中 则子节点 全部 为未选中;
while sonNode<>nil do
begin
SetChecked(sonNode, false);
tvToggleCheckbox(TreeView,sonNode,true);
sonNode := sonNode.GetNextSibling;
end;
end;
end;
end;
end; //4.点击连选处理
procedure TForm1.TreeView1Click(Sender: TObject);
var
P:TPoint;
treenode :TTreeNode;
begin
GetCursorPos(P);
P := TreeView1.ScreenToClient(P);
if (htOnStateIcon in TreeView1.GetHitTestInfoAt(P.X,P.Y)) then
begin
treenode := TreeView1.GetNodeAt(P.X,P.Y);
tvToggleCheckbox(TreeView1,treenode ,true);
end;
end; //5.生成节点
procedure TForm1.FormCreate(Sender: TObject);
begin
//仅仅这一句话就能让treeview 显示复选框
SetWindowLong(TreeView1.Handle, GWL_STYLE, GetWindowLong(TreeView1.Handle, GWL_STYLE) or $);
// SetWindowLong(H, GWL_STYLE, GetWindowLong(H, GWL_STYLE) or TVS_CHECKBOXES); //这名同上一个意思
{下面的代码只是给 TreeView 添加内容}
with TreeView1 do
begin
Align := alLeft;
Items.Add(nil, 'AAA');
Items.Add(nil, 'BBB');
Items.Add(nil, 'CCC');
Items.AddChild(Items[], '');
Items.AddChild(Items[], '');
Items.AddChild(Items[], '');
end;
end; //6.查看是否选中
procedure TForm1.Button1Click(Sender: TObject);
var
Node: TTreeNode;
TVI: TTVItem;
begin
for Node in TreeView1.Items do
begin
TVI.mask := TVIF_STATE;
TVI.hItem := Node.ItemId;
TreeView_GetItem(TreeView1.Handle, TVI);
if TVI.state and $ = $ then
ShowMessage(Node.Text);
end;
end;

最新文章

  1. background-image小解
  2. paper 114:Mahalanobis Distance(马氏距离)
  3. 【转】PowerShell入门(十二):编写PowerShell管理单元和二进制模块
  4. BZOJ4724 [POI2017]Podzielno
  5. java的向上转型总结
  6. 奇葩问题:This file could not be checked in because the original version of the file on the server was moved or deleted. A new version of this file has been saved to the server, but your check-in comments were not saved
  7. 移动App的REST API设计实践
  8. ubuntu下配置tomcat
  9. 不同语言的Unix时间戳
  10. [Hive - Tutorial] Type System 数据类型
  11. Linux下通过JDBC连接Oracle,SqlServer和PostgreSQL
  12. SenchaTouch2.3.1 正在使用listpaging以及pullrefresh插入 分页演示样品做
  13. Leetcode-34-Search for a Range-(Medium)
  14. Spring 依赖注入之从不会到稍微会一点儿
  15. OOAD-设计模式(三)之创建型设计模式(5种)
  16. mySQL语法中的存储过程及if语句的使用简例
  17. lodop打印收费小票
  18. javascript原型模式概念解读
  19. props default 数组/对象的默认值应当由一个工厂函数返回
  20. react全局的公共组件-------弹框 (Alert)

热门文章

  1. bzoj2791
  2. UVa 11542 (高斯消元 异或方程组) Square
  3. Google发布SSLv3漏洞简要分析报告
  4. Jqgrid入门-Jqgrid设置二级表头(六)
  5. UVa 253 Cube paiting
  6. 如何在Asp.Net WebApi接口中,验证请求参数中是否携带token标识!
  7. error: qrc_qml.obj: requires unsupported dynamic reloc R_ARM_REL32; recompile with -fPIC解决办法
  8. HDU 5294 Tricks Device (最短路,最大流)
  9. Oracle Analyze 命令 详解
  10. Discuz!NT静态文件缓存(SQUID)