我一个窗体form2,重载了create 过程。并把其类做了初始化注册。另外一个窗体中放一个button 。在button 下想以一种通用的方式来创建显法form2 ,但却报错。代码如下。
==========================
unit Unit2;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;type
  TForm2 = class(TForm)
  private
    { Private declarations }
  public
     constructor Create(STR1:STRING);
  end;var
  Form2: TForm2;implementation{$R *.dfm}constructor TForm2.Create(STR1: STRING);
begin
  inherited create(application);
  //
end;initialization
  RegisterClass(TForm2);
finalization
  UnregisterClass(TForm2);
end.==============================
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;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  tf :tform2;
begin
  //tf := TForm2(FindClass('TForm2')).Create('ad');//以下这方式调用报内存地址错误。
  tf := TForm2.Create('S'); //这种方式调用不会报错
  tf.Show;
end;end.请问,为何用类型转换后会报错。findcalss 是不是不能这样用。
如果要实施,通过传入一个字符串(如上述中的tform2)来创建显式一个窗体.

解决方案 »

  1.   

    //tf := TForm2(FindClass('TForm2')).Create('ad');改成下面这样
    TF := TForm2(FindClass('TForm2').Create('ad'));
      

  2.   

    var
      TF: TForm2;
    begin
      TF := TForm2(FindClass('TForm2').NewInstance).Create('Test');
      TF.Show;
    end;
      

  3.   

    FindClass()返回的是类类型
    //一般这样转换是用在对象上,如:TForm2(Sender).Caption := '';type
      TForm2Class = class of TForm2;procedure TForm1.Button1Click(Sender: TObject);
    var
      tf: TForm2;
    begin
      tf := TForm2Class(FindClass('TForm2')).Create('ad');
      tf.Show;
    end;