当处理事件驱动的gui代码时,我发现调试器不太有用,其中单行代码可能会导致触发新的事件,这可能反过来触发其他事件.
在这种情况下,“通过代码”的方法不会让我看到发生的一切.
我通常解决这个问题的方法是1)猜测哪些事件可能是问题的一部分,然后2)添加断点或记录到每个这些事件.
问题是这种方法是偶然的和耗时的.
是否有一个开关我可以在调试器中弹出来说“记录所有gui事件”?或者有一些代码可以添加到陷阱事件,像
procedure GuiEventCalled(ev:Event) begin log(ev); ev.call(); end
我正在寻找的最终结果是这样的(例如):
FieldA.KeyDown FieldA.KeyPress FieldA.OnChange FieldA.OnExit FieldB.OnEnter
这样可以把所有的猜测都从Delphi gui调试开始.
我使用的是Delphi 2010
[编辑]
几个答案建议拦截或记录Windows消息的方法.其他人则指出,并不是所有的Delphi事件都是Windows消息.我认为是我正在询问的这些类型的“非Windows消息”事件;由Delphi代码创建的事件. [/编辑]
[EDIT2]
在阅读了这里的所有信息后,我有一个想法,使用RTTI动态拦截TNotifyEvents并将其记录到“调试”窗口中的事件日志中.这包括OnEnter,OnExit,OnChange,OnClick,OnMouseEnter,OnMouseLeave事件.经过一点黑客之后,我得到了它的工作相当不错,至少对我的使用(它不记录关键事件,但可以添加).
我已经发布了代码here
要使用
>下载EventInterceptor Unit并将其添加到您的项目中
>将EventInterceptor单位添加到Uses子句
>在您要跟踪的每个表单的代码中添加此行.
AddEventInterceptors(MyForm的);
打开调试器窗口,任何被调用的事件将被记录到事件日志中
[/ EDIT2]
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。