for j:=0 to TreeView1.Items.Count-1 do
if (not(CNode.HasChildren) then
begin
CNode:=TreeView1.Items[j];
CNode:=TreeView1.Items.AddChild(Cnode,'xxxx');
end;
显然不起作用,因为树中的项目数增加了每一步。
答案 0 :(得分:2)
procedure TForm1.AddChildren(ATreeView: TTreeView);
procedure ProcessNode(Node : TTreeNode);
var
NewNode : TTreeNode;
begin
while Node <> Nil do begin
if Node.HasChildren then
ProcessNode(Node.getFirstChild)
else
NewNode := ATreeView.Items.AddChild(Node, 'Child of ' + Node.Text);
Node := Node.getNextSibling;
end;
end;
begin
ProcessNode(ATreeView.Items[0]);
ATreeView.FullExpand;
end;
,最好在调用Items.BeginUpdate / EndUpdate之间加括号。这样,您就可以避免使用TreeView.Items.Count更改时遇到的问题。
如果由于某种原因你必须坚持使用TreeView.Items,你可以这样做:
procedure TForm1.AddChildren(ATreeView: TTreeView);
var
List : TList;
i : Integer;
Node,
NewNode : TTreeNode;
begin
List := TList.Create;
try
ATreeView.Items.BeginUpdate;
for i := 0 to ATreeView.Items.Count - 1 do
List.Add(ATreeView.Items[i]);
for i := 0 to List.Count - 1 do begin
Node := TTreeNode(List.Items[i]);
if not Node.HasChildren then begin
NewNode := ATreeView.Items.AddChild(Node, 'Child of ' + Node.Text);
end;
Node.Expand(True);
end;
finally
ATreeView.Items.EndUpdate;
List.Free;
end;
end;
显然,这可以通过创建Tree的节点的TList然后迭代它来添加新的子节点。
只需将无子节点添加到List中,然后将树正确地完全展开 - 如果这是你想要的 - 需要额外的步骤,你可以提高效率:
procedure TForm1.AddChildren(ATreeView: TTreeView);
[...]
for i := 0 to ATreeView.Items.Count - 1 do begin
if not ATreeView.Items[i].HasChildren then
List.Add(ATreeView.Items[i]);
end;
for i := 0 to List.Count - 1 do begin
Node := TTreeNode(List.Items[i]);
if not Node.HasChildren then begin
NewNode := ATreeView.Items.AddChild(Node, 'Child of ' + Node.Text);
end;
ATreeView.FullExpand;
[...]
end;