窗体的构造函数和OnCreate事件
窗体的构造函数和创建事件和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事件的更多相关文章
- 界面主窗体,子窗体的InitializeComponent(构造函数)、Load事件执行顺序
主窗体,子窗体的InitializeComponent(构造函数).Load事件执行顺序1.执行主窗体定义事件 new函数时,同时执行主窗体构造函数,默认就一个InitializeComponent函 ...
- winform修改、打开窗体、构造函数传值
制作登录窗体: 制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体 直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false Form ...
- Winform 主窗体更换 构造函数传值
制作登录窗体: 制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体 直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false Form ...
- winform打开唯一窗体、构造函数传值
制作登入窗体: 制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体 直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false Form ...
- 桌面窗体应用程序,FormClosing事件
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { //主窗体关闭时,弹出对话框.判断对话框的返回值(即用户 ...
- Windows 窗体启动和关闭的事件顺序
本文系转载学习. 对于关注对 Windows 窗体应用程序中引发的每个事件按次序进行处理的开发人员来说,事件引发的顺序特别重要.当某种情况需要小心处理事件时(如重绘窗体的某些部分时),必须知道事件在运 ...
- C#winform窗体用户控件自定义事件
C#许多事情都和事件有关系,大部分的事情我们可以通过C#自己的事件来完成,但如果我们自己新建了一个自定义控件,我们该如何定义自己想要的事件呢?下面我就来为大家粗略的讲解一番. 假设我们自定义了一个控件 ...
- .NET(C#) win Form窗体的常用属性以及事件
使用.Net编写Windows程序,对于窗体控制常见项目 属性:1.让窗体在启动时在指定位置出现 form1.StartPosition Manual CenterScreen WindowsDefa ...
- FineUI表格、窗体、按钮组及事件
//表格 @(F.Grid().IsFluid(true).CssClass("blockpanel").Title("表格").ShowHeader(true ...
随机推荐
- 学习Kali Linux必须知道的几点
Kali Linux 在渗透测试和白帽子方面是业界领先的 Linux 发行版.默认情况下,该发行版附带了大量入侵和渗透的工具和软件,并且在全世界都得到了广泛认可.即使在那些甚至可能不知道 Linux ...
- PAT B1048 数字加密 (20 分)
本题要求实现一种数字加密方法.首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 ...
- Drupal性能优化:蜜蜂培训性能优化一
大家一直都说Drupal的性能不怎么样,跑起来慢,即使不是在用户量大的时候,最近公司的蜜蜂培训产品在一个客户的使用过程中,由于用户量及数据量的激增,就遇到了比较大的性能问题,这篇文章就记录了整个优化过 ...
- 【html】前端实现筛选条件跳转
之前与PHP的合作模式之一是前端这边负责写好静态页面交货. 那现在新进的公司,PHP说筛选由前端来实现. 嗯,好吧.实现就实现,多锻炼下咯. <div class="fliter&qu ...
- 20155338课程设计个人报告——基于ARM实验箱的Android交友软件的设计与实现
课程设计个人报告--基于ARM实验箱的Android交友软件的设计与实现 个人贡献 实验环境的搭建 代码调试 在电脑上成功运行 研究程序代码撰写小组报告 一.实验环境 1.Eclipse软件开发环境: ...
- EAS_BI(扩展报表)
case when 的使用 1. 扩展报表,一张收费单据中,下面分为分录 问题描述: 收费单中有一个分录用于记录检测的项目名称以及标准费用.收费单有自己的主键,分录中的外键即是收费单的主键,然后分录表 ...
- python3获取指定目录内容的详细信息
不同平台获取指定目录内容的详细信息命令各不相同: Linux中可以通过ls -al获取获取 windows中可以通过dir命令获取 下面是我写的一个通用获取目录内容详细信息的python3脚本: #! ...
- .Net Core WebApi控制器接收原始请求正文内容
主要目标 在Asp.net Core控制器中,通过自定义格式化程序来映射自定义处理控制器中的“未知”内容. 简单案例 为了演示这个问题,我们用VS2017创建一个默认的Asp.net Core Web ...
- NetBeans的(默认)快捷键
NetBeans的(默认)快捷键 1.完成代码:ctrl+\ //任何地方按下此组合键,均会提示相应的参考字段: 2.错误提示:alt + enter //顾名思义,当系统报错时,按下此组合可以查看 ...
- .Net Core 分布式微服务框架介绍 - Jimu
系列文章 .Net Core 分布式微服务框架介绍 - Jimu .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持 一.前言 近些年一直浸淫在 .Net 平台做企业应用开 ...