procedure TForm1.Button1Click(Sender: TObject);
var
  fRm:TForm;// Form2: TForm2;
begin
  frm:=(self.FindComponent('Form2') as TForm).Create(application);
  try
    frm.ShowModal;
  finally
    frm.Free;
  end;
end;如上方法老是报错,
望高手指点一下
谢谢

解决方案 »

  1.   

    http://www.delphibbs.com/keylife/iblog_show.asp?xid=343KeyLife富翁笔记  
    作者: 轻舞肥羊
    标题: 根据类名(字符串)建立类实例 
    关键字: RTTI 
    分类: 开发技巧 
    密级: 公开 
    (评分: , 回复: 2, 阅读: 752) »» 
    有时候需要根据类名来建立类的实例,比如把类名存于数据库,然后在程序中根据数据库中的
    内容建立不同的窗体,下面的例子可以实现这个需求.unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Controls, StdCtrls,Forms;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      public
        procedure CreateForm(AClassName:string);
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      //调用建立本身
      CreateForm('TForm1');
    end;procedure TForm1.CreateForm(AClassName: string);
    //如果查找到类类型(有的书叫类引用),则建立实例
    begin
      if GetClass(AClassName)<>nil then
        TFormClass(FindClass(AClassName)).Create(self).Show;
    end;////下面的代码注册窗体类,你要注册才能用FindClass找到(以前记得好象不用注册?)
    initialization
      RegisterClass(TForm1);end. 2003-5-12 1:45:00    
    修改笔记  发表评语&raquo;&raquo;&raquo;      2003-10-28 14:26:18    GetClass与FindClass的区别GetClass不会引发错误,如果没有找到类,它会返回nil
    FindClass如果找不到类,它会引发一个错误  
     2003-10-28 15:46:31    可以注册并在运行期生成非窗体类,条件是该类必须TPersistentClass的子类
      

  2.   

    你的條件是知道窗體的名字,那麼該窗體句柄必然存在!所以不知道你為什麼還要創建!?
        for I := 0 to self.components.Count - 1 do
        begin
          if components[i] is TForm  then
             if sametext(Tform(components[i]).name, 'form2') then
                begin
                  frm := TForm.create(application);
                  frm.showmodal;
                end;
      

  3.   

    ysai(所有真的都是假的真,所有假的都是真的假)
    的方法应该是目前最好的办法,我就是这么用的提请加精