在 Delphi XE 中,我正在尝试实现“即时搜索”功能 - 有点类似于 Firefox 的“键入时搜索”,但开源剪贴板扩展器Ditto中的类似功能更好地说明了这一点:
有一个处理典型导航事件的项目列表。但是,任何字母数字键以及导航和编辑命令(右/左箭头、shift+箭头、退格、删除等)都应重新路由到列表下方的编辑框。编辑框的 OnChange 事件将触发列表的刷新。
UI 的重点是用户不必在控件之间使用 tab 或 shift-tab。两个控件(列表和编辑框)应该“感觉”就像它们是一个单独的控件。搜索 UI 的行为不应该取决于哪个控件具有焦点。
似乎我最好的选择是将某些键盘事件从列表控件(我正在使用TcxTreeList)转发到编辑框,并将一些导航键从编辑框转发到列表。我怎样才能做到这一点?
笔记:
TcxTreeList 当然支持增量搜索,但这不是我想要的。搜索转到 SQLite 数据库并查找子字符串匹配项。该列表仅显示 db 中的匹配项。
有一些重叠,例如两个控件通常会处理 VK_HOME 和 VK_END,但没关系 - 在这种情况下,键将进入列表。我需要决定是转发每个单独的按键,还是在接收它的控件中处理它。
编辑时: 一种明显的方法似乎是调用编辑控件的相应 KeyDown、KeyUp 和 KeyPress 方法,如下所示:
type
THackEdit = class( TEdit );
procedure TMainForm.cxTreeList1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
THackEdit( edit1 ).KeyDown( Key, Shift );
end;
不幸的是,这没有效果。我的猜测是 TEdit 不会处理关键事件,除非它是专注的。使用 SendMessage( THackEdit( edit1 ).Handle, WM_KEYDOWN, Key, 0 ) 也没有效果。