ERPSYSTEM开发教程04 框架模块管理

从DEMO程序获知,

框架主程序工程文件里Forms替换为uTangramFramework,

每个模块都有一个TModule子类和一个GetModuleClass导出函数

那么框架是如何进行模块管理的呢?

我们先从模块入手

unit DllOnePlugin;

interface

uses SysUtils,Classes,uTangramModule,SysModule,RegIntf;

Type
  TUserModule=Class(TModule)
  private
  public
    Constructor Create; override;
    Destructor Destroy; override;

    procedure Init; override;
    procedure final; override;
    procedure Notify(Flags: Integer; Intf: IInterface); override;

    class procedure RegisterModule(Reg:IRegistry);override;
    class procedure UnRegisterModule(Reg:IRegistry);override;
  End;

implementation

initialization
  RegisterModuleClass(TUserModule);
finalization

end.

这是模块的TModule子类,initialization下方的代码是被最先执行的,我们看一下RegisterModuleClass函数放在uTangramModule.pas

unit uTangramModule;
{$weakpackageunit on}
interface

uses SysUtils,RegIntf,SysModule;

procedure InstallModule(Reg:IRegistry);
procedure UnInstallModule(Reg:IRegistry);
function GetModuleClass:TModuleClass;

Exports
  InstallModule,
  UnInstallModule,
  GetModuleClass;

implementation

var FModuleClass:TModuleClass;

procedure RegisterModuleClass(ModuleClass:TModuleClass);
begin
  FModuleClass:=ModuleClass;
end;

function GetModuleClass:TModuleClass;
begin
  Result:=FModuleClass;
end;

end.

RegisterModuleClass(TUserModule);其实就是将模块里的TModule子类保存到一个类引用变量FModuleClass;

而导出函数GetModuleClass则返回的FModuleClass,因此通过导出函数GetModuleClass就可以获得模块的TModule子类

接下来我们看主程序

Forms替换为uTangramFramework,而uTangramFramework文件里定义了一个Application对象,也就是说

Program HOST;

uses
  uTangramFramework,
  MainForm in ‘MainForm.pas‘ {FrmMain};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TFrmMain, FrmMain);
  Application.Run;
end.

这里的Application对象其实由uTangramFramework里定义的

unit uTangramFramework

TTangramApp=Class

var
  Application:TTangramApp;

initialization
  Application:=TTangramApp.Create;
finalization
  Application.Free;

这样,程序启动之初就会创建由框架定义的Application对象,接下来我们就从这行代码开始,进行调试,看模块是如何被管理的

首先进入TangramApp构造函数

这里的 FLoadModuleFromRegistry 是TTangramApp的 LoadModuleFromRegistry 属性变量,设置框架默认是从XML进行模块加载

而FModuleMgr是一个TModuleMgr对象,负责模块的管理,进行模块管理类的构造函数

这里创建了一个TObjectList 对象,该对象用于保存模块列表。

TSingletonFactory.Create(IRegistry,@CreateRegObj);几行是类厂的创建,这部分在接口管理里详细介绍。

继续执行,当所有包含initialization部分的单元执行过后,就到了程序入口

进入这几个函数看一下

可以看出,其实TTangramApp只是起了几个同名函数,实际调用还是交给了Forms的Application对象,使得主程序在启动之前有机会进行一些初始化工作

接下来运行到Run函数

FLoadModuleFromRegistry 在构造函数里已经设置为True,而我们没有修改这个属性,所以在这里开始进行模块的自动加载

这里调用模块管理类TModuleMgr对象FModuMgr进行模块加载,进入LoadModules

GetModuleList函数负责从XML文件读取需要自动加载的模块文件路径,保存到aList

这里先是判断文件是否存在,如果存在则准备加载

这里根据模块的文件创建一个TTangramModule对象,用于负责模块的加载

这里判断模块的类型然后进行加载,加载完成后

  @GetModuleClassPro := GetProcAddress(FModuleHandle, ‘GetModuleClass‘);
  if Assigned(GetModuleClassPro) then
  begin
    FModuleCls:=GetModuleClassPro;
    FValidModule:=FModuleCls<>nil;
    if (FModuleCls<>nil) and (CreateModuleObjInstance) then
      FModuleObj:=FModuleCls.Create;
  end;

获得模块的导出函数GetModuleClass,如果存在这个函数则保存并调用,将返回值保存到FModuleCls,这个FModuleCls保存的就是模块里的TModule子类,并创建对象

procedure TModuleMgr.LoadModuleFromFile(const ModuleFile: string);
var Module:TTangramModule;
begin
  try
    Module:=TTangramModule.Create(ModuleFile,self.FLoadBatch);
    if Module.IsValidModule then
      FModuleList.Add(Module)
    else Module.Free;
  Except
    on E: Exception do
    begin
      WriteErrFmt(Err_LoadModule, [ExtractFileName(ModuleFile), E.Message]);
    end;
  end;
end;

如果是一个有效模块,则添加到对象列表FModuleList

procedure TTangramApp.Run;
begin
  if FLoadModuleFromRegistry then
  begin
    FModuleMgr.LoadModules;
    FModuleMgr.Init;
  end;
  Forms.Application.Run;
  FModuleMgr.final;
end;

当所有模块加载完成后,开始进行模块初始化

这里取出模块对象列表FModuleList里的每一个对象进行初始化

注意这里的  FModuleObj.Init FModuleObj是一个TModule对象,是在模块加载时调用GetModuleClass返回模块里的TModule子类创建的对象,

而Init在TModule里是虚函数,所以这里实际调用的实际是模块里的TModule子类实现的Init函数

当所有模块都初始化过后就进入消息循环,直到主窗体退出则调用模块的终止化函数

procedure TTangramApp.Run;
begin
  if FLoadModuleFromRegistry then
  begin
    FModuleMgr.LoadModules;
    FModuleMgr.Init;
  end;
  Forms.Application.Run;
  FModuleMgr.final;
end;

TModuleMgr提供了两个接口IModuleLoader,IModuleInstall,提供给开发者进行自定义模块加载安装

视频教程地址:

ERPSYSTEM开发教程01     http://pan.baidu.com/s/1kT7Rb3D

ERPSYSTEM开发教程02     http://pan.baidu.com/s/11xN5s

框架源代码下载地址            http://pan.baidu.com/s/1jGIc2Su

DEMO源代码下载地址         http://pan.baidu.com/s/1bnyEafH

联系QQ:1330009208 (验证信息请填ERPSYSTEM)

时间: 2024-10-25 17:06:10

ERPSYSTEM开发教程04 框架模块管理的相关文章

ERPSYSTEM开发教程05 框架接口管理

框架接口是采用类厂来管理的 一个接口要被框架管理的实现步骤 首先是接口定义,接口实现类,接口实例创建函数,指定类厂 unit BplOneIntf; {$WEAKPACKAGEUNIT ON} interface type IBplOne=interface ['{E4C1C5FA-C598-4834-9111-26B52634068D}'] function Add(A,B:Integer):integer; function Sub(A,B:Integer):Integer; end; im

ERPSYSTEM开发教程01 框架介绍

从今天开始我将给大家带来一套有关Delphi开发的教程 主要开发ERP软件 我个人觉得,ERP软件的开发,技术层面的不是最大问题, 而是对客户需求的认知程度以及如何管理复杂多样的需求. 因此一个开发框架显得非常重要! 这里我推荐一套来自网络的开源框架 Tangram Plugin Framework 框架特点 1.采用模块化插件开发,支持DLL和BPL两种模块方式 2.自动或手动动态加载模块 3.模块与模块或主程序之间均使用统一的接口方式进行访问 源代码下载地址  http://code.goo

ERPSYSTEM开发教程02 框架安装

1.下载好Tangram后解压 2.把\framework目录下的DCP,Interfaces,Units添加到Delphi搜索目录 3.打开目录下的framework.groupproj项目工程组,该工程组有四个项目Tangram_Core.bpl ConfigTool.exe PackageRequries.exe IDEWiz.bpl 分别是框架核心包,框架配制工具,包引用查看工具,IDE向导.然后编译一下工程组,并把IDEWiz.bpl安装,这样就可以用向导来创建框架主程序或模块 框架源

ERPSYSTEM开发教程03 DEMO程序开发过程

DEMO程序说明 提供了两个演示接口 IBplOne=interface ['{E4C1C5FA-C598-4834-9111-26B52634068D}'] function Add(A,B:Integer):integer; function Sub(A,B:Integer):Integer; end; IDllOne=interface ['{0434DE04-07C9-4623-9009-CF7892768431}'] function GetString:string; procedu

Webpack: 为Web开发而生的模块管理器[转]

Webpack: 为Web开发而生的模块管理器 原文地址:http://hanjianwei.com/2014/09/10/webpack-package-manager-for-web/ 10 Sep 2014 对于开发人员而言,好的包管理器可以让工作事半功倍.现在流行的编程语言大多有自己的包管理系统.近年来,Web开发越来越火,其开发工具也随之越来越好用了,而Webpack就是一款专为Web开发设计的包管理器.它能够很好地管理.打包Web开发中所用到的HTML.Javascript.CSS以

XAF应用开发教程(五)验证模块

数据验证是应用程序开发中使用频率最高的功能模块,本节详细介绍一下XAF中如何使用验证模块. XAF 验证模块内置了下面的一些验证规则: 验证规则类型 说明 RuleCombinationOfPropertiesIsUnique (RuleCombinationOfPropertiesIsUniqueAttribute) 要求多个属性的值组合在一起时是唯一的. RuleCriteria (RuleCriteriaAttribute) 要求满足指定的条件. 如:座机或手机必须填写一个. 条件为:坐机

Magento 2开发教程 - 创建新模块

视频在youtube网站国内访问不了,可以使用FQ软件查看. 视频地址:www.youtube.com/embed/[email protected]=1 下面是视频文字介绍: Magento 2系统整体结构是建立在模块的基础上.通常,创建定制的第一步是构建模块. 要创建模块,需要完成以下步骤: 创建模块文件夹 创建 etc/module.xml 文件. 创建 registration.php 文件. 运行 bin/magento setup:upgrade脚本安装新模块 检查模块是否正常工作

Android快乐贪吃蛇游戏实战项目开发教程-04虚拟方向键(三)三角形按钮效果

该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.知识点讲解 当我们点击系统自带的按钮时,按钮的外观会发生变化.上篇博文中我们画了一个三角形按钮,但点击还不能变色,下面我们就来实现点击变色功能. 从知识体系上我们需要了解以下两个知识点 1.如何知道手指点击了我们的控件? 办法是重写View中的onTouchEvent方法.当手指触摸到我们的控件时,系统会通过该方法告诉我们.该方法还有一个类型为MotionEvent的参数,

06-移动端开发教程-fullpage框架

CSS3的新特性已经讲完了,接下来我们看一下jQuery的一个全屏jQuery全屏滚动插件fullPage.js.我们经常见到一些全屏的特绚丽页面,手指或者鼠标滑动一下就是一整屏切换,而且还有各种效果.比如:全屏滑动案例 下面我们就介绍一下jQuery的fullPage.js的如何使用及常用的配置. 1. fullpage.js的主要功能 fullPage.js是一个基于jquery的插件,它能很方便的制作出全屏网站,github地址. 主要功能有: 支持鼠标滚动. 支持前后退和键盘控制. 多个