繁体   English   中英

如何在Delphi中使用Initialization and Finalization命令?

[英]How to use the Initialization and Finalization command in Delphi?

当我在Delphi上生成新的应用程序项目时,源Project1.pas中的第一行实现如下。

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

然后在Form1的OnCreate事件中,我意识到我需要的所有initialization ,例如Open FdConnections,Activate Queries等。 我还将关闭窗体的OnClose中的所有查询和连接。 将被Initialization ,并Finalization一个很好的选择,这样做? 该命令的目的是什么,OnCreate有什么不同?

var Form1:TForm1;
Implementation

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

无论创建了多少Form实例, InitializationFinalization部分仅执行一次。 将其与Form的OnCreateOnCloseOnDestroy事件进行对比,该事件对每个实例执行一次。

在您的示例中,所讨论的表单仅创建一次,因此区别实际上更多地适用于(或可以)多次创建(实例化)的表单,无论每个实例是否关闭。

要遵循Delphi应用程序启动时的事件顺序,请尝试以下操作:

  1. 在Form1的单元中创建一个Initialization部分,在其中放置一些无关紧要的代码,并在其上设置调试断点。 这段代码的目的只是为了让您可以在上面放置一个断点。

  2. 在Form1的单元中创建一个Finalization部分,在其中放置一些代码,并在其上放置一个断点。

  3. 在.Dpr文件中的Application.Initialize上放置一个断点。

  4. 编译并运行该应用程序。

  5. 调试器将在您在步骤1中创建的断点处停止。如果查看调用堆栈,您将看到正在从RTL例程InitUnits中调用代码的结果被调用,该代码依次调用每个单元的初始化部分编译到您的.exe中。 它们被调用的确切顺序由编译器在编译时确定,并且大概由USEd单元的深度优先遍历确定。

  6. 接下来,调试器将在.Dpr文件中的Application.Initialize BP上停止。 当执行到达该位置时,将编译到.Exe中的所有单元的Initialization部分。

  7. 当您关闭应用程序时,调试器将在您在步骤2中设置的Finalization BP上停止。如果对其进行跟踪,则会发现它调用单元的Finalization部分的顺序与Initialization部分的顺序相反。叫。 每次执行.Exe时,这些InitializationFinalization部分仅被调用一次。

从上面应该显而易见的是,对Initialization / Finalization部分的调用与是否曾经实例化单元中的任何类无关。 Initialization部分中实例化类的主要原因是为了确保在Application.Initialize被调用之前(或在控制台应用程序中调用Main()的等效对象Main()之前存在该类实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM