Para las pruebas de depuración/rendimiento, me gustaría agregar dinámicamente el código de registro a todos los controladores de eventos de los componentes de un tipo determinado en tiempo de ejecución.¿Cómo puedo inyectar código dinámicamente en controladores de eventos en Delphi?
Por ejemplo, para todos los conjuntos de datos en un módulo de datos, necesito ejecutar código en los eventos BeforeOpen
y AfterOpen
para capturar la hora de inicio y registrar el tiempo transcurrido en AfterOpen.
Preferiría hacer esto de forma dinámica (sin subclases de componentes), de modo que pueda agregar esto a todos los módulos de datos y formularios existentes con un mínimo esfuerzo solo cuando sea necesario.
iteración todos los componentes y filtrado por su tipo es fácil, pero para los componentes que ya tienen controladores de eventos asignados, necesito una manera de tienda de los controladores de eventos existentes, y asignar un nuevo controlador de eventos modificado que primero hace el logging y luego invocará el código original que ya estaba presente.
lo que este código
procedure TMyDatamodule.OnBeforeOpen(Sender: TDataset);
begin
SomeProc;
end;
en tiempo de ejecución se convertiría en
procedure TMyDatamodule.OnBeforeOpen(Sender: TDataset);
begin
StoreStartTime(Sender); // injected code
SomeProc;
end;
¿Hay un patrón de diseño que se puede aplicar, o incluso un código de ejemplo que muestra cómo implementar esto en Delphi?
Usted no lo hace menciona qué DBMS estás usando. Pero como un enfoque completamente diferente, ¿ha considerado usar un DB Profiler? P.ej. Al usar el perfilador de SQL Server, tiene mucha flexibilidad y podría ver detalles internos que no están cubiertos por BeforeOpen/AfterOpen. –