当我在Delphi上生成新的应用程序项目时,源Project1.pas中的第一行实现如下。
Application.Initialize;
Application.CreateForm(Tform1, form1);
Application.Run;
然后在Form1的OnCreate事件中,我意识到我需要的所有initialization
,就像
打开FdConnections,激活查询等。
我也在关闭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?}
答案 0 :(得分:3)
初始化和终结部分只执行一次,无论创建多少个Form实例。与表格的 OnCreate , OnClose 和 OnDestroy 事件形成对比,该事件为每个实例执行一次。
在您的示例中,有问题的表单只创建一次,因此差异实际上更多地适用于(或可以)多次创建(实例化)的表单,无论每个实例是否已关闭。
答案 1 :(得分:2)
要在Delphi应用程序启动时遵循事件顺序,请尝试以下操作:
在Form1的单元中创建Initialization
部分,添加一些无关紧要的代码
在其中并在其上设置调试断点。这段代码简直就是这样
把断点放在上面。
在Form1的单元中创建一个Finalization
部分,在其中放入一些代码然后放入
关于它的断点。
在.Dpr文件中的Application.Initialize上设置断点。
编译并运行该应用程序。
调试器将在您在步骤1中创建的断点处停止。如果您查看调用堆栈,
您将看到代码是从RTL例程调用的结果
InitUnits
依次调用编译到你的每个单元的初始化部分
。可执行程序。它们被调用的确切顺序由编译器在编译时确定
并且可能是由USEd单位的深度优先遍历决定的。
接下来,调试器将停止在.Dpr文件中的Application.Initialize BP上。到...的时候
执行到达那里,所有单位的Initialization
部分编译成
.Exe将被召唤。
关闭应用程序时,调试器将停在您设置的Finalization
BP上
在第2步中。如果您追踪它,您会发现它调用Finalization
部分
单位的顺序与调用Initialization
部分的顺序相反。和
这些Initialization
和Finalization
部分每次执行时只调用一次
.Exe。
从上面可以看出,对初始化/终结的调用
部分与单元中的任何类是否实例化无关。素数
在Initialization
部分实例化一个类的原因是为了确保该类
实例在Application.Initialize被调用之前存在(或等效于Main()
在控制台应用程序中调用。)