提供Form的名称的字符串,有没有好的办法能够取得该窗口的实例?
比如:我有2个窗口Form2,From3var
  F: TForm;
begin  F := getFormInstance('Form2');
  F.ShowModal;
  F.Free;  F := getFormInstance('Form3');
  F.ShowModal;
  F.Free;
end;那么取得Form实例可以这么写
Function getFormInstance(FormName: String): TForm;
begin
      if FormName='Form2' then
         Result := TFrom2.Create 
      else if FormName='Form3' then
         Result := TFrom3.Create ;
end;
上面的方式虽然可以,但如果有100个Form就要写100个if ,有没有其他方便的方法可以
根据Form的名字取得实例

解决方案 »

  1.   

    给你写了一个例子,下面是主窗体的代码,程序中例如还有其他两个窗体,分别是form2,以及form3,那么首先注册,然后用我下面的CreateClass的代码,记得,使用之前一定要有注册代码,就是下面例子中的
    initialization
       //注册,我做的例子中只有form2,form3两个辅助窗体,如果你还有其他的,使用的时候记得都要注册
       RegisterClasses([TForm2,TForm3]);unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses Unit2, Unit3;{$R *.dfm}procedure CreateClass(const AClassName : string);
    var
      tm : TForm;
      t : TFormClass;
    begin
       t := TFormClass(FindClass(AClassName));
       tm := t.Create(nil);
       try
         tm.ShowModal;
       finally
         tm.Free;
       end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
       CreateClass('TForm3');
    end;initialization
       //注册类
       RegisterClasses([TForm2,TForm3]);end.
      

  2.   

    深奥`~~~
     能解释下
     CreateClass这个不用定义么?
    initialization
    RegisterClasses
    两个什么意思?
      

  3.   

    谢谢wudi_1982兄.
    给xk2y解释下
    RegisterClasses在Classes单元,具体意思看源码就了解了,
      CreateClass这个不用定义么?这个不明白你到底想问什么,我估计你是不是奇怪这个函数
    为什么没有在Private和Public里提前定义,在这个实例程序中不需要定义,这是因为在
    CreateClass方法中没有引用 TForm1 类里的任何元素,因此不需要提前定义.