Delphi调试器非常适合调试线性代码,其中一个函数以可预测的线性方式调用其他函数,并且我们可以逐行执行程序。有没有办法在Delphi中记录每一个gui事件?
我发现调试器在处理事件驱动的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调试。
我使用德尔福2010
[编辑] 几个答案提出的方法拦截或登录Windows消息。其他人则指出,并非所有的Delphi事件都是Windows消息。我认为这是我所问的这类“非Windows消息”事件;由Delphi代码创建的事件。 [/编辑]
[EDIT2] 在阅读了这里的所有信息后,我有一个想法是使用RTTI动态截取TNotifyEvents并将它们记录到调试窗口中的事件日志中。这包括OnEnter,OnExit,OnChange,OnClick,OnMouseEnter,OnMouseLeave事件。经过一番黑客攻击之后,我得到了很好的工作,至少对于我的使用来说(它不会记录关键事件,但可以添加)。 我已经发布的代码here
要使用
- 下载EventInterceptor单位,并将其添加到您的项目
- 添加EventInterceptor股uses子句
在某处添加此行您想要跟踪的每种表单的代码。
AddEventInterceptors(MyForm);
打开调试窗口以及调用的任何事件将被记录到事件日志
[/ EDIT2]
是否所有的Delphi事件都是Windows消息?我刚刚尝试使用TApplicationEvents.OnMessage记录事件,而我似乎只能看到鼠标移动和键盘事件。我没有看到OnChange,或OnExit或OnEnter事件(据我所知)。我想我希望得到比Windows消息更高级别的东西。 – awmross 2011-01-11 02:50:11
btw WinSight没有与德尔福2010年 – awmross 2011-01-11 02:50:42
@awmross:德尔福事件不是Windows消息。 Windows消息被派发到Delphi控件上的消息处理例程,其中一些调用事件处理程序(如果附加了一个)。 – 2011-01-11 04:42:54