zoukankan      html  css  js  c++  java
  • Delphi中initialization和finalization

    好了,进入正题,首先说明initialization 和 finalization 在代码单元中的位置:

    ************************************************************

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    unit Unit1; 
    interface
     
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs;
     
    type
    TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
    private
        { Private declarations }
    public
        { Public declarations }
    end;
     
    var
    Form1: TForm1;
     
    implementation
     
    uses Unit2;
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    ShowMessage('1 FormCreate');
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    ShowMessage('1 Destroy');
    end;
     
    initialization
    ShowMessage('1 ini');{单元初始化代码}
    finalization
    ShowMessage('1 final');{单元退出时的代码}
     
    end.

    ************************************************************

    initialization —— 在单元中放在文件结尾前,包含用来初始化单元的代码,它在主程序运行前运行并且只运行一次。

    finalization —— 在单元中放在 initialization 和 end. 之间,包含了单元退出时的代码。在程序退出时运行并且只运行一次。

    OnClose —— 在点击关闭按钮或执行该事件时调用。

    OnCreate —— 在窗体创建时调用。(我的感觉:该事件是在窗体创建之后,即执行构造函数后才执行的)

    OnDestroy —— 在窗体销毁时调用,一般用来销毁程序员自己定义(自己定义、创建,而不是直接从控件板拖拉过来的控件)的对象、变量、指针等等。(与析构函数的关系我还没弄清)

    下面是执行顺序(如果程序中没有 initialization、 OnCreate、 OnClose、 OnDestroy、 finalization 中的任何一项,则相应跳过即可):

    程序启动 --> 执行 initialization 处的代码 --> 执行窗体的构造函数并创建相应窗体和单元中的对象(如拖拉的控件对象,全局变量等) --> 执行 OnCreate 事件 --> 程序运行 --> 关闭主窗体(此处指调用主窗体的Close或点击主窗体的关闭按钮) --> 执行 OnClose 事件 --> 执行 OnDestroy 事件 --> 执行 finalization 处的代码

    以上是对于单个窗体而言,下面是对于多个窗体:

    新建一工程,创建3个Form,分别是form1、form2、form3,默认情况下form1为主窗体。

    <1 begin>

    程序启动 --> 执行 initialization 处的代码(先 form1 然后 form2 最后 form3 ) --> 执行窗体的构造函数并创建相应窗体和单元中的对象(如拖拉的控件对象,全局变量等) --> 执行 OnCreate 事件(先 form1 然后 form2 最后 form3 ) --> 程序运行 --> 关闭主窗体(此处指调用主窗体的Close或点击主窗体的关闭按钮) --> 执行主窗体的 OnClose 事件 --> 执行 OnDestroy 事件(先 form3 然后 form2 最后 form1 ,注意哟,顺序倒过来了。) --> 执行 finalization 处的代码(先 form3 然后 form2 最后 form1 ,注意哟,顺序倒过来了。)

    <1 end>

    为什么 OnDestroy 和 OnCreate 的顺序相反?为什么 finalization和 initialization 的顺序相反?大家好好想想吧!

    另外:如果我在form1中uses 一下Unit2(form2的代码单元)执行顺序如下:

    <2 begin>

    程序启动 --> 执行 initialization 处的代码(先 form2 然后 form1 最后 form3 ) --> 执行窗体的构造函数并创建相应窗体和单元中的对象(如拖拉的控件对象,全局变量等) --> 执行 OnCreate 事件(先 form1 然后 form2 最后 form3 ) --> 程序运行 --> 关闭主窗体(此处指调用主窗体的Close或点击主窗体的关闭按钮) --> 执行主窗体的 OnClose 事件 --> 执行 OnDestroy 事件(先 form3 然后 form1 最后 form2 ,注意注意,不一样了。) --> 执行 finalization 处的代码(先 form3 然后 form1 最后 form2 ,注意注意,不一样了。)

    <2 end>

    多个窗体(单元)一些细节性的东西:

    1)initialization

    initialization 的执行顺序取决于哪个窗体先被调用,对于<1>,由于3个窗体之间没有 uses 和被 uses 的关系,所以按照工程单元uses 中的顺序执行(在工程单元中,如下):

    ************************************************************

    program Project1;

    uses

    Forms,

    Unit1 in 'Unit1.pas' {Form1},

    Unit2 in 'Unit2.pas' {Form2},

    Unit3 in 'Unit3.pas' {Form3};

    {$R *.res}

    begin

    Application.Initialize;

    Application.CreateForm(TForm1, Form1);

    Application.CreateForm(TForm2, Form2);

    Application.CreateForm(TForm3, Form3);

    Application.Run;

    end.

    ************************************************************

    如果改变

    uses

    Forms,

    Unit1 in 'Unit1.pas' {Form1},

    Unit2 in 'Unit2.pas' {Form2},

    Unit3 in 'Unit3.pas' {Form3};

    成为

    uses

    Forms,

    Unit2 in 'Unit2.pas' {Form2},

    Unit3 in 'Unit3.pas' {Form3},

    Unit1 in 'Unit1.pas' {Form1};

    那么就是(先form2后form3最后form1)

    对于<2>,由于form1中uses了Unit2,那么在编译Unit1之前必须先编译Unit2。顺序自然是(先 form2 然后 form1 最后 form3)

    所以 initialization 的执行顺序首先看彼此单元之间是否有uses和被uses关系(简单的说就是:调用关系), 然后再看工程文件的uses的顺序。(呵呵,不要被uses弄混了!)

    2)OnCreate

    OnCreate 的执行顺序由工程单元中的如下类似代码决定

    ************************************************************

    Application.CreateForm(TForm1, Form1);

    Application.CreateForm(TForm2, Form2);

    Application.CreateForm(TForm3, Form3);

    ************************************************************

    改变之后则相应发生改变。

    3)OnDestroy

    与OnCreate的顺序相反。(相反时一种对应,创建的顺序与销毁的顺序是相反的,这样是为了避免发生错误,这样也体现了编程要求思维严谨。)

    4)finalization

    与 initialization 的顺序相反。

    再说说OnClose,

    当调用窗体的Close或点击关闭按钮时调用该事件。

    主窗体Close后,程序就退出。

    非主窗体Close,仅仅是Close本窗体。(别说你在OnClose中调用其他窗体的关闭,那些不再讨论范围)

    直接用Application.Terminate强制退出程序时,不调用OnClose事件。但 OnDestroy 和 finalization 要执行。

    说了这么多,不知道有没有说明白问题。希望大家能领悟(俺表达能力比较差,呵呵~~~)。

    转自:http://my.oschina.net/kavensu/blog/191440

  • 相关阅读:
    MySQL Community Server 8.0.16
    Python的编码规范
    Python 的语言特性
    spark笔记 环境配置
    C#委托实现工厂规则注入
    特性与元数据
    可输入的模糊搜索ComBox控件
    ASPX页面输出datatable的一种方法
    QRcode生成二维码,保存二维码图片到服务器
    SQL语句的随机值与行号,字符串拼接
  • 原文地址:https://www.cnblogs.com/760044827qq/p/4859693.html
Copyright © 2011-2022 走看看