delphi语言概览----delphi 2009 , delphi reference, delphi language guide 帮助文档的翻译,转载需标明出处。 Delphi 是个高级语言,可编译、健壮性好,支持结构化和面向对象设计。基于 Object Pascal,有代码易读、编译速度快、使用多个单元文件构成模块化的程序等优点。Delphi 支持 CodeGear 组件框架和 RAD 环境。多数情况下,本文档的说明和举例都基于 CodeGear 开发工具。 有很多开发人员使用 CodeGear 软件开发工具在集成开发环境(IDE)书写并编译代码。CodeGear 开发工具完成了很多安装工程和原文件的细节,比如维护各个单元之间的依赖关系。delphi在程序的组织上也有限制,严格说来,这些并不是Object Pascal语言规范的一部分。比如,CodeGear 开发工具加强了文件和程序命名的约定,可以避免在IDE外书写程序并在命令行编译。 一般情况下,是在IDE中使用 CodeGear 的可视化组件库(VCL)建立应用程序。 Delphi 的特殊规则不同于所有的 Object Pascal程序。本文包含了Delphi Win32编译器和 .NET 编译器。平台相关的语言和功能差别都作了特别注明。 本文包含以下两部分: {dy}部分 程序构成 Delphi 程序一般由多个单元(源代码模块)构成。多数程序都是以一个程序头 program 开始,在这里指定程序的名字。程序头后面是一个 uses 语句(可选),然后是一些声明语句。 uses 部分列举了连接到本程序的单元。这些单元可以被不同的程序共享,一般都有自己的 uses 语句。 Delphi 源文件 编译器希望能找到三种文件: 如果从命令行编译程序,可以把所有的代码放到多个单元文件(.pas)中,若使用 IDE 建立应用程序,则产生一个工程文件(.dpr)。 包文件类似于工程文件,用来建立专用的动态连接库——包(package)。 用来建立应用程序的其他文件: VCL 窗口文件(.dfm —— Win32,.nfm —— .NET) 每个工程还有一个资源文件(.res),存放应用程序图标和其他资源,如字符串。资源文件名默认与工程文件(.dpr)相同。 工程选项文件包含编译器和连接器的设置,搜索路径,版本信息等。 每个工程都有一个与工程同名的选项文件。通常可以在Project Options 对话框中设置这些选项。 IDE 的各种工具把数据存储在其他类型文件中。桌面设置文件(.dsk)包含了各个窗口的排列信息和其他配置选项。desktop settings can be project-specific or environment-wide. These files have no direct effect on compilation. 编译器产生的文件: 建立工程时,单独的单元文件在以下情况才会被重新编译:从上次编译后源文件(.pas)被改动;找不到 .dcu/.dpu 文件;明确指示编译器重新编译;单元文件所依赖的另一个单元文件发生了改动。事实上,只要编译器能找到已编译的单元文件,并且这些文件与其他已改变的单元没有依赖关系,就不需要这些单元的源文件。 第二部分 delphi程序举例 1 一个简单的控制台应用程序,举例说明delphi程序的基本功能。这个程序可以在命令行编译和运行。 program greeting; begin {dy}行声明程序(program)的名称是Greeting,下面的指令 {$APPTYPE CONSOLE} 告诉编译器这是个控制台应用程序,是在命令行下运行的。下一行声明了一个变量,变量名称是 MyMessage,是个字符串(string)变量(Delphi 包含有string这个数据类型)。然后把字符串 "Hello world!" 赋值给变量 MyMessage,使用Writeln这个过程(procedure)把 MyMessage 的内容发送到标准输出。System 单元中有 Writeln 的隐式定义,在每一个应用程序中,编译器都会自动包含 System 这个单元。 把这个程序输入到一个文件中,命名为 greeting.pas 或 greeting.dpr ,然后输入下面的命令,可编译为一个Win32可执行文件: dcc32 greeting 或使用下面的命令产生一个可管理的 .NET 可执行文件(managed .NET executable): dccil greeting 无论使用哪种方式,运行可执行文件都会打印出 Hello world! 除了简单外,这个程序在几个重要的方法上不同于其他可能用CodeGear 开发工具写的程序。首先,这是个控制台应用程序。CodeGear 开发工具最经常用于写图形界面的应用程序。因此,不能像这样调用Writeln。此外,整个程序(除了Writeln 以外)是一个单独的文件。一个典型的 GUI 应用程序的程序标题,如这个例子的{dy}行,需要放在一个单独的工程文件中。工程文件不包含任何实际的应用逻辑,而把许多调用定义到单元文件中。 2 一个比较复杂的例子 program greeting; begin unit Unit1; procedure PrintMessage(msg: string); implementation procedure PrintMessage(msg: string); end. 在命令行编译时,输入 编译为一个Win32可执行文件,或输入 编译为一个managed .NET可执行文件。 不需要在命令行里加上 Unit1 。当编译器处理 greeting.dpr 时,自动寻找greeting程序所依赖的单元文件。{zh1}的程序运行结果与{dy}个例子程序一样:打印出 Hello world! 3 一个VCL 应用程序 本程序包含一个工程文件和两个新的单元文件。先看工程文件: program greeting; begin 本程序有一系列Application 的调用,Application 是 Forms 中定义的TApplication 类的一个实例。每个工程都有自动产生一个Application 对象。其中有两行调用了 TApplication 的 CreateForm函数。{dy}次调用创建了 Form1,这是单元 Unit1 中类 TForm1 的实例,第二次调用创建了 Form2,这是单元Unit2 中类TForm2 的实例。 Unit1 的代码: unit Unit1; uses SysUtils, Types, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) var implementation uses Unit2; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); end. Unit1 建立了一个类,TForm1 (从TForm继承),和这个类的一个实例, Form1。TForm1 包含有一个按钮 Button1,这是TButton 的一个实例,还有一个过程 Button1Click,当用户按下Button1时调用这个过程。Button1Click显示出Form2 (通过调用Form2.ShowModal)。 注意:上面的例子中,Form2.ShowModal 依赖于使用了自动创建的窗口。这种自动创建的窗口不被自动xx。 Unit2 的代码: unit Unit2; uses SysUtils, Types, Classes, Graphics, Controls, Forms, Dialogs; type var implementation uses Unit1; {$R *.dfm} procedure TForm2.CancelButtonClick(Sender: TObject); end. TForm2 声明并定义了一个方法 CancelButtonClick,当运行时用户按下 CancelButton 就会调用这个方法。这个过程,以及 Unit1 中的 TForm1.Button1Click,都是一个事件句柄(event handler),在程序运行时响应事件。Event handlers通过窗口文件 Form1 和 Form2,赋值给特定的事件。 当 greeting 程序运行的时候,显示出Form1,不显示Form2。缺省情况下,只有工程文件中的{dy}个窗口是可见的。这是调用了工程的主窗口。当用户按下Form1中的按钮时,Form2显示出Hello world! greeting。当用户按下CancelButton 或标题栏上的关闭按钮时,Form2关闭。
|