5

在我几年前开发的代码中,我一直在使用它来关闭当前表单,随时按下 Escape 键:

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

此行为是为 TForm 定义的。表单的KeyPreview属性设置为True让表单在任何其他组件之前对按键做出反应。对于程序的最佳部分来说,这一切都运行良好,但是,当在 TEdit 组件聚焦时按下 Escape 键时,会发出声音(Windows 用来表示无效操作的叮当声)。它仍然可以正常工作,但我从来没有完全摆脱声音。

这有什么问题?


重建步骤:

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

    如果键=#27 那么;

  • 将 TListBox、TCheckBox、TEdit 添加到窗体并运行应用程序

  • 在应用程序中尝试按 Esc 并没有发生任何事情,如虚拟代码所指定
  • 聚焦 TEdit 并按 Esc。什么都没有发生,只是播放了声音。
4

4 回答 4

23

你得到了叮当声,因为你把 ESC 留在了输入中。看看 Key 是怎样的var?将其设置为 #0 即可消除叮当声。这将其从进一步处理中删除。

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

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

于 2009-04-20T21:49:12.487 回答
0

从吉姆的回答开始(感谢吉姆),我必须让它为我工作。我需要的是使下拉组合框关闭并保持所选项目,并在按下 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;
于 2018-06-18T05:13:36.207 回答
0

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

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

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

于 2021-11-19T12:26:32.550 回答
-1

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

与 ESC 不同,KeyPress 不提供 Alt-C,因此在 KeyPress 中将 Key 设置为 #0 不起作用,而且可怕的“叮!” 每次都会发出。经过数小时的尝试,这是我发现的解决方法: - 创建一个主菜单选项来服务请求 - 将其快捷方式设置为 Alt+C - 确实,这不是可用的快捷方式选择之一(!!)......但是无论如何它确实有效!- 在该菜单选项的 OnClick 中进行处理 - 您甚至可以在“后台”中进行处理:您可以将菜单选项的 Visible 设置为 false - 只要它的 Enabled 保持为真,它就会被 Alt-C 激活,即使它将在菜单中不可见。

希望这可能会有所帮助!如果你有更优雅的东西,请指教。

于 2017-06-14T03:12:23.127 回答