好了,進入正題,首先說明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 —— 在單元中放在文件結尾前,包含用來初始化單元的代碼,它在主程序運行前運行而且只運行一次。spa
finalization —— 在單元中放在 initialization 和 end. 之間,包含了單元退出時的代碼。在程序退出時運行而且只運行一次。.net
OnClose —— 在點擊關閉按鈕或執行該事件時調用。指針
OnCreate —— 在窗體建立時調用。(個人感受:該事件是在窗體建立以後,即執行構造函數後才執行的)code
OnDestroy —— 在窗體銷燬時調用,通常用來銷燬程序員本身定義(本身定義、建立,而不是直接從控件板拖拉過來的控件)的對象、變量、指針等等。(與析構函數的關係我還沒弄清)orm
下面是執行順序(若是程序中沒有 initialization、 OnCreate、 OnClose、 OnDestroy、 finalization 中的任何一項,則相應跳過便可):對象
程序啓動 --> 執行 initialization 處的代碼 --> 執行窗體的構造函數並建立相應窗體和單元中的對象(如拖拉的控件對象,全局變量等) --> 執行 OnCreate 事件 --> 程序運行 --> 關閉主窗體(此處指調用主窗體的Close或點擊主窗體的關閉按鈕) --> 執行 OnClose 事件 --> 執行 OnDestroy 事件 --> 執行 finalization 處的代碼blog
以上是對於單個窗體而言,下面是對於多個窗體:
新建一工程,建立3個Form,分別是form一、form二、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