想建一个树目录,但是用下面代码产生的大概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;
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;
解决方案 »
- 程序关闭时,无效的窗口句柄!
- Chart 怎样不x和y轴坐标换成这样的
- combobox的简单问题,但是我不会,请高手赐教
- 用程序怎么给Access数据设置密码
- webbrowser打开word文档的问题
- 请问怎样才能让控件的caption里面的内容回车啊?
- 几个问题怎么没人回答?
- 求救求救!!!!!!!!!!!!!!!!!!!! 关于2000和98的字体的问题。
- 数据库:如何知道已经打开的DatabaseName
- 救命!!!!怎样实现将鼠标移动到指定位置(模拟用手滚动鼠标),如ACDSEE32那样?
- 使用delphi开发小型数据库系统(保证结贴给分)
- 谁有Delphi6下的NMconst.dcu
ID SJID MC
1 0 院系
2 1 专业2
3 1 专业1
4 2 年级
5 3 班级1
6 3 班级2
Select id,sjid,mc from xq Where sjID =:sjid
采用绑定参数的形式,这样能够快一点.
2.可以不用递归,因为用递归会降慢速度.
如果树结构稳定的话,建议给树结构存到文件里,下次用的时候直接从文件里导入速度快
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.
表:
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.