Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何避免TEdit聚焦时按下Escape时发出叮当声?_Delphi_User Interface_Event Handling_Escaping_Onkeypress - Fatal编程技术网

Delphi 如何避免TEdit聚焦时按下Escape时发出叮当声?

Delphi 如何避免TEdit聚焦时按下Escape时发出叮当声?,delphi,user-interface,event-handling,escaping,onkeypress,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使用的叮当

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

procedure TSomeForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
    if key = #27 then close;
end;
此行为是为TForm定义的。表单的
KeyPreview
属性设置为
True
,以使表单在任何其他组件之前对按键做出反应。不过,在TEdit组件处于聚焦状态时按下Escape键,就会发出声音(Windows使用的叮当声表示操作无效)。它仍然工作良好,但我从来没有完全设法摆脱的声音

这有什么问题


重新创建的步骤:

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

    如果键=#27,则

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

  • 在应用程序中,尝试按Esc键,但没有任何结果,如伪代码所指定
  • 聚焦TEdit并按Esc键。除了播放声音外,什么也没发生

因为您将ESC保留在输入中,所以您会收到叮当声。查看键是如何成为var?将其设置为#0,即可消除叮当声。这将使其无法进一步处理

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

KeyPreview只是一个预览,除非您停止它,否则将传递给控件的内容。

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

与ESC不同,Alt-C不由按键服务,因此在按键中将键设置为#0不起作用,并且每次都会发出可怕的“叮!”。 经过几个小时的尝试,我发现了以下解决方法: -创建一个主菜单选项,为请求提供服务 -将其快捷方式设置为Alt+C-的确,这不是可用的快捷方式选项之一(!!)。。。但不管怎样,它确实有效! -在该菜单选项的OnClick中执行处理 -您甚至可以在“背景”中进行设置:您可以将菜单选项的Visible设置为false-只要其Enabled保持为true,它将被Alt-C激活,即使它在菜单中不可见


希望这能有所帮助!如果你有更优雅的,请建议。

从吉姆的回答开始(谢谢吉姆),我必须让它为我工作。我需要的是关闭一个下拉组合框,保留所选项目,并在按下TAB/shift+TAB时移动到下一个/上一个控件。每次我按TAB键,房间里就充满了恼人的声音。我在arroud的工作是使用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;

这让我说不出话来。。。我已经敲碎了更硬的坚果,但这。。。啊啊啊。谢谢你的建议。非常感谢。这件事发生在我们所有人身上。任何时候,当我知道这将是一件非常简单的事情时,我都会和一个bug斗争一段时间。这就是它的工作方式。你试过用一个按钮而不是菜单吗?