7

What is the correct way to implement the "find as you type" behavior on a TComboBox descendant component whose style is csOwnerDrawFixed?

4

2 回答 2

1
  1. 使用 TTimer(我们称之为 timIncSearch)。设置(在设计时)以下属性: Enabled:=False;
    间隔:=400;//凭经验发现-这是Windows资源管理器中使用的延迟

...在 OnTimer 中,您将编写您的搜索引擎。确保这里的第一行是 timIncSearch.Enabled:=False; 也因为您使用 csOwnerDrawFixed 可能最好强制重绘您的控件。

顺便说一句,只是猜测,因为你没有给我们很多细节——也许你必须挂钩 OnEnter 和 OnExit 事件来自定义打开和关闭 DropDown 列表。(通常,这是通过相应地设置 AutoDropDown 属性来实现的)

  1. 在你的 ComboBox.KeyPress 你会写

with timIncSearch do
begin
Enabled:=False;
Enabled:=True;
end;

...在这里也要小心,也许您必须有一个“case Key of”构造来单独处理#13(或其他)。

其他提示:

  • 根据您的情况,也许您必须挂钩(也是?) OnKeyDown (如果您想处理特殊键,例如 BackSpace、Del、Arrows 等 -考虑到事件在按下键时会重复)和/ 或 OnKeyUp(如果您想进行与上述类似的处理,但考虑键盘的按键自动重复功能)。
于 2008-10-02T06:11:04.873 回答
0

首先,您需要决定是否需要“*my_string*”或“my_string*”功能,这意味着决定是在字符串内搜索还是从头开始搜索。当您弄清楚这一点后,您将不得不构建组合框中输入的所有单词的索引,并在每次击键后进行搜索。我不认为处理 OnTimer 是正确的方法。我宁愿使用“OnChange”或类似的。您可以使用 sorted (dupignore) TStringList 来完成,或者可以使用哈希表构建索引(实现取决于您)。架构取决于您的组合可以包含的最大字符串数。如果它是一个比你可以使用哈希表的重要数字(一个哈希基数指向多个索引:数组,TList ...)

于 2012-01-26T15:30:59.203 回答