如何提高Treeview中节点的删除速度? (100分)

  • 主题发起人 xiao_q654321
  • 开始时间
X

xiao_q654321

Unregistered / Unconfirmed
GUEST, unregistred user!
问题如下:
在Treeview中增加节点速度很快,但从中删除节点速度要慢得多
(即使用了BeginUpdate/EndUpdate也不起作用),不知如何提高删除速度?
示例代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
TmpNode,FirstNode:TTreeNode;
i:integer;
begin
Begintime:=gettickcount;
FirstNode:=TreeView1.Items.AddFirst(nil,'0');
for i:=1 to 400 do
begin
TmpNode:=TreeView1.Items.AddChild(FirstNode,IntToStr(i));
TmpNode:=TreeView1.Items.AddChild(TmpNode,IntToStr(i));
TmpNode:=TreeView1.Items.AddChild(TmpNode,IntToStr(i));
end;
endtime:=gettickcount;
label1.Caption :=inttostr(endtime-begintime);//向树状图中增加1201个节点
//并显示所需时间(大约为0.17s)
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
begin
Begintime:=gettickcount;
treeview1.Items.BeginUpdate;
for i:=TreeView1.Items.Count -1 downto 0 do
TreeView1.Items.Delete;
treeview1.Items.EndUpdate;
endtime:=gettickcount;
label2.Caption :=inttostr(endtime-begintime);//一个一个的删除所有节点
//显示所需时间(大约需要30s)
end;
有没有提高删除速度的办法?
——请看清楚再回答,这里只是一个示例,表示速度的差异,实际上我并不是要删除所有
的节点,所以必须遍历并一个一个删除。
 
我也想知道。第一次删没有时间延迟,第二次则要三四秒。
 
这样就很快啊
Begintime:=gettickcount;
treeview1.Items.BeginUpdate;
while TreeView1.Items.Count >0 do
TreeView1.Items[0].Delete;
treeview1.Items.EndUpdate;
endtime:=gettickcount;
label2.Caption :=inttostr(endtime-begintime);//一个一个的删除所有节点
 
siyan:
我并不是删除全部的节点,这里只是一个示例。实际上用Items.Clear或直接用
Items[0].delete就可以删除全部节点(没必要再加循环),那样是很快的(相当于
只调用了一次delete),但我需要的是从中删除一部分节点,所以必须遍历并一个
一个删除,我想知道的是在这种情形下有没有办法提高速度?
 
TreeView1.Items.Clear
 
不好意思,帮不上忙
我试了一下,即使我只删除一个节点,花费的时间竟然和创建所有节点花费的时间差不多
我觉得是TreeView1.Items这里调用GetNodeFromIndex(Index: Integer)花费的时间
也就是说你从后面开始删除节点,每次删除时,treeview就会遍历一遍自己所有的节点
才能找到要删除的节点,而从GetNodeFromIndex(Index: Integer)里面的代码来看
如果你是从前面开始删除,速度应该会快一些,至于其他的因素,我也不知道
希望有高手来帮忙吧
 
还有,使用相对索引来定位节点也会快很多
 
我也这个问题
用 for i:=0 to listview1.selcount-1 do
delete

但是还是不快
 
我也在删除节点,
是用itraweb的IWTreeView,更慢。
 
siyan:多谢
 
按你的要求,很难再快到什么程度了...若数据多可试一下二分法..
 
没有其他建设性的意见了吗?
 
基本解决了,虽然还是有点不爽...
siyan的考虑很有道理,我改变了遍历方法,采用getprev,速度大大提高。
 
siyan:
可否告知你的mail,便于以后交流。
我的信箱是xiao_q654321@163.com.
 

Similar threads

I
回复
0
查看
480
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
697
import
I
顶部