ERPCore实现原理(二)

news/2023/9/28 18:59:49

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

procedure TMain.FormCreate(Sender: TObject);
beginTObjFactoryEx.Create([IMainForm,IFormMgr],self);SetSysSkin(dxSkinController);if not LoadSysModule then exit;LoadUserModule;if not Sys.Login.Login thenbeginApplication.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;
beginif FModuleCls<>nil thenbeginReg:=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;
beginResult:=E_NOINTERFACE;if self.GetInterface(IID,Obj) thenResult:=S_OKelse beginaFactory:=FactoryManager.FindFactory(IID);if Assigned(aFactory) thenbeginaFactory.prepare(FParam);Result:=aFactory.GetIntf(IID,Obj);end;end;
end;

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

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

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

所以才有SysService as IRegistry这一幕

转载于:https://www.cnblogs.com/erp-system/p/3461387.html


https://dhexx.cn/news/show-17920.html

相关文章

Java基础之SPI机制

Java基础之SPI机制一、SPI机制的简单示例1、案例分层2、接口3、实现类4、测试类5、结果二、SPI机制的缺陷一、SPI机制的简单示例 1、案例分层 resources 接下来可以在resources下新建META-INF/services/目录&#xff0c;然后新建接口全限定名的文件&#xff1a;com.example.d…

phoenix 创建 Pre-split(预分区)表

当可以提前知道 row key 的分布的时候&#xff0c;可以指定每个预分区的 region 的分割点&#xff0c;上面命令创建的表中&#xff0c;有 5 个 Region create table testlocal (id integer primary key, name varchar, age integer, address varchar) split on (10, 20, 30, …

Java基础之Collection的ArrayList

Java基础之Collection的ArrayList一、add()与addAll()二、remove()三、trimToSize()1、案例一、add()与addAll() 跟C 的vector不同&#xff0c;ArrayList没有push_back()方法&#xff0c;对应的方法是add(E e)&#xff0c;ArrayList也没有insert()方法&#xff0c;对应的方法是…

GetCharWidth32

#include <windows.h> #include<stdio.h> // 窗口函数的函数原形 LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {char szClassName[] …

Java基础之LinkedList

Java基础之LinkedList一、介绍二、add()一、介绍 底层是一个双向链表实现的List&#xff0c;内部每一个节点采用内部类Node表示&#xff0c;通过first、last引用分别指向链表的第一和最后一个元素非线程安全&#xff0c;可以用Collections.synchronizedList()方法对其进行包装…

phoenix全局索引和本地索引 概述,使用场景,区别等详解

索引类型 phoenix的索引大致分为两类global index和local index&#xff0c;好像和星环有点类似&#xff0c;其实这是hbase二级索引解决方案里面广为人知的两种方案&#xff0c;侧重点不同&#xff0c;使用场景也不一样。 global index&#xff0c;global是默认的索引格式。官…

Java基础之并发理论基础

Java基础之并发理论基础一、为什么需要多线程二、线程不安全1、三要素之一可见性&#xff08;CPU缓存引起&#xff09;2、三要素之一原子性&#xff08;分时复用引起&#xff09;3、三要素之一有序性&#xff08;重排序引起&#xff09;三、解决方案1、原子性角度2、可见性角度…

LeetCode:Sqrt(x)

题目链接 Implement int sqrt(int x). Compute and return the square root of x. 面试时需要考虑x是否小于0. 分析&#xff1a;牛顿法&#xff0c;先假设一个初始解res&#xff08;本文设为1&#xff09;&#xff0c;然后以抛物y x^2-c&#xff08;这里的c相当于题目中的x&am…

phoenix 全局索引设计实践

概述 全局索引是Phoenix的重要特性&#xff0c;合理的使用二级索引能降低查询延时&#xff0c;让集群资源得以充分利用。 本文将讲述如何高效的设计和使用索引。 全局索引说明 全局索引的根本是通过单独的HBase表来存储数据表的索引数据。我们通过如下示例看索引数据和主表数…

学习ForkJoin

学习ForkJoin一、普通解决多线程方式1、案例一2、效果图二、ForkJoin一、普通解决多线程方式 1、案例一 大数据量的List问题处理&#xff0c;多线程分批处理&#xff0c;需要解决的问题&#xff1a; 下标越界。线程安全。数据丢失。 private static ThreadPoolExecutor thre…