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

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.


//无效回答无分
...全文
144 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
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

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧