代码:
数据库字段: nodeid,title,parentid,turn
procedure TForm1.ReadTree(Node:TTreeNode;nid:Integer);
var
sql:string;
tNode:TTreeNode;
id:integer;
ado:TADOQuery;
begin
sql:=Format('select * from ttree where parentid=%d order by turn',[nid]);
ado:=TADOQuery.Create(nil);
ado.Connection:=ADOConnection1;
ado.SQL.Clear;
ado.SQL.Add(sql);
ado.Open;
ado.First;
while not ado.Eof do
begin
id:= ado.Fields[0].AsInteger;
tnode:=TreeView1.Items.AddChild(Node,ado.Fields[1].AsString ) ;
ReadTree(tNode,id);
ado.Next;
end;
ado.Close;
ado.Free;
end;
procedure TForm1.AddRoot;
var
ado:tadoquery;
node:TTreeNode;
begin
ado:=TADOQuery.Create(self);
ado.Connection:=ADOConnection1;
ado.SQL.Clear;
ado.SQL.Add('select * from ttree where parentid=0');
ado.Open;
while not ado.Eof do
begin
node:=TreeView1.Items.AddChild(nil,ado.Fields[1].AsString );
ReadTree(node,ado.Fields[0].AsInteger );
ado.Next;
end;
ado.Close;
ado.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
AddRoot;
end;
启动速度很慢,CPU也100%,有办法优化或其他的方法实现吗??
懒惰加载,只加载当前层和下一层(以便让下一层左侧出现加号)。在treeexpend事件中加载再下一层。windows资源管理器就是这么做的。
Treeview的目录树比较,可以分步读入。首先读入根目录,后续再读入子目录。
但是在使用中,树的数据一般,不会太大。处理的办法是一次性读入。
为了加快速度,在设计时,可以分层读入。如果层次少,可以这样,诗篇的速度就比较快。
但是,在实际中,本人是将数据读入内在,再分层创建树。
http://bbs.csdn.net/topics/380239317
这是我写的一个资源管理器的例子,就用到了我说的思路。C#的,但是你可以借鉴下。