跟据数据库表动态建树,表结构如下: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()方法会遍历所有结点来查找,我想这可能是慢的原因,该怎么解决呢?

解决方案 »

  1.   

    有点乱阿,上面有个tquery下面又出了个tquery1,还有个oraq是什么,TQ.FIELDBYNAME('FITTING_NAME').Text这里的fitting_name又是哪个字段?看了半天有点头晕,new(p)之后要dispatch(p),如果要查找树的话只能遍历,否则怎么知道是否存在?还有:
    if P^ =sText then begin
                 RESULT:=TreeV.Items[i];
                 Exit;//这里改成break;
              end;
      

  2.   

    to:bluekitty(可爱猪猪) tquery下面又出了个tquery1,和oraq 是一个东东,我为了贴上来让大家看起来简单些,把名字改了,但同于匆忙没改全,其实这里面只有一个tquery。
    TQ.FIELDBYNAME('FITTING_NAME').Text 也就是得到树节点的名字,相当于tquery.FIELDBYNAME(NAME').asString;
    真抱谦,让您兜圈子了:)能不能按层来查找或先生成小树,在每个小树中查找,然后再把数加起来?
      

  3.   

    树。BeginUpdate
    这里添加节点
    树。EndUpdate
    或者使用TVirtualTree,节点是一次性分配的
      

  4.   

    http://community.csdn.net/Expert/topic/3226/3226114.xml?temp=.850506
    看 zswangII(伴水清清)(一贴不灌,何以灌天下?) ( ) 信誉:
      

  5.   

    TO:jinjazz(近身剪(充电中...)) 
    谢谢你贴的连接,正在研究中......
    TO: S.F.(chinasf.cnblogs.com)
    我的表结构的ID部分也能体现编码树的结构,能贴出部分代参考一下吗?谢谢
      

  6.   

    见过用node的^data存放parentid的用法,不知是否会快些