uniGUI的主窗体可以采用多页面方式进行管理,参考网上的资料,都是用TUniFrame + TUniPageControl 来实现,尝试了一下,效果还不错,如下图:
用TUniFrame 能够使用继承模式,我采用了以下的类关系:
TfmeWebEmbedBase : 所有嵌入Frame的基类,实现了与主窗体的交互和控制,包括窗体的关闭等
TfmeWebDBListBase: 与数据集列表操作相关的基类,实现了数据集的开启、数据导出与打印等
TfmeWebDBListEditBase:与数据集读写操作相关的基类,实现了数据集的新增、修改、删除、导入及保存等
业务窗体根据情况从TfmeWebDBListBase或TfmeWebDBListEditBase继承。
在主窗体中,首先构建一个列表,容纳所有的Frame
FFrameList : TList;
菜单或按钮点击,需要开启业务窗体时,调用函数
procedure TfrmWebMain.ShowFrame(AfmeBaseClass: TfmeWebEmbedClass; AOwnerData: Variant);
var
ts: TUniTabSheet;
fme : TfmeWebEmbedBase;
begin
{ 查找是否已经存在相应的业务窗体 }
fme := FindFrame(AfmeBaseClass);
{ 如果没有则新建 }
if not Assigned(fme) then
begin { 先创建TabShee,用于放置Frame }
ts := TUniTabSheet.Create(self);
ts.PageControl := pcMain;
ts.Closable := False; { 置换关闭事件,用于关闭业务窗体 }
ts.OnClose := OnTabSheetClose; { 构建业务窗体 } fme := AfmeBaseClass.Create(Self);
fme.Parent := ts;
fme.TabSheet := ts;
fme.Align := alClient;
fme.MainForm := Self; { 设置返回事件,当业务窗体按下<返回>时,执行该函数}
fme.OnReturn := OnFrameReturn;
ts.Caption := fme.ModelName; { 业务窗体加入到列表 }
FFrameList.Add(fme);
end
else { 如果找到已存在的业务窗体,则取其对应的TabSheet}
ts := fme.TabSheet; { 进行业务窗体的数据准备工作,失败则释放业务窗体 } if not fme.PrepareData(AOwnerData) then
begin
ReleasFrame(fme);
Exit;
end; { 显示业务窗体 } ts.TabVisible := true;
pcMain.ActivePage := ts;
end;