//窗体继承了一个模块窗体,模块窗体自己写的一个自动保存从体内表格的宽度等信息,只需要在设计期的时候新建窗体
里将TgysForm = class(TForm)改为 TgysForm = class(TfrmMBForm)就可以了,现在想将这种固定的打开窗体方式改写成一个通用函数,每个新建的窗体都会将class(TForm)改为class(TfrmMBForm),
gysForm: TgysForm;
手动创建窗体的方法:
procedure TfrmMain.N13Click(Sender: TObject);
begin
if not Assigned(gysform) then
        begin
            try
                gysform := Tgysform.Create(application);
                gysform.ShowModal;
            finally
                freeAndNil(gysform);
            end;
        end;
end;
希望可以改写成一个通用的函数,只需要将要创建的窗体传入到函数里面调用一下即可打开窗体。

解决方案 »

  1.   

    我也没看明白,不过你上面的代码有问题
    procedure TfrmMain.N13Click(Sender: TObject);
    begin
      if not Assigned(gysform) then
      begin
        try
          gysform := Tgysform.Create(application);  //这个地方请改成gysform := Tgysform.Create(nil);
          gysform.ShowModal;
        finally
          freeAndNil(gysform);
        end;
      end;
    end;
    如果你指定的owner为application,就不要手动释放了
      

  2.   

    3楼说的不对,楼主的确没有错误,即使不需要手动释放,FreeAndNil也不会怎样,还能保证它安全
      

  3.   

    给一段你参考一下
    unit1
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        btn1: TButton;
        procedure btn1Click(Sender: TObject);
      private
        { Private declarations }
        procedure ShowForm(str:string);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    {$R *.dfm}procedure TForm1.ShowForm(str:string);
    var
      frmName:TForm;
    begin
      if GetClass(str) <> nil   then
      begin
       frmName:=TFormClass(FindClass(str)).Create(self);
       frmName.ShowModal;
      end;
    end;procedure TForm1.btn1Click(Sender: TObject);
    var
      str1: string;
    begin
      str1:= 'TfrmTest';
      ShowForm(str1);
    end;end.unit2
    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TfrmTest = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      frmTest: TfrmTest;implementation{$R *.dfm}
    Initialization
        RegisterClass(TfrmTest);  //这个地方很重要
    Finalization
        UnRegisterClass(TfrmTest);
    end.
      

  4.   

    这是一个在主界面打开窗体的方法,点击后就只会打开一个窗口,不知道这个楼上的可以帮忙实现一下吗?        
    if not Assigned(gysform) then
            begin
                gysform := Tgysform.Create(application);
                gysform.FormStyle := fsMDIChild;
                gysform.Show;
            end else gysform.BringToFront;
      

  5.   

    procedure CreateForm(var vForm:TForm; Const pForm:TFormclass);
    begin
      if not AsSigned(vForm) then
         vForm:=pForm.Create(Application);
      else
         vForm.BringToFront;
    end;调用:
    CreateForm(TForm(Form1),TForm1);
    CreateForm(TForm(Form2),TForm2);
    ...
      

  6.   

    错了个地方,else前面多了个分号,去掉
      

  7.   

    procedure aaa(gysform:tform);
    begin
    if not Assigned(gysform) then
      begin
      try
      gysform := Tgysform.Create(application);
      gysform.ShowModal;
      finally
      freeAndNil(gysform);
      end;
      end;
    end;
      

  8.   

    真的是厉害,这个问题困扰了很久一直不能解决,感谢楼上成功解决了这个问题。
    下面是一点点的完善的代码,贴出来给各位看看
    procedure TfrmMain.CreateForm(var vForm:TForm; Const pForm:TFormclass);
    begin
      if not AsSigned(vForm) then
         begin
         vForm:=pForm.Create(Application);
         vForm.FormStyle := fsMDIChild;
         vForm.Show;
         end else
         vForm.BringToFront;
    end;
      

  9.   

    在一个软件项目里面会有很多的子窗口和一个主窗口,打开子窗口的时候加载到主窗口里面,电脑上面只有一个窗体,子窗口不会单独显示一个窗口出来,一般只用gysform.Show;时没执行一次就会打一个相同的子窗口。