2.5 整理框架
在上一章的1.6节中,我们第一次整理出一个属于自己MDI应用的框架,而我们在上一节中也完成了MDI的登录界面等,在这一节中,我们再接再厉,把登录界面相关的东西也做到框架里面去!
2.5.1 把登录界面放到框架里面
登录的界面几乎是每个MIS都会需要的,但登录界面可能随着每一个应用的不同而样式也都不会一样。所以,我们采用子窗体与主窗体的方式把它分开。首先,把LoginForm.pas另存为../ FlexMDIFramework/LoginFormDefine.pas,并把这个Form的名字改为CustomLoginForm,再把WelcomeForm.pas另存为../ FlexMDIFramework/WelcomeFormDefine.pas,并把这个Form的名字改为 CustomWelcomeForm。接着我们使用类似于1.6节的方法,从上面两个父类Form中派生出frmLogin及frmWelcome,并保存好。
接下来的工作,我们整理一下目录,在EXE下建立两个子目录,名为Custom及ChildForms,把WelcomeForm.pas及LoginForm.pas放到Custom中,把ChildFormC、ChildFormD放到ChildForms中,然后回到Delphi中,通过使用删除单元文件,添加单元的方法所刚才那些文件修整完毕,最终得到如下图所示的结构:
另外,以上的操作完成后,记得修正MDI_Tutorial.dpr中的内容。
2.5.1 把基础表做得更通用
我们首先来看LoginFormDefine.pas中的内容:
……
qry.Connection := GBaseConf.MainConnection;
qry.SQL.Add('select count(*) from tb_operator where operatorid =:opid and psw =:psw');
qry.Parameters.ParamByName('opid').Value := edtOperatorID.text;
……
在这里有一个写好的SQL语句,这个语句里面有一张表,这张表的表名包含在一个固定的字符串里面,因为我们这个MDI框架是准备以后能重复使用的,那意味着这个操作员表也会被复用,有可能应用A里面的操作员表是tb_operator,应用B里面的操作员表也是tb_opeartor,这样本来没有什么问题,但如果这两个应用恰好安装在同一个库里面的时候,就可能发生名字上的冲突了,为了避免这种情况的发生,我们应该使用不同的两个名去命名这两个操作员表。但如果每次都去修改Framework中的内容,那么这种Framework就没有通用的意义了,所以我们引用另外一个公用单元模版BaseStringUnitDefine.pas,及一个实际的公用单元 BaseStringUnit.pas,这两个单元的代码如下:
BaseStringUnitDefine.pas(保存在FlexMDIFramework下)
unit BaseStringUnitDefine;
interface
type
TCustomBaseString = class (TObject)
protected
F_TB_OPERATOR : string;
public
property TB_OPERATOR : string read F_TB_OPERATOR;
end;
var
GBaseString : TCustomBaseString;
implementation
end.
BaseStringUnit.pas(保存在EXE/Custom下):
unit BaseStringUnit;
interface
uses
BaseStringUnitDefine;
type
TBaseString = class (TCustomBaseString)
public
constructor Create;
end;
implementation
constructor TBaseString.Create;
begin
self.F_TB_OPERATOR := 'tb_operator';
end;
initialization
GBaseString := TBaseString.Create;
end.
同时改造MDI_Tutorial.dpr的引用顺序,把BaseStringUnitDefine及BaseStringUnit放到最前面,并在程序的最好加上
……
GBaseString.Free;
End.
最后就可以改造LoginFormDefine.pas了,把
uses
BaseConfUnit, BaseStringUnitDefine;
……
qry := TADOQuery.Create(nil);
qry.Connection := GBaseConf.MainConnection;
qry.SQL.Add('select count(*) from '+ GBaseString.TB_OPERATOR + ' where operatorid =:opid and psw =:psw');
qry.Parameters.ParamByName('opid').Value := edtOperatorID.text;
qry.Parameters.ParamByName('psw').Value := edtPassword.Text;
……
通过这样的改造后,我们如果要改变这些基础表的表名时,只需要修改一下BaseStringUnit,pas就可以了,十分的方便。
最终的文件结构图:
第二章就此结束,在第二章中我们一起研究了登录窗口,欢迎窗口的写法,另外我们把数据库的访问也引入进来了。在最后一节中,我们把这些所有新研究的成果全都融入到我们的框架之中。