ShareERP2013-10-03
模块:具有功能设计、权限绑定,链接用户菜单与系统的重要桥梁。
菜单:是用于显示与用户交互的重要入口,更是导航系统的舵手,所以它的设计直接影响到用户体验。
菜单可能根据不同的用户会有不同的加载方式,特别是定制的系统,灵活性不必可少。并且,可扩展性,提供用户二次开发接口,可挂接用户自己的模块及调用菜单,当用户增加自己的模块或菜单后,能否进行权限控制,那么在权限设计时就要充分考虑到这些要素,详细请参看权限设计。
在一般系统中,菜单和工具栏按钮是共享事件过程的,我们不太可能给每个Event绑定一个过程,那样的代码量不但大而且冗余,就笔者使用的Delphi为例,Delphi为我们提供了ActionList控件,它是能很好的链接菜单和工具栏按钮的控件,不光是Event能共享,就连快捷键、图像、标题、Hint都为我们做好了。有了它看似简单许多,但我们还要进一步简化操作,就算共享Event,但功能项太多,不能每项都去编写代码,并且每项功能还都是动态创建的,为此我们要做一个统一的Event过滤器来执行操作,将所有的功能项绑定到Event过滤器上,以功能编号来区别功能调用。
为方便维护,笔者将各个子系统模块定义成DLL动态库,动态库里分若干子模块,每个子模块对应一菜单项,这样的映射关系需要做一个菜单模块映射表,用来记录它们,以便用户自定义自己的模块。
菜单与模块映射表 |
|||||
序号 |
主键 |
字段名 |
字段说明 |
数据类型 |
长度 |
1 |
YES |
iAutoID |
int |
4 |
|
2 |
cMCode |
模块编号 |
varchar |
20 |
|
3 |
cMenuName |
菜单名 |
varchar |
20 |
|
4 |
cMenuCaption |
菜单标题 |
varchar |
40 |
|
5 |
cParentName |
父级菜单 |
varchar |
20 |
|
6 |
cRemark |
备注 |
varchar |
20 |
|
7 |
bVisible |
菜单可见 |
bit |
1 |
有了菜单与模块映射表,就可以动态的为系统创建模块菜单和树形视图。
前面提到,DLL动态库模块,动态库模块它本身也是一个树形结构。
模块->
子模块->
功能项->
功能项N…
子模块N…->
Delphi 为我们提供了TCollection对像,它非常方便管理这种结构,然后再将 TCollection转成菜单就OK。
模块管理类的简单定义:
TModuleMgr = class; //菜单项 TModuleItem = class(TCollectionItem) public fTreeNode: TTreeNode; fMInfo: TModuleItemRec; procedure MenuOnClick(Sender: TObject); //菜单点击事件过滤 end; TModules = class(TCollection) private fForms: TList; DLLHandle: Integer; //DLL句柄 fSysHelper: TModuleMgr; procedure OnTimer(Sender: TObject); function GetItems(Index: Integer): TModuleItem; procedure SetItems(Index: Integer; Value: TModuleItem); public ModuleID: Integer; DLLFileName: string; function AddDLLFunction(const MenuCode: string): TModuleItem; constructor Create(ItemClass: TCollectionItemClass; ASysHelper:TModuleMgr); property Items[Index: Integer]: TModuleItem read GetItems writeSetItems; destructor Destroy; override; function GetActiveFunc: TModuleItem; procedure Execute(AItem: TModuleItem); end; TModuleItemRec = record ModuleDllName: string; //Dll Name ModuleParentCode: string; //父项序号 ModuleCode: string; //模块功能序号 MenuCode: string; //菜单编码 ModuleFormTitle: string; //菜单标题 ModuleTemplate: string; //模板名 iShowType: Byte; //窗口显示类型 ModuleType: TTemplateType; //模块类型 =TTemplateType单据模板类型 ModuleEnabled: Boolean; //菜单是否有效 RootAuth: string; //权限编码 InfaceName: string; //接口名 end; PModuleItemRec =^TModuleItemRec;
下篇:系统基础管理(BS)- 栏目与查询 待续……
来源:分享ERP http://www.shareerp.com 联系QQ:908916944