语言概述

来自RAD Studio
跳转到:航行,搜索

转到德尔福语言指南索引


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声明和定义方法取消按钮单击当用户按下时,将在运行时调用取消按钮.本程序(连同单元1TForm1.Button1单击)被称为事件处理程序因为它响应程序运行时发生的事件。事件处理程序由的表单文件分配给特定事件表格1表格2.

招呼程序启动,表格1显示,并且表格2是看不见的。(默认情况下,只有在项目文件中创建的第一个表单在运行时可见。这被称为项目的主表单。)当用户按下表格1,表格2显示你好,世界!招呼。当用户按下取消按钮关闭按钮,表格2关闭。

另请参见