代码之家  ›  专栏  ›  技术社区  ›  Ivan Prodanov

tlistview.clear冻结我的应用程序,如何修复它?

  •  2
  • Ivan Prodanov  · 技术社区  · 17 年前

    我在窗体上有一个listview:t listview,我添加了许多值(大约25k tlistviewitem),它工作得很快,但是当我调用listview时,它会冻结。清除,程序会冻结。我用调试器检查过它,它不会单步执行该行。

    我的问题是:我如何解决我的问题?如果可以在不到一秒钟的时间内创建这么多项目,为什么删除它们需要花费很长时间(我等了5分钟以上)?

    5 回复  |  直到 9 年前
        1
  •  14
  •   Deltics    17 年前

    你试过把你的电话寄到 清除 在beginupdate/endupdate块中:

      listview.Items.BeginUpdate;
      try
        listview.Items.Clear;
      finally
        listview.Items.EndUpdate;
      end;
    

    在ListView中添加/删除项(或各种其他控件,如ListBox)会为添加/删除的每个项触发控件的GUI更新。尤其是对于ListView,这可能非常昂贵,对于25000个项目,开销将非常大。

    诚然,5分钟听上去有点过分,但这将是我要尝试的第一件事。

        2
  •  5
  •   Bruce McGee    17 年前

    我要尝试的第一件事是用beginupdate/endupdate包装您的呼叫以清除。

      ListView1.Items.BeginUpdate;
      ListView1.Clear;
      ListView1.Items.EndUpdate;
    

    您是否有任何附加到ListView的事件,并且这些事件是否在清除列表时触发?

        3
  •  2
  •   zz1433    17 年前

    正如其他人所说的,开始更新……endupdate将大大提高性能,但是我建议您将代码移动到使用virtualtreeview。这是一个hybrit树/listview,在不到一秒钟的时间内,它将添加多达1百万个节点(实际上,这取决于处理器,但你知道这个想法)。

    刚开始学起来有点难,但一旦你习惯了它,你就会发现它很容易相处。每当我需要一个ListView或TreeView中的许多行时,我都会亲自查看它,只需查看virtualTreeView即可。哦,忘了在上面说,这是免费的。尝试一下: http://soft-gems.net/

        4
  •  2
  •   Francesca    17 年前

    约翰,清除的时间不应长于添加25K项。
    我想知道您是否在它不可见时加载它(自动禁用更新),但当它可见时清除它,在每个项目删除触发更新的地方。

        5
  •  0
  •   Ivan Prodanov    17 年前

    我不知道我是否应该删除这个问题,我相信它对其他任何人都没有任何用处,但我更愿意保留一段时间,至少对你,谁回答。

    问题是我使用了一个从tlistview继承的组件,我认为这不是问题,所以我决定说tlistview,但我错了。

    我把你所有的答案都投了反对票,请原谅我的无知——我是新来的。