|
|
|
|
Blog信息
|
blog名称:四裤全输的小窝~~ 日志总数:178 评论数量:699 留言数量:198 访问次数:1154948 建立时间:2005年10月29日 | |
|
|
|
|
 |
|
|
|
|
[Ides]TreeView 父节点 子节点 状态一致
原创空间, 软件技术, 电脑与网络 四裤全输 发表于 2008/1/11 22:39:28
|
今天晚上写用户组管理,需要对树进行操作.主要是勾选状态的一致性比较难处理,在网上搜索了一下没结果,就自己动手写了一个.核心函数主要有三个,供大家参考,如果还有更好的算法,希望大家能交流.注:我所用的是cxTreeView //所有子节点是否有处于选中状态 function ChildChecked(TreeNode:TTreeNode):Boolean; //改变所有子节点状态 procedure ChangeChildState(sParent:TTreeNode;StateIndex:Integer); //改变父节点状态 procedure ChangeParentState(TreeNode:TTreeNode;StateIndex:Integer);function TfrmRole.ChildChecked(TreeNode:TTreeNode):Boolean;var I : Integer;begin Result := False; for I := 0 to TreeNode.Count - 1 do begin if TreeNode[I].HasChildren then begin if 2 = TreeNode[I].StateIndex then begin Result := True; Exit; end; ChildChecked(TreeNode[I]); end else begin if 2 = TreeNode[I].StateIndex then begin Result := True; Exit; end; end; end;end;procedure TfrmRole.ChangeChildState(sParent: TTreeNode; StateIndex: Integer);var I : Integer;begin sParent.StateIndex := StateIndex; for I := 0 to sParent.Count - 1 do begin if sParent[I].HasChildren then begin sParent[I].StateIndex := StateIndex; ChangeChildState(sParent[I],StateIndex); end else sParent[I].StateIndex := StateIndex; end;end;procedure TfrmRole.ChangeParentState(TreeNode: TTreeNode; StateIndex: Integer);var I : Integer;begin if TreeNode.Parent = nil then Exit; //如果父节点是勾选状态,则要判断是否有其它节点是勾选状态,如果有,则退出,保持勾选 if 2 = TreeNode.Parent.StateIndex then begin if ChildChecked(TreeNode.Parent) then Exit; end; TreeNode.Parent.StateIndex := StateIndex; ChangeParentState(TreeNode.Parent,StateIndex);end;这段代码也比较有用,这个是点中节点才改变状态,点树上的"+""-"不会触发.procedure TfrmRole.cxTV_MenuMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var MyHitTest : THitTests; tn : TTreeNode;begin inherited; MyHitTest := cxTV_Menu.GetHitTestInfoAt(X,Y); tn:=TcxTreeView(Sender).GetNodeAt(x,y); if tn=nil then Exit; if htOnItem in MyHitTest then begin if 1 = tn.StateIndex then begin ChangeChildState(tn,2); ChangeParentState(tn,2); end else begin ChangeChildState(tn,1); ChangeParentState(tn,1); end; end;end;效果:1 全部不选择:500)this.width=500'>2 选计量单位:500)this.width=500'>3 选资信等级500)this.width=500'>4 取消选择计量单500)this.width=500'>5 只取消选择"计量单位修改"500)this.width=500'>稍候整理一下.把源码也上传上来.
|
阅读全文(9666) | 回复(0) | 编辑 | 精华 |
|
|
|
|
|
|
|
|
|
|
回复:TreeView 父节点 子节点 状态一致
原创空间, 软件技术, 电脑与网络 longwe(游客)发表评论于2011/4/28 15:19:25
|
|
|
|
|
|
|
» 1 »
|