发信人: ringotu() 
整理人: teleme(2000-12-05 19:09:57), 站内信件
 | 
 
 
【 在 hawkliu (hawk) 的大作中提到: 】
 : 【 在 ringotu (ringo) 的大作中提到: 】
 : : 【 在 hawkliu (hawk) 的大作中提到: 】
 : :    .......
 : rocedure TForm1.Button1Click(Sender: TObject);
 :    .......
 
 看你的代码,估计你是用getid来标识节点的级数,但是我看不到你是如何标识某 个节点的父节点的,通常来说,构造树,都是需要用到递归算法的,这样做从理 论上可以构造出n级的树,只是受到堆栈容量的限制而已。
 
 下面是我的数据库结构,以及代码。代码中,首先将所有的节点从数据库中读入 到内存,使用一个TmyTreeNode类,以及一个数组来维护。
 
 数据库结构: Create table test_tree(id varchar(10) not null,
                                    parentid varchar(10),
                                    name varchar(32),
                                    primary key (id))
 
 代码的pas文件:
 
 unit DBtree;
 
 interface
 
 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dia logs,
   ComCtrls, StdCtrls, Db, DBTables;
 
 type
 
   TMyTreeNode = class
   public
     id: String;
     Parentid: String;
     Name: String;
     added: Boolean;  //to special wether this node has been added into  the tree;
     constructor Create(Aid, AParentid, AName: String);
    end;
 
   TForm1 = class(TForm)
     tv: TTreeView;
     Table1: TTable;
     Button1: TButton;
     procedure Button1Click(Sender: TObject);
   private
     Nodearr: array of TMyTreeNode;
     function AddANode(MyTreeNode: TMyTreeNode): TTreeNode;
   public
     { Public declarations }
   end;
 
 var
   Form1: TForm1;
 
 implementation
 
 {$R *.DFM}
 
 constructor TMytreeNode.Create(Aid, AParentid, AName: String);
 begin
   inherited Create;
   id := Aid;
   Parentid := AParentid;
   Name := AName;
   Added := false;
 end;
 
 function TForm1.AddANode(MyTreeNode: TMyTreeNode): TTreeNode;
 var
   i: Integer;
   parentNode: TTreeNode;
 begin
   if MyTreeNode.Added then
   begin
     for i := 0 to tv.Items.count - 1 do
       if TMyTreeNode(tv.Items[i].data).id = MyTreeNode.id then
       begin
         Result := tv.Items[i];
         break;
       end;
   end else
   begin
     for i := 0 to Length(Nodearr) - 1 do
       if Nodearr[i].id = MyTreeNode.parentid then
       begin
         parentNode := AddaNode(Nodearr[i]);
         break;
       end;
      MyTreeNode.Added := True;
      Result := tv.Items.AddChildObject(parentNode, MyTreeNode.Name, My treeNode);
   end;
 end;
 
 procedure TForm1.Button1Click(Sender: TObject);
 var
   i: Integer;
 begin
   Table1.OPen;
   Table1.First;
   SetLength(Nodearr, 0);
   while not table1.Eof do
   begin
     SetLength(Nodearr, Length(Nodearr) + 1);
     Nodearr[High(Nodearr)] := TMyTreeNode.Create(table1.FieldByName('i d').AsString,
                               table1.FieldByName('parentid').AsString, 
                               table1.FieldByName('id').AsString);
 
     Table1.Next;
   end;
   for i := 0 to high(Nodearr) do if not Nodearr[i].Added then addANode (Nodearr[i]);
 end;
 
 end.
  
  -- You may say I'm a dreamer,
 but I'm not the only one.
 I hope someday you can join us,
 and the world will be as one.
  ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.142.73.41]
  | 
 
 
 |