我尝试使用TListView
组件来显示相当大的数据列表(例如4000行大),并且创建列表的速度非常慢 - 这需要2-3秒的时间,这使得UI全部变得模糊并且接近无法使用。
我在TListView.Items
块内填充BeginUpdate/EndUpdate
,只预先分配了字符串 - 我的意思是:我构建了一个要存储的所有字符串的列表(没有人类明显的时间),然后我把它们放在TListView中。
我希望在vsReport
模式下以多列显示TListView的内容。
代码如下所示:
MyList.Items.BeginUpdate;
for i := 0 to MyCount - 1 do
begin
ListItem := MyList.Items.Add;
ListItem.Caption := StrCaptions[i];
ListItem.SubItems.Add(StrSubItems1[i]);
ListItem.SubItems.Add(StrSubItems2[i]);
end;
MyList.Items.EndUpdate;
TListView组件的逻辑中是否还有其他一些黑客攻击?或者我应该忘记将这个组件用于演出?
答案 0 :(得分:7)
您可以在虚拟模式下使用listview。看看virtuallistview.dpr演示。
答案 1 :(得分:4)
您可以尝试使用Virtual Treeview组件。它说“Virtual Treeview非常快。添加一百万个节点只需要700毫秒”
答案 2 :(得分:3)
使用单独的结构来保存数据。将TListView的OwnerData设置为True。
答案 3 :(得分:0)
@ 4000行我只得到~700毫秒(D2009)次。为了提高响应速度,您可以将其与其他线程分开,或将脏的Application.ProcessMessages()添加到循环中。
使用此代码在16毫秒内生成的行:
MyCount := 4000;
dw := GetTickCount();
for i := 0 to MyCount - 1 do begin
StrCaptions.Add('caption'+IntToStr(i));
StrSubItems1.Add('sub1'+IntToStr(i));
StrSubItems2.Add('sub2'+IntToStr(i));
end;
ShowMessageFmt('%u ms', [GetTickCount() - dw]);
印刷:
MyList.Clear;
dw := GetTickCount();
MyList.Items.BeginUpdate;
for i := 0 to MyCount - 1 do
begin
ListItem := MyList.Items.Add;
ListItem.Caption := StrCaptions[i];
ListItem.SubItems.Add(StrSubItems1[i]);
ListItem.SubItems.Add(StrSubItems2[i]);
end;
MyList.Items.EndUpdate;
ShowMessageFmt('%u ms', [GetTickCount() - dw]);
编辑: 我将Application.ProcessMessages()插入到print中,但 somewhy 性能保持不变