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;

uniGUI试用笔记(五)的更多相关文章

  1. uniGUI试用笔记(十五)通过URL控制参数

    通过URL代入参数,在代码中读取,如: http://localhost:8501/?ServerPort=212&&ServerIP=192.168.31.12 在代码中可以通过: ...

  2. uniGUI试用笔记(十三)调用WebService

    今天尝试用uniGUI做Web服务器,调用应用服务器的WebService,遇到些问题记录下来备忘. 1.对WebService的调用同一般App程序,只是注意如果WebService的执行时间较长, ...

  3. uniGUI试用笔记(十一)

    最近研究了一下UniGUI的TuniDBGrid,记录一下免得忘记了. TuniDBGrid的重要属性包括: 1.列—TUniDBGridColumns和TUniDBGridColumn 每个列对象( ...

  4. uniGUI试用笔记(十)

    今天用LoadRunner对uniGUI的Standalone模式的程序进行了一次压力测试,程序采用三层模式,将应用服务器与Web服务器分离,由于条件限制,数据库.应用服务和Web服务都部署在同一条云 ...

  5. uniGUI试用笔记(九)

    uniGUI执行程序部署有3种形式 1.ISAPI模式 部署在IIS或Apache,程序编译为Dll形式,没有试,准备后续专门测试一下. 2.标准执行文件模式 将软件编译成一个独立的Exe文件,包括了 ...

  6. uniGUI试用笔记(八)

    在业务系统中常常使用回车键(Enter)替代Tab键完成焦点跳转,在uniGUI下,可以不用代码,直接使用TUniForm的NavigateKeys进行设置: 其中Next和Prior决定了焦点向下一 ...

  7. uniGUI试用笔记(七)

    uniGUI的文件下载由于TUniSession的存在而变得非常简单,最典型的一个例子就是将列表中的所有数据导出到Excel中.服务器上采用TMS FlexCel控件,先将数据集中的记录导入到Exce ...

  8. uniGUI试用笔记(六)

    uniGUI提供了一个文件上传控件TUniFileUpload,进行数据的导入就变得比较容易.首先将TUniFileUpload控件放置在窗体上,按下导入按钮后,执行TUniFileUpload的文件 ...

  9. uniGUI试用笔记(四)

    uniGUI下有专用的登录窗体类:TUniLoginForm,该类属于AppForm,构建代码为: function frmWebLogin: TfrmWebLogin; begin Result : ...

随机推荐

  1. HTTP参数污染【转】

    HTTP参数污染注入源于网站对于提交的相同的参数的不同处理方式导致. 例如: www.XX.com/a?key=ab&key=3 如果服务端返回输入key的值,可能会有 一: ab 二:3 三 ...

  2. InstallShield2015制作安装包----------卸载前结束执行中的进程

    方法一:InstallShiel直接调用cmd命令来杀掉进程. //更新或卸载时先关闭应用程序 sCmdLine=" /c taskkill /f /im \"Frs.exe\&q ...

  3. 1.display:flex布局笔记

    /*display:flex布局方式主要运用于垂直居中的效果*/ 一.Flex译为Flexible Box(弹性盒子),任何一个容器都可以指定为Flex布局 注:设置为Flex布局之后,子元素的flo ...

  4. Lambda表达式语法

    基础语法:‘->’Lambda操作符* 左侧:Lambda表达式的参数列表 对应接口中方法中的参数列表中的参数(比如nice1中MyPredict这个接口中的方法)* 右侧:Lambda表达式中 ...

  5. mongodb mapredReduce 多个条件分组(group by)

    from:https://my.oschina.net/chiyong/blog/289138 Mongodb 没有传统数据库的group函数,如果分组需要走MapReduce.这种MR与Hadoop ...

  6. windows编程之Windows Shell 编程

    参考书<VC++ Windows Shell Programming>   这里仅仅是记录下该资源,推荐到下文列出的连接进行查看   用VC++ 进行Windows Shell 扩展编成 ...

  7. URL Resources

    Prezi 1. 官网   https://prezi.com/ 2. 入门教程   https://wenku.baidu.com/view/9bb234ac0029bd64783e2c6b.htm ...

  8. <8>Lua继承

    模拟继承方式 代码: --继承 -- 基类:Person local Person = {} --基类的表 -- 方法 function Person:test() print("Perso ...

  9. yii2 rules验证规则,ajax验证手机号码是否唯一

    <?php namespace frontend\models; use Yii; use yii\base\Model; /** * Signup form */ class SignupFo ...

  10. Spark学习之路 (二十)SparkSQL的元数据

    一.概述 SparkSQL 的元数据的状态有两种: 1.in_memory,用完了元数据也就丢了 2.hive , 通过hive去保存的,也就是说,hive的元数据存在哪儿,它的元数据也就存在哪儿. ...