我用程序启动速度变慢 要90秒呀(100分)

  • 主题发起人 主题发起人 无限风
  • 开始时间 开始时间

无限风

Unregistered / Unconfirmed
GUEST, unregistred user!
谁帮助我呀把下面的带码优化,把启动速度加快呀!

Adodataset1有一万多条记录
function TFrmMain.TreeAddItem(Sender: TTreeView; ItemList: TStrings;Resort: Boolean): TTreeNode;
var
ThisNode, Node: TTreeNode;
I: Integer;
begin
Node := nil; //nil = level 0 has no parent node
//this is checked by TreeFindItem
for I := 0 to Itemlist.count -1 do
begin
if i<Itemlist.count -1 then
ThisNode := TreeFindItem(Sender, node, Itemlist)
else ThisNode:=nil;
if ThisNode <> nil then
Node := ThisNode
else
begin
if I <= Itemlist.count -1 then
begin
if I = 0 then
begin
Node := Sender.items.Add(Node, Itemlist);
node.ImageIndex:=1;
end
else
begin
Node := Sender.items.AddChild(Node, Itemlist);
if i=1 then
node.ImageIndex:=1;
end;
end;
Node.stateIndex := Node.level + 1;
if Resort and (Node.parent <> nil) then Node.parent.alphasort;
end;
end;
Result := Node;
end;

function TFrmMain.TreeFindItem(Sender: TTreeView; NodeItem: TTreeNode; Name: String): TTreeNode;
begin
if NodeItem = nil then NodeItem := Sender.items.getfirstnode
else NodeItem := NodeItem.getfirstchild;
//NodeItem is now the first item of the desired level
//if this level has no items, NodeItem is nil

if (NodeItem <> nil) and (NodeItem.text <> Name) then
repeat
NodeItem := NodeItem.getnextsibling;
until (NodeItem = nil) or (NodeItem.text = Name);
Result := NodeItem;
end;


Function TFrmMain.GetFieldList: TStringList;
var str,strtem:string;
begin
FieldList.clear;
str:=Adodataset1.fieldbyname('type1').asstring;
str:=uppercase(str);
FieldList.add(str);
str:=Adodataset1.fieldbyname('nx').asstring;
strtem:=copy(str,1,2);
FieldList.add(strtem);
FieldList.add(str);
Result := FieldList;
end;

procedure TFrmMain.FormCreate(Sender: TObject);
begin
ADODataSet1.open
FieldList := TStringList.create;
TreeView1.items.BeginUpdate;
ADODataSet1.first;
while not ADODataSet1.eof do
begin
TreeAddItem(TreeView1, GetFieldList, false);
ADODataSet1.next;
end;
FieldList.clear;
TreeView1.Alphasort;
TreeView1.items.Endupdate;
ADODataSet1.first;
end;


 
哇!!!!慢慢来嘛,一下子搞这么多!!!
 
谁帮助我呀把下面的带码优化,把启动速度加快呀!
 
关键是你的需求太特殊了,你遍历了10000条记录!
速度根本不会有太大的提高的。即使修改了TreeView部分的代码,也不会有明显的提高。
不妨实验一下,注释掉添加TreeView的代码,看速度如何?估计也会很慢的,毕竟从数据库
中提取10K的记录。
难呀,除非你改变设计思想,需要的时候再从数据库中取。
就是首先取出TreeView的第一层数据,当点击第二级节点的时候再取相应节点数据。
 
我试试
谢谢yzhshi
 
还是不行
 
为什么不行?
说一下你的实现思路。
 
改为
Function TFrmMain.GetFieldList: TStringList;
var str,strtem:string;
begin
FieldList.clear;
str:=Adodataset1.fieldbyname('type1').asstring;
str:=uppercase(str);
FieldList.add(str);
str:=Adodataset1.fieldbyname('nx').asstring;
strtem:=copy(str,1,2);
FieldList.add(strtem);
// FieldList.add(str);
Result := FieldList;
end;

就是首先取出TreeView的第一层数据,当点击第二级节点的时候再取相应节点数据---怎么实现呀???/
 
不是呀,你需要改下面的,不能这样遍历!这是最耗时的!
while not ADODataSet1.eof do
begin
TreeAddItem(TreeView1, GetFieldList, false);
ADODataSet1.next;
end;
 
那怎样遍历呢?
你的qq呢?
我们用qq好吗?
我的qq:8556597
 
不使用遍历,而是根据点的节点不同,生成不同的SQL语句进行查询,动态对TreeView控件进行
填补。其实就是填写SQL的Where部分。
只有这样,否则速度真的不会快起来。
这样做其实就是将查询的时间分散开了,分给了用户点击TreeView时,所以启动能够快一些。
但是你的代码就需要做大的修改了。
 
给我源代码好吗?
谢谢
 
同意yzhshi的意见,要改变设计思想,否则无法提速。
 
给我源代码好吗?
谢谢
wind0904@263.net
 
Have a look my application (with full source):
Http://varphone.delphibbs.com/index.html
or http://varphone.8u8.com/download/richer1.0.zip
 
太难看了,我看不懂呀!!
你帮助我把它提出来好吗?
 

Similar threads

后退
顶部