以下代码有什么问题。它进入无限循环
for Itr := TreeView1.Items.Count-1 downto 0 do Begin
if TreeView1.Items[Itr].Selected then
begin
Node := TreeView1.Items[Itr];
if (Node.Level = 0) and Node.HasChildren then begin
Sel_Node := Node.getNextSibling;
while Assigned(Sel_Node) do
begin
Sel_Node.Selected := True;
Sel_Node := Node.getNextSibling;
end;
end;
End;
End;
答案 0 :(得分:1)
无限循环的原因在于标记的两行;
if (Node.Level = 0) and Node.HasChildren then
begin
Sel_Node := Node.getNextSibling; // here
while Assigned(Sel_Node) do
begin
Sel_Node.Selected := True;
Sel_Node := Node.getNextSibling; // and here
end;
end;
节点Node
在每次迭代时保持不变,因此节点Sel_Node
在每次迭代时也是相同的,条件Assigned(Sel_Node)
永远不会变为假。也许你打算写
Sel_Node := Sel_Node.getNextSibling;
在while
循环中?
由于此问题的标题显示"从树视图中选择节点中的所有子节点"我想知道你为什么只获得兄弟节点而不是子节点?你想要达到的目标并不是很清楚。
您可能需要参考this link以获取如何以递归方式遍历节点的示例。
评论后编辑:
使用TreeView1
属性MultiSelect = True
和MultiSelectStyle = [msControlSelect]
并对我链接到的子节点和兄弟节点应用递归搜索,使用{{1}选择已选定节点下的所有子节点的代码,看起来f.ex.像这样:
level = 0