Delphi调试器非常适用于调试线性代码,其中一个函数以可预测的线性方式调用其他函数,我们可以一行一步地遍历程序.
当处理事件驱动的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]
解决方法
使用我写的
download here的“delphieventlogger”单元.它只是一种方法调用,非常容易使用.它将所有TNotifyEvent(例如OnChange,OnEnter,OnExit)记录到调试器窗口中的Delphi事件日志中.