TListView性能问题

时间:2010-08-13 08:06:12

标签: delphi vcl

我尝试使用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组件的逻辑中是否还有其他一些黑客攻击?或者我应该忘记将这个组件用于演出?

4 个答案:

答案 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 性能保持不变