ObjectPascal参考手册(Ver0.1)ezdelphi@hotmail.comOverview-1-Overview(概述)Usingobjectpascal(使用objectpascal)ObjectPascal是一种高级编译语言,具有强类型(对数据类型的检查非常严格)特性,支持结构化和面向对象编程。它的优点包括代码的易读性、快速编译,以及支持多个单元文件从而实现模块化编程。ObjectPascal具有一些特性以支持Borland组件框架和RAD(快速应用程序开发)环境。在很大程度上,本语言参考的说明和示例假定你使用Borland公司的开发工具,如Delphi和Kylix。绝大多数使用Borland开发工具的开发者是在IDE(集成开发环境)环境下编写代码并进行编译。Borland开发工具帮助我们设置工程和源文件的许多细节,比如维护单元的依赖信息。并且,使用这些工具在程序的组织上还有一些限制,严格说来,这不是ObjectPascal语言规范的一部分。比如,Borland开发工具遵循某些文件和程序的命名约定,若你在IDE以外编写代码并使用命令行来编译,你可以避开这些限制。这些帮助主题假设你在IDE环境下工作,并且使用VCL(可视化组件库)和/或CLX(跨平台组件库)创建应用程序。但有时候,Borland一些特定的规则和ObjectPascal的通用规则并不相同。Programorganization(程序组织)Programorganization:Overview(概述)应用程序通常被分成多个源代码模块,我们称它们为单元(unit)。每个程序以一个程序头(heading)开始,它为程序指定一个名称。在程序头之后是一个可选的uses子句,然后是一个由声明和命令语句组成的块(block)。uses子句列出了那些链接到程序的单元,这些单元可以被不同的程序共享,并且通常有自己的uses子句。uses子句给编译器提供各模块间的依赖信息,因为这些信息是存于模块自身的,所以,ObjectPascal程序不需要makefile文件、头文件以及include预处理指令(这些概念你可能要参考C语言)。每当一个工程调入IDE时,ProjectManager创建一个makefile,但只有在包含多个工程的工程组中才保存这些文件。关于程序结构和依赖关系的更多内容,请参考程序和单元。Pascalsourcefiles(Pascal源文件)编译器期望在以下三种文件中取得Pascal源代码:•单元源文件(文件扩展名为.pas)•工程文件(文件扩展名为.dpr)•包源文件(文件扩展名为.dpk)单元源文件包含程序代码的主要部分,每个程序包含一个工程文件和多个单元文件。工程文件相当Overview-2-于传统Pascal语言的‘主’程序文件,它把各单元文件组织成一个程序。Borland开发工具自动为每一个应用程序维护一个工程文件。如果从命令行编译一个程序,你可以把所有源代码放在单元文件(.pas)中,但如果用IDE创建程序,则必须有一个工程文件(.dpr)。包源文件类似于工程文件,但它们用来创建称为包的特殊的动态链接库(DLL)。关于包的更多信息,请参考动态链接库和包。Otherfilesusedtobuildapplications(创建程序所需的其它文件)除了源代码文件,Borland工具还需要几种非Pascal文件来创建程序。它们是自动维护的,包括以下文件:•窗体文件,扩展名为.dfm(Delphi)或.xfm(Kylix)•资源文件,扩展名为.res(已经编译的资源文件)•工程选项文件,扩展名为.dof(Delphi)或.kof(Kylix)窗体文件或者是一个文本文件,或者是一个编译的资源文件,资源文件能包含位图、字符串等等。每个窗体文件表示一个窗体,通常对应于程序中的一个窗口或对话框。IDE允许以文本方式察看和编辑窗体文件,并且能以文本或二进制格式保存它。虽然默认是以文本方式保存窗体,但通常不要手动编辑它,更常用的方式是使用Borland提供的可视化设计工具。每个工程至少有一个窗体,每个窗体有一个关联的单元文件(.pas),默认情况下,单元的文件名和窗体文件名相同。除了窗体文件,每个工程使用一个资源文件(.res)保存位图作为程序的图标。默认情况下,这个文件和工程文件(.dpr)同名。要改变程序的图标,可使用ProjectOptions对话框。工程选项文件(.dof或.kof)包含编译器和链接器设置、搜索路径以及版本信息等等。每个工程对应一个选项文件,它和工程文件同名。通常情况下,文件中的选项是通过ProjectOptions对话框来完成的。IDE中的许多工具保存其它类型的文件。桌面设置文件(.dsk或.desk)包含窗口的排列信息及其它设置项目。桌面设置或者特定于一个工程(和某个工程相关),或者作用于整个环境(environment-wide)(不是特定于某个工程,对所有工程都有效)。这些文件对编译没有影响。Compiler-generatedfiles(编译器生成的文件)在第一次生成一个程序或一个标准DLL时,编译器为工程中所使用的每个新单元创建一个编译(过的)单元文件.dcu(Windows)或.dcu/.dpu(Linux)。工程中所有的.dcu文件(Windows)或.dcu/.dpu文件(Linux)被链接到一个单独的可执行文件或共享库中;当第一次生成一个包时,编译器为包所包含的每个新单元创建一个.dcu文件(Windows)或.dpu文件(Linux),然后创建.dcp文件和包文件(关于库和包的更多信息,请参考库和包)。若使用–GD开关,链接器生成一个map文件和.drc文件,.drc文件包含字符串资源,能被编译进资源文件中。当重新生成一个工程(程序、库或者包)时,除非自上次编译后单元文件(.pas)发生了改变、或者没发现.dcu文件(Windows)和.dcu/.dpu文件(Linux)、或者明确告诉编译器重新编译它,否则,单元文件不会被重新编译。实际上,只要编译器能找到编译(过的)单元文件(.dcu或.dpu),单元源文件不是必需的。Overview-3-Exampleprograms(实例程序)Aboutexampleprograms(关于实例程序)下面的实例演示ObjectPascal编程的基本特点,它们是一些简单的ObjectPascal程序,不能在IDE下编译,你可以从命令行编译它们。Asimpleconsoleapplication(一个简单的控制台程序)下面是一个简单的控制台程序,你可以从命令行编译并运行它。programGreeting;{$APPTYPECONSOLE}varMyMessage:string;beginMyMessage:='Helloworld!';Writeln(MyMessage);end.第一行声明程序叫做Greeting;{$APPTYPECONSOLE}指示字告诉编译器,这是一个控制台程序,它要从命令行运行;接下来的一行声明了一个变量MyMessage,它存储一个字符串(ObjectPascal包含真正的字符串类型)。程序把字符串”Helloworld!”赋给变量MyMessage,然后使用Writeln例程把MyMessage的内容送到标准输出设备(Writeln在System单元声明,编译器在每个程序中自动包含这个单元)。你可以把这个程序(源代码)输入到一个叫Greeting.pas或Greeting.dpr的文件中,然后在控制台输入如下命令编译它:对于Delphi:DCC32Greeting对于Kylix:dccGreeting执行的结果是输出信息”Helloworld!”。除了简单,上面这个例子和我们在Borland开发工具下写的程序有几个重要的不同:首先,这是一个控制台程序,Borland开发工具通常创建图形界面的程序,因此,你不大可能调用Writeln(GUI程序不能调用Writeln);而且,整个程序只有一个文件。在一个典型的程序中,程序头,也就是例子中的第一行,将被放在一个单独的工程文件中。工程文件通常不包含实际的程序逻辑,而只是调用在单元文件中定义的方法。Amorecomplicatedexample(一个稍微复杂的程序)下面的实例程序被分成两个文件:一个工程文件,一个单元文件。工程文件可以存为Greeting.dpr,它看起来这样:Overview-4-programGreeting;{$APPTYPECONSOLE}usesUnit1;beginPrintMessage('HelloWorld!');end.第一行声明程序叫做Greeting,它同样是个控制台程序。usesUnit1;子句告诉编译器,Greeting包含(引用)一个叫做Unit1的单元。昀后,程序调用PrintMessage过程,并把字符串”Helloworld!”传递给它。请注意,PrintMessage过程是从哪里来的?它是在Unit1单元定义的。下面是Unit1单元的源代码,你能把它保存在一个叫Unit1.pas的文件中:unitUnit1;interfaceprocedurePrintMessage(msg:string);implementationprocedurePrintMessage(msg:string);beginWriteln(msg);end;end.Unit1单元定义一个叫做PrintMessage的过程,它接收一个字符串作为参数,并把它送到标准输出设备(在Pascal中,没有返回值的例程叫过程,有返回值的例程叫函数)。请注意,PrintMessage在Unit1中声明了两次,第一次是在关键字interface的下面,这使得它对于引用Unit1单元的其它模块(比如Greeting)是可用的;第二次声明是在关键字implementation的下面,它实际定义PrintMessage过程。现在你可以在控制台输入如下命令编译Greeting。对于Delphi:DCC32Greeting对于Kylix:dccGreeting没必要在命令行参数中包含Unit1。当编译器处理Greeting.dpr时,它自动查找Greeting程序所依赖(引用)的单元文件。程序的执行结果和前面的实例相同,它输出信息”Helloworld!”。Anativeapplication(在IDE下设计程序)我们的下一个实例程序是在IDE下用VCL或CLX组件生成的,它使用自动产生的窗体文件和资源文件,因此,你不能仅仅使用源代码来编译它。它阐明了ObjectPascal的重要特点。除包含多个单元外,这个程序还使用了类和对象。Overview-5-程序包含一个工程文件和两个单元文件。首先是工程文件:programGreeting;{注释写在一对大括号中}usesForms,{在Linux下改为QForms}Unit1in'Unit1.pas'{Form1所在的单元},Unit2in'Unit2.pas'{Form2所在的单元};{$R*.res}{这个指示字链接工程的资源文件}begin{对Application的调用}Application.Initialize;Application.CreateForm(TForm1,Form1);Application.CreateForm(TForm2,Form2);Application.Run;end.我们的程序还是叫Greeting。它引用了三个单元:一个是Forms单元,它是VCL和CLX的一部分;二是Unit1单元,它和程序的主窗体(Form1)相关联;三是Unit2单元,它和另一个窗体(Form2)相关联。这个程序调用Application对象的一系列方法。Application是类TApplication的一个实例,它在Forms单元定义(每个工程自动生成一个Application对象)。这些调用中有两个调用了TApplicati