【问题标题】:How to avoid the ding sound when Escape is pressed while a TEdit is focused?如何避免在 TEdit 聚焦时按下 Escape 时发出叮当声?
【发布时间】:2010-10-20 16:34:24
【问题描述】:

在我几年前开发的代码中,我经常使用这个来关闭当前表单,随时按下 Escape 键:

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

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

这有什么问题?


重建步骤:

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

    如果键=#27 那么;

  • 在窗体中添加 TListBox、TCheckBox、TEdit 并运行应用程序

  • 在应用程序中尝试按 Esc 并没有发生任何事情,正如虚拟代码所指定的那样
  • 聚焦 TEdit 并按 Esc。什么都没有发生,只是播放了声音。

【问题讨论】:

    标签: delphi user-interface event-handling escaping onkeypress


    【解决方案1】:

    使用菜单项并将它们设置为不可见,并使用快捷方式,这是我刚刚偶然发现的一种快速解决方法,但如果您需要使用第一次使用的字符的快捷方式,则无法使用现有快捷方式的字母:例如对于 Alt+ENTER,您需要在表单创建过程中添加类似的内容:

    MainMenu1.Items[0].ShortCut:=TextToShortCut('Alt+e');
    

    但是使用 TActionList 可能更容易,即使没有列出 Alt+E 之类的内容,您也可以添加它。

    【讨论】:

      【解决方案2】:

      从吉姆的回答开始(感谢吉姆),我必须让它为我工作。我需要的是使下拉组合框关闭并保持所选项目,并在按下 TAB/shift+TAB 时移动到下一个/上一个控件。每次我确实按 TAB 时,房间里都充满了烦人的声音。我的工作是使用 onKeyDown 事件来捕获 shiftstate,在表单的界面中声明 var aShift: boolean; 并使用以下代码:

      procedure TForm2.StComboKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
      begin
        if ssShift in Shift then aShift := true else aShift := false;
      end;
      
      procedure TForm2.StComboKeyPress(Sender: TObject; var Key: Char);
      begin
       if Key=char(VK_TAB) then
         begin
           Key := #0;
           StCombo.DroppedDown := false;
           if aShift
             then previousControl.SetFocus
             else nextControl.SetFocus;
         end;
      end;
      

      【讨论】:

        【解决方案3】:

        这是一个旧线程......但无论如何,这里有一个更好的线程:捕捉 Alt-C

        与 ESC 不同,KeyPress 不支持 Alt-C,因此在 KeyPress 中将 Key 设置为 #0 不起作用,而且可怕的“叮!”每次都会发出。 经过数小时的尝试,这是我找到的解决方法: - 创建一个主菜单选项来服务请求 - 将其快捷方式设置为 Alt+C - 确实,这不是可用的快捷方式选择之一(!!)......但它确实有效! - 在该菜单选项的 OnClick 中进行处理 - 你甚至可以在“后台”设置:你可以将菜单选项的 Visible 设置为 false - 只要它的 Enabled 保持为真,即使它在菜单中不可见,它也会被 Alt-C 激活。

        希望能有所帮助!如果你有更优雅的东西,请指教。

        【讨论】:

        • 你试过用TAction代替菜单吗?
        【解决方案4】:

        因为您在输入中留下了 ESC,所以您得到了 ding。看看 Key 是如何成为 var 的?将其设置为 #0 即可消除叮当声。这将其从进一步处理中删除。

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

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

        【讨论】:

        • 这让我哑口无言...我已经破解了更坚硬的坚果,但是这... aaaahhhh。谢谢你的建议。非常感谢。
        • 这发生在我们所有人身上。每当我与一个错误战斗超过一段时间时,我知道这将是一件非常简单的事情。这就是它的工作方式。
        猜你喜欢
        • 1970-01-01
        • 2012-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多