【发布时间】:2011-01-11 00:10:56
【问题描述】:
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 代码创建的事件。 [/编辑]
[编辑2] 看完这里的所有信息后,我有了一个想法,使用 RTTI 来动态拦截 TNotifyEvents 并将它们记录到 Debugging 窗口中的 Event Log 中。这包括 OnEnter、OnExit、OnChange、OnClick、OnMouseEnter、OnMouseLeave 事件。经过一番修改后,我让它工作得很好,至少对我来说是这样(它不记录关键事件,但可以添加)。 我已经发布了代码here
使用
- 下载 EventInterceptor Unit 并将其添加到您的项目中
- 将 EventInterceptor 单元添加到 Uses 子句
-
在您要跟踪的每个表单的代码中的某处添加此行。
AddEventInterceptors(MyForm);
打开调试器窗口,任何被调用的事件都将被记录到事件日志中
[/EDIT2]
【问题讨论】:
-
Wayback link,至少需要Delphi 2005。
标签: delphi