在TEdit聚焦时按下Escape时如何避免叮当声?

Pet*_*háč 4 delphi user-interface escaping event-handling onkeypress

在我几年前开发的代码中,我一直在使用它来关闭当前表单,随时按下Escape键:

procedure TSomeForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
    if key = #27 then close;
end;
Run Code Online (Sandbox Code Playgroud)

此行为是为TForm定义的.表单的KeyPreview属性设置为True让表单在任何其他组件之前对按键做出反应.这一切都工作得很好了程序的最好的部分,然而,当同时TEDIT组件的重点是健全按下Esc键(一的声音由Windows用来表示无效操作)发出.它仍然工作正常,但我从来没有完全摆脱声音.

这有什么问题?


重新创建的步骤:

  • 新的VCL Forms应用程序,将表单的KeyPreview设置为true
  • 在"事件"选项卡上,双击onKeyPress事件并输入虚拟代码:

    如果key =#27则;

  • 将TListBox,TCheckBox,TEdit添加到表单并运行应用程序

  • 在应用程序中尝试按Esc和NOTHING发生,如虚拟代码所指定
  • 关注TEdit并按Esc.没有任何事情发生,但声音播放.

Jim*_*eth 22

你得到了ding,因为你在输入中离开了ESC.看看Key是一个var?将其设置为#0,即可消除叮当声.这使它无法进一步处理.

procedure TSomeForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
    if key = #27 then 
    begin
      key := #0;
      close;
    end;
end;
Run Code Online (Sandbox Code Playgroud)

KeyPreview就是这样,预览将传递给控件的内容,除非你停止它.