转到德尔福语言指南索引
Delphi是一种高级、编译、强类型语言,支持结构化和面向对象的设计。基于Delphi,它的优点包括易于阅读的代码、快速编译以及使用多个单元文件进行模块化编程。Delphi具有支持RAD Studio组件框架和环境的特殊功能。在大多数情况下,本语言指南中的描述和示例假设您正在使用Embarcadero开发工具。
大多数使用Embarcadero软件开发工具的开发人员在集成开发环境(IDE)中编写和编译代码。Embarcadero开发工具处理设置项目和源文件的许多细节,例如维护单元之间的依赖关系信息。该产品还对程序组织设置了约束,严格来说,这些约束不是Delphi语言规范的一部分。例如,Embarcadero开发工具强制执行某些文件和程序命名约定,如果您在IDE外部编写程序并从命令提示符处编译程序,则可以避免这些约定。
本语言指南通常假设您正在IDE中工作,并且正在构建使用Visual Component Library(VCL)的应用程序。然而,偶尔会将Delphi特定的规则与适用于所有Delphi编程的规则区分开来。
本节涵盖以下主题:
- 项目组织。介绍允许您将应用程序划分为单元和命名空间的基本语言功能。
- 示例程序。显示了控制台和GUI应用程序的小示例,以及从命令行运行编译器的基本说明。
采办项目组织
Delphi程序通常分为称为单元的源代码模块。大多数程序以程序标题,指定程序的名称。这个程序标题后面是可选的使用子句,然后是声明和语句块。这个使用子句列出链接到程序中的单元;这些单元可以由不同的程序共享,通常具有使用他们自己的条款。
这个使用子句为编译器提供有关模块之间依赖关系的信息。因为这些信息存储在模块中,所以大多数Delphi语言程序不需要makefile、头文件或预处理器“include”指令。
Delphi源文件
编译器希望在三种文件中找到Delphi源代码:
- 单元源文件(以.pas扩展名结尾)
- 项目文件(以.dpr扩展名结尾)
- 包源文件(以
.dpk(.dpk)
扩展)
单元源文件通常包含应用程序中的大多数代码。每个应用程序都有一个项目文件和几个单元文件;项目文件,它对应于程序文件,将单元文件组织到应用程序中。Embarcadero开发工具自动为每个应用程序维护一个项目文件。
如果您正在从命令行编译程序,则可以将所有源代码放入单元(.pas)文件中。如果使用IDE构建应用程序,它将生成一个项目(.dpr)文件。
包源文件类似于项目文件,但它们用于构建称为包的特殊动态可链接库。
用于生成应用程序的其他文件
除了源代码模块之外,Embarcadero产品还使用几个非Pascal文件来构建应用程序。这些文件由IDE自动维护,包括
- VCL表单文件(在Win32上具有.dfm扩展名)
- 资源文件(以.res结尾)
- 项目选项文件(以.dof结尾)
VCL表单文件包含表单属性及其所属组件的描述。每个表单文件代表一个表单,通常对应于应用程序中的窗口或对话框。IDE允许您以文本形式查看和编辑表单文件,并将表单文件保存为文本(非常适合版本控制的格式)或二进制文件。虽然默认行为是将表单文件保存为文本,但通常不会手动编辑;为此,使用Embarcadero的可视化设计工具更为常见。每个项目至少有一个表单,每个表单都有一个关联的单元(.pas)文件,默认情况下,该文件与表单文件同名。
除了VCL表单文件外,每个项目还使用一个资源(.res)文件来保存应用程序的图标和其他资源,如字符串。默认情况下,此文件与项目(.dpr)文件具有相同的名称。
项目选项(.dof)文件包含编译器和链接器设置、搜索路径信息、版本信息等。每个项目都有一个与项目(.dpr)文件同名的关联项目选项文件。通常,此文件中的选项是从“项目选项”对话框中设置的。
IDE中的各种工具将数据存储在其他类型的文件中。桌面设置(.dsk)文件包含有关窗口排列和其他配置选项的信息;桌面设置可以是特定于项目的或环境范围的。这些文件对编译没有直接影响。
编译器生成的文件
第一次构建应用程序或包时,编译器会为项目中使用的每个新单元生成一个编译后的单元文件(Win32上的.dcu);然后链接项目中的所有.dcu文件以创建单个可执行文件或共享包。第一次构建包时,编译器为包中包含的每个新单元生成一个文件,然后创建.dcp和包文件。如果您使用GD编译器开关,链接器生成映射文件和.drc文件; 包含字符串资源的.drc文件可以编译为资源文件。
构建项目时,除非自上次编译以来,各个单元的源(.pas)文件发生了更改,找不到它们的.dcu/.dpu文件,明确地告诉编译器重新处理它们,或者单元的接口依赖于另一个已更改的单元,否则不会重新编译各个单元。事实上,只要编译器可以找到编译后的单元文件,并且该单元不依赖于已更改的其他单元,那么单元的源文件就根本没有必要存在。
示例程序
下面的示例说明了Delphi编程的基本功能。示例显示了通常不会从IDE编译的简单应用程序;您可以从命令行编译它们。
一个简单的控制台应用程序
下面的程序是一个简单的控制台应用程序,您可以从命令提示符编译和运行该程序:
程序 招呼;
{$APPTYPE控制台}
无功功率,无功功率
我的消息: 一串;
开始
我的消息 := “你好,世界!”;
Writeln公司(我的消息);
结束.
第一行声明了一个名为Greeting的程序。这个{$APPTYPE控制台}指令告诉编译器这是一个控制台应用程序,将从命令行运行。下一行声明了一个名为MyMessage的变量,该变量包含一个字符串。(Delphi具有真正的字符串数据类型。)然后,程序将字符串“Hello world!”分配给变量MyMessage,并使用Writeln公司程序。(Writeln公司在中隐式定义系统单元,编译器会自动将其包含在每个应用程序中。)
您可以将此程序键入名为问候.pas或问候.dpr并通过输入以下内容进行编译:
dcc32问候语
生成Win32可执行文件。
生成的可执行文件打印消息你好,世界!
除了简单之外,这个示例在几个重要方面与您可能使用Embarcadero开发工具编写的程序不同。首先,它是一个控制台应用程序。Embarcadero开发工具最常用于编写具有图形界面的应用程序;因此,您通常不会致电Writeln公司此外,整个示例程序(保存为Writeln公司)在单个文件中。在典型的GUI应用程序中,示例第一行的程序将放在一个单独的项目文件中,该文件不包含任何实际的应用程序逻辑,只包含对单元文件中定义的例程的一些调用。
一个更复杂的例子
下一个示例显示了一个分为两个文件的程序:项目文件和单元文件。项目文件,可以另存为问候.dpr,如下所示:
程序 招呼;
{$APPTYPE控制台}
使用
1号机组;
开始
打印消息(“你好,世界!”);
结束.
第一行声明一个名为招呼,这又是一个控制台应用程序。这个使用单元1;子句告诉编译器程序招呼取决于一个名为1号机组。最后,程序调用打印消息过程,将字符串传递给它你好,世界!这个打印消息程序定义于单元1。这是的源代码1号机组,必须保存在名为单位1.pas:
单元 1号机组;
接口
程序 打印消息(消息: 一串);
实施
程序 打印消息(消息: 一串);
开始
Writeln公司(消息);
结束;
结束.
1号机组
定义一个名为打印消息
它接受单个字符串作为参数,并将字符串发送到标准输出。(在Delphi中,不返回值的例程称为过程。返回值的例行程序称为函数。)
请注意打印消息
在中声明了两次1号机组
.保留字下的第一个声明接口,使打印消息
可用于其他模块(例如招呼
)使用1号机组
.保留字下的第二个声明实施,实际上定义了打印消息
.
现在可以通过输入以下命令行编译问候语
dcc32问候语
生成Win32可执行文件。
没有必要包括1号机组
作为命令行参数。当编译器处理问候.dpr
,它会自动查找招呼
程序依赖于。生成的可执行文件执行与第一个示例相同的操作:它打印消息你好,世界!
VCL应用程序
我们的下一个示例是使用IDE中的Visual Component Library(VCL)组件构建的应用程序。这个程序使用自动生成的表单和资源文件,因此您无法仅从源代码编译它。但它说明了德尔菲语言的重要特征。除了多个单元外,该程序还使用类和对象.
该程序包括一个项目文件和两个新的单元文件。首先,项目文件:
程序 招呼;
使用
形式, 1号机组, 第2单元;
{$R*.res} {此指令链接项目的资源文件。}
开始
{调用全局应用程序实例}
应用程序.初始化;
应用程序.创建表单(T形1, 表格1);
应用程序.创建表单(TForm2, 表格2);
应用程序.运行;
结束.
我们的程序再次被调用招呼。它使用三个单位:形式,它是VCL的一部分;单元1,它与应用程序的主窗体关联(表格1); 和第2单元,它与另一个窗体关联(表格2).
该程序对一个名为应用程序,它是第五类。形式。T应用程序在Forms单元中定义的类。(每个项目都会自动生成应用程序对象。)其中两个调用调用第五类。形式。T应用程序名为的方法创建表单。第一次呼叫创建表单创建表格1,的实例T形1中定义的类单元1。第二次呼叫创建窗体创建表格2,的实例TForm2中定义的类第2单元.
1号机组
看起来像这样:
单元 1号机组;
接口
使用 系统实用程序, 类型, 课程, 绘图, 控制, 形式, 对话框;
类型
T形式1 = 班(T表格)
按钮1: 按钮控件;
程序 按钮1单击(发件人: TObject(目标));
结束;
无功功率,无功功率
表格1: T形1;
实施
使用 第2单元;
{$R*.dfm}
程序 T形1.按钮1单击(发件人: TObject(目标));
开始
表格2.ShowModal(显示模式);
结束;
结束.
1号机组
创建一个名为T形1
(源自第五类。形式。T表格)和这个类的一个实例表格1
. TheT形1
类包含一个按钮--按钮1
,的实例第五类。标准控制。按钮控件--和一个名为按钮1单击
当用户按下时调用按钮1
.按钮1单击
兽皮表格1
和显示器表格2
(呼叫表2.ShowModal
).
注:在前面的示例中,表2.ShowModal依赖于使用自动创建的表单。虽然这对于示例代码来说很好,但不鼓励使用自动创建的表单。
表格2
在中定义第2单元:
单元 第2单元;
接口
使用 系统实用程序, 类型, 课程, 绘图, 控制, 形式, 对话框;
类型
TForm2 = 班(T表格)
标签1: T标签;
取消按钮: 按钮控件;
程序 取消按钮单击(发件人: TObject(目标));
结束;
无功功率,无功功率
表格2: TForm2;
实施
使用 1号机组;
{$R*.dfm}
程序 TForm2.取消按钮单击(发件人: TObject(目标));
开始
表格2.关闭;
结束;
结束.
第2单元
创建一个名为T形式2
和该类的一个实例,表格2
. TheTForm2
类包含一个按钮(取消按钮
,的实例第五类。标准控制。按钮控件)和标签(标签1
,的实例第五类。标准控制。T标签)。您无法从源代码中看到这一点,但是标签1
显示标题,内容如下你好,世界!
标题定义于表格2
的表单文件,单位2.dfm
.
TForm2
声明和定义方法取消按钮单击
当用户按下时,将在运行时调用取消按钮
.本程序(连同单元1
的TForm1.Button1单击
)被称为事件处理程序因为它响应程序运行时发生的事件。事件处理程序由的表单文件分配给特定事件表格1
和表格2
.
当招呼程序启动,表格1显示,并且表格2是看不见的。(默认情况下,只有在项目文件中创建的第一个表单在运行时可见。这被称为项目的主表单。)当用户按下表格1
,表格2
显示你好,世界!
招呼。当用户按下取消按钮
或关闭
按钮,表格2
关闭。
另请参见