本主题介绍 Delphi 应用程序的整体结构:程序头、单元声明语法和 uses 子句( program header, unit declaration syntax, and the uses clause)。
- 将大型程序划分为可单独编辑的模块。
- 创建可在程序之间共享的库。
- 将库分发给其他开发人员,而无需提供源代码。
1. program 结构和语法
一个完整的、可执行的 Delphi 应用程序由多个单元模块(unit modules)组成,所有这些模块都由称为项目文件(project file)的单个源代码模块捆绑在一起。在传统的Pascal编程中,所有源代码,包括主程序,都存储在.pas文件中。Embarcadero工具使用文件扩展名.dpr来指定主程序源模块( main program source module),而大多数其他源代码驻留在具有传统.pas扩展名的单元文件中。若要生成项目,编译器需要项目源文件,以及每个单元的源文件或已编译单元文件。
注意:严格来说,您不需要在项目中使用任何单元,但所有程序都会自动使用 System Unit 和 SysInit Unit。
可执行Delphi应用程序的源代码文件包含:
- 程序头,
- 一个 use 子句(可选),以及
- 声明和可执行语句块。
编译器(以及 IDE)希望在单个项目 (.dpr) 文件中找到这三个元素。
1.1 program 头
program 头指定可执行程序的名称。它由保留字program组成,后跟有效标识符,后跟分号。对于使用 Embarcadero 工具开发的应用程序,标识符必须与项目源文件名匹配。
下面的示例演示名为 Editor 的程序的项目源文件。由于该程序称为Editor,因此此项目文件称为Editor.dpr。
program Editor;
uses Forms, REAbout, // An "About" box
REMain; // Main form
{$R *.res}
begin
Application.Title := 'Text Editor';
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
第一行包含program 头。此示例中的 uses 子句指定对三个附加单元的依赖关系:Forms、REAbout 和 REMain。$R
编译器指令将项目的资源文件链接到程序中。最后,开始和结束关键字之间的语句块在程序运行时执行。与所有 Delphi 源文件一样,项目文件以句点(不是分号)结尾。
Delphi项目文件通常很短,因为程序的大部分逻辑都驻留在其单元文件中。Delphi 项目文件通常只包含足够的代码来启动应用程序的主窗口,并启动事件处理循环。项目文件由 IDE 自动生成和维护,很少需要手动编辑它们。IDE中并不会显示dpr 文件,可以用其他文本编辑器打开查看,内容类似下面这种:
program greeting;
uses
Vcl.Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
在标准 Pascal 中,程序标题可以在程序名称后包含参数:
program Calc(input, output);
Embarcadero的Delphi忽略了这些参数。
在 RAD Studio 中,program 头引入了自己的命名空间,称为项目默认命名空间。
1.2 uses 子句
uses 子句列出了合并到程序中的那些units。这些units可能又有自己的uses 子句。
uses 子句由关键字 uses 组成,后跟项目文件直接依赖的逗号分隔的unit列表。
1.3 begin end程序块
begin end程序块包含程序运行时执行的简单或结构化语句。在大多数程序文件中,begin end程序块由一个复合语句组成,该复合语句括在保留字 begin 和 end 之间,其组件语句只是对项目的 Application 对象的方法调用。大多数项目都有一个全局应用程序变量,其中包含 Vcl.Forms.TApplication、Web.WebBroker.TWebApplication 或 Vcl.SvcMgr.TServiceApplication 的实例。该块还可以包含常量、类型、变量、过程和函数的声明;这些声明必须位于begin end程序块的语句部分之前。请注意,表示程序源结束的结尾必须后跟句点 (.):
begin
.
.
.
end.
2. Unit结构和语法
unit 由类型types(包括类classes)、常量、变量和例程routines(函数和过程functions and procedures)组成。每个unit都在其自己的源 (.pas) 文件中定义。
单元文件以 unit heading 开头,后跟接口 interface 关键字。在接口 interface 关键字之后, uses 子句指定单元依赖项的列表。接下来是实现 implementation 部分,然后是可选的初始化 initialization和完成 finalization 部分。unit源文件的骨架如下所示:
unit Unit1;
interface
uses // List of unit dependencies goes here...
// Interface section goes here
implementation
uses // List of unit dependencies goes here...
// Implementation of class methods, procedures, and functions goes here...
initialization
// Unit initialization code goes here...
finalization
// Unit finalization code goes here...
end.
unit 必须以保留字end结尾,后跟句点结束。
注意:unit源文件中,interface 和 implementation 中都可以使用 uses 子句
2.1 unit 头
The unit heading specifies the unit’s name. It consists of the reserved word unit, followed by a valid identifier, followed by a semicolon. For applications developed using Embarcadero tools, the identifier must match the unit file name. Thus, the unit heading:
unit 头指定unit的名称。它由保留字 unit,组成,后跟有效标识符,后跟分号。对于使用 Embarcadero 工具开发的应用程序,标识符必须与unit文件名匹配。因此, unit头:
unit MainForm;
将出现在名为 MainForm.pas 的源文件中,包含编译unit的文件将是 MainForm.dcu。unit名称在项目中必须是唯一的。即使它们的unit文件位于不同的目录中,两个同名的unit也不能在单个程序中使用。
2.2 interface部分
界面部分
unit的 interface部分从保留字 interface开始,一直持续到 implementation 部分的开头。interface部分声明可供客户端使用的常量、类型、变量、过程和函数。也就是说,对于希望使用该unit中的元素的其他units 或programs。这些实体称为公共实体 public ,因为其他unit中的代码可以访问它们,就像它们是在这些unit本身中声明的一样。
过程或函数的interface 声明仅包含该例程routine的签名。即例程的名称、参数和(函数的)返回类型。包含过程或函数的可执行代码的块位于 implementation部分。因此,interface 部分中的过程和函数声明的工作方式类似于前向声明。
类的 interface 声明必须包括所有类成员的声明:字段、属性、过程和函数。
interface 部分可以包含其自己的 uses 子句,该子句必须紧跟在关键字 interface之后。