遍历 treeview组件一个结点下所有子节点,不能用递归算法

解决方案 »

  1.   


    使用时,选定一个节点(必须有子节点),自己可以把代码完善,避免一些错误
    var
      i,level:integer;
    begin
      level := TreeView1.Selected.Level;
      for i := TreeView1.Selected.Index + 1 to TreeView1.Items.Count - 1 do
      begin
        if TreeView1.Items[i].Level = level then
          Break;
        ListBox1.Items.Add(TreeView1.Items[i].Text)
      end;
    end;
      

  2.   

    用FOR循环,慢S你,我试过了,超过五千多个节点时,差不多要一秒才能循环一遍
      

  3.   

    用GetNext来遍历,Index的效率比GetNext差
    var
      ANode: TTreeNode;if TreeView.Items.Count > 0 then
    begin
      ANode := TreeView.Items[0];
      while ANode <> nil do
      begin
        //做操作
        ANode := ANode.GetNext; 
      end;
    end;
      

  4.   

    哦,漏了看是某个节点下全部节点,改改:var
      ANode: TTreeNode;if TreeView.Selected <> nil then
    begin
      ANode := TreeView.Selected.GetFirstChild;
      while (ANode <> nil) and (ANode.Level > TreeView.Level) do
      begin
        //做操作
        ANode := ANode.GetNext; 
      end;
    end;
      

  5.   

    ANode.Level > TreeView.Level改为ANode.Level > TreeView.Selected.Level
      

  6.   


    //Delphi的TreeView控件提供了很多方法了.这里尽量使用一般的节点功能
    procedure TForm1.StepDepthFirst(AFirstNode: TTreeNode);
    var
      mFirstLevel: Integer;
      mCurrNode, mNode: TTreeNode;
    label
      VisitSibling;
    begin
      //深度优先遍历
      //访问自己, 访问自己的子节点, 然后是兄弟节点
      mFirstLevel := AFirstNode.Level;
      mCurrNode := AFirstNode;
      while True do
      begin
        //访问自己
        Visit(mCurrNode);    //访问子节点
        mNode := mCurrNode.getFirstChild();
        if (mNode <> nil) then
        begin
          mCurrNode := mNode;
          Continue;
        end;VisitSibling:
        //访问兄弟节点
        mNode := mCurrNode.getNextSibling();
        if (mNode <> nil) then
        begin
          mCurrNode := mNode;
          Continue;
        end;    mNode := mCurrNode.Parent;
        if (mNode = nil) or (mNode.Level < mFirstLevel) then
          Break;    mCurrNode := mNode;
        goto VisitSibling;
      end;
    end;
      

  7.   

    procedure TraverseTreeNode(ANode: TTreeNode);
    var
      i: integer;
    begin
      while(Anode <> nil) do
      begin
        //你需要执行的操作
        ANode:= ANode.GetNext;
      end;
    end;