发信人: 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]
|
|