如何用字符串动态创建窗体
var
  myform:tformclass;
  aform:tform;
begin
  myform:=TFormClass(TForm(Application.FindComponent('Form_Apply_Money_To_OA')));
  aform:=TForm(myform);
  aform:=myform.Create(nil);
  try
    aform.ShowModal;
  finally
    aform.Free;
end;
以上代码总是报错.....我想要实现的效果是用一个字符串动态地创建一个窗体,并把它showmodal出来.......

解决方案 »

  1.   

    请参照registerclass, findclass
      

  2.   

    我认为楼主的Application.FindComponent用法是错误的,因为FindComponent只能找到已实例化的对象,待创建的动态对象是找不到的,所以报错。
    如果要实现你的功能,我觉得可以这样:
    type
      FormNameRec=record
        Name:String;
        ClassName:tformclass;
      end;
    然后再用此结构体记录系统中的全部类名称与其名,再创建时在结构体数组中搜索后返回ClassName,然后再创建窗体对象
      

  3.   

    FindComponent 能找到,说明该窗体的实例存在着,还要创建什么?
      

  4.   

    楼上两位朋友说得对.....我在网上也找了一下资料,需要registerclass, findclass,但我觉得既然
    registerclass了,那还叫什么动态创建......请问到底该怎么做呢?
      

  5.   

    呵呵,我就是这样实现的,毕竟delphi也有自己的实际情况
    实际上,windows也是要注册类的,只不过大部分情况下,我们看不到这些代码,架构已经帮我们实现了,
    你想根据字串创建对象,当然要多作些东西了
    把你可能动态创建的类在类声明的单元里的initialization部分里全部注册一下就可以了
      

  6.   

    var
      frmclass: TFormClass;
      frm: TForm;
    begin
      frmclass := TFormClass(application.FindComponent('Form1').ClassType);
      frm := frmclass.Create(nil);
      frm.ShowModal;
      frm.Free;
      

  7.   

    application.FindComponent(‘Form_Apply_Money_To_OA')
    必须Form_Apply_Money_To_OA这个窗体已经创建了啊,直接用就是了myform:=TForm(Application.FindComponent('Form_Apply_Money_To_OA'));如果真的字符创创建窗体的话,我觉得还是1楼sonicer说的对啊,registerclass, findclass
      

  8.   

    没出现引用某个类的代码的话,链接器是不会把那个类的 rtti 和方法之类链接到程序里的,不然你看到的 vcl 程序不可能是现在的大小