【发布时间】:2011-01-27 08:28:55
【问题描述】:
对于调试/性能测试,我想在运行时将日志代码动态添加到给定类型组件的所有事件处理程序中。
例如,对于数据模块中的所有数据集,我需要在 BeforeOpen 和 AfterOpen 事件中运行代码以捕获开始时间,并在 AfterOpen 中记录经过的时间。
我更喜欢动态地执行此操作(无组件子类化),以便仅在需要时才可以轻松地将其添加到所有现有数据模块和表单中。
迭代所有组件并按其类型过滤很容易,但是对于已经分配了事件处理程序的组件,我需要一种方法来存储现有的事件处理程序,并分配一个新的修改后的事件处理程序它首先进行日志记录,然后调用已经存在的原始代码。
所以这段代码
procedure TMyDatamodule.OnBeforeOpen(Sender: TDataset);
begin
SomeProc;
end;
在运行时会变成
procedure TMyDatamodule.OnBeforeOpen(Sender: TDataset);
begin
StoreStartTime(Sender); // injected code
SomeProc;
end;
是否有可以应用的设计模式,或者甚至是一些示例代码来展示如何在 Delphi 中实现这一点?
【问题讨论】:
-
你没有提到你正在使用什么 DBMS。但作为一种完全不同的方法,您是否考虑过使用 DB Profiler?例如。使用 SQL Server 探查器,您有很大的灵活性,并且能够查看 BeforeOpen/AfterOpen 未涵盖的内部详细信息。
标签: delphi event-handling aop