Delphi11中TSearchBox的OnKeyUp事件无法捕获ENTER键如何解决
问题产生原因
Delphi 11 对 TSearchBox 的原生事件处理逻辑做了调整,控件内部默认拦截了 ENTER 键的按下/抬起事件,用于触发内置的搜索提交逻辑,所以 ENTER 键的 KeyUp 事件不会再冒泡到用户自定义的 OnKeyUp 回调中,才会出现其他按键可正常捕获、唯独回车失效的情况。
可行解决办法
- 方法1:改用
OnSearch事件
Delphi 11 为 TSearchBox 专门新增了OnSearch事件,用户按下 ENTER 键或者点击控件自带的搜索图标时都会触发该事件,直接把原有的DoSomeThing逻辑写到OnSearch事件回调中即可,是官方推荐的最优解法。
示例代码:procedure TForm1.SearchBox1Search(Sender: TObject); begin DoSomeThing; end; - 方法2:在
OnKeyDown事件中捕获回车
如果需要保留原有事件处理逻辑,可以优先在OnKeyDown事件中判断回车键,该事件的优先级高于控件内部的 ENTER 拦截逻辑,可以正常捕获到键值 13:
示例代码:procedure TForm1.SearchBox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = 13 then begin DoSomeThing; Key := 0; // 添加该行可阻止控件触发默认的 OnSearch 逻辑 end; end; - 方法3:通过窗体键盘预处理捕获
如需全局管控该类控件的回车事件,可先将窗体的KeyPreview属性设置为 True,再在窗体的OnKeyUp事件中判断当前焦点是否在 TSearchBox 上,再执行对应逻辑:
示例代码:procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (ActiveControl is TSearchBox) and (Key = 13) then begin DoSomeThing; Key := 0; end; end;
内容的提问来源于stack exchange,提问作者JGMS
相关产品推荐
相关产品推荐

