功能说明:

一、在需要融合的每个窗体加一句

initialization
RegisterClasses([TFrmDataDict]); //类名

二、cxpagecontrol融合窗体,在调用时

1. 如果不存在,创建窗口并显示到cxTabsheet中;

2.如果已存在,则找到窗体并显示

//ClassName窗体类名,Caption窗口名称,Args参数
function TFrmMain.OpenForm(ClassName: string; Caption: string; Args: array of Variant): TcxTabSheet;
var
I: Integer;
aSheet: TcxTabSheet;
aForm: TBaseForm; //继承自TForm的基类窗体,定义了一个procedure Execute(const Args: array of Variant); virtual; 所有窗体从此类窗体继承
begin
Result := nil;
//如果模块已存在,则显示
for I := to cxPageControl.PageCount - do
begin
if cxPageControl.Pages[I].Name = 'TabSheet_' + ClassName then
begin
cxPageControl.Pages[I].Show;//或者 cxPageControl.ActivePageIndex:=i;
//如果有传参数,则调用Execute
if Length(Args)> then
begin
Application.ProcessMessages;
TBaseForm(cxPageControl.Pages[I].Tag).Execute(Args); //传参数并调用Execute方法,方法名可以TBaseForm自定义
end;
Result:=cxPageControl.Pages[I];
Exit;
end;
end; //窗体不存在
if GetClass(ClassName) = nil then
begin
DialogInformation('【' + ClassName + '】不存在或未注册!');
Exit;
end; //不存在则创建
aSheet := TcxTabSheet.Create(Self);
aSheet.Name := 'TabSheet_' + ClassName;
aSheet.PageControl := cxPageControl;
aSheet.Align := alClient;
cxPageControl.ActivePage := aSheet;
//创建窗口
try
aForm := TFormClass(FindClass(ClassName)).Create(self) as TBaseForm;
aForm.Name := ClassName + 'Ex';
aForm.Parent := aSheet;
aForm.BorderStyle := bsNone;
aForm.Align := alClient;
aForm.Show;
if Caption='' then Caption:= aForm.Caption;
aSheet.Caption := Caption;
aSheet.Tag := THandle(aForm);
Application.ProcessMessages; //如果下面这句执行较慢,可加这一条先让画面显示出来
TBaseForm(aForm).Execute(Args); //创建时,传参并调用
Result := aSheet;
except
FreeAndNil(aForm);
FreeAndNil(aSheet);
Abort;
end;
end;

调用方法

procedure TFrmMain.Button1Click(Sender: TObject);
begin
//方式一, cxtabsheet的caption取TFrmQueryOrder的caption
OpenForm('TFrmQueryOrder');
//方式二, cxtabsheet的caption=订单查询
OpenForm('TFrmQueryOrder','订单查询');
//方式三, 传参并调用
OpenForm('TFrmQueryOrder','',['ORD1001',,DateStart, DateEnd]);
//方式四,直接调用某个窗体的方法
TFrmQueryOrder(OpenForm('TFrmQueryOrder').tag).ReFlashRecord;
end; //方式三的响应,在TFrmQueryOrder中实现父类方法
procedure Execute(const Args: array of Variant); override; procedure TFrmQueryOrder.Execute(const Args: array of Variant);
var
OrderNO:string;
Start,End:TdateTime;
order_type:integer;
begin
if Length(Args)> then
begin
OrderNO:=Args[]; //订单号
order_type:=Args[]; //订单类型
Start:=Args[]; //开始日期
End:=Args[]; //结果日期 ...........根据参数查询,略..........
end;
end;

 

Delphi cxpagecontrol融合窗体的更多相关文章

  1. Delphi中的窗体创建与销毁

    Delphi中的窗体,有模式窗体与非模式窗体两种.两种窗体的调用方式不同,模式窗体使用ShowModal显示,非模式窗体使用Show显示.当显示模式窗体的时候你是不能操作本程序的其他窗体的,你不能把焦 ...

  2. delphi SetWindowPos改变窗体位置和状态

    http://blog.163.com/yuanliaofan@126/blog/static/1730690722012534428814/ delphi SetWindowPos改变窗体位置和状态 ...

  3. [原创] Delphi 修改新建窗体时候的默认字体格式

    Delphi 修改新建窗体时候的默认字体格式 操作步骤: 1.运行输入“regedit” 2.找到目录(这里默认以Delphi 7为例) HKEY_CURRENT_USER\Software\Borl ...

  4. delphi判断MDI窗体的子窗体是否存在

    转]delphi判断MDI窗体的子窗体是否存在//*************************************************************************** ...

  5. Delphi MDI 子窗体的创建和销毁 [zhuan]

    1.如果要创建一个mdi child,先看是否有这个child 存在,如果有,则用它,如果没有再创建 //该函数判断MDI 子窗体是否存在,再进行创建和显示function isInclude(for ...

  6. delphi制作登陆窗体

    delphi登陆窗体的制作,就我知道的,可以有两种方法,一种是在工程文件中实现登陆窗体的动态调用,另一种就是在主窗体的OnCreate事件中动态创建登陆窗体,两种方法都需要将主窗体设置为Auto-cr ...

  7. Delphi 实现不规则窗体

    最近为了要兼容XP系统(守旧的市场),又需要做出产品的特效,不得不从头学习一下这门 “聪明的语言” . 开发环境: win10 Delphi 10.2 Version 25.0.26309.314 产 ...

  8. Delphi~通过程序窗体句柄获取程序路径

    http://www.cnblogs.com/Jesses/articles/1636323.html 引用PsAPI var  h:HWND;  pid: Cardinal;  pHandle: T ...

  9. Delphi 编写ActiveForm窗体工程知识和样例(开发浏览器客户端应用程序)(有详细步骤)

    一.基础知识介绍: 1.ActiveForm的基础知识介绍: 在Delphi中,ActiveForm是封装了Delphi Form的一种ActiveX控件.ActiveForm其实是一种标准的Delp ...

随机推荐

  1. ICEM—非结构化周期网格

    原视频下载地址:https://yunpan.cn/cPBnmsNheJ46q  访问密码 3441

  2. Flutter移动电商实战 --(32)列表页_小类高亮交互效果制作

    点击大类右侧的横向的小类红色显示当前的小类别 解决之前溢出的问题: 先解决一个bug,之前右侧的这里设置的高度是1000,但是有不同的虚拟机和手机设别的问题造成了溢出的问题 Expaned是有伸缩能力 ...

  3. CPU分几核几核的是什么意思?

    CPU的几核分类其实是按照CPU的地址总线数量来分类的 单核心的地址总线数量是8条 双核心就是16条 三核心就是24 依次类推,核心的多少,只需要知道地址总线的多少,然后除以8就得出来了 地址总线:地 ...

  4. exactly the kind of division of tasks that Gulp.js is built on

    The results are then passed to a reporter function that displays the results of the code analysis in ...

  5. 007-log-log4j2、slf4j+log4j2

    一.概述 而log4j2的性能无论在同步日志模式还是异步日志模式下都是最佳的. 根本原因在于log4j2使用了LMAX, 一个无锁的线程间通信库代替了, logback和log4j之前的队列. 并发性 ...

  6. 004-log-common-logging,Apache整合日志框架JCL门面框架、JCL+log4j

    一.概述 Jakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具.它提供给中间件/日志工具开发者一个 ...

  7. java使用jconsole查看java程序运行(jmx原理)

    在JVM启动参数上加上     java -Dcom.sun.management.jmxremote.port=8999     -Dcom.sun.management.jmxremote.aut ...

  8. linux简单命令7--管道符和通配符

    ”&&“和管道符“|”不一样. ---------------------------------------------------------通配符---------------- ...

  9. Vue打包文件放在服务器后,浏览器存在缓存问题

    每次打包更新版本发到服务器上,导致偶尔会出现不能即使更新最新代码,浏览器存在缓存的问题. 解决方法:找到webpack .prod.conf.js 1.定义版本变量: const  Version = ...

  10. double,float,BigDecimal类型数值的操作

    float四舍五入保留两位小数 /** * float四舍五入保留两位小数 * */ public static float formatDecimal(float n) { return (Math ...