[英]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实例, Initialization和Finalization部分仅执行一次。 将其与Form的OnCreate , OnClose和OnDestroy事件进行对比,该事件对每个实例执行一次。
在您的示例中,所讨论的表单仅创建一次,因此区别实际上更多地适用于(或可以)多次创建(实例化)的表单,无论每个实例是否关闭。
要遵循Delphi应用程序启动时的事件顺序,请尝试以下操作:
在Form1的单元中创建一个Initialization
部分,在其中放置一些无关紧要的代码,并在其上设置调试断点。 这段代码的目的只是为了让您可以在上面放置一个断点。
在Form1的单元中创建一个Finalization
部分,在其中放置一些代码,并在其上放置一个断点。
在.Dpr文件中的Application.Initialize上放置一个断点。
编译并运行该应用程序。
调试器将在您在步骤1中创建的断点处停止。如果查看调用堆栈,您将看到正在从RTL例程InitUnits
中调用代码的结果被调用,该代码依次调用每个单元的初始化部分编译到您的.exe中。 它们被调用的确切顺序由编译器在编译时确定,并且大概由USEd单元的深度优先遍历确定。
接下来,调试器将在.Dpr文件中的Application.Initialize BP上停止。 当执行到达该位置时,将编译到.Exe中的所有单元的Initialization
部分。
当您关闭应用程序时,调试器将在您在步骤2中设置的Finalization
BP上停止。如果对其进行跟踪,则会发现它调用单元的Finalization
部分的顺序与Initialization
部分的顺序相反。叫。 每次执行.Exe时,这些Initialization
和Finalization
部分仅被调用一次。
从上面应该显而易见的是,对Initialization / Finalization部分的调用与是否曾经实例化单元中的任何类无关。 在Initialization
部分中实例化类的主要原因是为了确保在Application.Initialize被调用之前(或在控制台应用程序中调用Main()
的等效对象Main()
之前存在该类实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.