如何在delphi的listview中快速读写?

如何在delphi的listview中快速读写?,delphi,Delphi,delphi中有一个包含多个字段的listview。线程检查并向listview添加项目。如果有相同的标题,将在该标题的子项中添加一个整数。当项目计数小于2000时,性能正常。检查和添加项目时,项目数超过2000个左右,性能较差。当项目数大于20000时,性能可以描述为极其缓慢。当项目可能达到50000或100000时,是否有一些方法可以快速读取和写入listview 事先非常感谢 编辑: 我们已经阅读了您的所有答案,感谢您的帮助。您可以在listview上调用BeginUpdate和EndUp

delphi中有一个包含多个字段的listview。线程检查并向listview添加项目。如果有相同的标题,将在该标题的子项中添加一个整数。当项目计数小于2000时,性能正常。检查和添加项目时,项目数超过2000个左右,性能较差。当项目数大于20000时,性能可以描述为极其缓慢。当项目可能达到50000或100000时,是否有一些方法可以快速读取和写入listview

事先非常感谢

编辑:


我们已经阅读了您的所有答案,感谢您的帮助。

您可以在listview上调用BeginUpdate和EndUpdate,通过防止listview在更新时重新绘制自身来提高性能。但这可能不会给你想要的动力。 此外,您需要知道,除非同步,否则直接从线程访问VCL控件是不安全的


我认为最好跳过listview,选择一个第三方控件,这样既好又免费。:)

Delphi TListView控件是Windows列表视图组件的包装器。在默认操作模式下,列表数据的副本会从应用程序传输到Windows控件,这很慢

在Windows术语中,另一种方法称为虚拟列表视图。你的应用程序未将数据传递到Windows控件。相反,当控件需要显示数据时,它会向应用程序请求所需的数据


Delphi TListView控件通过使用OwnerData属性公开虚拟列表视图。您必须重新编写列表视图代码,但这确实是唯一的解决方案。

使用OnData处理程序尝试虚拟列表视图

数据保留在您自己的数据结构中,listview在需要时调用OnData处理程序以获取所需的数据项。i、 e.当数据结构要求时,您可以从中提取特定数据


您的另一项工作是使listview的ItemCount与列表中的项目数保持一致。

几年前,我们发现,除了BeginUpdate/EndUpdate之外,在向listview添加大量数据之前将其ViewStyle更改为vsIcon,在大大提高性能之后再将其更改为vsReport。如果我没记错的话,那是在Windows 98和Windows 2000上,所以我不确定是否仍然是这样。

您只需要在“虚拟”模式下使用列表

  • 在你的表格上放一个列表框
  • 将样式属性设置为lbVirtual
  • 将Count属性设置为列表中的项目数
  • 然后使用OnData处理程序提供要根据请求显示的文本:
  • 与此代码相同(替换为来自数据库或TStringList等的一些数据):

    可以使用LBVirtualLownerDraw样式进一步自定义图形,并且必须使用OnDrawItem事件处理程序绘制项目。Delphi文档中有一些示例代码(至少在Delphi7中有)

    在虚拟模式下,您可以即时显示50000或100000个项目


    对于存储文本,使用好的旧TStringList将比TListBox的Items方法更快,因为此Items[]属性必须使用每个项的“slow”GDI消息与Windows通信,而TStringList只将文本存储在Delphi堆中,这通常要快得多。

    在更新项目时,BeginUpdate和EndUpdate是绝对必须的。 根据你的描述,这听起来像是你在项目中循环寻找特定的标题。这很慢,显然,随着数据量的增加,这一点会变得更加明显

    由于要查找匹配的标题,请使用ListViewFindCaption功能

    这将执行一个windows调用来搜索项目,并且相当快速和简单。如果找到它,它会传回该项,您可以引用它来更新子项。否则,请创建一个新项目并继续处理

    只要你的线程安全,你应该能够看到体面的性能


    HTH.

    我还打算建议他必须切换到listview的虚拟模式。就个人而言,我们使用Golztrol提到的虚拟树视图。Mike Lischke的虚拟树视图非常棒。但是,如果您有一个列表而不是一个树,那么使用列表视图组件有很多话要说,因为它允许您在平台上使用本机组件。另外,虚拟树视图呈现了一条相当不错的学习曲线。@Tupel这个问题没有提到grouping@David你是对的,但我认为它可能对人们搜索关于这个主题的信息有用(我发现这个问题的原因)。FindCaption IIRC导致了一个API调用,但我可能错了。我不能100%确定这台机器上有Delphi。我快速查看了虚拟树视图组件。使用多个标准的TListView和TTreeView控制器将其放入应用程序中,并访问代码中的列和树节点并对其进行操作,这有多“困难”?我们是说完全重写那些部分吗?如果是这样的话,只使用TTreeView和TListView,而不将它们改为虚拟的,在速度上会有多大的差异?我真的不知道速度的差异。我认为虚拟TListView也可能非常快,但我没有以这种方式使用它,所以我无法给您一个适当的比较。
    procedure TForm1.ListBox1Data(Control: TWinControl; Index: Integer;
      var Data: String);
    begin
      Data := Format('Item %d',[Index+1]); // set the text to be displayed
    end;