当TEdit获得焦点时,如何避免按下Escape键时发出“叮”声?

7

在我几年前编写的代码中,我经常使用以下方法在任何时候按下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。什么也不会发生,但是会播放声音。
4个回答

27

你之所以会收到“叮”的声音是因为你在输入时将 ESC 键留在了其中。看一下 Key 是一个 var,将其设置为 #0 即可消除这个声音,从而防止它进一步影响处理。

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

KeyPreview的作用就是,它能预览会传递给控件的按键事件,除非你停止它。


这让我无言以对...我曾经破解过更难的问题,但是这个...啊啊啊。感谢你的建议。非常感激。 - Peter Perháč
这种情况发生在我们所有人身上。每当我与一个错误斗争了一段时间,我就知道它肯定是某些极其简单的问题。事情就是这样。 - Jim McKeeth

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;

0

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

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

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


-1

这是一个旧的帖子...但无论如何,这里有一个更好的解决方案:捕获Alt-C

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

希望这能有所帮助!如果您有更优雅的解决方案,请告诉我。


1
你尝试过使用TAction而不是菜单吗? - dummzeuch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接