uniGUI试用笔记(五)

uniGUI的主窗体可以采用多页面方式进行管理,参考网上的资料,都是用TUniFrame + TUniPageControl 来实现,尝试了一下,效果还不错,如下图:

image

用TUniFrame 能够使用继承模式,我采用了以下的类关系:

image

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;

 

你可能感兴趣的:(GUI)