zoukankan      html  css  js  c++  java
  • 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;

     

  • 相关阅读:
    Android中Context样式分析
    Android组件化实践
    插着USB mic开机时,系统没有声音问题
    Android7.1 解决ttyUSB串口节点不固定问题
    android中设置里面版本号的显示
    android7.1添加开机启动服务被selinux禁用问题
    Settings中删除一些默认的选项
    es8323codec调节录播音量大小
    user版本串口不能输入
    高新兴GM510模块调试
  • 原文地址:https://www.cnblogs.com/dreamszx/p/11666020.html
Copyright © 2011-2022 走看看