【问题标题】:Stringlist sort progress barStringlist 排序进度条
【发布时间】:2014-03-09 19:42:34
【问题描述】:

我有一个 TListBox,它在加载时可以有一个很长的字符串列表,所以我让操作员通过单击一个按钮来启动排序。有时,排序可能需要将近一分钟,操作员会想知道发生了什么。

有什么方法可以使用 TProgressBar 来显示正在发生的事情吗?如果有,怎么做?

我可以在开始时将屏幕变灰(视觉上禁用),然后在排序完成后重新变回白色吗?如果有,怎么做?

谢谢

【问题讨论】:

  • 您是否在后台线程中运行排序?列表中有多少项?我敢打赌,您可以将排序速度提高几个数量级。
  • FWIW,排序需要一分钟,列表中包含大约 1000 万个项目。如果你的数量比这个少很多,那么解决问题的方法就是修复排序。
  • @DavidHeffernan 感谢 cmets,大约有 60,000 到 90,000 个长字符串(300 多个字符)要按字母顺序排序。理想情况下 SQL 会更好,但这是我试图为小型企业廉价修改的一些旧软件,所以重写已经结束。我只是使用 Listbox.Sort 方法。速度——我敢说,它是在win98上运行的!哈哈
  • 你在使用TListBox.Items.BeginUpdate/EndUpdate吗?这应该会加快速度。
  • @LURD,这可能会加快速度,但 WM_SETREDRAW 消息是在 Windows 98 上出现的 TListBoxStrings (至少在 Delphi 2009 中)的 SetUpdateState 方法的后面:-) ?

标签: delphi sorting listbox delphi-4


【解决方案1】:

我相信您的根本问题是您将视觉控件用作容器。对容器内的列表进行排序会产生糟糕的性能。将 60,000 个字符串放入 TStringList 中,您将能够立即对它们进行排序。

您可以在虚拟模式下操作它,而不是拿着可视控件中的项目。这将是最有效的操作方式。

如果您进行了这些更改,那么您将不需要进度条。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    相关资源
    最近更新 更多