第一讲:Delphi关键词-interface,implementation,initialization,finalization
01.名称:【interface】、【implementation】、【initialization】、【finalization】
02. 功能:与单元文件相关的关键字。
03. interface :单元文件的接口部分,也用于定义接口类型,可以理解为C或者C++的头文件。
04. implementation :单元文件的实现部分,可以理解为.cpp文件。
05. initialization :单元文件的初始化部分。
06. finalization :单元文件的反初始化部分。
07.
08.
09.{ 单元文件结构 }
10.unit Unit1;
11.interface
12. { 引用其他单元、定义数据类型、定义过程函数、定义变量常量等 }
13. { 此处定义的类型或数据对其他单元是可见的(可访问的) }
14.implementation
15. { 引用其他单元、实现接口部分定义的类型、过程、函数的具体代码 }
16. { 此处定义的类型或变量只对本单元可见 }
17.initialization
18. { 这里编写单元被载入时所要调用的方法 }
19. { 通常是初始化一些不能自动初始化的对象,也可以不用 }
20. { initialization 最常用的情况是对 OLE 对象做初始化 }
21.finalization
22. { 这里编写单元被释放时所要调用的方法 }
23. { 通常是释放掉单元中不能自动释放的对象,也可以不用 }
24. { finalization 最常用的情况是对 OLE 对象做反初始化 }
25.end.
26.
27./*****深入分析区******************我是分界线帅哥*********下面文字来自大熊-编程学习博客*********************/
28.【interface】、【implementation】比较容易理解,就不详细说名。当然interface得用来声明接口用,关于接口的思想我这里只简单提一下,想详细了解的可以去百度一下OO(面向对象编程)。
29. 这里我用java的接口思想来说阐述。所谓接口其实就是定义了一个类,里面只申明了方法,而不对方法做处理,就是空方法。而有些时候你必须要用这些类,那就不得不去写这些方法,一个也不能漏掉的写。就好比定了一个规矩,你必须服从!
30. 接口声明 MyInterface = interface //这样MyInterface就是一个接口了!
31.
32.
33.【initialization】、【finalization】比较少用到,这里咱就谈谈他们哥俩的用法!
34./**************************************************
35.
36.initialization
37.ShowMessage('1 ini');{单元初始化代码}
38.finalization
39.ShowMessage('1 final');{单元退出时的代码}
40.end.
41.****************************************************/
initialization —— 在单元中放在文件结尾前,包含用来初始化单元的代码,它在主程序运行前运行并且只运行一次。
finalization —— 在单元中放在 initialization 和 end. 之间,包含了单元退出时的代码。在程序退出时运行并且只运行一次,不能脱离initialization独立存在。
为了更好的说明,我们与下面的事件做比较:
OnClose —— 在点击关闭按钮或执行该事件时调用。
OnCreate —— 在窗体创建时调用。(先执行他,然后才创建窗体)
OnDestroy —— 在窗体销毁时调用,一般用来销毁程序员自己定义(自己定义、创建,而不是直接从控件板拖拉过来的控件)的对象、变量、指针等等。
下面是执行顺序(如果程序中没有 initialization、 OnCreate、 OnClose、 OnDestroy、 finalization 中的任何一项,则相应跳过即可):
程序启动 –> 执行 initialization 处的代码 –> 执行窗体的构造函数并创建相应窗体和单元中的对象(如拖拉的控件对象,全局变量等) –> 执行 OnCreate 事件 –> 程序运行 –> 关闭主窗体(此处指调用主窗体的Close或点击主窗体的关闭按钮) –> 执行 OnClose 事件 –> 执行 OnDestroy 事件 –> 执行 finalization 处的代码;
上面是针对单个窗体而言的,如果是多个窗体呢??!!!
我们新建一工程,创建3个Form,分别是form1、form2、form3,默认情况下form1为主窗体。
<1 begin>
程序启动 –> 执行 initialization 处的代码(先 form1 然后 form2 最后 form3 ) –> 执行窗体的构造函数并创建相应窗体和单元中的对象(如拖拉的控件对象,全局变量等) –> 执行 OnCreate 事件(先 form1 然后 form2 最后 form3 ) –> 程序运行 –> 关闭主窗体(此处指调用主窗体的Close或点击主窗体的关闭按钮) –> 执行主窗体的 OnClose 事件 –> 执行 OnDestroy 事件(先 form3 然后 form2 最后 form1 ,注意哟,顺序倒过来了。) –> 执行 finalization 处的代码(先 form3 然后 form2 最后 form1 ,注意哟,顺序倒过来了。)
<1 end>
经过测试我们会发现
1.OnClose事件必须绑定到点击窗口的关闭上,点击关闭按钮时才会执行OnClose;
2.在窗体2,或者3上面点击关闭按钮时只会执行OnClose,不会执行 OnDestroy、 finalization ;
01./********************************
02.
03.begin
04. Application.Initialize;
05. Application.MainFormOnTaskbar := True;
06. Application.CreateForm(TForm1, Form1);
07. Application.CreateForm(TForm2, Form2);
08. Application.CreateForm(TForm3, Form3);
09. Application.Run;
10.end.
11.***********************************/
3.在窗口1执行玩OnClose后程序会马上执行到上面end.处,除了主窗口,其他窗口都会全部关闭(不知道是调用哪个事件关闭窗口的,不是close也不是destory),感兴趣的同学帮忙解答一下!!!
4.如果在form1中USES了form2,这个时候会先执行form2的 finalization和 initialization,其他事件不变;
5.为什么 OnDestroy 和 OnCreate 的顺序相反?为什么 finalization和 initialization 的顺序相反?
这些方法的调用是通过栈的方式来记录的, OnCreate与 initialization相当于把一些内存入栈,OnDestroy, finalization相当于释放栈内资源即出栈。
入栈:栈底->IF1->IF2->IF3->CF1->CF2->CF3 I表示initialization,F表示Form,C表示OnCreate;
出战顺序:DF3->DF2->DF1->FF3->FF2->FF1 D表示OnDestroy,F表示Form,FF表示 finalization Form;