В нашем приложении Delphi 2007 мы используем множество следующих конструкций
FdmBasic:=TdmBasicData(FindOwnerClass(AOwner,TdmBasicData));
FindOwnerClass перемещает иерархию Owner текущего компонента вверх, чтобы найти определенный класс (в примере TdmBasicData). Полученный объект сохраняется в переменной Field FdmBasic. Мы используем это прежде всего для передачи модулей данных.
Пример: при создании отчета результирующие данные сжимаются и сохраняются в поле Blob таблицы, доступ к которой осуществляется через модуль данных TdmReportBaseData. В отдельном модуле нашего приложения есть функциональные возможности для отображения данных из отчета в постраничной форме с использованием ReportBuilder. Основной код этого модуля (TdmRBReport) использует класс TRBTempdatabase для преобразования сжатых данных больших двоичных объектов в разные таблицы, которые можно использовать в конструкторе отчетов среды выполнения Reportbuilder. TdmRBReport имеет доступ к TdmReportBaseData для всех видов данных, связанных с отчетами (тип отчета, параметры расчета отчета и т. Д.). TRBTempDatabase создается в TdmRBReport, но должен иметь доступ к TdmReportBasedata. Так что теперь это делается с помощью конструкции выше:
constructor TRBTempDatabase.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
FdmReportBaseData := TdmRBReport(FindOwnerClass(Owner, TdmRBReport)).dmReportBaseData;
end;{- .Create }
У меня такое ощущение, что это означает, что TRBTempDatabase много знает о своем владельце, и мне было интересно, если это какой-то запах кода или Anti-pattern.
Что вы думаете об этом? Это запах кода? Если так, что лучше?