2017-05-23 95 views
-1

當我在Delphi上生成新的應用程序項目時,源Project1.pas中的第一行實現如下。如何在Delphi中使用初始化和終結命令?

Application.Initialize; 
Application.CreateForm(Tform1, form1); 
Application.Run; 

然後在Form1的事件OnCreate中我意識到所有initialization我需要的,像 打開FdConnections,激活查詢等。 我也關閉窗體的OnClose中的所有查詢和連接。將InitializationFinalization做一個很好的選擇嗎?這個命令的目的是什麼,以及OnCreate有什麼不同?

var Form1:TForm1; 
Implementation 

Initialization 
Begin 
FdConnection1.Open; 
FdQuery1.open; 
FdQuery2.Open; 
... 
End; 
Finalization 
Begin 
FdQuery1.Close 
... 
FdConnection.Close; 
End; {Could It works?} 
+0

這在文檔 –

+1

中解釋哪個對象(如果有的話)是FDConnection1和FDQuery1&2的成員,或者它們是全局變量?如果它們是對象的成員,則需要先創建該對象,然後再創建該對象。我認爲您可能對初始化和定稿部分和對象生命週期有一個基本的誤解。 – MartynA

回答

3

初始化定稿部分執行只有一次,不管如何創建一個表單的多個實例。與OnCreate,OnCloseOnDestroy對於每個實例執行一次的表單事件。

在你的榜樣,在討論的形式只會創建一次,這樣的差別真的更適用於創建的是(或可以)表格(實例)多次,每個實例是否關閉或沒有。

+0

只是沒有提及OP對'Application.Initialize;'的原始引用...... –

+0

@jerry Application.Initialize與單元初始化和終結無關。 –

+1

更重要的是,初始化和最終化部分與單元相關,而不涉及任何恰好在其中聲明的類,也不適用於Application.Initialize。 – MartynA

2

要跟蹤事件的順序時,Delphi應用程序啓動時,請嘗試以下操作:

  1. 建立在Form1的單元的Initialization部分,把一些無關緊要的代碼 在這裏,並設置調試斷點它。這段代碼的意義在於,你可以在 上放置一個斷點。

  2. 在Form1的單元中創建一個Finalization部分,在其中放置一些代碼並將 作爲斷點。

  3. 放在在Application.Initialize一個破發點中的.Dpr文件。

  4. 編譯並運行應用程序。

  5. 調試器將停止對你在步驟1.如果您查看調用堆棧中創建的斷點, 你會看到代碼被稱爲從RTL程序被稱爲結果 InitUnits它調用了把每個單元的初始化部分編譯成你的 。它們被調用的確切順序由編譯器在編譯時間 確定,並且大概由USEd單元的深度優先遍歷來確定。

  6. 接下來,調試器將在.Dpr文件停止對在Application.Initialize BP。在 執行時間到達那裏時,編譯爲 .Exe的所有單元的Initialization部分將被調用。

  7. 當您關閉該應用程序時,調試器將在步驟2中設置爲 的Finalization BP上停止。如果您找不到它,您會發現它調用Finalization部分的 部分的順序與調用Initialization部分的順序相反。並且 這些InitializationFinalization部分僅在每次執行 時被調用一次.Exe。

它應該從上文顯而易見的是,對初始化/定稿 部分中的呼叫無關的是否在單元的任何類以往實例化。在Initialization部分中實例化類的主要原因 是爲了確保在調用Application.Initialize之前存在類 實例(或等效的Main()是在控制檯應用程序中調用的 )。