功能说明:
一、在需要融合的每个窗体加一句
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 := 0 to cxPageControl.PageCount - 1 do begin if cxPageControl.Pages[I].Name = 'TabSheet_' + ClassName then begin cxPageControl.Pages[I].Show;//或者 cxPageControl.ActivePageIndex:=i; //如果有传参数,则调用Execute if Length(Args)>0 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',3,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)>0 then begin OrderNO:=Args[0]; //订单号 order_type:=Args[1]; //订单类型 Start:=Args[2]; //开始日期 End:=Args[3]; //结果日期 ...........根据参数查询,略.......... end; end;