Для отладки / тестов производительности я хотел бы динамически добавлять код регистрации во все обработчики событий компонентов данного типа во время выполнения.
Например, для всех наборов данных в модуле данных мне нужно запустить код в событиях BeforeOpen
и AfterOpen
, чтобы зафиксировать время начала и записать прошедшее время в AfterOpen.
Я бы предпочел сделать это динамически (без подклассов компонентов), чтобы добавить его ко всем существующим модулям данных и формам с минимальными усилиями только при необходимости.
Итерация всех компонентов и фильтрация по их типу проста, но для компонентов, которым уже назначены обработчики событий, мне нужен способ сохранить существующие обработчики событий и назначить новый модифицированный обработчик событий, сначала выполняет регистрацию, а затем вызовет исходный код, который уже присутствовал.
Итак, этот код
procedure TMyDatamodule.OnBeforeOpen(Sender: TDataset);
begin
SomeProc;
end;
во время выполнения станет
procedure TMyDatamodule.OnBeforeOpen(Sender: TDataset);
begin
StoreStartTime(Sender); // injected code
SomeProc;
end;
Существует ли шаблон проектирования, который можно применить, или даже какой-то пример кода, который показывает, как реализовать это в Delphi?