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;

 

 

 

Delphi cxpagecontrol融合窗体

上一篇:Parallel Python——一个简易的分布式计算系统


下一篇:深入java并发Lock一