在我几年前开发的代码中,我一直在使用它来关闭当前表单,随时按下Escape键:
procedure TSomeForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key = #27 then close;
end;
此行为是为TForm定义的。表单的KeyPreview
属性设置为True
,以使表单在任何其他组件之前对按键做出反应。这一切对于程序的最佳部分都非常有效,但是,当TEdit组件聚焦时按下Escape键时会发出声音(Windows使用的 ding 声音表示无效操作) 。它仍然可以正常工作,但我从来没有完全摆脱声音。
这有什么问题?
重新创建的步骤:
双击onKeyPress事件并输入虚拟代码:
如果key =#27则;
将TListBox,TCheckBox,TEdit添加到表单并运行应用程序
答案 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;