Object Pascal编程语言手册

01:用Pascal写程序

注释


Program HelloConsole;
{$APPTYPE CONSOLE}

Var 
  strMessage: string;
Begin
  strMessage := 'Hello, World!你好世界!';
  writeln (strMessage);
  writeln('Delphi编译器版本:' + CompilerVersion.tostring); // Delphi13 对应的是37

// 以下这个指令,是用来等待使用者输入,直到使用者按下Enter 键为止
  readln;
End.

编译器的设定值(会以$这个符号开头,并且用大括号整个包起来

三种注释类型:

//从左边出现了两个斜线以后,到本行的末端都会被视为批注
{这里面的跨行文字都是批注}
(*这是另一种
多行文字批注的写法*)
  • 在IDE的编辑器里面,您可以按下Ctrl+/这组快捷键,来把单一一行源码,或者选择多行源码进行注释或者解除注释
  • 在大括号之后如果出现$,就不再代表是注释,而是编译器的设定代码
  • 标识符中,Object Pascal是把英文字母大小写视为相同的,英文称为Case-Insensitive

关键词

构成整个应用程序项目的骨干的关键词:

program 标明应用程序项目的名称
library 标明函式库专案的名称
package 标明套件函式库专案的名称
unit 标明单元文件的名称,单元文件也就是源码的原始档
uses 指示当前这个单元文件会参考到哪些单元档案
interface 单元文件的区段,用来进行宣告
implementation 单元文件的区段,用来放置实作的源码
initialization 当程序启动时,要先被执行的源码区段
finalization 当程序结束前,最后要被执行的源码区段
begin 宣告一个源码区块的开始
end 宣告一个源码区块的结束

跟一些基础数据型别的宣告与变量相关的关键词

type 标明开始进入数据类型声明区段
var 标明开始进入变量宣告区段
const 标明开始进入常数宣告区段
set 定义一个集合变量
string 定义一个字符串变量,或者自定的字符串型别
array 定义一个数组型别
record 定义一个复合数据型别
integer 定义一个整数变量
Real,single, double 定义一个浮点数型态的变量
file 定义一个档案变量
record 定义一个复合数据型别

介绍 Object Pascal 编程语言的基础叙述句的关键词:

if 标明一个条件判断式
then 将条件判断式与符合条件时执行的源码分隔的符号
else 标明条件判断式中,不符条件时要执行的源码
case 标明一个多重选项的条件判断式
of 把多重选项判断式的条件与各个选项分隔的符号
for 标明一个固定次数的循环开始
to 标明 for 循环将变量递增计算时的最终数值
downto 标明 for 循环将变量递减计算时的最终数值
in 标明在列举循环当中,用来表示要被列举的组合变量
while 标明一个条件化的循环开始
do 把 while 循环的条件式与要执行的源码做分隔的符 号
repeat 标明一个具终止条件的循环开始
until 标明repeat循环的终止条件
with 标明要针对特定的数据结构进行处理
function 标明一个会回传执行结果的子程序(名为函式)
procedure 标明一个不会回传执行结果的子程序(名为程序)
inline 要求编译器对函式或程序进行优化
overload 允许同名的函式或程序被重复使用(称为多载)

跟类别、对象相关的关键词:

class 标明一个新的类别型别
object 用来标明一个就的类别型别(目前已不再使用)
abstract 标明一个抽象类,表示该类别还没有完全被定义
sealed 标明一个已封锁类别,该类别不能再被继承
interface 标明一个接口型别(这个关键词也在第一组当中出现 过)
constructor 一个类别或对象的初始方法
destructor 一个类别或对象的清除方法
virtual 一个虚拟方法,在衍生类别中需要被实作出来
override 在衍生类别中,实作虚拟方法的关键词
inherited 直接呼叫、引用父类别的方法
private 宣告类别中不能被外界存取的属性、事件或方法
protected 宣告类别中有条件供外界存取的属性、事件或方法
public 宣告类别或记录中可以完全被外界存取的属性、事件或方法
published 宣告类别中特别为了用户建立的属性、事件或方法
strict 比private跟protected限制更为严格的类别区段
property 被对应到变量或方法的一个符号,称之为类别的属性
read 属性的数据源
write 属性的变更方法
nil 表示空对象,在许多有指针类型的语言当中也都有乡对应的特别符号,在C里面称为NULL

异常处理关键词:

try 标明例外处理区块开始
finally 表示不管例外发生与否,都要被执行的区块
except 表示当例外发生时,要被执行的源码区块
raise 用来触发一个例外事件

运算相关的关键词:

as and div
is in mod
not or shl
shr xor

一些比较不常用的关键词,包含一些不建议使用的旧的关键词:

default 意指一个属性的默认值
dynamic 宣告虚拟方法的另一个被实现的源码
export 传统用来输出的关键词,已经被下一个关键词取代了
exports 在 DLL 项目中,列出要输入让其他程序使用的函式
external 指向我们要绑定的外部DLL中的函式名称
file 用来定义传统的 file 型别,这个型别近年来已经很少用到了
forward 表示一个函式预先宣告,实际的宣告在后面的源码才会完整出现
goto让源码跳到程序中另一个标注的位置继续执行,强烈建议绝对不要使用这个功能。
index 用在当需要引入或者输出函式时,标明当中有索引的 属性(现在已经很少用了)
label 定义一个特别的程序位置,让goto指令能直接跳到此 一位置继续执行,强烈建议绝对不要使用这个功能。
message 虚拟函式的替代关键词,和不同平台的讯息相关
Name 用以对应外部函式
nodefault 表示该属性没有默认值
on 用来触发例外状况
out
var关键词的替代字,是用来表示一个引用参数(call by reference),但没有被进行过初始化
packed 改变记录(record)或者数据结构在内存中的排列
reintroduce 允许重复使用一个虚拟函式的名称
requires 在制作套件时,用来宣告所需要的其他套件名称

单元文件的结构

unit Unit1;

interface

implementation

end.
  • 单元文件要有一个整个项目不能重复的名字为之命名,同时也当作文件名,如 Unit1.pas
    • 单元的名称必须跟单元文件的文件名一致,程序名也一样
    • 单元名的规则还有一个延伸的规则,就是单元名可以包含., 如:mycompany.myproject.unit1
  • 单元文件一定要有一个interface区段,用来宣告让其他单元文件可以使用、存取的资料
  • 单元文件要有implementation区段,用来实作这个单元文件里面 真正的源码
  • 可选:每个单元还可以有initialization 跟 finalization 这两个非必要的区段
    • Initialization 是用来处理该单元被执行时最开始的源码
    • finalization 则是用来处理该单元在程序结束时要处理的源码。

一个相对完整的Unit源码结构:

unit UnitName;
interface

uses
 UnitA, UnitB, UnitC;
// 要公告周知的型别定义
type
 NewType = TypeDefinition;
// 要公告周知的常数
const
 Zero = 0;
// 全局变量
var
 Total: Integer;

// 要公告周知的函式与程序
procedure MyProc;
implementation
// 其他在 implementation 区段我们会引入的单元名称

uses
 UnitD, UnitE;
// 不对其它单元文件告知的全局变量
var
 PartialTotal: Integer;
// 所有被公告的函式都必须在此被实作
procedure MyProc; begin
// ... MyProc 这个程序的源码
end;
initialization
// 非必要的 initialization 区段的源码
finalization
// 非必要的 finalization 区段源码
end.
  • 一个单元的 interface 区段存在的意义,是为了告知其它单元,这个单元包含什么,能为其它单元或项目提供什么。而 implementation 区段则包 含了所有其它单元都无法得知的源码。这也是Object Pascal之所以可以提供信息封装,而不需要靠类别或对象就能达成该功能的原因。
  • Uses条文位于interface区段的开头部分,是用来标示我们在该单元中需要参考的其它单元名称。是标明我们在这个单元当中,为了定义数据型别时,需要参考的其它单元,而参考的程序也限于那些单元的数据型别,例如我们在画面窗体当中定义的组件。
  • 第二个uses条文是出现在implementation区段的开头,是标明我们只在源码 实作阶段需要参考的单元文件。当您只需要参考其它单元的源码,例如子程序、方法,我们就得在implementation区段当中的uses来标明这些单元的名称,这个作法可以减少对档案的依赖度并减少编译所耗费的时间。在uses条文中被标明要参考的单元文件,都必须位于项目目录当中,或者IDE环境的搜寻路径当中,这样编译才不会出问题。
  • Object Pascal 的二进制编译文件(DCU)只会在使用相同版本的编译器与系统函式库时兼容。
  • 在Object Pascal当中,单元正是数据封装与源码界限的关键,在这个规范下,单元能提供的源码界限甚至比类别中private或public关键词能提供的还更重要。
  • Object Pascal 跟 C、C++都不一样,Object Pascal 在一般源码区块里面不允许变量、常数的宣告。当我们已经进入了 begin-end 的源码区块范 围之后,在这里面就不能够再宣告任何变量了。
    • 简单的说,当我们透过uses条文把其它单元引入的时候,在被引入的单元中,interface区块所宣告的所有标识符也在新的单元文件里面变成可以被存取的了。
    • 如果在interface区段宣告了一个标识符(可能是型别、函式、类别、变量等等),所有引用现在建立的这个单元的其它所有源码也都可以看到这个刚宣告的标识符了。但如果是在implementation区段中宣告这个标识 符的话,则这个标识符就只能在自己这个单元文件中被看见,其余引用这个单元的源码都无法看见了,我们可以把它理解成区域标识符,就像局部变量那样。

把单元⽂件当成命名空间来使用: 有时在两个单元文件里面可能宣告了相同的标识符,例如您可能有两个类别, 或者两个子程序使用了完全相同的名字。在这种情形下,我们可以简单的把单元名称前置在这个被重复使用的标识 符之前。举个例子来说,您可以引入在Calc这个单元当中名为ComputeTotal的程序,这时我们可以把它写成Calc.ComputeTotal

02:变量与数据型别

  • 最新版的 Delphi 已经加入了可以在源 码当中随处宣告变量(inline)的功能。这跟古典传统的 Pascal 是很显著的不同。
  • 对于数值很大的数字,也是从 Delphi 11 开始,我们可以用底线来做为数值分隔的逗点(西方的数值分隔符, 是每三位数加一个逗点),作为分隔数值符号的底线,会自动被编译器忽略,例如,我们可以把 2 千万写成: 20_000_000
  • 赋值: :=, 全局变量定义时初始化可以使用 =
  • 常数: 要宣告常数,我们可以不用指定资料型别,只要直接指定初始值就行了(具体类型可能不是你期望的), 但指定类型可以让编译器按你指定的类型分配内存

Program HelloConsole;
{$APPTYPE CONSOLE}

Uses 
System.SysUtils;

Const 
  pi = 3.14;

Var 
  age: integer = 18;
Begin
  writeln('年龄:' + inttostr(age));

  Var i,j: integer;
    i := 100;
    j := i+100;
    writeln(j);
    writeln(pi);
  End.

有序类型:最重要的三个型别分别是:Integer(整数), Boolean(布尔值), 以及Char(字符)

类型 位数 范围 别名
ShortInt 8 -128~127 Int8
Byte 8 0~255 UInt8
SmallInt 16 -32768~32767(-32k~32k) Int16
Word 16 0~65535(64k) UInt16
Integer 32 -2,147,483,648 到
2,147,483,647 (-2GB到正2GB)
Int32
Cardinal 32 0 到 4,294,967,295
(0到4GB)
UInt32
Int64 64 -9,223,372,036,854,775,808
到9,223,372,036,854,775,807
Uint64 64 -9,223,372,036,854,775,808
到9,223,372,036,854,775,807

整数类型部分数值函数:

ToString 把数值转成字符串,以十进制表示
ToHexString 把数值转换成字符串,以十六进制表示
ToBoolean 把数值转换成布尔型别
ToSingle 把数值转换成单精度浮点数型别
ToDouble 把数值转换成倍精度浮点数型别
ToExtended 把数值转成extend浮点数型别
Size 该型别使用多少个字节来存放数据
Parse 把一个字符串转换成字面上显示的数值,如果该字符串并不是数值,就会抛出一个型别转换例外事件。
TryParse 试着把字符串转换成数值,如果字符串不是合法的数字,则会回传0

示例:


Program HelloConsole;
{$APPTYPE CONSOLE}

Uses 
System.SysUtils;

Begin
  // ToString 把数值转成字符串,以十进制表示
  // ToHexString 把数值转换成字符串,以十六进制表示
  // ToBoolean 把数值转换成布尔型别

  Var i,j: integer;
    i := 89430721;
    j := 0;
    writeln(i.ToString);
    writeln(i.ToHexString);
    writeln(i.ToBoolean);
    writeln(j.ToBoolean);

    // 89430721
    // 05549AC1
    // TRUE
    // FALSE



(*
    ToSingle 把数值转换成单精度浮点数型别
    ToDouble 把数值转换成倍精度浮点数型别
    ToExtended 把数值转成extend浮点数型别(32、64位平台可能不全支持)
    Size 该型别使用多少个字节来存放数据
*)


  Var k: int32;

  Var l: int64;

  Var m: single;

  Var n: double;

    k := 123;
    l := 843248174021743;
    m := 3.1415987654321;
    n := 3.1415987654321;
    writeln(k.ToSingle);
    writeln(l.ToSingle);
    writeln(k.ToDouble);
    writeln(l.ToDouble);
    writeln(k.Size);
    writeln(l.Size);
    writeln(m.Size);
    writeln(n.Size);
    //  1.23000000000000E+0002
    //  8.43248176201728E+0014
    //  1.23000000000000E+0002
    //  8.43248174021743E+0014
    // 4
    // 8
    // 4
    // 8

(*
    bool success = targetType.TryParse(sourceString, out targetVariable);
    Parse 把一个字符串转换成字面上显示的数值,如果该字符串并不是数值,就会抛出一个型别转换例外事件。
    TryParse 试着把字符串转换成数值,如果字符串不是合法的数字,则会回传0
*)

  Var success: Boolean;
    l := 0;
    success := int64.TryParse('123',l);
    writeln(success);
    writeln(l);

    l := 0;
    success := int64.TryParse('123.123',l);
    writeln(success);
    writeln(l);

    // TRUE
    // 123
    // FALSE
    // 123


    m := 0;
    success := single.TryParse('123',m);
    writeln(success);
    writeln(m);

    n := 0;
    success := double.TryParse('123.123',n);
    writeln(success);
    writeln(n);

    // TRUE
    //  1.23000000000000E+0002
    // TRUE
    //  1.23123000000000E+0002

  End.

page68

正文完
 0
评论(没有评论)