//代码一
program Project1;uses
Forms,
MainForm in 'MainForm.pas' {Form1},
MyClass_Unit in '..\MyClass_Unit.pas';{$R *.res}begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);///////////
Application.Run;
end.//代码二
program Project1;uses
Forms,
MainForm in 'MainForm.pas' {Form1},
MyClass_Unit in '..\MyClass_Unit.pas';{$R *.res}begin
Application.Initialize;
Form1 := TForm1.Create(Application);///////
Application.Run;
end.
//无效回答无分
program Project1;uses
Forms,
MainForm in 'MainForm.pas' {Form1},
MyClass_Unit in '..\MyClass_Unit.pas';{$R *.res}begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);///////////
Application.Run;
end.//代码二
program Project1;uses
Forms,
MainForm in 'MainForm.pas' {Form1},
MyClass_Unit in '..\MyClass_Unit.pas';{$R *.res}begin
Application.Initialize;
Form1 := TForm1.Create(Application);///////
Application.Run;
end.
//无效回答无分
代码1运行后显示form1
这段代码调用了TApplication类的CreateForm方法,这个方法的内部实现原理是:先调用NewInstance来为对象分配内存,再创建对象,然后判断如果Form1如果是应用程序的主窗体的话,就创建Form1的窗口句柄,然后显示出来。
而Form1 := TForm1.Create(Application);///////
就不一样了,它只是创建了Form1对象,此时Form1还没拥有句柄,不是一个有效的Win32窗口。
所以结果是:方法一显示出了Form1,而方法二没有效果,它只创建了Form1对象。
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
Instance: TComponent;
begin
Instance := TComponent(InstanceClass.NewInstance); //为对象分配内存等操作
TComponent(Reference) := Instance;
try
Instance.Create(Self); //创建窗口对像,此时无句柄
except
TComponent(Reference) := nil;
raise;
end;
if (FMainForm = nil) and (Instance is TForm) then //判断是否存在主窗口
begin
TForm(Instance).HandleNeeded; //创建主窗口句柄
FMainForm := TForm(Instance); //设置创建的对象为应用程序主窗口
end;
end;