+ A
| |--1
| |--2
| |--3
| |+B
|   |--1
|   |--2
|   |--3
| |+C
|   |--1
|   |--2
|   |--3
+ D
  |--1
  |--2
  |--3

解决方案 »

  1.   

    要求可以将这样的结构保存到文件中,然后再读取。
    用循环链表?具体如何定义?to pandarus(Delphi/Asp里流浪的云) :
    能否说详细点?
      

  2.   

    用递归
    給一個遞歸函數的例子你:表結構
    父阶    子阶     名稱
    a        b        1
    a        c        3
    b        d        1
    c        g        2
    c        E        8遞歸函數:
    procedure TFm_main.treeviwe(treenode:ttreenode;roods:string);
    var mytreenode:Ttreenode;
        book1:Tbook;
    begin
      while not adoquery1.Eof do
      begin
        if treenode=nil then
        begin
          mytreenode:=treeview1.Items.Add(nil,adoquery1.Fieldbyname('node_text').AsString);
          treeviwe(mytreenode,adoquery1.Fieldbyname('node_id').AsString);
        end
        else
        begin
          if adoquery1.Fieldbyname('parent_node_id').AsString=roods then
          begin
            mytreenode:=treeview1.Items.AddChild(treenode,adoquery1.Fieldbyname('node_text').AsString);
            Book1:=adoquery1.GetBook;
            treeviwe(mytreenode,adoquery1.Fieldbyname('node_id').AsString);
            adoquery1.GotoBook(Book1);
            adoquery1.FreeBook(Book1);
          end;
        end;
        adoquery1.Next;
      end;
    end;
      

  3.   

    TreeView1.SaveToFile();
    TreeView1.LoadFromFile();
      

  4.   

    //具体的实现,参考VCL代码~~
    procedure TTreeStrings.LoadTreeFromStream(Stream: TStream);
    var
      List: TStringList;
      ANode, NextNode: TTreeNode;
      ALevel, i: Integer;
      CurrStr: string;
    begin
      List := TStringList.Create;
      Owner.BeginUpdate;
      try
        try
          Clear;
          List.LoadFromStream(Stream);
          ANode := nil;
          for i := 0 to List.Count - 1 do
          begin
            CurrStr := GetBufStart(PChar(List[i]), ALevel);
            if ANode = nil then
              ANode := Owner.AddChild(nil, CurrStr)
            else if ANode.Level = ALevel then
              ANode := Owner.AddChild(ANode.Parent, CurrStr)
            else if ANode.Level = (ALevel - 1) then
              ANode := Owner.AddChild(ANode, CurrStr)
            else if ANode.Level > ALevel then
            begin
              NextNode := ANode.Parent;
              while NextNode.Level > ALevel do
                NextNode := NextNode.Parent;
              ANode := Owner.AddChild(NextNode.Parent, CurrStr);
            end
            else TreeViewErrorFmt(sInvalidLevelEx, [ALevel, CurrStr]);
          end;
        finally
          Owner.EndUpdate;
          List.Free;
        end;
      except
        Owner.Owner.Invalidate;  // force repaint on exception
        raise;
      end;
    end;procedure TTreeStrings.SaveTreeToStream(Stream: TStream);
    const
      TabChar = #9;
      EndOfLine = #13#10;
    var
      i: Integer;
      ANode: TTreeNode;
      NodeStr: string;
    begin
      if Count > 0 then
      begin
        ANode := Owner[0];
        while ANode <> nil do
        begin
          NodeStr := '';
          for i := 0 to ANode.Level - 1 do NodeStr := NodeStr + TabChar;
          NodeStr := NodeStr + ANode.Text + EndOfLine;
          Stream.Write(Pointer(NodeStr)^, Length(NodeStr));
          ANode := ANode.GetNext;
        end;
      end;
    end;
      

  5.   

    to SydPink(敲坏10块键盘就能成高手) :子节点数目不固定,
    我想用记录+动态数组可以吗?
      

  6.   

    TreeView1.SaveToFile();
    TreeView1.LoadFromFile();
    可以的吧