功能说明:

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

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. Spring基础环境搭建所需要的jar包

    红色标明的jar包.是spring框架开发的基础jar包. 必要jar包. spring-core-4.1.6.RELEASE.jar 框架核心jar包. spring-beans-4.1.6.REL ...

  2. linux系统rwx(421)、777权限详解

    摘要 linux的常见权限,mark一下 常用的linux文件权限如下: 444 r--r--r-- 600 rw------- 644 rw-r--r-- 666 rw-rw-rw- 700 rwx ...

  3. CentOS8安装Python3

    安装CentOS8 如果使用vmware player安装CentOS8,会出现如下选项 其中Software Selection默认为带有GUI版本,即安装完成之后,带有图形界面,我本人不太喜欢使用 ...

  4. 修改ssh端口

    centos7.5修改默认SSH端口 linux SSH默认端口是22,不修改的话存在一定的风险,要么是被人恶意扫描,要么会被人破解或者攻击,所以我们需要修改默认的SSH端口 1.修改22端口为620 ...

  5. C-LODOP的端口和网站的端口

    c-lodop的端口和网站的端口是不同的,不需要修改自己网站的端口.c-lodop32位标准版端口:8000,18000 (http网站)c-lodop32扩展版端口:8000,18000(http网 ...

  6. 1-18-2 LVM管理和ssm存储管理器使用&磁盘配额 (二)

    LVM管理和ssm存储管理器使用&磁盘配额  (二) 内容如下: ü  LVM快照 ü  ssm存储管理器的使用 ü  磁盘配额 第1章 LVM快照 lvm快照:为了保持系统的一致性,我们先做 ...

  7. jmeter解决乱码

    在jmeter.properties 这个文件里面 找到sampleresult.default.encoding=xx 后面xx改成utf-8,然后取消注释 解决jmeterbody里面中文显示不出 ...

  8. wp-query调用前几篇文章的方法

    ---恢复内容开始--- 利用强大的wp-query函数调用指定分类下的前几篇文章,下面的代码表示调用的是分类ID4下的前两篇文章. <?php $cunt_wenzhen = array('c ...

  9. EMC DS300B光纤交换机扩展光口license

    一.通过EMC指定的网站激活license 激活license,生成激活码需要三个信息: 1.交换机WWN号:可在交换机铭牌上查看:(16位) 2.SN号码:AQA00***9*6(11位) 3.ke ...

  10. Lua实现简单的类,继承,多态 实例

    -- 类的例子,长方形的类,具备一个打印面积方法和一个设置长宽的方法 --lua实现类的思路,定义出来的对象在lua中可以访问自己有的成员,访问成员函数实际上是通过元表的__index方法实现的,具体 ...