Delphi 德尔福';什么是预览工作?

Delphi 德尔福';什么是预览工作?,delphi,Delphi,我和一位同事正在讨论哪种方式对系统资源的负担更小。(注意:这不是我想要回答的问题。而标题和下面粗体的一行是我寻求答案的问题。) 或 乍一看,KeyPreview的系统负担似乎更小,因为定义OnMessage过程会导致我们的程序检查传入的每一条消息。注意,我们不关心的消息会导致它在第一个if语句前跳出。最坏的情况是,我们会为每条消息执行if语句 但我们想知道Delphi是如何处理KeyPreview属性的。。。我们想知道Delphi是否在内部定义了自己的OnMessage并查看消息,然后触发与按键

我和一位同事正在讨论哪种方式对系统资源的负担更小。(注意:这不是我想要回答的问题。而标题和下面粗体的一行是我寻求答案的问题。)

乍一看,KeyPreview的系统负担似乎更小,因为定义OnMessage过程会导致我们的程序检查传入的每一条消息。注意,我们不关心的消息会导致它在第一个if语句前跳出。最坏的情况是,我们会为每条消息执行if语句

但我们想知道Delphi是如何处理KeyPreview属性的。。。我们想知道Delphi是否在内部定义了自己的OnMessage并查看消息,然后触发与按键相关的事件。


如果是这种情况,那么两种方法是否大致相同?

最好的答案是,测量它。最有可能的是,两者都不会给系统带来任何明显的“负担”,如果您在专门寻找时没有注意到,那么您的用户也不会注意到。因此,只要选择更容易理解的代码,以防将来需要返回到该代码。

正如其他人所说,可能没有明显的区别

我只想指出彼得在下面关于这个主题的一篇优秀文章:

本文描述了关键消息 在Delphi中实现的处理 2007,适用于Win32 VCL表单应用程序。 这方面有一些变化 与Delphi7相比,这些是 主要是我要强调的补充 当我们找到他们的时候。大部分代码 从那以后基本上没有变化 《德尔福时报》1,向 设计的稳健性。如果你 你是赶时间还是不感兴趣 您可以参考 摘要中概述了一个简明的 概述

按键预览功能: 对于当前活动控件的KeyUp、KeyDown和KeyPress事件处理程序,将检查当前活动窗体的KeyPreview属性。即:在任何控件中按一个键都会检查窗体的KeyPreview属性

如果该属性为True,则所讨论的事件处理程序在调用窗体的事件处理程序之前先调用窗体的事件处理程序。如果窗体的事件处理程序没有将键值更改为0(或#0,取决于按键或KeyDown/KeyUp),则活动控件的事件处理程序将接管,否则该事件将被视为已处理

与Application.OnMessage相比: 因此,在表单的事件处理程序中将键值设置为0/#0与设置Application.OnMessage的已处理参数是同义的。在这方面,几乎没有区别。但是,由于OnMessage在调度过程中很早就被调用,因此理论上可以提高性能,因为消息不再被调度。如果将Handled保留为False,则没有任何区别,因为无论是否设置KeyPreview属性,都会始终选中该属性


剩下的主要区别是必须将所有表单的KeyPreview设置为True,并为每个表单实现和维护适当的事件处理程序。将此与Application.OnMessage只有一个事件处理程序进行比较。也就是说:假设您可以对所有表单只使用一个例程。

这里的底线是,您无法快速生成输入,甚至无法让计算机注意到。如果你的输入信息的速度比你通常的速度高出数百甚至数千,电脑就不会有问题

您将无法衡量在
OnMessage
中处理某些内容与使用
KeyPreview
之间的区别

因此,决定使用哪种方法归根结底是哪种方法最方便。如果您需要在应用程序范围内进行处理,并且没有一个通用的基类用于所有表单,那么您可以使用
OnMessage
。如果希望不同表单有不同的行为,则需要使用
KeyPreview

就我个人而言,我强烈建议重构,以便项目中的所有表单都来自一个公共基础(一个
TForm
的子类)。这使您具有更大的灵活性。通过这种方式,您可以使用
KeyPreview
机制为应用程序中的所有表单应用干预点


至于如何实现
KeyPreview
,则在
TControl
中的
KeyDown
KeyPress
等中重定向输入消息。要了解更多信息,请阅读源代码。

+1谢谢您的回答。我同意,无论哪种方式都可能不被注意到。在我的问题中,我已经更清楚地说明了我真正想要的是什么。我希望差异可以忽略不计(无法测量的小),并且无论您编写什么代码来进行处理,都将是问题所在,而不是调用您的处理程序。您无需测量它。这无关紧要。您的计算机不会因处理输入消息而被拉伸。来吧,它每纳秒可以做无数次超级运算。你打字有多快?!!只要选择最自然的机制,看看问题的根源,你就能找到答案。基本上,它使用的是一个消息处理程序。这就是我的想法,我只是还没有开始。我确信你指的是KeyPreview而不是OnKeyPreview。事实上我做到了。我已经改变了标题。泰+1啊啊,下面是彼得。特尔斐的乔恩·斯凯特。我很久没有从他那里读到什么了。他似乎消失了。
1. Using KeyPreview to get the keypresses on a form.
2. Using defining an OnMessage procedure and handling it there.