2009-04-20 108 views
4

在代码中,我在几年前开发的,我一直用这个有很多收在任何时刻按下Esc键的当前形式:如何在TEdit集中时避免按下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真
  • 事件选项卡上双击onkeypress事件事件并输入虚拟代码:

    if key =#27 then;

  • 添加的TListBox,TCheckBox,TEDIT的形式和运行应用程序的应用

  • 试着同时按下Esc键没有反应,由伪代码
  • 重点TEDIT和按Esc键指定。没有任何反应,但播放的声音。

回答

20

由于您在输入中保留了ESC,您将得到ding。看看密钥是如何被var?将其设置为#0并消除叮。这将其从进一步处理中移除。

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

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

+0

这让我无语了...我已经破解了更坚韧的坚果,但是这... aaaahhhh。感谢您的建议。多谢。 – 2009-04-20 21:54:39

+0

它发生在我们所有人身上。任何时候,我都会在一段时间内与一个bug进行斗争,但我知道它会变得非常简单。这只是它的工作方式。 – 2009-04-20 22:38:35

0

这是一个古老的线程...但无论如何,这里是一个更好的:捕获Alt-C

与ESC不同,Alt-C没有被KeyPress服务,因此在KeyPress中将Key设置为#0不起作用,而可怕的“ding!”每次发布。 经过数小时的尝试,这里是我找到的解决方法: - 创建一个主菜单选项服务于请求 - 将其快捷方式设置为Alt + C - 是的,这不是可用的快捷方式选项之一。 )...但它确实工作! - 在该菜单选项的OnClick 中执行处理 - 甚至可以在“后台”中进行处理:您可以将菜单选项的可见性设置为false - 只要其Enabled保持为真,它将由Alt-C甚至尽管它在菜单中不可见。

希望可以帮助!如果你有更优雅的东西,请告知。

相关问题