从树视图中的节点中选择所有子项

时间:2016-05-06 05:16:54

标签: delphi

以下代码有什么问题。它进入无限循环

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;

1 个答案:

答案 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 = TrueMultiSelectStyle = [msControlSelect]并对我链接到的子节点和兄弟节点应用递归搜索,使用{{1}选择已选定节点下的所有子节点的代码,看起来f.ex.像这样:

level = 0