代码如下:问题是当我没有创建Form2时此代码会产生错误
procedure TForm1.Button1Click(Sender: TObject);
var
  objfor :TForm;
begin
    objfor := TForm(Application.FindComponent('Form2'));    
    objfor.Show;
end;
我的目的是实现如下代码
procedure TForm1.Button1Click(Sender: TObject);
var
  objfor :TForm;
begin
    objfor := TForm(Application.FindComponent(inputbox('输入Form窗体名称','窗口名称:','Form2')));
    if objfor = nil then//如果找不到或者窗口没有创建就创建对应类的窗口
    begin
      objfor:=T《这里我如何替换》.Create(Application);
    end;
    objfor.Show;
end;
我的意识是让用户自己输入自己需要打开的窗口名称该怎样实现。

解决方案 »

  1.   

    initialization 
      ... 
      RegisterClass(TForm2);   
      RegisterClass(TForm3); 
      ... 
    finalization 
      ... 
      UnRegisterClass(TForm2); 
      UnRegisterClass(TForm3); 
      ... function TMainForm.FindForm(FormName,FormCaption: string): TForm; 
    var 
     FindForm:TForm; 
     FindFormClass:TFormClass; 
     classname:string;//窗体类名 
    begin 
     FindForm:=tform(FormName); 
     classname:='T'+formname; 
     FindFormClass:=TFormClass(Findclass(classname)); 
     if FindFormClass<>nil then 
     begin 
       application.Createform(FindFormClass,FindForm); 
       FindForm.Caption:=FormCaption; 
       result:=FindForm; 
     end; 
    end;   
    先注册VCL原生组件,使用RTTI技术就能通过字符串动态创建控件。
      

  2.   

    我在多文档应用程序,好像不行,说找不到TForm2类,不是多文当时可以的。
      

  3.   

    看一下是这个意思吗:http://community.csdn.net/Expert/topic/5546/5546004.xml?temp=.7233087
      

  4.   

    楼上说的是我要所要的功能,但在多文档就是不能实现。
    只要调用FindClass/GetClass就会出错。不是多文档是可以的。
      

  5.   

    最总还是能够解决了
    代码如下
    initialization
      RegisterClass( TMDIChild );
      //或者 RegisterClasses( [TMDIChild] );
    finalization
      UnRegisterClass( TMDIChild );
      //或者 UnRegisterClasses( [TMDIChild] );function ClassFactoryForTWinControl(
      AnyTWinControlClass: String;
      AOWner: TComponent) :TWinControl;
    var
     FindClass: TPersistentClass;
    begin
        FindClass := GetClass(AnyTWinControlClass);
        if (FindClass <> nil) and FindClass.InheritsFrom(TWinControl) then
          Result := TWinControlClass(FindClass).Create(AOwner)
        else
          Result := nil
    end;procedure TMainForm.Button1Click(Sender: TObject);
    var
      obj:TWinControl;
    begin
      obj := ClassFactoryForTWinControl('TMDIChild',Application);
      if obj = nil then Exit;
      with obj do
      begin
        showMessage(Name);
        //Width := 100;
        //Height := 100;
        //Left := 10;
        Show;
      end
    end;