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

时间:2009-04-20 21:37:37

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

在我几年前开发的代码中,我一直在使用它来关闭当前表单,随时按下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事件并输入虚拟代码:

    如果key =#27则;

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

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

3 个答案:

答案 0 :(得分:21)

你得到了ding,因为你在输入中离开了ESC。了解Key是如何 var 的?将其设置为#0并消除叮当声。这使它无法进一步处理。

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

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

答案 1 :(得分:0)

这是一个老线程......但无论如何,这里有一个更好的方法:抓住 Alt-C

与ESC不同,Alt-C不是由KeyPress提供服务的,所以在KeyPress中将Key设置为#0不起作用,而且可怕的“ding!”每次发布。 经过几个小时的尝试,这是我找到的解决方法: - 创建主菜单选项以服务请求 - 将其ShortCut设置为Alt + C - 是的,这不是可用的ShortCut选项之一(!!)......但无论如何它确实有效! - 在该菜单选项的OnClick中进行处理 - 您甚至可以在“后台”中进行操作:您可以将菜单选项的Visible设置为false - 只要其Enabled保持为true,它就会被Alt-C激活,即使它在菜单中不可见。 / p> 希望这可能有所帮助!如果你有更优雅的东西,请告知。

答案 2 :(得分:0)

从Jim的回答开始(感谢Jim)我必须让它适合我。我需要的是让一个下拉组合框关闭保持所选项目并在按下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;