窗体的构造函数和OnCreate事件

博客介绍了窗体的构造函数、创建事件与OldCreateOrder属性的关系。当窗体继承自TForm,OldCreateOrder为False和True时,构造函数和创建事件执行顺序不同。OnCreate在TCustomForm的Create和AfterConstructor函数中被调用。若窗口继承已存在窗口类,无论怎么设置,执行顺序固定,OldCreateOrder总为True。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

窗体的构造函数和创建事件和OldCreateOrder属性有很大的关系。

情况1

如果窗体继承自TForm,且有如下形式:

1. constructor TForm1.Create(AOwner: TComponent);

2. begin

3. inherited;

4. Button1.Caption := '1';

5. end;

6.

7. procedure TForm1.FormCreate(Sender: TObject);

8. begin

9. Button1.Caption := '2';

10. end;

此时,设Tform1OldCreateOrder(默认就是为False)属性为False,则执行顺序是349行。

如果设OldCreateOrderTrue,则执行顺序为394,即先执行inherited然后执行Button1.Caption := '2'再执行Button1.Caption := '1'

看帮助,解释是如果OldCreateOrderFalse,则OnCreate将在所有构造函数执行完之后才执行。如果OldCreateOrderTrue,则OnCreateTCustomForm的构造函数执行完就执行。

这样就很容易理解上面的执行顺序了,OldCreateOrderTrue时,执行到第3行时,便会调用TCustomFormCreate函数,该函数执行完后就调用OnCreate了,当然也就执行了第9行,最后才回来执行第4行。而OldCreateOrderFalse时则等所有构造函数执行才调用onCreate事件。

为什么有这样的行为呢,还是看源代码:

事实上OnCreate会在两处地方被调用,一是TCustomFormCreate函数,一是AfterConstructor函数。

TCustomFormCreate函数中,是这样的:

if OldCreateOrder then DoCreate;

AfterConstruction函数中,是这样的:

if not OldCreateOrder then DoCreate;

这样就一清二楚了,同时也了解了AfterConstruction的执行时机,即所有的构造函数执行完毕后才由编译器调用。

情况2

如果窗口继承自一个已经存在的窗口类比如TForm1,同时有像下面这样的代码:

1. constructor TForm2.Create(AOwner: TComponent);

2. begin

3. inherited;

4. Button1.Caption := '1';

5. end;

6.

7. procedure TForm2.FormCreate(Sender: TObject);

8. begin

9. Button1.Caption := '2';

10. end;

无论怎么设OldCreateOrder,都只是执行394原因就是最后OldCreateOrder都是等于True。为什么会一直等于True呢,找不出原因,大概是读取窗体资源文件时作了些什么处理吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值