Example programs(实例程序)
A simple console application(一个简单的控制台程序)
下面是一个简单的控制台程序,你可以从命令行编译并运行它。
program Greeting;
{$APPTYPE CONSOLE}
var MyMessage: string;
begin
MyMessage := 'Hello world!';
Writeln(MyMessage);
end.
第一行声明程序叫做Greeting;{$APPTYPE CONSOLE} 指示字告诉编译器,这是一个控制
台程序,它要从命令行运行;接下来的一行声明了一个变量MyMessage,它存储一个字符串(Object
Pascal 包含真正的字符串类型)。程序把字符串 ”Hello world!” 赋给变量MyMessage,然后使用
Writeln 例程把MyMessage 的内容送到标准输出设备(Writeln 在System 单元声明,编译器在每个
程序中自动包含这个单元)。
你可以把这个程序(源代码)输入到一个叫Greeting.pas 或Greeting.dpr 的文件中,然后在控
制台输入如下命令编译它:
对于Delphi:DCC32 Greeting
对于Kylix:dcc Greeting
执行的结果是输出信息 ”Hello world!”。
除了简单,上面这个例子和我们在Borland 开发工具下写的程序有几个重要的不同:首先,这是一
个控制台程序,Borland 开发工具通常创建图形界面的程序,因此,你不大可能调用Writeln(GUI 程序
不能调用Writeln);而且,整个程序只有一个文件。在一个典型的程序中,程序头,也就是例子中的第
一行,将被放在一个单独的工程文件中。工程文件通常不包含实际的程序逻辑,而只是调用在单元文件
中定义的方法。
A more complicated example(一个稍微复杂的程序)
下面的实例程序被分成两个文件:一个工程文件,一个单元文件。工程文件可以存为Greeting.dpr,
它看起来这样:
program Greeting;
{$APPTYPE CONSOLE}
uses Unit1;
begin
PrintMessage('Hello World!');
end.
第一行声明程序叫做Greeting,它同样是个控制台程序。uses Unit1; 子句告诉编译器,Greeting
包含(引用)一个叫做Unit1 的单元。最后,程序调用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 的过程,它接收一个字符串作为参数,并把它送到标准输
出设备(在Pascal 中,没有返回值的例程叫过程,有返回值的例程叫函数)。请注意,PrintMessage
在Unit1 中声明了两次,第一次是在关键字interface 的下面,这使得它对于引用Unit1 单元的其它
模块(比如Greeting)是可用的;第二次声明是在关键字implementation 的下面,它实际定义
PrintMessage 过程。
现在你可以在控制台输入如下命令编译Greeting。
对于Delphi:DCC32 Greeting
对于Kylix:dcc Greeting
没必要在命令行参数中包含Unit1。当编译器处理Greeting.dpr 时,它自动查找Greeting 程序
所依赖(引用)的单元文件。程序的执行结果和前面的实例相同,它输出信息 ”Hello world!”。
A native application(在IDE 下设计程序)
我们的下一个实例程序是在IDE 下用VCL 或CLX 组件生成的,它使用自动产生的窗体文件和资源
文件,因此,你不能仅仅使用源代码来编译它。它阐明了Object Pascal 的重要特点。除包含多个单元外,
这个程序还使用了类和对象。
程序包含一个工程文件和两个单元文件。首先是工程文件:
program Greeting; { 注释写在一对大括号中 }
uses
Forms, { 在Linux 下改为QForms }
Unit1 in 'Unit1.pas' { Form1 所在的单元 },
Unit2 in '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 对象)。这些调用中有两个调用了TApplication
的CreateForm 方法,第一个CreateForm 创建Form1,它是类TForm1(在Unit1 单元定义)的
一个实例;第二个CreateForm 创建Form2,它是类TForm2(在Unit2 单元定义)的一个实例。
Unit1 单元看起来像下面的样子:
unit Unit1;
interface
uses { 下面这些单元是VCL 的一部分 }
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
{
在Linux 下,uses 子句看起来像这样:
uses { 下面这些单元是CLX 的一部分 }
SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs;
}
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Overview
Form1: TForm1;
implementation
uses Unit2; { 这是Form2 定义的地方 }
{$R *.dfm} { 这个指示字链接Unit1 的窗体文件 }
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.ShowModal;
end;
end.
Unit1 单元创建了类TForm1(继承自TForm)和它的一个实例Form1。TForm1 包含一个按钮
Button1,它是TButton 的一个实例;还包含一个过程TForm1.Button1Click,在运行时,当用户按
下Button1 时它将被执行。TForm1.Button1Click 隐藏Form1 并显示Form2 ( 调用
Form2.ShowModal),Form2 在Unit2 单元定义:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
{
在Linux 下,uses 子句看起来像这样:
uses
SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs;
}
type
TForm2 = class(TForm)
Label1: TLabel;
CancelButton: TButton;
procedure CancelButtonClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
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 将显示 ”Hello world!” 标
题,但从源代码中你不能看到这一点。标题是在Form2 的窗体文件Unit2.dfm 中定义的。
Unit2 单元定义了一个过程。在运行时, 当用户点击CancelButton 时,
TForm2.CancelButtonClick 将被调用, 它关闭Form2 。这个过程( 以及Unit1 单元的
TForm1.Button1Click)是作为事件句柄,因为它们响应程序运行时发生的事件。事件句柄通过窗体
文件(Windows 下是 .dfm,Linux 下是 .xfm)赋给指定的事件(事件是一种特殊的属性)。
当Greeting 程序启动时,显示Form1 而隐藏Form2(默认情况下,只有工程文件中最先创建的
窗体是可见的,它称为主窗口)。当用户点击Form1 上的按钮时,Form1 消失而被Form2 取代,后者
将显示 ”Hello world!” 信息。当用户关闭Form2(点击CancelButton 按钮或窗口标题栏上的关闭按
钮)后,Form1 重新显示。