在我几年前开发的代码中,我经常使用它来关闭当前窗体,随时按 Escape 键:

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

此行为是为 TForm 定义的。表单的 KeyPreview 属性设置为 True 以让表单在任何其他组件之前对按键使用react。对于程序的最佳部分,这一切都运行良好,但是,当在 TEdit 组件聚焦的同时按下 Escape 键时,会发出声音(Windows 用来表示无效操作的 clang )。它仍然可以正常工作,但我从来没有完全摆脱过这种声音。

这有什么问题?

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

    如果键=#27 那么;
  • 在表单中添加 TListBox、TCheckBox、TEdit 并运行应用程序
  • 应用程序中的
  • 尝试按 Esc 并且没有发生,如虚拟代码
  • 所指定
  • 聚焦 TEdit 并按 Esc。什么也没有发生,但声音被播放。
  • 最佳答案

    你得到 ding 是因为你在输入中留下了 ESC。看看 Key 是 var 吗?将其设置为 #0 并消除 clang 。这会将其从进一步处理中移除。

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

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

    关于delphi - 如何避免在聚焦 TEdit 时按下 Escape 时的 clang ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/770207/

    10-08 21:02