You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring4D 解析带构造Owner参数的TFrame及工厂实现问题

步骤1:调整工厂接口,增加页面名称参数

你原来的工厂接口只接收Owner参数,没有传入要获取的Frame的注册名称,所以无法定位到指定实现,首先修改接口定义:

IPageFactory = interface(IInvokable)
  ['{2E40E3C4-87B7-4313-BE0A-29202B7EB5A1}']
  // 新增aPageName参数,传入你注册Frame时用的命名标识
  function Create(aOwner: TComponent; const aPageName: string): TfraBasePage;
end;

步骤2:调整Frame注册逻辑,显式指定构造函数注入规则

你需要告诉容器,Frame要使用带Owner参数的构造函数创建,构造参数由工厂传入,不需要容器自行解析:

// 注册每个Frame时都显式指定使用带TComponent参数的构造函数
GlobalContainer.RegisterType<TfraBasePage, TfraSetting>(IDSettingPage)
  .InjectConstructor([TypeInfo(TComponent)]);
GlobalContainer.RegisterType<TfraBasePage, TfraCurrency>(IDCurrencyPage)
  .InjectConstructor([TypeInfo(TComponent)]);
GlobalContainer.RegisterType<TfraBasePage, TfraTicketLayOut>(IDTicketLayOutPage)
  .InjectConstructor([TypeInfo(TComponent)]);
GlobalContainer.RegisterType<TfraBasePage, TfraSetUp>(IDSetUpPage)
  .InjectConstructor([TypeInfo(TComponent)]);

// 注册工厂,不需要加命名标识,全局只需要一个IPageFactory实例即可
GlobalContainer.RegisterFactory<IPageFactory>;

步骤3:调用工厂获取对应Frame

注册完成后,先解析出工厂实例,再调用Create方法传入Owner和对应Frame的注册名即可:

var
  oFrame: TfraBasePage;
begin
  // 先解析工厂实例,不需要加名称参数
  oFrame := GlobalContainer.Resolve<IPageFactory>.Create(Self, IDSettingPage);
  // 此时获取到的oFrame的构造Owner已经是当前类实例,无需再手动调用InsertComponent
end;

原写法错误原因

你之前将页面名称放在Resolve<IPageFactory>('SettingPage')的参数中,是让容器查找名称为SettingPage的IPageFactory实现,而你从未注册过命名的工厂,所以会报错。


内容的提问来源于stack exchange,提问作者Ravaut123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:54:03