如何通过窗体的类名动态地创建窗体。不用以下的类似方法(因为不够灵活):
......
var
  frm1:tform1;
begin
  frm:=tform1.create(self);
  frm.showmodal;
  frm.free;
  frm:=nil;
......  我要达到的目的是,通过传入一个字符串参数(记录Form类名),创建相应的窗体。

解决方案 »

  1.   

    讨论过,已经知道一个类名,怎么才能创建一个实列。一个偶然的机会发现很好做。
    用Tform来做个试验吧。
       1、新建工程,主form为form1,保存为unit1,添加一个form2,保存为unit2。
       2、 在unit2中TForm2 = class(TForm)前面加上 
              TmyForm = class of Tform2;//相当于给Tform2加上一个别名
       3、 在form1的FormCreate中写入RegisterClasses([TForm2]);//注册Tform2类
       4、 在form1的button的单击事件中加入
             var 
                  A : Tform ;
             begin
               if GetClass('TForm2') =nil then exit ;
               a := TMyform(GetClass('TForm2')).Create(nil);
               a.show;
             end;
            搞定!
      

  2.   

    procedure CreateMyForm(FormClass: TFormClass);
    var
      Form: TForm;
    begin
      Form := FormClass.Create(Application);
      try
        Form.ShowModal;
      finally
        Form.Free;
      end;
    end;调用
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      CreateMyForm(TForm1);//tform1可以换成任意从TForm派生的类,如TForm3
    end;