窗体的构造函数和创建事件和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;

此时,设Tform1的OldCreateOrder(默认就是为False)属性为False,则执行顺序是3-4-9行。

如果设OldCreateOrder为True,则执行顺序为3-9-4,即先执行inherited然后执行Button1.Caption := '2'再执行Button1.Caption := '1'。

看帮助,解释是如果OldCreateOrder为False,则OnCreate将在所有构造函数执行完之后才执行。如果OldCreateOrder为True,则OnCreate在TCustomForm的构造函数执行完就执行。

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

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

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

在TCustomForm的Create函数中,是这样的:

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,都只是执行3-9-4,原因就是最后OldCreateOrder都是等于True。为什么会一直等于True呢,找不出原因,大概是读取窗体资源文件时作了些什么处理吧。

---------------------
如果OldCreateOrder为False,则OnCreate将在所有构造函数执行完之后才执行。如果OldCreateOrder为True,则OnCreate在TCustomForm的构造函数执行完就执行。

窗体的构造函数和OnCreate事件的更多相关文章

  1. 界面主窗体,子窗体的InitializeComponent(构造函数)、Load事件执行顺序

    主窗体,子窗体的InitializeComponent(构造函数).Load事件执行顺序1.执行主窗体定义事件 new函数时,同时执行主窗体构造函数,默认就一个InitializeComponent函 ...

  2. winform修改、打开窗体、构造函数传值

    制作登录窗体: 制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体 直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false Form ...

  3. Winform 主窗体更换 构造函数传值

    制作登录窗体: 制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体 直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false Form ...

  4. winform打开唯一窗体、构造函数传值

    制作登入窗体: 制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体 直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false Form ...

  5. 桌面窗体应用程序,FormClosing事件

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) { //主窗体关闭时,弹出对话框.判断对话框的返回值(即用户 ...

  6. Windows 窗体启动和关闭的事件顺序

    本文系转载学习. 对于关注对 Windows 窗体应用程序中引发的每个事件按次序进行处理的开发人员来说,事件引发的顺序特别重要.当某种情况需要小心处理事件时(如重绘窗体的某些部分时),必须知道事件在运 ...

  7. C#winform窗体用户控件自定义事件

    C#许多事情都和事件有关系,大部分的事情我们可以通过C#自己的事件来完成,但如果我们自己新建了一个自定义控件,我们该如何定义自己想要的事件呢?下面我就来为大家粗略的讲解一番. 假设我们自定义了一个控件 ...

  8. .NET(C#) win Form窗体的常用属性以及事件

    使用.Net编写Windows程序,对于窗体控制常见项目 属性:1.让窗体在启动时在指定位置出现 form1.StartPosition Manual CenterScreen WindowsDefa ...

  9. FineUI表格、窗体、按钮组及事件

    //表格 @(F.Grid().IsFluid(true).CssClass("blockpanel").Title("表格").ShowHeader(true ...

随机推荐

  1. python变量的引用,浅拷贝

    python的变量是对象引用 l1和l2引用的相同的对象,所以会相互影响 元组不变的是引用的物理地址,如果引用的对象是可变的,那么远祖也会发生变化 但是t1[2]的id时钟没有发生变化 2 默认是浅拷 ...

  2. PAT A1007 Maximum Subsequence Sum (25 分)——最大子列和,动态规划

    Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A continuous subsequence is defined to ...

  3. HTTP请求header信息讲解

    HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息.这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成.HTTP的头域包括通用头,请求头,响应头和 ...

  4. Java中splite的用法与小技巧

    在java.lang包中也有String.split()方法,与.net的类似,都是返回是一个字符型数组,但使用过程中还有一些小技巧.如执行:"2|33|4".split(&quo ...

  5. defaultdict - update - pymysql

    defaultdict 的例子 使用list作为default_factory,他很容易的将一个以键值形式表现的序列分组成一个字典列表 >>> s = [('yellow', 1), ...

  6. 多模匹配算法之Aho-Corasick

    除剔除那些含有敏感词的文本,由于有大量的敏感词,所以通过简单的正则表达式和字符串查找的方式效率太低,每次都有遍历一次字符串.而AC算法的核心思想就是避免不必要的回溯使搜索一直沿着向前的方向,最大可能的 ...

  7. 【小程序】  的识别

    给标签添加   decode="{{true}}" space="{{true}}"  属性 eg: <text decode="{{true} ...

  8. CODE[VS] 1159 最大全0子矩阵

    写一道CODEVS的题目 其实我还是很喜欢CODEVS的界面的 主要是系统地学习一下悬线法这个看似十分简单,实际就是十分简单的算法 对于一些详细的东西参考dalao's blog,不喜勿喷 对于悬线法 ...

  9. 4.Xilinx RapidIO核详解

    转自https://www.cnblogs.com/liujinggang/p/10072115.html 一.RapidIO核概述 RapidIO核的设计标准来源于RapidIO Interconn ...

  10. 蓝牙inquiry流程之Advertising Report

    setting 界面开始搜索的时候,通常也会同时进行le scan,这一点在inquiry流程之命令下发中已经讲述.此篇文章主要是分析一下对于controller 搜索到的广播包的处理.这里以Andr ...