跟据数据库表动态建树,表结构如下:ID ,NAME ,PARENT_ID
当有一千多个节点时,树生成的速度难以忍受的慢,大约要40秒,现在想提高生成树的速度,本人对树控件不熟,请高手指点该如何解决,100分酬谢~~生成树的方法如下:
procedure form.FormShow(Sender: TObject);
begin
with TQuery do begin
Close;
sql.Text :='select * from tree order by length(id)'
open;
end ;
DrawTree(TreeView1 ,TQuery );
end;
PROCEDURE form.DrawTree(TreeV:TreeView;TQuery1:TQuery);
var i,t:Integer;
pnode,NODE:TTreeNode ;
begin
if MainForm.RecCount(oraQ)=0 then exit;
TreeV.Items.BeginUpdate ;
TreeV.Visible :=false;
node:= TreeV.Items.GetFirstNode;
for i :=1 to TQuery1.RecCount do begin
if TQuery1.FieldByName('parent_id').text ='0' then// 根
pnode:=AppendBootNode(TreeV,NODE,TQuery1)
else begin
pnode:= FindNode (TreeV,TQuery1.FieldByName('parent_id').text );
if pnode<>nil then begin
AppendBootNode(TreeV,pnode,TQuery1);
end;
end;
oraQ.Next;
end;
TreeV.Visible :=True;
TreeV.Items.EndUpdate ;
end;function form.AppendBootNode(Treev:TreeView ;NODE:TTreeNode;TQ:TQuery ):TTreeNode;
var
CatNode : TTreeNode;
P:PString ;
begin
CatNode := TreeV.Items.AddChild(NODE,TQ.FIELDBYNAME('FITTING_NAME').Text);
New(P);
P^:= TQ.FIELDBYNAME('FITTING_ID').Text ;
CatNode.Data:=P;
Result :=catNODE;
END;function Tfittingstandard.FindNode(TREEV:TreeView ; sText:string ):TTreeNode ;
var
i:Integer;
P:Pstring;
begin
result:=nil;
for i := 0 to treeV.items.count-1 do begin
P:= TreeV.Items[i].Data ;
if P^ =sText then begin
RESULT:=TreeV.Items[i];
Exit;
end;
end;
end;
=====================================================
FindNode()方法会遍历所有结点来查找,我想这可能是慢的原因,该怎么解决呢?
当有一千多个节点时,树生成的速度难以忍受的慢,大约要40秒,现在想提高生成树的速度,本人对树控件不熟,请高手指点该如何解决,100分酬谢~~生成树的方法如下:
procedure form.FormShow(Sender: TObject);
begin
with TQuery do begin
Close;
sql.Text :='select * from tree order by length(id)'
open;
end ;
DrawTree(TreeView1 ,TQuery );
end;
PROCEDURE form.DrawTree(TreeV:TreeView;TQuery1:TQuery);
var i,t:Integer;
pnode,NODE:TTreeNode ;
begin
if MainForm.RecCount(oraQ)=0 then exit;
TreeV.Items.BeginUpdate ;
TreeV.Visible :=false;
node:= TreeV.Items.GetFirstNode;
for i :=1 to TQuery1.RecCount do begin
if TQuery1.FieldByName('parent_id').text ='0' then// 根
pnode:=AppendBootNode(TreeV,NODE,TQuery1)
else begin
pnode:= FindNode (TreeV,TQuery1.FieldByName('parent_id').text );
if pnode<>nil then begin
AppendBootNode(TreeV,pnode,TQuery1);
end;
end;
oraQ.Next;
end;
TreeV.Visible :=True;
TreeV.Items.EndUpdate ;
end;function form.AppendBootNode(Treev:TreeView ;NODE:TTreeNode;TQ:TQuery ):TTreeNode;
var
CatNode : TTreeNode;
P:PString ;
begin
CatNode := TreeV.Items.AddChild(NODE,TQ.FIELDBYNAME('FITTING_NAME').Text);
New(P);
P^:= TQ.FIELDBYNAME('FITTING_ID').Text ;
CatNode.Data:=P;
Result :=catNODE;
END;function Tfittingstandard.FindNode(TREEV:TreeView ; sText:string ):TTreeNode ;
var
i:Integer;
P:Pstring;
begin
result:=nil;
for i := 0 to treeV.items.count-1 do begin
P:= TreeV.Items[i].Data ;
if P^ =sText then begin
RESULT:=TreeV.Items[i];
Exit;
end;
end;
end;
=====================================================
FindNode()方法会遍历所有结点来查找,我想这可能是慢的原因,该怎么解决呢?
解决方案 »
- 发个采用BIFF8规发二进制导出写Excel文件的绿色函数,速度爆快。Delphi2009,D2007及其以下同样均兼容。
- 怎样将Access里面表的数据导出到VFP数据表里去
- 增加一个事件。可以再加分
- 关于自定义函数和过程的问题??????
- Delphi 中﹐一个值得思索的问题…………
- 请教:全局变量问题,急!马上结贴.
- 分钟如何换成小时???在线等
- 字体
- 小型ERP系统的日志系统该怎么写?
- win2000下开发的程序,在Win98下运行,见面全部变样,就象在800*600下开发的,到600*480下运行一样,控件全部变大了,而且Form等全部出来滚动条……
- 大家给个建议ListView和DBGrid来做数据显示,哪个更好?理由……
- VC写DLL 参数为结构数组,Delphi如何调用???求强人~~
if P^ =sText then begin
RESULT:=TreeV.Items[i];
Exit;//这里改成break;
end;
TQ.FIELDBYNAME('FITTING_NAME').Text 也就是得到树节点的名字,相当于tquery.FIELDBYNAME(NAME').asString;
真抱谦,让您兜圈子了:)能不能按层来查找或先生成小树,在每个小树中查找,然后再把数加起来?
这里添加节点
树。EndUpdate
或者使用TVirtualTree,节点是一次性分配的
看 zswangII(伴水清清)(一贴不灌,何以灌天下?) ( ) 信誉:
谢谢你贴的连接,正在研究中......
TO: S.F.(chinasf.cnblogs.com)
我的表结构的ID部分也能体现编码树的结构,能贴出部分代参考一下吗?谢谢