我要实现从数据库中取出数据,然后显示成树状结构的形式
我的算法如下:
procedure TFrmmain.treefind(const parentname:string;var node:TTreenode; parentquery:TADOQuery);
var                                         //递归便利
fnode:TTreenode;
cadoquery:Tadoquery;
begin
cadoquery:=Tadoquery.Create(nil);
try
cadoquery.Connection:=DMBook.ADOCBOOK;
DMBook.ADOCBOOK.BeginTrans;
  with parentquery do
  begin //with
    Close;
    SQL.Clear;
    SQL.Add('select distinct * from Listtb where ParentName=:ParentName order by ListName desc');
    Parameters.ParamByName('ParentName').Value:=ParentName;
    Open;
    Disablecontrols;
    DMBook.ADOCBOOK.CommitTrans;
    if recordcount > 0 then
    while not eof do
      begin
        fnode:=treeview1.Items.AddChildFirst(node,fieldbyname('ListName').AsString);//增加叶子
  //      fnode.SelectedIndex:=fnode.ImageIndex;
        treefind(fieldbyname('ListName').AsString,fnode,cadoquery);
        next;
      end;
      enablecontrols;
  end;   //with
  finally
 cadoquery.Free;
  end;
 end;
请问如何提高效率,我数据库中的数据有20000多条数据,我想用用很短的时间把它显示出来,请教那位高手会这个问题,请多多指教啊!

解决方案 »

  1.   

    参见http://community.csdn.net/Expert/topic/5068/5068078.xml?temp=.4545862中的frankzhenglei(小白鸽) 的方法,因为你的数据比较多。
    介绍下小白鸽的方法,不用递归,开始只添加1级的数据,当点击这个项的时候,添加下一级的数据,简单来说,只有点击某个项才去获取这个项的下一级数据,不需要递归算法。
    另外还有就是XP资源管理器的方法值得借鉴,要看你每一级所用到的数据的数量。
    资源管理器的方法是,使用递归,每次添加树的3级项目(大概3级,没有仔细分析),等到点击没有获得数据的项目时,再为这个项目添加3级子项目,自己可以看下资源管理器,当你点击某个树形文件夹,有的时候花的时间特别长,就是这个装载数据的时间。这种方法结合了递归和需要时取数据2种方法,效率比较好,合理分配程序开始装载的时间和运行期间花费的时间。不过这样也有坏处,就是算法复杂些。
    具体一次添加几级项目,要根据每一级项目的数量决定。