Delphi将项目添加到ComboBox速度

Ste*_*est 8 delphi performance combobox

我有一个相当复杂和庞大的应用程序,负载和数据负载.是否有一种快速的方法来向ComboBox添加不需要这么长时间的项目?在我的P3 3.2ghz上,以下片段只需不到一秒钟即可添加大约32,000个项目.(MasterCIList是一个StringList,字符串通常为20-30个字节长).

with LookupComboBox do
 begin
  Items.BeginUpdate;
  Items.Clear;
  for i := 0 to MasterCIList.Count - 1 do
   Items.Add(MasterCIList[i]);
  Items.EndUpdate;
 end;
Run Code Online (Sandbox Code Playgroud)

钻进VCL,似乎在TComboBoxStrings.Add,有一个电话

Result := SendMessage(ComboBox.Handle, CB_ADDSTRING, 0, Longint(PChar(S)));
Run Code Online (Sandbox Code Playgroud)

我猜这真的占用了时间(好吧,我知道它是).是否有另一种方法来填充更快速的项目?有没有高速组合盒?我有TMS组件,但它们似乎是TComboBox的扩展.

例如,我有PlusMemo似乎是对TMemo的完全重写.我可以在一秒钟内轻松地向PlusMemo添加一百万行.一个TMemo,我不这么认为.

非常感谢您的参与!

onn*_*odb 17

对不起,如果我是一个讨厌的人,但我怀疑一个拥有32,000个项目的TComboBox甚至可以远程"使用" - 我会说这是有原因的,因为它很慢:它从来没有打算这样做:)

是否有可能过滤数据,只加载一个子集?更具体地说,在我一直在研究的一个特定数据库应用程序中,用户可以搜索一个人.我们让用户输入至少3或4个字符的名称,然后才开始在列表框中返回结果.这大大提高了搜索表单的可用性,也大大加快了整个过程.

你能按照类似的方法吗?

或者,在一个完全不同的观点上,也许你可以看看VirtualTreeView组件 - 直接使用或灵感.


X-R*_*Ray 1

也许 cmb.Items.Assign(myStringList) 会有所帮助。

这是一个疯狂的想法:我还没有尝试过,但您可能会检查是否有一种方法可以通过设置项目数量然后所有者绘图来虚拟加载组合框。请原谅这个疯狂的想法,但我想我听说过这个可以以某种方式实现。无关紧要:这就是在 Palm OS 中完成的方式...加载组合框的更快方法是不加载全部...;-)

这不是答案,但您到底为什么要在一个组合框中包含 32,000 个项目呢?这是存储大量数据的糟糕方法。

我同意; 这是一个不好的做法...