首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序TListbox --高低不一

排序TListbox --高低不一
EN

Stack Overflow用户
提问于 2009-09-10 15:07:30
回答 5查看 2K关注 0票数 1

好的,我有一个TListBox,有时可能会被调用来显示43,000行代码!

我知道,这很难说得通,但事实就是如此。

现在的问题是:

使用内置的排序方法及其比较回调函数,几乎需要花费很长时间,就像许多分钟一样。

因此,我将字符串从列表框中提取出来,放入一个简单的ShortStrintgs动态数组中,对其执行QuickSort(),这大约需要三秒钟。我想是Whopee!

稍微思考一下,我发现QuickSort正在移动所有这些字符串,这是不必要的,所以我将代码更改为只移动指向字符串的指针或索引,瞧,排序速度又快了很多,排序时间不到一秒就能对43,000个项目进行排序。大获全胜,对吧?

但是,现在如果我执行LB.Items.Add()或LB.Items.Assign来将排序后的字符串移动到列表框中,大约需要30秒!即使发生了BEgin/EndUpdate。如果我仔细查看代码,我会看到一大堆关于delete()、Insert()、INsertObject()和Windows消息无端飞来飞去的东西。

稍等片刻,就会发现我已经拥有了LB.TStrings中的所有字符串,我只需要在我的QuickSorted()数组中处理它们。这应该是微不足道的,只是移动了一些指针。

但是我没有看到任何可见的方法来设置原始的TStringList指针。不,Exchange()真的很慢。

你知道怎样才能找到TString字符串指针吗?这应该是微不足道的,但我没有看到它。

谢谢,

乔治

EN

回答 5

Stack Overflow用户

发布于 2009-09-10 15:27:16

所有这些消息实际上都是为了一个非常好的理由。没有神奇的“显示列表中的内容”功能。它必须获取列表的内容,从列表中构建一个树,一次一个项目,并显示树中恰好属于可视控件的ClientRect的任何部分。你的外部字符串列表技术听起来像是你能得到的最快的东西。

如果您想要更好的性能,请尝试查看速度更快的列表框。我听说Virtual TreeView在添加大批量新项目时速度非常快,尽管我不能真正推荐它,因为我还没有使用过它,也没有亲自测试过它。但您可能希望查看一下,看看它是否比现有设置更适合您的需要。

票数 5
EN

Stack Overflow用户

发布于 2009-09-10 17:20:37

您尝试过将TListBox.Style设置为lbVirtual吗?然后列表框要求您提供OnData()事件中的数据

请参阅http://www.delphi3000.com/articles/article_3761.asp?SK=

票数 4
EN

Stack Overflow用户

发布于 2009-09-10 15:36:36

您可以使用的另一种方法(我自己也成功地使用过)是停止应用程序重新绘制控件,将列表复制到第二个TStringList,对该TStringList进行排序,然后再复制回来。停止重绘的关键是这样的命令:

SendMessage(Application.Handle, WM_SETREDRAW, 0, 0);

第一个0告诉应用程序停止绘制到窗口,因此所有这些消息都会立即删除,并且应用程序可以更快地移动。当准备好重新绘制屏幕时,只需将第一个0替换为1,然后调用

RedrawWindow(Application.Handle, nil, 0, [Options])

强制立即重新绘制所有内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1405867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档