【发布时间】:2011-01-18 15:05:23
【问题描述】:
在 Delphi XE 中,我正在尝试实现“即时搜索”功能 - 有点类似于 Firefox 的“键入时搜索”,但更好地说明了开源剪贴板扩展器中的类似功能,Ditto :
有一个处理典型导航事件的项目列表。但是,任何字母数字键以及导航和编辑命令(右/左箭头、shift+箭头、退格、删除等)都应重新路由到列表下方的编辑框。编辑框的 OnChange 事件会触发列表的刷新。
用户界面的重点是用户不必在控件之间使用制表符或切换制表符。这两个控件(列表和编辑框)应该“感觉”就像它们是一个单独的控件。搜索 UI 的行为应该不取决于哪个控件具有焦点。
看来我最好的选择是将列表控件(我使用TcxTreeList)中的某些键盘事件转发到编辑框,然后从编辑框转发一些导航键到列表中。我怎样才能做到这一点?
注意事项:
TcxTreeList 当然支持增量搜索,但这不是我想要的。搜索转到 SQLite 数据库并查找子字符串匹配项。该列表仅显示数据库中的匹配项。
有一些重叠,例如这两个控件通常都会处理 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 ) 也没有效果。
【问题讨论】:
标签: windows delphi keyboard-events forwarding