表记录为30000条,要求一次性全部显示,提高速度
代码如下:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ToolWin, ActnMan, ActnCtrls, StdActns, BandActn,
  ExtActns, ActnList, ComCtrls, Grids, ValEdit, ExtCtrls, XPStyleActnCtrls,
  DBGrids, DB, ImgList, ActnMenus, ADODB, StdCtrls,DateUtils;type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);  private
  procedure Add(var Nodes:TTreeNode;x:string);
    { Private declarations }  public
    { Public declarations }
  end;var
  Form1: TForm1;
  ADOQuery1: TADOQuery;
  TreeView1: TTreeView;implementation{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
nodes:TTreenode;
x:string;
a,b:tdatetime;
begin
a:=now;
begin
with ADOQuery1 do
begin
close;
sql.clear;
sql.add('select id,caption from lianxi where lb=''father'' and fjid=''0'' order by id');
open;
while not eof do
begin
nodes:=TTreenode.create(nil);
nodes:=Treeview1.Items.add(nil,FieldbyName('caption').AsString);
x:=ADOQuery1.fieldbyname('id').asstring;
Add(nodes,x);
next;
end;
end;
end;
b:=now;
ShowMessage(IntToStr(SecondsBetween(A,B)));
end;procedure TForm1.Add(var Nodes:TTreeNode;x:string);
var
  sub:TTreenode;
  List:TADOQuery;
begin
    List:=TAdoQuery.Create(nil);
    List.Connection:=ADOConnection1;
  with List do
  begin
    Close;
    Sql.Clear;
    Sql.Add('select id,caption from lianxi where fjid=:par order by id');
    parameters.ParamByName('par').Value:=x;
    open;
    While not Eof do
    begin
      sub:=Treeview1.Items.AddChild(nodes,FieldbyName('caption').AsString);
      add(sub,fieldbyname('id').asstring);
      next;
    end;
  end;
    List.Free;
end;end.
哪里可以再优化?提高速度

解决方案 »

  1.   

    TreeView1.Items.BeginUpdate;   
            //你上面的代码   
    TreeView1.Items.EndUpdate;   
    这样你试一下
      

  2.   

    最简单的办法:用功能强劲的第三方控件,比如dxTreeView。自己写的话对算法的要求太高!
      

  3.   

    用virtualtreeview,其性能用了便知
      

  4.   

    其实我个人觉得和SELECT语句的执行次数有关系,所以大家看看能不能减少SELECT语句的执行次数呢?
      

  5.   

    sql.add('select id,caption from lianxi where lb=''father'' and fjid=''0'' order by id'); x:=ADOQuery1.fieldbyname('id').asstring; Sql.Add('select id,caption from lianxi where fjid=:par order by id'); 
    parameters.ParamByName('par').Value:=x; 你不感觉这第二次SQL查询是多余的吗?
      

  6.   

    用SQL语句一次返回所有的节点,节点按树展开的顺序排序.读取数据创建每一个节点时,只要找到这个节点的上级节点就可以了,因为是按展开的顺序排序的,
    所以很快可以找到.如果显示在 TVirtualStringTree 这样的控件上,就要将读取的结果先保存起来.
      

  7.   

    在添加节点时要想快, BeginUpdate 和 EndUpdate 肯定也是不能少的
      

  8.   

    1.加BeginUpdate 和 EndUpdate
    2.将结果集DownLoad到ADOQuery1后,在添加结点时,就应该用Filter功能,从内存中过滤相应的结点,而不是用SQL再次连接来查询