请问这两段“项目文件代码”所导致的差异?

largewang 2004-06-18 04:54:37
//代码一
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.


//无效回答无分
...全文
100 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
EventLog 2004-07-05
用google搜 avi素材。
  • 打赏
  • 举报
回复
CsdnRob 2004-07-01
用google搜 avi素材。
  • 打赏
  • 举报
回复
largewang 2004-06-21
本人提问不慎,Sorry!
  • 打赏
  • 举报
回复
juliens 2004-06-21
另外补充一句,从TWinControl继承下来的可视化类,在Create之后并没有给它分配窗口句柄,只有在创建后第一次使用它时才分配句柄。(也即在需要Handle属性时)。
  • 打赏
  • 举报
回复
juliens 2004-06-21
分析一下Application.CreateForm的源代码:
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;
  • 打赏
  • 举报
回复
juliens 2004-06-21
Application.CreateForm(TForm1, Form1);///////////
这段代码调用了TApplication类的CreateForm方法,这个方法的内部实现原理是:先调用NewInstance来为对象分配内存,再创建对象,然后判断如果Form1如果是应用程序的主窗体的话,就创建Form1的窗口句柄,然后显示出来。
而Form1 := TForm1.Create(Application);///////
就不一样了,它只是创建了Form1对象,此时Form1还没拥有句柄,不是一个有效的Win32窗口。
所以结果是:方法一显示出了Form1,而方法二没有效果,它只创建了Form1对象。
  • 打赏
  • 举报
回复
chwdong 2004-06-21
代码二只运行了form1.create事件,因为没有窗体显示,运行后程序结束!


代码1运行后显示form1
  • 打赏
  • 举报
回复
相关推荐
发帖
Delphi
加入

5096

社区成员

Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
申请成为版主
帖子事件
创建了帖子
2004-06-18 04:54
社区公告
暂无公告