我有一个相当复杂和大型的应用程序,它负责加载和加载数据。有没有一种快速的方法可以将项目添加到ComboBox中,而不需要花费太长的时间?在我的P3 3.2 the上,下面的代码片段只用了不到一秒钟的时间就添加了大约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;
深入到VCL,看起来在TComboBoxStrings.Add
中,有一个调用
Result := SendMessage(ComboBox.Handle, CB_ADDSTRING, 0, Longint(PChar(S)));
我猜这真的很占用时间(好吧,我知道是这样)。有没有其他更快填充项目的方法?有没有高速组合盒?我有TMS组件,但它们似乎是TComboBox的扩展。
例如,我有一个似乎完全重写了TMemo的PlusMemo。我可以很容易地在一秒钟内向PlusMemo添加一百万行代码。一个TMemo,我不这么认为。
非常感谢您的宝贵时间!
发布于 2009-03-20 21:35:09
如果我是个麻烦的人,我很抱歉,但我怀疑一个有32,000个项目的TComboBox甚至根本不是“可用的”-我想说它慢的原因是:它从来没有打算这样做:)
有没有可能过滤数据,只加载子集?更具体地说,在我一直在开发的一个特定数据库应用程序中,用户可以搜索一个人。我们让用户输入至少3或4个字符的名称,然后才开始在列表框中返回结果。这大大增加了搜索表单的可用性,也大大加快了整个过程。
你能遵循类似的方法吗?
或者,从完全不同的角度来看,也许您可以看看VirtualTreeView组件-或者直接使用,或者从中获得灵感。
发布于 2009-03-21 01:29:15
我同意在一个组合盒里有3万2千个项目是一个荒谬的数量...也就是说,您可以先尝试将项添加到TStringList中,然后结合使用Begin/EndUpdate和AddStrings:
SL := TStringList.Create;
try
// Add your items to the stringlist
ComboBox.Items.BeginUpdate;
try
ComboBox.Items.AddStrings(YourStringList);
finally
ComboBox.Items.EndUpdate;
end;
finally
SL.Free;
end;
代码可以编译,但我没有进一步测试它;我从来没有觉得有必要向组合框或列表框添加几十个以上的项。如果需要更多的条目,我会找到一种方法在填充列表之前进行过滤,这样条目就会更少。
只是出于好奇,你怎么能期望用户在这么多项目中进行排序来做出决定呢?
发布于 2013-12-07 08:01:30
var
Buffer: TStringList;
begin
Buffer := TStringList.Create;
try
// --> Add items to Buffer here <--
ComboBox.Items := Buffer;
finally
FreeAndNil(Buffer);
end;
end;
这是我们发现的更新视觉控件的最快方法。
VCL在内部执行BeginUpdate、Clear和EndUpdate。
如果你不相信我,那就分析一下吧。
https://stackoverflow.com/questions/668054
复制相似问题