功能说明:

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

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. JAVA基础知识|枚举

    将代码中经常使用的常量,放在枚举中,是一个很好的编码习惯.便于统一修改,同时也增强代码的严谨和稳定性.当然,枚举的应用有很多,这里我只做一个简单的演示,以后看到有趣的使用,会慢慢丰富 package ...

  2. ORM SQLAlchemy - 基本关系模式

    1 一对多 一个parent对多个child,一对多关系添加一个外键到child表,用于保存对应parent.id的值,引用parent.relationship()在parent中指定,引用/保存 ...

  3. 重读APUE(4)-fcntl和ioctl的区别

    fcntl(File Control)-文件控制 ioctl(In/Out Control)-I/O控制 1. fcntl作用于文件,提供对文件的基础控制:ioctl作用于文件和设备对象,一般用来向设 ...

  4. chip based learning

    chip types Transistor mode of operation Digital chip: 0/1  -> digital clac Analog chip: sound / b ...

  5. Resend a Request by fiddler

    Resend a Request You can resend a request directly from the Sessions List, or save requests to resen ...

  6. Flutter移动电商实战 --(17)首页_楼层区域的编写

    1.楼层标题组件 该组件非常简单,只接收一个图片地址,然后显示即可: class FloorTitle extends StatelessWidget { final String picture_a ...

  7. Redis | 一文轻松搞懂redis集群原理及搭建与使用

    转载:https://juejin.im/post/5ad54d76f265da23970759d3 作者:SnailClimb 这里总结一下redis集群的搭建以便日后所需同时也希望能对你有所帮助. ...

  8. Docker 版本的更新和安装

    涉及到网址:1.https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#prerequisites (官网)       ...

  9. 国内it论坛

    社区是聚集一类具有相同爱好或者相同行业的群体,IT技术社区就是聚集了IT行业内的技术人,在技术社区可以了解到行业的最新进展,学习最前沿的技术,认识有相同爱好的朋友,在一起学习和交流. 技术社区一般有三 ...

  10. Hibernate fetch相关

    fetch=FetchType.LAZY 时,spring boot jackson 返回数据时会出错. 可配置使用Hibernate4Module 帮助解决: @Configurationpubli ...