请问怎样将树的节点跟子节点都遍历出来,并且将他们存到一个数组里面

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      MemStream: TMemoryStream;
      StrList: TStringList;
    begin
      MemStream := TMemoryStream.Create;
      try
        StrList := TStringList.Create;
        try
          TreeView1.SaveToStream(MemStream);
          MemStream.Position := 0;
          StrList.LoadFromStream(MemStream); // 保存到一个StringList,它本身就是一个数组
          Memo1.Lines.Assign(StrList); // 测试结果
        finally
          FreeAndNil(StrList);
        end;
      finally
        FreeAndNil(MemStream);
      end;
    end;
      

  2.   

    当然上面的方法有个问题,就是保存为文本后,用空格来表示节点之间的关系。你如果不想要空格,需要用这些数据的时候Trim就可以了
      

  3.   

    关键是我要接点还要存在!其实我的目的是我现在有一字符窜:str1,将字符窜与树中的接点内容匹配,如果该接点的内容与str1相同,则Imageindex:=1;请问怎么做到!
      

  4.   

    这样的话,就要递归查找了。function FindNode(AName: string; ANode: TTreeNode): TTreeNode;
    var
      tnNext: TTreeNode;
    begin
      if ANode.Text = AName then
        Result := ANode
      else
      begin
        tnNext := ANode.GetNext;
        if Assigned(tnNext) then
          Result := FindNode(AName, tnNext)
        else
          Exit;
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      tnRoot: TTreeNode;
      tnTemp: TTreeNode;
      sName: string;
    begin
      tnRoot := TreeView1.Items.GetFirstNode;
      sName := Edit1.Text;
      tnTemp := FindNode(sName, tnRoot);
      if Assigned(tnTemp) then
      begin
        TreeView1.SetFocus;
        tnTemp.Selected := True;
        tnTemp.Imageindex:=1;
      end;
    end;
      

  5.   

    上面的FindNode方法写的不太好。最好是在方法的开始就判断节点是否为空。可以这样改一下:function FindNode(AName: string; ANode: TTreeNode): TTreeNode;
    begin
      if not Assigned(ANode) then
        Exit;  if ANode.Text = AName then
        Result := ANode
      else
      begin
        Result := FindNode(AName, ANode.GetNext);
      end;
    end;