• Delphi cxpagecontrol融合窗体


    功能说明:

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

    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;

     

  • 相关阅读:
    《Linux内核设计与实现》读书笔记 第十八章 调试
    《Linux内核设计与实现》读书笔记 第五章 系统调用
    [题解] LuoguP5488 差分与前缀和
    [题解] LuoguP4655 [CEOI2017]Building Bridges
    [题解] Tenka1 Programmer Contest 2019 E
    [题解] LuoguP4284 [SHOI2014]概率充电器
    长链剖分学习笔记
    [题解] LuoguP4292 [WC2010]重建计划
    [题解] LuoguP6197 [EER1]礼物
    [题解] LuoguP3980 [NOI2008]志愿者招募
  • 原文地址:https://www.cnblogs.com/dreamszx/p/11666020.html
Copyright © 2020-2023  润新知