程序结构与基本类型

基础

Delphi 的程序基本结构

控制台应用程序

1
2
3
4
5
6
7
8
9
10
program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;

begin
{ 这里插入主程序代码 }
end.
  • program 语句表示生成一个应用程序,后面跟程序名称
  • {$APPTYPE CONSOLE} 用于控制编译器生成控制台应用程序
  • uses 语句用于引用其他 pascal 程序单元
  • “;” 分号表示分隔各个语句
  • beginend 包含程序的主体代码
  • end 后面需要带上 “.” 点号

DLL动态链接库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
library Project1;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
SysUtils,
Classes;

{$R *.res}

begin
{ 这里插入主程序代码 }
end.
  • library 语句表示生成一个DLL动态链接库,后面跟程序名称

窗口应用程序

1
2
3
4
5
6
7
8
9
10
11
12
13
program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
  • uses 语句中添加所使用到的模块以及各个 Form 窗体

单元程序

1
2
3
4
5
6
7
unit Unit1;

interface
{ 单元程序的接口部分 }
implementation
{ 单元程序的实现部分 }
end.
  • unit 语句表示本 pascal 源程序是一个单元,被其他单元引用
  • interface 用于声明本单元的接口部分
  • implementation 用于声明本单元的具体实现部分,直到 end 结束
  • end 表示单元结束

1
2
3
4
5
6
7
8
9
10
11
package Package1;

{ 各种编译指示字 }

requires
rtl;

contains
Unit2 in 'Unit2.pas';

end.
  • package 语句表示生成一个程序包,后面跟包名
  • requires 表示该包依赖其他包的列表
  • contains 用于表示本包包含其他的程序单元列表

关键字

程序区块类关键字

关键字 说明
program 标明应用程序项目的名称
library 标明库项目的名称
package 标明软件包库项目的名称
unit 表示一个单元的名称,一个源代码文件
uses 指代码所依赖的其他单元
interface 表示单元中的声明的区段开始
implementation 表示单元中的实现的区段开始
initialization 当程序启动前,要先被执行的源码区段开始(每个单元都可以有)
finalization 当程序结束前,最后要被执行的源码区段开始(每个单元都可以有)
begin 代码块的开始
end 代码块的结尾

声明类型关键字

关键字 说明
tpye 开始一个类型声明块
var 开始一个变量声明块
const 开始一个常量声明块
set 用于表示集合类型
string 用于表示字符串类型
array 用于表示数组类型
record 用于表示记录类型
integer 用于表示整数类型
real, single, double 用于表示浮点数类型
file 用于表示文件类型

流程控制关键字

关键字 说明
if 条件语句开始
then 将条件表达式与需要执行的代码分隔开
else 不符合条件而需要执行的代码开始
case case多重条件匹配语句开始
of case多重条件匹配语句中将各条件与选项分隔开
for for/for-in循环语句开始
to for循环中指定变量递增终止值
downto for循环中指定变量递减终止值
in for-in循环中指示要循环迭代的集合
while while条件循环语句开始
do 将循环条件与代码分隔开
repeat repeat循环语句开始
until 指出repeat循环终止的条件
with with语句开始,简化使用指定的数据结构
function 声明函数开始
procedure 声明过程开始
inline 声明函数、过程内联优化
overload 声明函数、过程重载

类对象相关关键字

关键字 说明
class 声明一个类
object 声明一个类(旧式的类、已经废弃)
abstract 指示字,声明一个抽象类、抽象方法
sealed 指示字,声明一个封闭类
interface 声明一个接口(在第一组关键字出现过)
constructor 声明一个构造方法
destructor 声明一个析构方法
virtual 指示字,声明一个虚方法
override 指示字,指明虚方法、动态方法重写
inherited 调用父类方法
private 声明类、记录中的 private 区开始
protected 声明类的 protected 区开始
public 声明类、记录中的 public 区开始
published 声明类的 published 区开始
strict 用于声明更严格的 private、protected 区开始
property 声明一个类的属性
read 声明类的字段的 read 方法
write 声明类的字段的 write 方法
nil 表示空指针、空引用

异常处理关键字

关键字 说明
try 声明可以异常处理的语句区块开始
except 发生异常后的处理区块开始
finally 不管是否发生异常都执行的区块开始
raise 抛出异常

运算符关键字

关键字 说明
as 运算符:尝试类型转换
and 运算符:与
div 运算符:整除
is 运算符:检测对象是否兼容某类型
in 运算符:数值是否在集合中
mod 运算符:取余
not 运算符:按位取反,非
or 运算符:或
shl 运算符:左移
shr 运算符:右移
xor 运算符:异或

其他关键字

关键字 说明
asm 内联汇编区块开始
assembler 指示字,说明过程或函数是用汇编实现的(废弃,保留兼容)
automated 自动类型的成员区域开始(类似private、public、protected修饰符)
default 声明类中的属性的默认值
dynamic 指示字,声明一个动态方法(另一种相当于虚拟方法的实现方式)
export dll中用来导出符号(已经被exports取代)
exports dll中用来导出符号
external 指出过程、函数不在本单元中实现,位于外部单元,或者外部dll
file 声明文件类型,已经很少用到了
forward 指出过程、函数前置声明(具体实现在本单元的后面)
goto 绝对跳转到标号
index 指示字,用于声明多个属性可以通过索引使用同一个 read、write方法
(现在已经很少用了)
label 声明标号
message 指示字,用于声明消息处理方法
name 指示字,用于声明外部函数的真实名称
nodefault 表示该属性没有默认值
on 用于列表异常的各种匹配的类型与值
out 输出式参数声明,引用传递,但是允许未初始化
packed 表示记录或者数组采用紧凑方式存储
reintroduce 指示字,用于表示虚拟方法、动态方法重新定义和引入
resourcestring 声明资源字符串常量,位于exe/dll中的资源区的
threadvar 线程局部存储,必须声明为全局变量
absolute 定义变量新名称,位于前面的变量同一个地址;
如:var NewByteVar: byte absolute OldInt64Var
dispinterface 用于声明一个特定的适配器的接口
dispid dispinterface 声明的接口中,用于指定例程、属性的特定的适配序号
requires 用于软件包,指出本包必须依赖其他包
contains 用于软件包,指出本包包含哪些单元

Delphi 基本数据类型

整数类别

类型名 字节大小 位数 符号
ShortInt 1 8位 有符号整数
SmallInt 2 16位 有符号整数
Integer 4 32位 有符号整数
LongInt 4 32位 有符号整数
Int64 8 64位 有符号整数
Byte 1 8位 无符号整数
Word 2 16位 无符号整数
Cardinal 4 32位 无符号整数
LongWord 4 32位 无符号整数
UInt64 8 64位 无符号整数
NativeInt 4/8 32/64位 有符号整数(32位平台下为32位,64位平台下为64位)
NativeUInt 4/8 32/64位 无符号整数(32位平台下为32位,64位平台下为64位)

System 这个单元当中预先定义的类别别名:

1
2
3
4
5
6
7
type
Int8 = ShortInt;
Int16 = SmallInt;
Int32 = Integer;
UInt8 = Byte;
UInt16 = Word;
UInt32 = Cardinal;

PtrUIntNativeUInt 的变体。

内建函数

处理有序类型的系统内建的函数(编译器函数):

函数名 含义
Dec 把参数一自减1,如果有参数二,则把参数一递减参数二的数值
Inc 把参数一自增1,如果有参数二,则把参数一递增参数二的数值
Odd 判断是否奇数,如测试偶数则前面加 not(not Odd)
Pred 返回参数的前一个数值
Succ 返回参数的后一个数值
Ord 返回指定类型的参数的序列编号,例如 Ord('A') 返回 65
Low 返回该类型的最小值
High 返回该类型的最大值
SizeOf 返回该类型或者对象的占用内存字节数
Ptr 把数值转换为指针类型
Chr 把数值转换为Char字符类型,例如 Chr(65) 返回 'A'

助手函数

助手函数是可以把整数看作是一个对象,助手函数当作方法来调用的一种方式,例如:

1
100.ToString;
函数名 含义
ToString 数值转成字符串后返回
ToBoolean 数值转换成布尔类型
ToHexString 把数值转换成十六进制表示字符串
ToSingle 数值转换成单精度浮点数
ToDouble 数值转换成倍精度浮点数
ToExtended 数值转成扩展精度浮点数
Size 返回占用字节数
Parse 把字符串转换为整数,无法转换则抛出异常
TryParse 把字符串转换为整数,无法转换则返回0

布尔类型

类型名 字节大小 位数 符号
Boolean 1 8位 有符号整数
ByteBool 1 8位 有符号整数
WordBool 2 16位 有符号整数
LongBool 4 32位 有符号整数

布尔类型只有 truefalse 两种值,其他整数类型转换为布尔型时,需要显示类型转换,如:boolean(6)

注:为了跟微软的 COM 以及 OLE automation 兼容,ByteBool, WordBool, LongBool 都以 -1 表示 True, 以 0 表示 False

实数类型

类型名 字节大小 位数 精度 其它说明
Single 4 32位 单精度浮点数
Double 8 64位 双精度浮点数
Extended 8/10/16 64/80/128位 扩展精度浮点数 与平台相关,类似 Clong double
Comp 8 64 定点数 Int64来模拟浮点数实现的定点数
不能进行递增或递减运算
Currency 8 64 定点数 用于货币计算的定点数
总是会保留小数点后四位

字符类型

类型名 字节大小 位数 其它说明
AnsiChar 1 8位 单字节字符
WideChar 2 16位 宽字符
Char 1/2 8/16位 字符(依赖Delphi版本)
Delphi 2010版本后默认为 WideChar
UCS4Char 4 32位 其实是 LongWord 的变体

字符类型依旧是有序的类型,也可以使用 DecInc 等函数。

字面量

整数字面量,例如:

1
2000

可以用下划线来做为数值分隔,以便于更好阅读 (Delphi 11):

1
2_000_000

十六进制方式的面量,例如:

1
$1000       // 相当于十进制的 4096

浮点数要加上小数点表示:

1
100.0       // 表示浮点数的 100

字符表示:

1
2
'A'         // 表示字符 A
#32 // 表示字符 空格

字符串表示:

1
2
'string1'
'strng''2000' // 如果字符串中包含单引号,则用两个单引号来表示转义一个单引号

字符串分多行表示:

1
2
'Hello ' +      // 字符串多行表示用 + 连接起来,编译器会自动把它们粘合在一起
'World'

带换行符的字符串多行表示:

1
2
'Hello ' + sLineBreak +     // sLineBreak 表示换行符的字符串
'World'

特殊字符转义:

1
'Hello ' + #$0061 + ' World'  // 用 # 号来转义特殊字符($0061表示 Unicode 字符)

枚举类型

枚举类型的声明如下:

1
2
3
4
type
TMyColor = (Red, Blue, Blue); // 内部数值从 0 开始递增
var
value1: TMyColor;

指定数值的枚举,例如:

1
2
3
4
5
6
7
type
TMyColor = (Red, Blue = 8, Blue = 14);
var
value1: TMyColor;
begin
value1 := TMyColor(8); // 可以将数字转换为枚举
end;

匿名类型的枚举,例如:

1
2
var 
value1: (Red, Blue, Blue);

子界类型

子界类型的声明如下:

1
2
type 
TMySub = 100..200;

上面子界类型表示可以是 100 ~ 200 (包括100和200)之间的任何整数。

定义子界类型的变量:

1
2
3
4
5
type 
TMySub = 100..200;
var
value1: TMySub;
value1: 600..700; // 匿名类型的子界