语言概览delphi_keyiwenwo_百度空间

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 编译器。平台相关的语言和功能差别都作了特别注明。

本文包含以下两部分:
  程序构成。介绍了基本的语言功能,应用程序中的单元和命名空间。
  程序举例。几个小例子,包含了控制台应用程序和 GUI 应用程序,和在命令行运行编译器的基本指令。

{dy}部分 程序构成

  Delphi 程序一般由多个单元(源代码模块)构成。多数程序都是以一个程序头 program 开始,在这里指定程序的名字。程序头后面是一个 uses 语句(可选),然后是一些声明语句。 uses 部分列举了连接到本程序的单元。这些单元可以被不同的程序共享,一般都有自己的 uses 语句。
  uses 语句给编译器指出了各个模块间的依赖关系。由于这些内容是保存在各个模块内部,多数Delphi 程序不需要生成文件,头文件,或预处理指令include。

Delphi 源文件

  编译器希望能找到三种文件:
  单元文件(.pas)
  工程文件(.dpr)
  包文件(.dpk)
  单元文件包含了应用程序的多数代码。 每个应用程序都有{wy}一个工程文件和几个单元文件。工程文件与传统Pascal 的程序文件一样,是用来组织单元文件的。CodeGear 开发工具自动为每个应用程序维护工程文件。

  如果从命令行编译程序,可以把所有的代码放到多个单元文件(.pas)中,若使用 IDE 建立应用程序,则产生一个工程文件(.dpr)。

  包文件类似于工程文件,用来建立专用的动态连接库——包(package)。

  用来建立应用程序的其他文件:
  除了源代码模块,CodeGear 使用一些非 Pascal 文件。这些文件由IDE自动维护,包括:

  VCL 窗口文件(.dfm —— Win32,.nfm —— .NET)
  资源文件(.res)
  工程选项文件(.dof)
  VCL 窗口文件包含有窗口和它的组件的属性描述。每个窗口文件代表一个单独的窗口,一般是应用程序的一个窗口或一个对话框。可以在IDE 中查看和编辑窗体,可以把窗口文件保存为文本格式或二进制格式。文本格式更适用于版本控制。默认保存为文本,但一般不会手工编辑窗口文件,而是使用 CodeGear's 的可视化设计工具。每个工程至少有一个窗口,每个窗口都有一个关联的单元文件(.pas)。此单元文件的文件名默认与窗口文件相同。

  每个工程还有一个资源文件(.res),存放应用程序图标和其他资源,如字符串。资源文件名默认与工程文件(.dpr)相同。

  工程选项文件包含编译器和连接器的设置,搜索路径,版本信息等。 每个工程都有一个与工程同名的选项文件。通常可以在Project Options 对话框中设置这些选项。

  IDE 的各种工具把数据存储在其他类型文件中。桌面设置文件(.dsk)包含了各个窗口的排列信息和其他配置选项。desktop settings can be project-specific or environment-wide. These files have no direct effect on compilation.

  编译器产生的文件:
  {dy}次建立应用程序和包的时候,编译器为工程中引用的每个新的单元产生一个已编译的单元文件(.dcu,.dcuil——.NET)。工程中所有的 .dcu/.dcuil 文件连接后建立一个可执行文件或一个共享包. {dy}次建立包的时候,编译器还创建一个 .dcp 文件和一个包文件。若使用 GD 开关,则连接器产生一个映象(map)文件和一个 .drc 文件。.drc文件含有字符串资源,可以编译到资源文件中。

  建立工程时,单独的单元文件在以下情况才会被重新编译:从上次编译后源文件(.pas)被改动;找不到 .dcu/.dpu 文件;明确指示编译器重新编译;单元文件所依赖的另一个单元文件发生了改动。事实上,只要编译器能找到已编译的单元文件,并且这些文件与其他已改变的单元没有依赖关系,就不需要这些单元的源文件。

第二部分 delphi程序举例

1 一个简单的控制台应用程序,举例说明delphi程序的基本功能。这个程序可以在命令行编译和运行。

    program greeting;
                                               
    {$APPTYPE CONSOLE}
   
    var MyMessage: string;

      begin
           MyMessage := 'Hello world!';
           Writeln(MyMessage);
    end.

  {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 一个比较复杂的例子
下面的程序,由两部分组成:一个工程project文件和一个单元unit文件。工程文件可以保存为 greeting.dpr:

program greeting;
                                       
    {$APPTYPE CONSOLE}
                                       
     uses Unit1;

    begin
          PrintMessage('Hello World!');
    end.
  {dy}行声明一个程序,名称是 greeting,下一行指明是控制台应用程序。下面的 uses Unit1; 语句告诉编译器本程序依赖于一个叫 Unit1 的单元,{zh1},程序调用 PrintMessage 这个过程,把字符串 Hello World! 传递给它。PrintMessage 定义在 Unit1 单元内。下面是 Unit1 的原代码,这个代码必须保存为 Unit1.pas:

    unit Unit1;
                   
    interface

    procedure PrintMessage(msg: string);

    implementation

    procedure PrintMessage(msg: string);
    begin
        Writeln(msg);
    end;

    end.
  Unit1 定义了一个过程:PrintMessage,这个过程以一个字符串做参数, 然后把这个字符串发送到标准输出。 Delphi里,没有返回值的叫过程,有返回值的叫函数。在Unit1中,PrintMessage 被声明了两次。{dy}次是在interface 下面,使其他使用了use Unit1 的模块可以使用此过程。第二次是在 implementation 下面,实际定义 PrintMessage。

  在命令行编译时,输入
  
  dcc32 greeting

  编译为一个Win32可执行文件,或输入
 
  dccil greeting

  编译为一个managed .NET可执行文件。

  不需要在命令行里加上 Unit1 。当编译器处理 greeting.dpr 时,自动寻找greeting程序所依赖的单元文件。{zh1}的程序运行结果与{dy}个例子程序一样:打印出 Hello world!

3 一个VCL 应用程序
  这个例子使用IDE中的可视化组件库(VCL) 组件。本程序自动产生 窗口文件 和 资源文件,所以不能单独编译原文件。但是这里表明了Delphi语言的重要功能。除了引用多个单元,本程序还使用了类和对象。

  本程序包含一个工程文件和两个新的单元文件。先看工程文件:

program greeting;
                                       
uses Forms, Unit1, Unit2;
{$R *.res} // 连接本工程的资源文件

begin
    // 调用全局 Application 的实例
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.CreateForm(TForm2, Form2);
    Application.Run;
end.
  与前两个例子相同,程序还命名为 greeting ,引用3个单元:Forms,是 VCL 的一部分;Unit1,与应用程序的主窗口 (Form1)关联;Unit2,关联另一个窗口(Form2)。

  本程序有一系列Application 的调用,Application 是 Forms 中定义的TApplication 类的一个实例。每个工程都有自动产生一个Application 对象。其中有两行调用了 TApplication 的 CreateForm函数。{dy}次调用创建了 Form1,这是单元 Unit1 中类 TForm1 的实例,第二次调用创建了 Form2,这是单元Unit2 中类TForm2 的实例。

Unit1 的代码:

unit Unit1;
       
interface

uses SysUtils, Types, Classes, Graphics, Controls, Forms, Dialogs;

type

TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
end;

var
    Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
    Form2.ShowModal;
end;

end.

  Unit1 建立了一个类,TForm1 (从TForm继承),和这个类的一个实例, Form1。TForm1 包含有一个按钮 Button1,这是TButton 的一个实例,还有一个过程 Button1Click,当用户按下Button1时调用这个过程。Button1Click显示出Form2 (通过调用Form2.ShowModal)。

注意:上面的例子中,Form2.ShowModal 依赖于使用了自动创建的窗口。这种自动创建的窗口不被自动xx。

Unit2 的代码:

unit Unit2;
                   
interface

uses SysUtils, Types, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm2 = class(TForm)
    Label1: TLabel;
    CancelButton: TButton;
    procedure CancelButtonClick(Sender: TObject);
end;

var
    Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.CancelButtonClick(Sender: TObject);
begin
     Form2.Close;
end;

end.
  Unit2 创建了一个类 TForm2 和这个类的实例 Form2。TForm2 含有一个按钮 CancelButton,这是TButton的一个实例,和一个标签Label1,这是 TLabel的一个实例。从源代码中看不到这些,但是 Label1 的caption(标题)是 Hello world! ,这个caption 定义在 Form2 的窗口文件 Unit2.dfm 中。

  TForm2 声明并定义了一个方法 CancelButtonClick,当运行时用户按下 CancelButton 就会调用这个方法。这个过程,以及 Unit1 中的 TForm1.Button1Click,都是一个事件句柄(event handler),在程序运行时响应事件。Event handlers通过窗口文件 Form1 和 Form2,赋值给特定的事件。

  当 greeting 程序运行的时候,显示出Form1,不显示Form2。缺省情况下,只有工程文件中的{dy}个窗口是可见的。这是调用了工程的主窗口。当用户按下Form1中的按钮时,Form2显示出Hello world! greeting。当用户按下CancelButton 或标题栏上的关闭按钮时,Form2关闭。



郑重声明:资讯 【语言概览delphi_keyiwenwo_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——