原著作者 魅魂^.^CAD 2011-07-07
摘 要:对TreeView的某个节点遍历
function TForm1.ErgodicTreeView(node:TTreenode):TTreenode;
begin
while node<>nil do
begin
if node.HasChildren then
begin
node:=node.getFirstChild;
ErgodicTreeView(node);
node:=node.Parent;
end;
if ANode = BackupNode then //BackupNode 为传入的节点备份,少了这句就不行了
Exit;
if node.getNextSibling<>nil then
node:=node.getNextSibling
else
exit;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
BackupNode :TTreenode;
begin
BackupNode :=Mytreeview.Items.GetFirstNode;
ErgodicTreeView(BackupNode);
end;
------------------------------------------------------
遍历TreeView的方法有很多,我经过反复编程实现,上面是我用最少的代码实现TreeView的遍历。效果还不错。
利用这个对所有节点的遍历,我们可以很方便的对所有节点进行各种操作。例如:统计每层节点的个数、对
满足要求的节点进行操作、等等。
function ErgodicTreeNode(ANode: TTreeNode; var JidList: TStringList): TStringList;
var
NodeItem: TOrgItem;
begin
try
if not Assigned(ANode) then
Exit;
while ANode <> nil do
begin
if ANode.HasChildren then
begin
ANode:=ANode.getFirstChild;
ErgodicTreeNode(ANode, JidList);
ANode:=ANode.Parent;
end;
NodeItem := TOrgItem(ANode.Data);
if Assigned(NodeItem) then
begin
//如果不是个人信息节点则不添加
if (NodeItem.Itemtype = 2) and (NodeItem.Jid <> '')then
begin
JidList.Add(NodeItem.Jid);
Result := JidList;
end;
end;
if ANode = FSelectedNode then //FSelectedNode 为传入的备份,少了这句就不行了
Exit;
if ANode.getNextSibling <> nil then
begin
ANode:=ANode.getNextSibling;
end
else
exit;
end;
except
end;
end;