Delphi 如何避免TEdit聚焦时按下Escape时发出叮当声?
在我几年前开发的代码中,我经常使用此功能随时按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使用的叮当
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键。除了播放声音外,什么也没发生
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斗争一段时间。这就是它的工作方式。你试过用一个按钮而不是菜单吗?