ERPCore实现原理(二)

程序初始化后,就创建主窗体

procedure TMain.FormCreate(Sender: TObject);
begin

  TObjFactoryEx.Create([IMainForm,IFormMgr],self);

  SetSysSkin(dxSkinController);

  if not LoadSysModule then exit;
  LoadUserModule;

  if not Sys.Login.Login then
  begin
    Application.ShowMainForm:=False;
    Application.Terminate;
  end;

  Sys.ERPInit.InitSYS;
  Sys.ERPInit.InitMenu(dxBarManager);

  CloseSplash;
  BringToFront;
End;


主窗体创建时做了以下事情

1.通过实例工厂,将主窗体Self与接口IMainForm,IFormMgr绑定,

这样当访问这两接口时就会调用主窗体里的实现代码,有关类厂将在后期讲解

2.设置系统皮肤

3.加载系统模块和用户模块,这里进行了模块管理

4.系统登陆

5.系统初始化(和用户相关)

 

先说说接口吧,一切从这里开始,先说说一些初学者不好理解的地方

在SysModuleMgr.pas里有一段代码

procedure TTangramModule.UnInstall;
var Reg:IRegistry;
begin
  if FModuleCls<>nil then
  begin
    Reg:=SysService as IRegistry;
    FModuleCls.UnRegisterModule(Reg);
  end;
end;

其中 SysService 是TSysService对象

TSysService=Class(TObject,IInterface,ISysService)

与IRegister接口没有任何继承关系,可为什么可以直接 as 呢?

这是因为TSysService重新实现了IInterface接口

function TSysService.QueryInterface(const IID: TGUID; out Obj): HResult;
var aFactory:TFactory;
begin
  Result:=E_NOINTERFACE;
  if self.GetInterface(IID,Obj) then
    Result:=S_OK
  else begin
    aFactory:=FactoryManager.FindFactory(IID);
    if Assigned(aFactory) then
    begin
      aFactory.prepare(FParam);
      Result:=aFactory.GetIntf(IID,Obj);
    end;
  end;
end;

查询接口时,会先通过GUID搜索,当搜索不到时会到工厂管理搜索

在这个框架下,接口都会先注册到工厂,这也是为什么任何框架下地模块都可以调用到不同模块的接口

而 as 操作会调用接口查询QueryInterface

所以才有SysService as IRegistry这一幕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值