Я брал из примера куски кода (там очень много лишнего, что к паттерну никак не относится) и понемногу добавлял в свой проект.
Принцип действия примера: в исходном коде проекта инициализируется только главный модуль (потомок TDataModule). Примерно так:
- Код: Выделить всё
Application.Initialize;
Application.CreateForm(TMainDataModule, MainDataModule);
Application.Run;
Этот кусок работает.
Вот кусок кода модуля "фабрика":
- Код: Выделить всё
function TModuleFactory.CreateModule(ModuleType: TModuleType; Mediator: TMediator): TBaseModule;
var
ModuleClass: TModuleClass;
begin
{ выбор класса для реализации }
case ModuleType of
MyDataModuleDescendant:
ModuleClass :=TMyDataModuleDescendant;
end;
{ реализация модуля по выбранному классу }
Application.CreateForm(ModuleClass, Result); // проблема начинается отсюда
Result.Mediator := Mediator;
end;
Этот модуль вызывает фабрику, которая уже создает остальные модули и регистрирует их в медиаторе. Но почему-то при вызове Application.CreateForm(ModuleClass, Result); появляется ошибка "Project raised exception class 'EStreamError' with message: Failed to initialize component: No streaming method available.". Если в этом месте потомок DataModule заменить потомком формы, то все работает нормально - форма инициализируется и выводится на экран. Собственно вопрос: почему в одном месте программы DataModule инициализируется, а в другом - нет? Может, я что-то пропустил?
Более точно - проблема тут (application.inc):
- Код: Выделить всё
procedure TApplication.CreateForm(InstanceClass: TComponentClass;
out Reference);
var
Instance: TComponent;
ok: boolean;
AForm: TForm;
begin
// Allocate the instance, without calling the constructor
Instance := TComponent(InstanceClass.NewInstance);
// set the Reference before the constructor is called, so that
// events and constructors can refer to it
TComponent(Reference) := Instance;
ok:=false;
try
if (FCreatingForm=nil) and (Instance is TForm) then
FCreatingForm:=TForm(Instance);
Instance.Create(Self); // Ошибка на этой строке
ok:=true;