2008-10-01 59 views
7

在样式为csOwnerDrawFixed的TComboBox子系统组件上实现“find as you type”行为的正确方法是什么?如何在TComboBox子系统上键入时实现查找

+0

取决于,你只是想实现“搜索键入”部分,而不显示对用户的任何反馈(例如,Firefox在长列表上执行的方式),还是想要显示一个显示当前搜索字符串的小型子控件? – dguaraglia 2008-10-02 00:05:48

回答

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

...在OnTimer中,您将编写您的搜索引擎。确保这里的第一行是timIncSearch.Enabled:= False;另外,因为您使用csOwnerDrawFixed,所以最好对您的控件重新执行一次。另外, - 只是猜测,因为你没有给我们很多细节 - 也许你必须挂钩OnEnter和OnExit事件来自定义打开和关闭DropDown列表。 (Normaly,这是由相应地设置AutoDropDown属性实现)

  • 在你ComboBox.KeyPress你会写
  • with timIncSearch do
    begin
    Enabled:=False;
    Enabled:=True;
    end;

    ...还在这里照顾一下,也许你必须有一个'case key'构造来分别处理(或者其他)#13。

    其他提示:根据您的情况

    • ,或许您必须挂钩(也?)中,onKeyDown(如果你想处理例如像BackSpace键,Del键,箭头等特殊键 - 采取。考虑到事件在键被按下时重复)和/或OnKeyUp(如果您想要进行与上述类似的处理,但是没有考虑到键盘的关键自动重复功能)。
    0

    首先,您需要确定是否需要“* my_string *”或“my_string *”功能,这意味着决定是要在字符串内搜索还是从头开始搜索。 当你已经想通了,那么你将不得不buld在组合框中输入的所有单词的索引,并在每次击键后搜索它。 我不认为处理OnTimer是一个正确的方法。我宁愿使用“OnChange”或类似的。 你可以使用排序(dupignore)TStringList来完成它,也可以使用散列表来构建索引(实现由你决定)。 架构取决于您的组合可能包含的最大字符串数。如果它是一个显着的数字比你可以使用散列表(一个散列红衣主教指向多个索引:数组,TList ...)