想建一个树目录,但是用下面代码产生的大概2000条数据共四张的树目录要等几分钟才形成,能用什么方法能快点呢?  procedure Txsxxxgfrm.FillTreeView(TreeView: TTreeView);
  procedure CreateSubTree(FNodeName: string; Node: TTreeNode = nil);
  var
    mLocalName: string;
    TreeNode: TTreeNode;
    Ads_Tmp: TADODataSet;
  begin
    ADS_Tmp := TADODataSet.Create(Self);
    ADS_Tmp.Connection := datafrm.adomain;
    with ADS_Tmp do
    try
      Close;
      CommandText := 'Select * from xq Where sjID =' + FNodeName;
      Open;
      First;
      while not Eof do
      begin
        mLocalName := FieldbyName('ID').Asstring;
        TreeNode := TreeView.Items.AddChild(Node, FieldByName('mc').AsString);
        CreateSubTree(mLocalName, TreeNode); // 此处循环递归
        Next;
      end;
    finally
      ADS_Tmp.Free;
    end;
  end;
begin
  TreeView.Items.BeginUpdate;
  TreeView.Items.Clear;
  with TreeView.Items.Add(nil, '所有目录') do
  begin
    ImageIndex := 1;
    SelectedIndex := 1;
  end;
  CreateSubTree('0', TreeView.Items[0]);
  TreeView.Items.EndUpdate;
  TreeView.Items[1].Selected := True;
end;

解决方案 »

  1.   

    不用递归可以吗?我的数据结构是
    ID SJID MC
    1   0   院系
    2   1   专业2
    3   1   专业1
    4   2   年级
    5   3   班级1
    6   3   班级2
      

  2.   

    1.Select * from xq Where sjID =' + FNodeName;这句SQL你把*改成相对应的字段值.
    Select id,sjid,mc from xq Where sjID =:sjid
    采用绑定参数的形式,这样能够快一点.
    2.可以不用递归,因为用递归会降慢速度.
      

  3.   

    楼上,在TreeView的单击事件里写
    如果树结构稳定的话,建议给树结构存到文件里,下次用的时候直接从文件里导入速度快
      

  4.   

    弄了个简单的例子,希望对你有帮助.没有联数据库,只是模拟了一下你所说的情况
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls;type
      PT = ^TT;
      TT = record
        code: string;
        name: string;
      end;type
      TForm1 = class(TForm)
        Button1: TButton;
        TreeView1: TTreeView;
        procedure Button1Click(Sender: TObject);
        procedure TreeView1Click(Sender: TObject);
      private
        { Private declarations }
        FT : PT;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      t1,t2: TTreeNode;
    begin
      t1 := treeview1.Items.Add(nil,'所有节点');
      //在这里可以根据查询条件从数据库中取属于第一级的数据.
      new(FT);
      FT.code := '1';
      FT.name := '测试1';
      t2 := treeview1.Items.AddChild(t1,FT.name);
      t2.Data := FT;
      new(FT);
      FT.code := '2';
      FT.name := '测试2';
      t2 := treeview1.Items.AddChild(t1,FT.name);
      t2.Data := FT;
    end;procedure TForm1.TreeView1Click(Sender: TObject);
    var
      t1,t2: TTreeNode;
    begin
      //在这里可以根据不同的级别提取不同的数据挂在其下做为它的子结点.
      if (treeview1.SelectionCount=1) and (treeview1.Selected.Level=1) then
      begin
        new(FT);
        FT := treeview1.Selected.Data;
        if FT.code='1' then
        begin
          t1 := Treeview1.Selected;
          treeview1.Items.AddChild(t1,'1-adasfa');
          treeview1.Items.AddChild(t1,'1-aasfasfdaa');
        end;
        if FT.code='2' then
        begin
          t1 := Treeview1.Selected;
          treeview1.Items.AddChild(t1,'2-adasfa');
        end;
      end;
    end;end.
      

  5.   

    给你一个完整的代码,数据库sqlserver
    表:
    create table dept(id int,sjid int,mc varchar(20));
    insert into dept values(1,0,'院系');
    insert into dept values(2,1,'专业2');
    insert into dept values(3,1,'专业1');
    insert into dept values(4,2,'年级');
    insert into dept values(5,3,'班级1');
    insert into dept values(6,3,'班级1');unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls, DB, ADODB;type
      pdept = ^Tdept;
      Tdept = record
        id: integer;
        sjid: integer;
        mc: String;
      end;
    type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        Button1: TButton;
        TreeView1: TTreeView;
        procedure Button1Click(Sender: TObject);
        procedure TreeView1DblClick(Sender: TObject);
      private
        { Private declarations }
        Fdept: pdept;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      t1,t2 : TTreeNode;
    begin
      treeview1.Items.Clear;
      t1 := treeview1.Items.Add(nil,'所有信息');
      with adoquery1 do
      begin
        close;
        sql.Text := ' select id,sjid,mc from dept where sjid=0 order by id';
        open;
        while not eof do
        begin
          new(Fdept);
          Fdept.id := fields[0].AsInteger;
          Fdept.sjid := fields[1].AsInteger;
          Fdept.mc := fields[2].AsString;
          t2 := treeview1.Items.AddChild(t1,Fdept.mc);
          t2.Data := Fdept;
          next;
        end;
      end;
    end;procedure TForm1.TreeView1DblClick(Sender: TObject);
    var
      t1,t2: TTreeNode;
    begin
      if (treeview1.SelectionCount=1) and (treeview1.Selected.Level<>0) then
      begin
        t1 := Treeview1.Selected;
        t1.DeleteChildren;
        new(FDept);
        FDept := TreeView1.Selected.Data;
        with adoquery1 do
        begin
          close;
          sql.Text := ' select id,sjid,mc from dept where sjid=:id order by id';
          parameters.ParamByName('id').Value := FDept.id;
          open;
          while not eof do
          begin
            new(FDept);
            FDept.id := Fields[0].AsInteger;
            FDept.sjid := Fields[1].AsInteger;
            FDept.mc := Fields[2].AsString;
            t2 := treeview1.Items.AddChild(t1,Fdept.mc);
            t2.Data := Fdept;
            next;
          end;
        end;
      end;
    end;end.