在我几年前编写的代码中,我经常使用以下方法在任何时候按下Escape键来关闭当前窗体:
procedure TSomeForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key = #27 then close;
end;
这种行为是针对TForm定义的。必须将表单的KeyPreview属性设置为True,以便在任何其他组件之前让表单对按键作出反应。在程序的大部分时间里,它都能正常工作,但是当焦点位于TEdit组件上时按下Escape键时,会发出一个声音(Windows用于表示无效操作的“叮”声)。它仍然可以正常工作,但我从来没有完全摆脱过这个声音。
这有什么问题吗?
重现步骤:
1. 新建VCL Forms应用程序,将表单的KeyPreview设置为true 2. 在事件选项卡上双击onKeyPress事件并输入虚拟代码:
if key=#27 then ;
3. 在表单上添加TListBox、TCheckBox和TEdit,然后运行应用程序
4. 在应用程序中尝试按Esc键,什么也不会发生,如虚拟代码所指定的那样
5. 将焦点放在TEdit上,然后按Esc。什么也不会发生,但是会播放声音。