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

时间:2017-05-23 03:17:37

标签: delphi

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

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?}

2 个答案:

答案 0 :(得分:3)

初始化终结部分只执行一次,无论创建多少个Form实例。与表格的 OnCreate OnClose OnDestroy 事件形成对比,该事件为每个实例执行一次。

在您的示例中,有问题的表单只创建一次,因此差异实际上更多地适用于(或可以)多次创建(实例化)的表单,无论每个实例是否已关闭。

答案 1 :(得分:2)

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

  1. 在Form1的单元中创建Initialization部分,添加一些无关紧要的代码 在其中并在其上设置调试断点。这段代码简直就是这样 把断点放在上面。

  2. 在Form1的单元中创建一个Finalization部分,在其中放入一些代码然后放入 关于它的断点。

  3. 在.Dpr文件中的Application.Initialize上设置断点。

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

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

  6. 接下来,调试器将停止在.Dpr文件中的Application.Initialize BP上。到...的时候 执行到达那里,所有单位的Initialization部分编译成 .Exe将被召唤。

  7. 关闭应用程序时,调试器将停在您设置的Finalization BP上 在第2步中。如果您追踪它,您会发现它调用Finalization部分 单位的顺序与调用Initialization部分的顺序相反。和 这些InitializationFinalization部分每次执行时只调用一次 .Exe。

  8. 从上面可以看出,对初始化/终结的调用 部分与单元中的任何类是否实例化无关。素数 在Initialization部分实例化一个类的原因是为了确保该类 实例在Application.Initialize被调用之前存在(或等效于Main() 在控制台应用程序中调用。)