功能说明:

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

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;

 

 

 

posted on 2019-10-13 12:58  凌风的博客  阅读(1060)  评论(1编辑  收藏  举报