本章要点:
Object Pascal基本知识
常用数据类型
常量变量的定义及使用
用运算符及表达式第 2章 Object Pascal语言基础
2.1 基本概念
Delphi 7.0是一个基于 Object Pascal语言的 Windows应用程序开发系统,在所有的事件处理过程和应用程序中都是使用它来编写程序代码。 Object Pascal编程语言是在 Pascal
语言的基础上发展起来的,它继承了 Pascal语法严谨、数据结构丰富等优点,同时融入了面向对象编程的语法要素,使之成为一种优秀的面向对象编程语言。
2.1.1 保留字首先介绍 Object Pascal语言的最基本内容:保留字和标志符。
保留字( Reserved Words)是由系统规定的、具有特定意义的单词。
在编程时不能被重新定义或另作他用。 Object Pascal 语言规定的保留字有
65个,详见本教程 P23页表 2-1。
除了上述的保留字外,Private,Protected,Public,Published 和
Automated在定义对象类型时也作为保留字,而在其他场合则作为指令符。单词 at和 on也具有特殊的含义。
注意,Object Pascal 编程语言和许多编程语言不同,它对单词的大小写是不敏感的。 Object Pascal不区分大小写。 IN,in和 In都被看做是同样的意义。
2.1.2 标识符标识符 是 Object Pascal语言中用来表示应用程序量的名称。包括:
变量 (Var)、常量 (Const)、类型 (Type)、过程 (Procedure)、方法
(Method)等。
标识符分为标准标识符和自定义标识符两类。
标准标识符是 Object Pascal语言系统预先分配给标准常量、标准类型、标准函数、标准过程及标准文件使用的标识符。如标准常量:
False,True;标准类型,integer,char,real;标准函数,Abs,Sqr、
Cos等。
自定义标识符是程序员根据需要为自己定义的常量、变量、类型、
函数、过程以及所编写的程序名等。 Object Pascal标识符由字母、数字、下划线组成,其规定为:
( 1)必须以字母或下划线开始;
( 2)不能与保留字相同;
( 3)避免与 Object Pascal已经使用的标准标识符相同。
2.1.3 指令符指令符( directives)也是具有特殊意义的单词,但与保留字不同的是可以将指令符定义为标识符,Object Pascal不会指示出错,但这容易混淆。
Object Pascal 规定的指令符见表 2-2。
absolute abstract assembler automated cdcel contains
default dispid dynamic export external far
forward implement
s
index message name near
nodefault overload override package pascal private
protected public read readonly register retroduce
requires resident safecall stdcall stored virtual
write writeonly
表 2-2 Object Pascal 语言规定的指令字
2.2 数据类型描述客观事物的数、字符以及所有能输入到计算机中并被计算机程序加工处理的符号的集合称为数据。数据的一个重要特征就是其所属的数据类型,数据类型不仅确定了该类数据的表示形式和取值范围,而且还确定了数据所能够参加的各种运算。
Object Pascal提供了多种数据类型,包括标准数据类型和高级数据类型。标准数据类型属于 Object Pascal内部约定的数据类型,无需定义就可以直接使用。标准数据类型有整型( Integer)、实型( Real)、字符型
( Character)、字符串型( String)、布尔型( Boolean)五种。高级数据类型体现了特殊的数据结构,在使用之前必须由用户自己进行定义。高级数据类型有枚举型( Enumerated)、子界型( Subrange)、集合类型
( Set)、数组类型( Array)、记录类型( Record)文件类型( File)、
类类型( Class)、类引用类型( Class Reference)、接口类型
( Interface)、指针类型( Pointer)、过程类型( Procedural)、可变类型( Variant)。
2.2.1 整型整数包括正整数、负整数和零。
整型是存储整数数据的类型。 Object Pascal包括 9种形式的整型数据,详见本教程 P25页 表 2-3。
前 2种为一般整型,后 7种为基本整型,应尽量使用 Integer,Cardinal
两种基本类型,因为它们在各种 CPU和操作系统中都提供最佳的性能。
通常,作用于整数的算术运算符返回 Integer类型的值。在当前执行中,
等价于 32位的长整型( LongInt)。仅当对 Int64类型执行运算时,运算结果返回 Int64类型。因此,下面的代码执行后得到的结果是不正确的:
var
i,Integer;
j,Int64;
...
i,= High(Integer); //取 Integer类型中的最大值
j,= i + 1;
要使返回值是 Int64类型,在上面的情况中可以将 i 转换为 Int64。代码如下:
...
j,= Int64(i) + 1;
2.2.2 实型实数是最常用的数据类型。
在 Object Pascal中实数有两种表示方法,小数表示法和科学计数法。
例如,
-3.6,2.4e0,–1.2e-5,3E7
小数表示法与日常数学中所用表示方法相同。科学计数法中,e之前表示有效数字,e之后数字表示 10的幂。即
–1.2e-5=(-1.2) × 10-5=-0.000012
需要注意的是小数表示法中小数点前后都必须有数字,科学计数法中
e前后都必须有数字,e可以大写成 E。
实型是存储实数数据的类型。 Object Pascal包括 5种形式的实型数据,详见本教程 P26表 2-4。
(图 1-2)
前六种为基本数据类型,Real为一般实型。最常用的实型是 Real类型,它与 Double等价。 Currency是专为处理货币而设计的,该类型与其他实型进行运算时,Delphi自动将结果转化为 Currency类型。
2.2.3 字符型字符型是存储单个字符的类型。 Object Pascal包括 3种形式的字符型数据,详见表 2-5。
基本字符类型是 AnsiChar和 WideChar。 AnsiChar的尺寸是一个字节 ( 8
位 ),其值参照本地字符集 。 AnsiChar最初模仿 ANSI字符集,但现在用于扩大到当前的本地字符集 。 WideChar字符用多于一个字节来表示每个字符 。
WideChar的尺寸是一个字 ( 16位 ),其字符顺序参照 Unicode字符集,
Unicode字符集中的前 256个字符对应 ANSI字符 。
一般字符类型是 Char,等价于 AnsiChar。
字符类型数据的表示方法是用两个单引号括起单个字符如,'A','6',','。
' ' 表示空格符。
表 2-5 Object Pascal 语言的字符型类型 名称 字节数 取值范围
Ansi字符型 AnsiChar 1 扩展 ANSI字符集宽字符型 WideChar 2 UniCode字符集字符型 Char 1( 2) 扩展 ANSI字符集
2.2.4 字符串型字符串型是存储字符串数据的类型。 Object Pascal包括 4种形式的字符串型数据,详见本教程 P27页表 2-6。
保留字 string的作用如一般类型的标识符。例如:
var S,string;
创建了变量 S,用于保存串。在默认的编译指示 {$ H+}状态下,编译器将 string(后面没有跟随方括号和数字)解释为 AnsiString;使用编译指示 {$ H-}时,解释为 ShortString。
ShortString类型串的长度在 0到 255之间。 ShortString串的长度可以动态改变,其占用的内存是静态的,总是 256字节;第一个字节存储串的长度,其余 255个字节存储串中的字符。
AnsiString也叫做长串( long string),用来表示动态分配的串。
WideString类型表示 16位 Unicode字符的动态分配的串。 WideString
类型大部分的特性与 AnsiString类型相似。
Object Pascal还支持其他最大长度在 0到 255之间的短串。可以通过在保留字 string后边附加方括号括起来的数字来表示。例如:
var MyString,string[100];
创建了一个叫做 MyString的变量,其最大长度为 100个字符。
2.2.5 布尔型布尔型数据用于进行逻辑运算,布尔型数据的值只有两个,True(真 )
和 False(假 )。
Object Pascal包括 4种形式的布尔型数据,详见表 2-7。
Boolean类型是编程时常用的布尔类型,其他三种类型是为了兼容其他语言而设置的。 Boolean类型的取值为 False和 True两个符号常量。
在 Object Pascal中,布尔表达式不能被等同为整数或实数。因此,如果 x
是一个整数类型的变量,那么语句
if x then,..;
将产生一个编译错误。
可以将上个语句改为:
if x=1 then,..;
表 2-7 Object Pascal 语言的布尔型类型 名称 字节数 取值布尔型 Boolean 1 只能为 False( 0)或 True( 1)
字节布尔型 ByteBool 1 False或 True(非 False)
宽布尔型 WordBool 2 False或 True(非 False)
长布尔型 LongBool 4 False或 True(非 False)
2.2.6 序数类型
1,序数类型序数类型包括整数、字符、布尔、枚举、子界等类型。序数类型定义了一个有序的值的集合。集合中的每个值(除第一个)都有一个唯一的前驱值,每个值(除最后一个)都有一个唯一的后继值。对于第一个序数的前趋和最后一个序数的后继在此不做讨论。此外,每个值都有一个序号,
类型中的序号决定值在类型中的顺序。大多数情况下,如果一个值的序号为 n,那么它的前驱值的序号为 n–1,后继值的序号为 n + 1。
2,序数函数
( 1)序数函数 Ord()返回数据的序数。
例如,Ord( 6)的返回值为 6,表示整数 6的序数是其本身。
( 2)前趋函数 Pred()返回数据的前趋值。
例如,Pred( 'e')的返回值为 'd',表示字符 e的前趋是字符 d。
( 3)后继函数 Succ()返回数据的后继值。
例如,Succ( False)的返回值为 True,表示布尔型数据 True是 False的后继。
( 4)首序数函数 Low()返回序数类型的数据中序数最小的一个数据。
( 5)末序数函数 High()返回序数类型的数据中序数最大的一个数据。
2.3 常量与变量在程序设计中常用到两种形式的数据,一种是在程序执行过程中其值保持不变的数据,称为常量;另一种是在程序执行过程中其值可以改变的数据,
称为变量 。
常量是一种在程序执行进程中其值保持不变的数据。
根据使用的方式不同,程序中的常量分为直接常量、真实常量与类型常量。
2.3.1 常量
1,直接常量直接常量是指在程序中直接引用的整数、实数、字符、字符串或其他不同类型的常数。下列常数均属于直接常量。
( 1)带有正负号的整数或无符号的整数,如,-1,+2,2003,0。
( 2)实数,包括定点实数与浮点实数两种表示形式。
定点实数即小数形式,如,0.03,-32.48,+102.9,0.0。
浮点实数即指数形式,如,+2.56E-5,-1.2E+8,3.2E12。
2.3.1 常量 (2)
2,真实常量真实常量是指一个被声明的标识符,它的值不能改变。
如果在一个程序中,某一个常数反复多次出现可以定义一个标识符来代表该常数。
定义常量时使用常量说明语句,语法格式为:
const
<常量名 1>=<常量值 1>
…
<常量名 n>=<常量值 n>
其中 const是 Object Pascal的保留字,表示常量定义的开始。 <常量名 >即常量的标识符,<常量值 >是直接常量或常量组成的表达式。例如:
const
PI=3.1415926;
K=PI/180;
不能在程序中给常量另行赋值,否则会导致语法错误。
( 3)字符,由单撇号括起来的单个字符,如,'a','C','6','+'。
( 4)字符串,由双撇号括起来的字符串,如,"hello","abc123",
"3.234"。
( 5)布尔型常数,只有两个值 True和 False。
2.3.1 常量 (3)
3,类型常量类型常量不同于真实常量,它能保存数组、记录等高级数据类型的值。
定义类型常量的语法格式如下:
const
<常量名 >:<类型名 >=<常量值 >;
例如:
const
Hello,string = 'Hello';
Max,Integer = 100;
Digits,array[0..9] of Char = ('0','1','2','3','4','5','6','7',
‘8’,‘9’); //定义了一个常量用于保存数组在缺省的编译状态 {$ J-} 中,类型常量不能被赋予新的值,这时的类型常量相当于只读变量。然而,如果编译指示 {$ J+} 有效,那么类型常量可以被赋予新的值,这时的类型常量相当于被初始化过的变量。
变量是程序代码中代表一个内存地址的标识符,而此地址的内存内容在程序代码执行时可以被改变 。 在使用变量前必须对它进行说明,即对它进行命名,并说明它的类型 。 变量就像数据容器,而且由于变量被定义了类型,只能用于储存与其定义类型相兼容的数据 。
2.3.2 变量 (1)
变量有如下三个主要特征。
( 1)变量名:即变量的标识符,用于对所代表的内存单元的引用。
( 2)类型:变量的类型决定了变量中所存放数据的范围、
有效的操作、存储空间的大小和格式。
( 3)变量值:变量所代表的内存单元中的数据值。
程序中的变量必须先声明才能使用。
1,变量的声明变量在单元、函数或过程的声明部分进行声明,声明位置决定了变量的作用范围。变量声明的格式为:
2.3.2 变量 (2)
声明多个同类型的变量时可采用如下格式:
var <变量名 1> … < 变量名 n>,<类型名 >
其中 var是 Object Pascal的保留字,表示变量定义的开始,<变量名 >可以是任意合法的标识符,<类型名 >可以是 Object Pascal的基本数据类型也可以是由用户定义的高级数据类型。
声明在过程或函数内部的变量有时叫做局部变量,而在应用程序开始声明的变量叫做全局变量。全局变量可以在声明时对它进行初始化,格式为:
var <变量名 >,<类型名 >=<常量表达式 >
其中常量表达式的值必须与变量定义的类型相兼容。
var
<变量名 1>,<类型名 1>
…
<变量名 n>,<类型名 n>
2,变量使用变量经过声明之后,就可以在程序中使用了,通常可以通过赋值语句给变量赋值。
如果没有明确初始化全局变量,那么编译器将对其初始化为 0。
不同的是,局部变量不能在其声明中被初始化并且在其被赋值之前包含的是随机数据。一旦声明了一个变量,应及时对它赋值进行初始化,
未经初始化的变量的值是一个不确定的随机数,如果该变量参与运算或是出现程序流程中将会产生意想不到的后果。初始化变量的最简单方法就是给变量赋值。
2.3.2 变量 (3)
2.4 运算符与表达式运算是对数据进行加工处理的过程,描述各种不同运算的符号称为运算符,
而参与运算的数据称为操作数。表达式是表示某个求值规则的运算公式,它由运算符和圆括号将常量、变量等操作数以合理的形式组合而成。表达式可以用来执行运算、操作或测试数据,每个表达式都会产生惟一的值。表达式的类型由运算符的类型决定。在 Object Pascal 中有以下几种运算符:算术运算符、
位运算符、字符串运算符、关系运算符、布尔运算符、集合运算符、指针运算符、类运算符和@运算符。本章中先介绍几种常用的运算符。
1,算术运算符
Object Pascal有8个算术运算符,在这8个算术运算符中,除取正
“+”、取负“-”是单目运算符外,其他均为双目运算符,详见本教程 P31页表 2-8。
其中+、-、*运算的含义与数学中的相同,参加运算的数可以是整型也可以是实型,结果由 Delphi 7.0自动向精度高的数据类型转化。参加除法运算“/”的数无论是整型或是实型,结果都是实型。参加整数除法
,div”和求余运算,mod”的数必须是
2.4.1 算术运算符
2.4.1 算术运算符
2,算术表达式算术表达式是由算术运算符、数值型常量、变量、圆括号组成,其运算结果为一数值。
例如,3*4+(90-5)/4*2的值为 54.5。
在书写算术表达式时应当注意以下两点:
( 1)在数学中可以省略乘号,但在算术表达式书写中不可以省略,如在数学中相乘可以写成 2x,但在编程中必须写成 2*x;
( 2)所有括号都用小括号(),括号必须配对,例如数学式 3[x+(y-z)]
在编程中必须写成 3*(x+(y-z))。
整型,结果也是整型,分别是除法的商和余数。在表达式 a/b,a div b,a
mod b 中,如果 b的值为 0将会触发一个错误。
例如,10 mod 3的值为 1,10 div 3的值为 3。
2.4.2 位运算符位运算符是指对操作数进行的按位逻辑运算 。 其运算对象是整数,运算结果也是整数,Object Pascal有 6 个逻辑运算符,详见表 2-9。
and,or,not和 xor运算符当运算符两侧为数值数据,则将数值数据转换为二进制数(补码形式)进行按位运算。
设 x值为 3,y值为 5,在内存中按二进制保存,即 x,y值分别为 00000011,
00000101。按位计算结果如下:
not x 的值为 11111100 (十进制数 –4)
x and y的值为 00000001 (十进制数 1)
x or y 的值为 00000111 (十进制数 7)
x xor y 的值为 00000110 (十进制数 6)
x shl 2 的值为 00001100 (十进制数 12)
x shr 1 的值为 00000010 (十进制数 2)
运算符 名称 举例 运算符取值 名称 举例
not 按位取反 not x xor 按位异或 x xor y
and 按位与 x and y shl 左移位 x shl 2
or 按位或 x or y shr 右移位 y shr 1
表 2-9 Object Pascal 语言的位运算符
2.4.3 字符串运算符
Object Pascal只有一种字符串运算符,即连接运算符,+”。该运算符用于连接两个或更多的字符串。
当两个字符串用连接运算符连接起来后,第二个字符串直接添加到第一个字符串的尾部,结果是一个更长的包含两个字符串的全部内容的字符串,也可以把多个字符串连接起来,每两个字符串之间都要用,+”号分隔。例如:
'abcdef'+'123' 连接后结果为,'abcdef123'
'abc'+'123'+'xyz' 连接后结果为,'abc123xyz‘
加号( +)运算符对串的操作与其对数字的操作有很大差异。对于数字 a,b,
表达式 a + b与 b + a是等价的,对于字符串 s1,s2表达式 s1 + s2与 s2 + s1不是等价的。例如,当 s1为 'hello',s2为 'world'时,s1 + s2返回的值是 'helloworld',
而 s2 + s1返回的值是 'worldhello'。也就是说,当加号( +)作为字符串运算符时,操作数的位置顺序直接影响运算结果。
2.4.4 关系运算符关系运算符又称为比较运算符,用来对两个表达式的值进行比较,比较的结果是一个布尔值 ( True或 False) 。 关系表达式是指用关系运算符将两个表达式连接起来的式子 。 Object Pascal提供的关系运算符有 9种,详见表 2-10。
表 2-10 Object Pascal 语言的关系运算符运算符 名称 举例 运算符取值 名称 举例
= 等于 4=5值为 False > 大于 4>5值为 False
<> 不等于 4<>5值为 True <= 小于或等于 4<=5值为 True
< 小于 4<5值为 True >= 大于或等于 4>=5值为 False
关系运算符两侧可以是数值表达式、字符型表达式或其他表达式,也可以是常量、
变量或函数,但其两侧的数据类型必须是相容的标准数据类型或顺序类型。
各关系运算符的运算级别相同。运算次序为:先分别求出关系运算符两侧表达式的值,然后再把两者的值进行比较,两者的关系若与关系运算符指示的一样,则关系运算的结果为真( True),否则结果为假( False)。数值型数据按其数值大小进行比较;字符型数据按其 ASCII码值进行比较,比较字符串时先比较第一个字符,其中
ASCII码值较大的字符所在的字符串大。若第一个字符相同时比较第二个字符,… 以此类推。顺序类型数据的比较按照其序数进行比较。
2.4.5 布尔运算符在表示较为复杂的条件判断时,必须使用布尔表示式 。 布尔表达式是指用布尔运算符连接若干关系表达式或布尔值组成的式子,如 a≤x≤b可以表示为,a<=x And x<=b,
布尔表达式的值也是一个布尔值 。 Object Pascal提供 4种布尔运算符,详见表 2-11。
表 2-11 Object Pascal 语言的布尔运算符运算符 名称 举例 说明
and 与 ( 4>5) and( 3<4)
该表达式值为 False。当两个表达式的值均为真,结果才为真,否则结果为假。
or 或 ( 4>5) or( 3<4)
该表达式值为 True。两个表达式中只要有一个表达式的值为真,结果就为真,两个表达式的值均为假时结果为假。
not 非 not( 4>5) 该表达式值为 True。进行取“反”操作,由真变成假或由假变成真。
xor 异或 ( 4>5) xor( 3<4) 该表达式值为 True。当两个布尔表达式值不同时结果为 True。
2.4.6 运算符的优先级在一个表达式中进行多种操作时,Object Pascal会按一定的顺序进行求值,这个顺序称为运算符的优先顺序。在表达式中运算符的优先级决定了运算被执行的顺序。
常用运算符的优先顺序如本教程 P34页表 2-12所示。
当一个表达式中含有多个算术运算符时,将按优先级由高到低的顺序求值。优先级高的运算符在优先级低的运算符之前求值,优先级相同时自左向右求值,如果表达式中含有括号,则先计算括号内表达式的值,如果有多层,先计算最内层括号中的表达式。例如表达式:
x + y * z
先运算 y乘以 z,然后将乘积(运算结果)与 x相加;运算符 * 先被执行,因为它比运算符 +优先。
可以使用圆括号超越所有的优先级规则。圆括号中的表达式最先被求值,因此可以被视为一个单独的操作数。例如表达式:
(x > y) and (x > z)
首先判断 x是否大于 y,然后判断 x是否大于 z,最后将两次判断的结果相与,只有当 x
的值比 y,z的值都大时此表达式的值才为 true。该表达式不能书写为:
x > y and x > z
根据运算符的优先级,该表达式将解释为:
(x > (y and x)) > z
若 x,y,z均为实型或整型数据时将产生编译错误。
圆括号通常使代码更容易读写,在编程过程中应当合理使用圆括号。
2.5 语句语句是执行具体操作的指令,是由 Object Pascal的保留字,变量名,函数名及
Delphi 7.0编辑器可以识别的指令符号组成,建立正确的语句必须遵从 Object Pascal
的语法规则 。
Object Pascal程序语句书写比较自由,可以把多个语句放在一个程序行中,也可把一个语句分多行书写,但需要记住 Object Pascal的每个语句都必须以分号“;”结束。在编写自己的 Object Pascal程序时,要注意程序的可读性。 Pascal语言是英式结构语言,在程序中选择合适的缩排、大小写风格,并在需要时将程序代码分行,会使得程序代码能够很容易地被自己和他人读懂。
对于较为复杂的程序常用到复合语句,复合语句是指将多个语句用 begin和 end两个保留字包围起来,格式如下:
begin
<语句 1>;
… ;
<语句 n>;
end;
复合语句在 Object Pascal中被视为一个语句,因此在 end后必须加上分号“;”。
2.5.1 语句的书写规则
2.5.2 语句格式中的符号约定为了解释语法规则,在说明各语句,函数的格式和功能时用到表 2-13中所列符号,这些符号的含义详见表 2-13。
符号 含义
<> 必选参数表示符。尖括号中的中文提示说明,由使用者根据问题的需要提供具体参数,如果缺少必选参数,语句则发生错误
[ ] 可选参数表示符。方括号中的中文提示说明,由使用者根据问题的需要决定是否选用该参数,如果省略则默认为缺省值
| 多中取一表示符。含义为“或者选择”,竖线分隔多个选择项,必须选择其中一个选项。
{} 包含符号。其中包含多选一的各个选项
,… 同类项目的重复
… 省略了在当时叙述中不涉及的部分表 2-13 语句格式中的符号约定
2.5.3 赋值语句在事件处理过程中,最常用到的工作就是把一个新值赋给一个属性或变量。在设计用户界面时,可以使用 Object Inspector(对象检查器 )来改变其属性;但有时需要在程序执行时改变属性的值,而且有些属性只能在执行时改变,这些属性在 Delphi的在线帮助的 Proprety主题中被标为执行期属性。进行这种改变,就必须使用赋值语句。赋值语句是
Object Pascal程序中最常用的语句,其语法格式为:
{变量名 |属性名 },=<表达式 >
注意“,=”是赋值号,不要写为,=”。赋值语句的功能是先计算表达式的值,然后把结果赋给赋值号左边的变量或属性。赋值号为“,=”,
不论给属性还是给变量赋值,都是将右边的值赋给左边的属性或变量。
当将一个属性值、变量、常量或文本数据赋给属性或变量时,所赋值的类型和接受此值的属性或变量的类型应相同或兼容,否则会导致错误。
2.5.4 注释语句一般的程序员都有这样的体验:如果不给程序加上适当的注解,一段时间后,
自己也难以理清程序的流程。给程序及时地加上注释是良好的编程习惯。为了提高程序的可读性,通常应该在程序的适当位置加上一些注释。注释语句用来包含注释,
语法格式为:
{<注释内容 >}
或 (*注释内容 *)
或 //注释内容注释内容指要对程序进行注释说明的文本,前两种格式可以对程序进行多行文本的注释,第三种格式只能注释本行文本。例如:
S:=PI*r*r; //计算半径为 r的圆的面积
Object Pascal保留了 Borland Pascal编辑器的风格,关键字采用黑体字,被注释的部分会变暗,这使得编程风格良好,易读易写。对于 Object Pascal的注释,编辑器会把它们处理成为空白,它不参加编译也不影响程序的运行。
Object Pascal基本知识
常用数据类型
常量变量的定义及使用
用运算符及表达式第 2章 Object Pascal语言基础
2.1 基本概念
Delphi 7.0是一个基于 Object Pascal语言的 Windows应用程序开发系统,在所有的事件处理过程和应用程序中都是使用它来编写程序代码。 Object Pascal编程语言是在 Pascal
语言的基础上发展起来的,它继承了 Pascal语法严谨、数据结构丰富等优点,同时融入了面向对象编程的语法要素,使之成为一种优秀的面向对象编程语言。
2.1.1 保留字首先介绍 Object Pascal语言的最基本内容:保留字和标志符。
保留字( Reserved Words)是由系统规定的、具有特定意义的单词。
在编程时不能被重新定义或另作他用。 Object Pascal 语言规定的保留字有
65个,详见本教程 P23页表 2-1。
除了上述的保留字外,Private,Protected,Public,Published 和
Automated在定义对象类型时也作为保留字,而在其他场合则作为指令符。单词 at和 on也具有特殊的含义。
注意,Object Pascal 编程语言和许多编程语言不同,它对单词的大小写是不敏感的。 Object Pascal不区分大小写。 IN,in和 In都被看做是同样的意义。
2.1.2 标识符标识符 是 Object Pascal语言中用来表示应用程序量的名称。包括:
变量 (Var)、常量 (Const)、类型 (Type)、过程 (Procedure)、方法
(Method)等。
标识符分为标准标识符和自定义标识符两类。
标准标识符是 Object Pascal语言系统预先分配给标准常量、标准类型、标准函数、标准过程及标准文件使用的标识符。如标准常量:
False,True;标准类型,integer,char,real;标准函数,Abs,Sqr、
Cos等。
自定义标识符是程序员根据需要为自己定义的常量、变量、类型、
函数、过程以及所编写的程序名等。 Object Pascal标识符由字母、数字、下划线组成,其规定为:
( 1)必须以字母或下划线开始;
( 2)不能与保留字相同;
( 3)避免与 Object Pascal已经使用的标准标识符相同。
2.1.3 指令符指令符( directives)也是具有特殊意义的单词,但与保留字不同的是可以将指令符定义为标识符,Object Pascal不会指示出错,但这容易混淆。
Object Pascal 规定的指令符见表 2-2。
absolute abstract assembler automated cdcel contains
default dispid dynamic export external far
forward implement
s
index message name near
nodefault overload override package pascal private
protected public read readonly register retroduce
requires resident safecall stdcall stored virtual
write writeonly
表 2-2 Object Pascal 语言规定的指令字
2.2 数据类型描述客观事物的数、字符以及所有能输入到计算机中并被计算机程序加工处理的符号的集合称为数据。数据的一个重要特征就是其所属的数据类型,数据类型不仅确定了该类数据的表示形式和取值范围,而且还确定了数据所能够参加的各种运算。
Object Pascal提供了多种数据类型,包括标准数据类型和高级数据类型。标准数据类型属于 Object Pascal内部约定的数据类型,无需定义就可以直接使用。标准数据类型有整型( Integer)、实型( Real)、字符型
( Character)、字符串型( String)、布尔型( Boolean)五种。高级数据类型体现了特殊的数据结构,在使用之前必须由用户自己进行定义。高级数据类型有枚举型( Enumerated)、子界型( Subrange)、集合类型
( Set)、数组类型( Array)、记录类型( Record)文件类型( File)、
类类型( Class)、类引用类型( Class Reference)、接口类型
( Interface)、指针类型( Pointer)、过程类型( Procedural)、可变类型( Variant)。
2.2.1 整型整数包括正整数、负整数和零。
整型是存储整数数据的类型。 Object Pascal包括 9种形式的整型数据,详见本教程 P25页 表 2-3。
前 2种为一般整型,后 7种为基本整型,应尽量使用 Integer,Cardinal
两种基本类型,因为它们在各种 CPU和操作系统中都提供最佳的性能。
通常,作用于整数的算术运算符返回 Integer类型的值。在当前执行中,
等价于 32位的长整型( LongInt)。仅当对 Int64类型执行运算时,运算结果返回 Int64类型。因此,下面的代码执行后得到的结果是不正确的:
var
i,Integer;
j,Int64;
...
i,= High(Integer); //取 Integer类型中的最大值
j,= i + 1;
要使返回值是 Int64类型,在上面的情况中可以将 i 转换为 Int64。代码如下:
...
j,= Int64(i) + 1;
2.2.2 实型实数是最常用的数据类型。
在 Object Pascal中实数有两种表示方法,小数表示法和科学计数法。
例如,
-3.6,2.4e0,–1.2e-5,3E7
小数表示法与日常数学中所用表示方法相同。科学计数法中,e之前表示有效数字,e之后数字表示 10的幂。即
–1.2e-5=(-1.2) × 10-5=-0.000012
需要注意的是小数表示法中小数点前后都必须有数字,科学计数法中
e前后都必须有数字,e可以大写成 E。
实型是存储实数数据的类型。 Object Pascal包括 5种形式的实型数据,详见本教程 P26表 2-4。
(图 1-2)
前六种为基本数据类型,Real为一般实型。最常用的实型是 Real类型,它与 Double等价。 Currency是专为处理货币而设计的,该类型与其他实型进行运算时,Delphi自动将结果转化为 Currency类型。
2.2.3 字符型字符型是存储单个字符的类型。 Object Pascal包括 3种形式的字符型数据,详见表 2-5。
基本字符类型是 AnsiChar和 WideChar。 AnsiChar的尺寸是一个字节 ( 8
位 ),其值参照本地字符集 。 AnsiChar最初模仿 ANSI字符集,但现在用于扩大到当前的本地字符集 。 WideChar字符用多于一个字节来表示每个字符 。
WideChar的尺寸是一个字 ( 16位 ),其字符顺序参照 Unicode字符集,
Unicode字符集中的前 256个字符对应 ANSI字符 。
一般字符类型是 Char,等价于 AnsiChar。
字符类型数据的表示方法是用两个单引号括起单个字符如,'A','6',','。
' ' 表示空格符。
表 2-5 Object Pascal 语言的字符型类型 名称 字节数 取值范围
Ansi字符型 AnsiChar 1 扩展 ANSI字符集宽字符型 WideChar 2 UniCode字符集字符型 Char 1( 2) 扩展 ANSI字符集
2.2.4 字符串型字符串型是存储字符串数据的类型。 Object Pascal包括 4种形式的字符串型数据,详见本教程 P27页表 2-6。
保留字 string的作用如一般类型的标识符。例如:
var S,string;
创建了变量 S,用于保存串。在默认的编译指示 {$ H+}状态下,编译器将 string(后面没有跟随方括号和数字)解释为 AnsiString;使用编译指示 {$ H-}时,解释为 ShortString。
ShortString类型串的长度在 0到 255之间。 ShortString串的长度可以动态改变,其占用的内存是静态的,总是 256字节;第一个字节存储串的长度,其余 255个字节存储串中的字符。
AnsiString也叫做长串( long string),用来表示动态分配的串。
WideString类型表示 16位 Unicode字符的动态分配的串。 WideString
类型大部分的特性与 AnsiString类型相似。
Object Pascal还支持其他最大长度在 0到 255之间的短串。可以通过在保留字 string后边附加方括号括起来的数字来表示。例如:
var MyString,string[100];
创建了一个叫做 MyString的变量,其最大长度为 100个字符。
2.2.5 布尔型布尔型数据用于进行逻辑运算,布尔型数据的值只有两个,True(真 )
和 False(假 )。
Object Pascal包括 4种形式的布尔型数据,详见表 2-7。
Boolean类型是编程时常用的布尔类型,其他三种类型是为了兼容其他语言而设置的。 Boolean类型的取值为 False和 True两个符号常量。
在 Object Pascal中,布尔表达式不能被等同为整数或实数。因此,如果 x
是一个整数类型的变量,那么语句
if x then,..;
将产生一个编译错误。
可以将上个语句改为:
if x=1 then,..;
表 2-7 Object Pascal 语言的布尔型类型 名称 字节数 取值布尔型 Boolean 1 只能为 False( 0)或 True( 1)
字节布尔型 ByteBool 1 False或 True(非 False)
宽布尔型 WordBool 2 False或 True(非 False)
长布尔型 LongBool 4 False或 True(非 False)
2.2.6 序数类型
1,序数类型序数类型包括整数、字符、布尔、枚举、子界等类型。序数类型定义了一个有序的值的集合。集合中的每个值(除第一个)都有一个唯一的前驱值,每个值(除最后一个)都有一个唯一的后继值。对于第一个序数的前趋和最后一个序数的后继在此不做讨论。此外,每个值都有一个序号,
类型中的序号决定值在类型中的顺序。大多数情况下,如果一个值的序号为 n,那么它的前驱值的序号为 n–1,后继值的序号为 n + 1。
2,序数函数
( 1)序数函数 Ord()返回数据的序数。
例如,Ord( 6)的返回值为 6,表示整数 6的序数是其本身。
( 2)前趋函数 Pred()返回数据的前趋值。
例如,Pred( 'e')的返回值为 'd',表示字符 e的前趋是字符 d。
( 3)后继函数 Succ()返回数据的后继值。
例如,Succ( False)的返回值为 True,表示布尔型数据 True是 False的后继。
( 4)首序数函数 Low()返回序数类型的数据中序数最小的一个数据。
( 5)末序数函数 High()返回序数类型的数据中序数最大的一个数据。
2.3 常量与变量在程序设计中常用到两种形式的数据,一种是在程序执行过程中其值保持不变的数据,称为常量;另一种是在程序执行过程中其值可以改变的数据,
称为变量 。
常量是一种在程序执行进程中其值保持不变的数据。
根据使用的方式不同,程序中的常量分为直接常量、真实常量与类型常量。
2.3.1 常量
1,直接常量直接常量是指在程序中直接引用的整数、实数、字符、字符串或其他不同类型的常数。下列常数均属于直接常量。
( 1)带有正负号的整数或无符号的整数,如,-1,+2,2003,0。
( 2)实数,包括定点实数与浮点实数两种表示形式。
定点实数即小数形式,如,0.03,-32.48,+102.9,0.0。
浮点实数即指数形式,如,+2.56E-5,-1.2E+8,3.2E12。
2.3.1 常量 (2)
2,真实常量真实常量是指一个被声明的标识符,它的值不能改变。
如果在一个程序中,某一个常数反复多次出现可以定义一个标识符来代表该常数。
定义常量时使用常量说明语句,语法格式为:
const
<常量名 1>=<常量值 1>
…
<常量名 n>=<常量值 n>
其中 const是 Object Pascal的保留字,表示常量定义的开始。 <常量名 >即常量的标识符,<常量值 >是直接常量或常量组成的表达式。例如:
const
PI=3.1415926;
K=PI/180;
不能在程序中给常量另行赋值,否则会导致语法错误。
( 3)字符,由单撇号括起来的单个字符,如,'a','C','6','+'。
( 4)字符串,由双撇号括起来的字符串,如,"hello","abc123",
"3.234"。
( 5)布尔型常数,只有两个值 True和 False。
2.3.1 常量 (3)
3,类型常量类型常量不同于真实常量,它能保存数组、记录等高级数据类型的值。
定义类型常量的语法格式如下:
const
<常量名 >:<类型名 >=<常量值 >;
例如:
const
Hello,string = 'Hello';
Max,Integer = 100;
Digits,array[0..9] of Char = ('0','1','2','3','4','5','6','7',
‘8’,‘9’); //定义了一个常量用于保存数组在缺省的编译状态 {$ J-} 中,类型常量不能被赋予新的值,这时的类型常量相当于只读变量。然而,如果编译指示 {$ J+} 有效,那么类型常量可以被赋予新的值,这时的类型常量相当于被初始化过的变量。
变量是程序代码中代表一个内存地址的标识符,而此地址的内存内容在程序代码执行时可以被改变 。 在使用变量前必须对它进行说明,即对它进行命名,并说明它的类型 。 变量就像数据容器,而且由于变量被定义了类型,只能用于储存与其定义类型相兼容的数据 。
2.3.2 变量 (1)
变量有如下三个主要特征。
( 1)变量名:即变量的标识符,用于对所代表的内存单元的引用。
( 2)类型:变量的类型决定了变量中所存放数据的范围、
有效的操作、存储空间的大小和格式。
( 3)变量值:变量所代表的内存单元中的数据值。
程序中的变量必须先声明才能使用。
1,变量的声明变量在单元、函数或过程的声明部分进行声明,声明位置决定了变量的作用范围。变量声明的格式为:
2.3.2 变量 (2)
声明多个同类型的变量时可采用如下格式:
var <变量名 1> … < 变量名 n>,<类型名 >
其中 var是 Object Pascal的保留字,表示变量定义的开始,<变量名 >可以是任意合法的标识符,<类型名 >可以是 Object Pascal的基本数据类型也可以是由用户定义的高级数据类型。
声明在过程或函数内部的变量有时叫做局部变量,而在应用程序开始声明的变量叫做全局变量。全局变量可以在声明时对它进行初始化,格式为:
var <变量名 >,<类型名 >=<常量表达式 >
其中常量表达式的值必须与变量定义的类型相兼容。
var
<变量名 1>,<类型名 1>
…
<变量名 n>,<类型名 n>
2,变量使用变量经过声明之后,就可以在程序中使用了,通常可以通过赋值语句给变量赋值。
如果没有明确初始化全局变量,那么编译器将对其初始化为 0。
不同的是,局部变量不能在其声明中被初始化并且在其被赋值之前包含的是随机数据。一旦声明了一个变量,应及时对它赋值进行初始化,
未经初始化的变量的值是一个不确定的随机数,如果该变量参与运算或是出现程序流程中将会产生意想不到的后果。初始化变量的最简单方法就是给变量赋值。
2.3.2 变量 (3)
2.4 运算符与表达式运算是对数据进行加工处理的过程,描述各种不同运算的符号称为运算符,
而参与运算的数据称为操作数。表达式是表示某个求值规则的运算公式,它由运算符和圆括号将常量、变量等操作数以合理的形式组合而成。表达式可以用来执行运算、操作或测试数据,每个表达式都会产生惟一的值。表达式的类型由运算符的类型决定。在 Object Pascal 中有以下几种运算符:算术运算符、
位运算符、字符串运算符、关系运算符、布尔运算符、集合运算符、指针运算符、类运算符和@运算符。本章中先介绍几种常用的运算符。
1,算术运算符
Object Pascal有8个算术运算符,在这8个算术运算符中,除取正
“+”、取负“-”是单目运算符外,其他均为双目运算符,详见本教程 P31页表 2-8。
其中+、-、*运算的含义与数学中的相同,参加运算的数可以是整型也可以是实型,结果由 Delphi 7.0自动向精度高的数据类型转化。参加除法运算“/”的数无论是整型或是实型,结果都是实型。参加整数除法
,div”和求余运算,mod”的数必须是
2.4.1 算术运算符
2.4.1 算术运算符
2,算术表达式算术表达式是由算术运算符、数值型常量、变量、圆括号组成,其运算结果为一数值。
例如,3*4+(90-5)/4*2的值为 54.5。
在书写算术表达式时应当注意以下两点:
( 1)在数学中可以省略乘号,但在算术表达式书写中不可以省略,如在数学中相乘可以写成 2x,但在编程中必须写成 2*x;
( 2)所有括号都用小括号(),括号必须配对,例如数学式 3[x+(y-z)]
在编程中必须写成 3*(x+(y-z))。
整型,结果也是整型,分别是除法的商和余数。在表达式 a/b,a div b,a
mod b 中,如果 b的值为 0将会触发一个错误。
例如,10 mod 3的值为 1,10 div 3的值为 3。
2.4.2 位运算符位运算符是指对操作数进行的按位逻辑运算 。 其运算对象是整数,运算结果也是整数,Object Pascal有 6 个逻辑运算符,详见表 2-9。
and,or,not和 xor运算符当运算符两侧为数值数据,则将数值数据转换为二进制数(补码形式)进行按位运算。
设 x值为 3,y值为 5,在内存中按二进制保存,即 x,y值分别为 00000011,
00000101。按位计算结果如下:
not x 的值为 11111100 (十进制数 –4)
x and y的值为 00000001 (十进制数 1)
x or y 的值为 00000111 (十进制数 7)
x xor y 的值为 00000110 (十进制数 6)
x shl 2 的值为 00001100 (十进制数 12)
x shr 1 的值为 00000010 (十进制数 2)
运算符 名称 举例 运算符取值 名称 举例
not 按位取反 not x xor 按位异或 x xor y
and 按位与 x and y shl 左移位 x shl 2
or 按位或 x or y shr 右移位 y shr 1
表 2-9 Object Pascal 语言的位运算符
2.4.3 字符串运算符
Object Pascal只有一种字符串运算符,即连接运算符,+”。该运算符用于连接两个或更多的字符串。
当两个字符串用连接运算符连接起来后,第二个字符串直接添加到第一个字符串的尾部,结果是一个更长的包含两个字符串的全部内容的字符串,也可以把多个字符串连接起来,每两个字符串之间都要用,+”号分隔。例如:
'abcdef'+'123' 连接后结果为,'abcdef123'
'abc'+'123'+'xyz' 连接后结果为,'abc123xyz‘
加号( +)运算符对串的操作与其对数字的操作有很大差异。对于数字 a,b,
表达式 a + b与 b + a是等价的,对于字符串 s1,s2表达式 s1 + s2与 s2 + s1不是等价的。例如,当 s1为 'hello',s2为 'world'时,s1 + s2返回的值是 'helloworld',
而 s2 + s1返回的值是 'worldhello'。也就是说,当加号( +)作为字符串运算符时,操作数的位置顺序直接影响运算结果。
2.4.4 关系运算符关系运算符又称为比较运算符,用来对两个表达式的值进行比较,比较的结果是一个布尔值 ( True或 False) 。 关系表达式是指用关系运算符将两个表达式连接起来的式子 。 Object Pascal提供的关系运算符有 9种,详见表 2-10。
表 2-10 Object Pascal 语言的关系运算符运算符 名称 举例 运算符取值 名称 举例
= 等于 4=5值为 False > 大于 4>5值为 False
<> 不等于 4<>5值为 True <= 小于或等于 4<=5值为 True
< 小于 4<5值为 True >= 大于或等于 4>=5值为 False
关系运算符两侧可以是数值表达式、字符型表达式或其他表达式,也可以是常量、
变量或函数,但其两侧的数据类型必须是相容的标准数据类型或顺序类型。
各关系运算符的运算级别相同。运算次序为:先分别求出关系运算符两侧表达式的值,然后再把两者的值进行比较,两者的关系若与关系运算符指示的一样,则关系运算的结果为真( True),否则结果为假( False)。数值型数据按其数值大小进行比较;字符型数据按其 ASCII码值进行比较,比较字符串时先比较第一个字符,其中
ASCII码值较大的字符所在的字符串大。若第一个字符相同时比较第二个字符,… 以此类推。顺序类型数据的比较按照其序数进行比较。
2.4.5 布尔运算符在表示较为复杂的条件判断时,必须使用布尔表示式 。 布尔表达式是指用布尔运算符连接若干关系表达式或布尔值组成的式子,如 a≤x≤b可以表示为,a<=x And x<=b,
布尔表达式的值也是一个布尔值 。 Object Pascal提供 4种布尔运算符,详见表 2-11。
表 2-11 Object Pascal 语言的布尔运算符运算符 名称 举例 说明
and 与 ( 4>5) and( 3<4)
该表达式值为 False。当两个表达式的值均为真,结果才为真,否则结果为假。
or 或 ( 4>5) or( 3<4)
该表达式值为 True。两个表达式中只要有一个表达式的值为真,结果就为真,两个表达式的值均为假时结果为假。
not 非 not( 4>5) 该表达式值为 True。进行取“反”操作,由真变成假或由假变成真。
xor 异或 ( 4>5) xor( 3<4) 该表达式值为 True。当两个布尔表达式值不同时结果为 True。
2.4.6 运算符的优先级在一个表达式中进行多种操作时,Object Pascal会按一定的顺序进行求值,这个顺序称为运算符的优先顺序。在表达式中运算符的优先级决定了运算被执行的顺序。
常用运算符的优先顺序如本教程 P34页表 2-12所示。
当一个表达式中含有多个算术运算符时,将按优先级由高到低的顺序求值。优先级高的运算符在优先级低的运算符之前求值,优先级相同时自左向右求值,如果表达式中含有括号,则先计算括号内表达式的值,如果有多层,先计算最内层括号中的表达式。例如表达式:
x + y * z
先运算 y乘以 z,然后将乘积(运算结果)与 x相加;运算符 * 先被执行,因为它比运算符 +优先。
可以使用圆括号超越所有的优先级规则。圆括号中的表达式最先被求值,因此可以被视为一个单独的操作数。例如表达式:
(x > y) and (x > z)
首先判断 x是否大于 y,然后判断 x是否大于 z,最后将两次判断的结果相与,只有当 x
的值比 y,z的值都大时此表达式的值才为 true。该表达式不能书写为:
x > y and x > z
根据运算符的优先级,该表达式将解释为:
(x > (y and x)) > z
若 x,y,z均为实型或整型数据时将产生编译错误。
圆括号通常使代码更容易读写,在编程过程中应当合理使用圆括号。
2.5 语句语句是执行具体操作的指令,是由 Object Pascal的保留字,变量名,函数名及
Delphi 7.0编辑器可以识别的指令符号组成,建立正确的语句必须遵从 Object Pascal
的语法规则 。
Object Pascal程序语句书写比较自由,可以把多个语句放在一个程序行中,也可把一个语句分多行书写,但需要记住 Object Pascal的每个语句都必须以分号“;”结束。在编写自己的 Object Pascal程序时,要注意程序的可读性。 Pascal语言是英式结构语言,在程序中选择合适的缩排、大小写风格,并在需要时将程序代码分行,会使得程序代码能够很容易地被自己和他人读懂。
对于较为复杂的程序常用到复合语句,复合语句是指将多个语句用 begin和 end两个保留字包围起来,格式如下:
begin
<语句 1>;
… ;
<语句 n>;
end;
复合语句在 Object Pascal中被视为一个语句,因此在 end后必须加上分号“;”。
2.5.1 语句的书写规则
2.5.2 语句格式中的符号约定为了解释语法规则,在说明各语句,函数的格式和功能时用到表 2-13中所列符号,这些符号的含义详见表 2-13。
符号 含义
<> 必选参数表示符。尖括号中的中文提示说明,由使用者根据问题的需要提供具体参数,如果缺少必选参数,语句则发生错误
[ ] 可选参数表示符。方括号中的中文提示说明,由使用者根据问题的需要决定是否选用该参数,如果省略则默认为缺省值
| 多中取一表示符。含义为“或者选择”,竖线分隔多个选择项,必须选择其中一个选项。
{} 包含符号。其中包含多选一的各个选项
,… 同类项目的重复
… 省略了在当时叙述中不涉及的部分表 2-13 语句格式中的符号约定
2.5.3 赋值语句在事件处理过程中,最常用到的工作就是把一个新值赋给一个属性或变量。在设计用户界面时,可以使用 Object Inspector(对象检查器 )来改变其属性;但有时需要在程序执行时改变属性的值,而且有些属性只能在执行时改变,这些属性在 Delphi的在线帮助的 Proprety主题中被标为执行期属性。进行这种改变,就必须使用赋值语句。赋值语句是
Object Pascal程序中最常用的语句,其语法格式为:
{变量名 |属性名 },=<表达式 >
注意“,=”是赋值号,不要写为,=”。赋值语句的功能是先计算表达式的值,然后把结果赋给赋值号左边的变量或属性。赋值号为“,=”,
不论给属性还是给变量赋值,都是将右边的值赋给左边的属性或变量。
当将一个属性值、变量、常量或文本数据赋给属性或变量时,所赋值的类型和接受此值的属性或变量的类型应相同或兼容,否则会导致错误。
2.5.4 注释语句一般的程序员都有这样的体验:如果不给程序加上适当的注解,一段时间后,
自己也难以理清程序的流程。给程序及时地加上注释是良好的编程习惯。为了提高程序的可读性,通常应该在程序的适当位置加上一些注释。注释语句用来包含注释,
语法格式为:
{<注释内容 >}
或 (*注释内容 *)
或 //注释内容注释内容指要对程序进行注释说明的文本,前两种格式可以对程序进行多行文本的注释,第三种格式只能注释本行文本。例如:
S:=PI*r*r; //计算半径为 r的圆的面积
Object Pascal保留了 Borland Pascal编辑器的风格,关键字采用黑体字,被注释的部分会变暗,这使得编程风格良好,易读易写。对于 Object Pascal的注释,编辑器会把它们处理成为空白,它不参加编译也不影响程序的运行。