在delphi中有一个包含几个字段的列表视图.线程检查项目并将其添加到listview.如果有相同的标题,则会在此标题的子项中添加一个整数.当项目数小于2000时,性能良好.当检查和添加项目和项目计数超过约2000时,性能很差.当项目数量大于20,000时,性能可以描述为非常慢.当项目可能达到50,000或100,000时,有没有办法在listview中快速读写?
非常感谢你提前
编辑:
我们已经阅读了您的所有答案,并感谢您的帮助.
Dav*_*nan 11
Delphi TListView控件是Windows列表视图组件的包装器.在其默认操作模式下,列表数据的副本将从您的应用程序传输到Windows控件,这很慢.
替代方案称为Windows术语中的虚拟列表视图.您的应用程序未将数据传递给Windows控件.相反,当控件需要显示数据时,它会向您的应用询问所需的数据.
Delphi TListView控件使用OwnerData属性公开虚拟列表视图.您必须稍微重新编写列表视图代码,但它确实是唯一的解决方案.
您只需在"虚拟"模式下使用列表即可.
如在此代码中(替换为数据库中的某些数据或TStringList等):
procedure TForm1.ListBox1Data(Control: TWinControl; Index: Integer;
var Data: String);
begin
Data := Format('Item %d',[Index+1]); // set the text to be displayed
end;
Run Code Online (Sandbox Code Playgroud)
您可以使用lbVirtualOwnerDraw样式进一步自定义绘图,并且必须使用OnDrawItem事件处理程序绘制项目.Delphi文档中有一些示例代码(至少在Delphi 7下).;)
在虚拟模式下,您可以以瞬时方式显示50000或100000个项目.
对于存储文本,使用旧的TStringList将比TListBox的Items方法更快,因为这个Items []属性必须与Windows通信,每个项目的"慢"GDI消息,而TStringList将只存储Delphi堆中的文本,通常要快得多.
您可以通过阻止列表视图在更新时重绘自身来在列表视图上调用BeginUpdate和EndUpdate来提高性能.但这可能不会给你你想要的提升.此外,您需要知道直接从线程访问VCL控件是不安全的,除非已同步.
我认为最好跳过listview并选择像Virtual Tree View这样的第三方控件,它既好又免费.:)
几年前我们发现,除了 BeginUpdate / EndUpdate 在添加大量数据之前将 ListView 的 ViewStyle 更改为 vsIcon 之外,在我们完成之后返回到 vsReport 大大提高了性能。如果我没记错的话,那是在 Windows 98 和 Windows 2000 上,所以我不确定是否仍然如此。