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. 一个tomcat下,两个系统的jar包可以相互引用。

    将道路挖占管理系统(rems)从交通设备设施系统(tms)中剥离出去以后,在本地调试的时候是在同一个Tomcat下启动的,上传文件成功. 然后部署到西安以后,分成两个tomcat以后,发现rems上传 ...

  2. C++ 执行 cmd 命令 删除文件 删除注册表项

    #include <Windows.h> WinExec("cmd /C \"del C:\\Windows\\secretWin.ini\"",S ...

  3. 笔记 : win8系统中的VM虚拟机的Ubuntu搭建samba服务

    1. 环境准备 (此处使用root超级管理员帐户,执行命令时不用加sudo, 普通帐户需要前面加sudo):  (1)安装好Ubutun虚拟系统后,Ubuntu 的软件源配置文件是 /etc/apt/ ...

  4. python遍历某一位置所有文件夹中的文件

    通过多次遍历达到找出所有文件的目的 import os rootdir=["d:/77"] c=[] for i in rootdir: for parent,dirnames,f ...

  5. Python全栈-day8-day9-函数1

    函数 day8 1.为什么需要函数 1)代码的组织结构不清晰,可读性差 2)需要重复使用某个功能时,需要重新编写成程序,重复率高 3)多处引用相同代码时,需要扩展功能的时候过于麻烦,工作量大 2.函数 ...

  6. SiteCore Experience Analytics-体验分析

    体验分析   Sitecore Experience Analytics为营销人员和营销分析师提供仪表板和报告,以识别从其网站和可能的其他外部数据源收集的体验数据的模式和趋势. 体验分析报告示例:   ...

  7. Java多线程-----理解CountDownLatch

       CountDownLatch简介  CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier.Semaphore.ConcurrentHa ...

  8. Acperience (英语阅读 + 数学推导)

    #include<bits/stdc++.h> using namespace std; int main(){ int T,n,m;scanf("%d",&T ...

  9. 直流-直流(DC-DC)变换电路_BUCK&BOOST变换电路

    1. 直流—直流变换器通过对电力电子器件的通断控制,将直流电压断续地加到负载上,通过改变占空比改变输出电压平均值. BUCK线路原理图如上,其中Q管/MOS作为开关管,驱动电压一般为PWM. 当开关管 ...

  10. AWS免费云服务套餐申请步骤及常见问题

    AWS免费云服务套餐申请步骤及常见问题 AWS免费使用套餐常见问题_AWS免费云服务套餐_-AWS云服务https://amazonaws-china.com/cn/free/faqs/ 什么是 AW ...