我一个窗体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)来创建显式一个窗体.
==========================
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)来创建显式一个窗体.
TF := TForm2(FindClass('TForm2').Create('ad'));
TF: TForm2;
begin
TF := TForm2(FindClass('TForm2').NewInstance).Create('Test');
TF.Show;
end;
//一般这样转换是用在对象上,如: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;