我的Delphi语法笔记1.docx
《我的Delphi语法笔记1.docx》由会员分享,可在线阅读,更多相关《我的Delphi语法笔记1.docx(40页珍藏版)》请在冰豆网上搜索。
我的Delphi语法笔记1
我的Delphi語法筆記1
发表:
2004-3-1319:
06:
05 出处:
你的博客网(yourblog.org)
--------------------------------------------------------------------------------
单元程序头:
uses(子句列出了那些链接到程序的单元),block(声明,命令语句)
一个程序包括:
•一个程序头(programheading)
•一个uses子句(可选),和
•一个包含声明和命令语句的块(block)
一个单元以单元头(unitheading)开始,后面跟interface、implementation、initialization
和finalization部分,后面两个部分是可选的
一个uses子句可以出现在:
•程序或库的工程文件
•单元的接口部分,和
•单元的实现部分
在单元声明以及uses子句中(尤其是在Linux下),单元名称必须和文件名大小写一致。
在其它情
况(比如使用限定符的标志符),单元名是大小写无关的。
要避免在单元引用中出现问题,要明确指出单元文件:
usesMyUnitin"myunit.pas";
如果像上面这样在工程文件中明确引用一个单元,在其它源文件中就可以像下面那样简单地引用它,
而不必考虑大小写问题:
usesMyunit;
uses子句给编译器提供各模块间的依赖信息,因为这些信息是存于模块自身的,所以,ObjectPascal
程序不需要makefile文件、头文件以及include预处理指令(这些概念你可能要参考C语言)。
每当一个
工程调入IDE时,ProjectManager创建一个makefile,但只有在包含多个工程的工程组中才保存这些文
件。
•单元源文件(.pas)
•工程文件(.dpr)
•包源文件(.dpk)
•窗体文件,扩展名为.dfm(Delphi)或.xfm(Kylix)
•资源文件,扩展名为.res(已经编译的资源文件)
•工程选项文件,扩展名为.dof(Delphi)或.kof(Kylix)
要改变程序的图标,可使用ProjectOptions对话框。
在窗体设计器上右击弹出PopMenu有ViewasText项,可察看事件和过程的关联
事件句柄通过窗体文件(Windows下是.dfm,Linux下是.xfm)赋给指定的事件
空格(#32)和控制符(#0到#31,其中#13叫回车符或行的结束符)被称为空白符(blank)。
特殊符号是非文字和数字字符,或这类字符的组合,它们有固定的意义。
‘[’相当于‘(.’,‘]’相当于‘.)’;‘(*’和‘*)’分别相当于‘{’和‘}’(表示注释)。
,!
(惊叹号)、”(双引号)、%(百分号)、?
(问号)、\(反斜杠)、_(下划线)、|(通道)和~(破折
号)不是特殊符号
$前缀表示一个16进制数字,比如$8F
标签是一个不超过4位的阿拉伯数字序列,也就是从0到9999,打头的0没有意义
。
若单引号中没有内容(’’),它被称为空串(nullstring)。
在一个引用串中,两个连续的单引号(’’)表示一个字符,也就是单引号本身(’)控制串由一个或多个控制字符(控制符)所组成,每个控制符包含一个#,后跟一个无符号整数(10
进制或16进制),整数的范围从0到255,表示相应的ASCII字符。
下面的控制串
#89#111#117
就相当于引用串
’You’
运算符包括:
@not^*/divmodandshlshras+-orxor=><<><=>=in和is。
一些运算符的行为因为传给它们的数据类型不同而不同。
比如,not运算符用于整数时,是对它的
位进行求反运算,而对布尔类型进行逻辑非运算。
除了^,is和in,其它运算可应用在Variant类型上。
•不管x和y的类型是什么,x/y的结果总是扩展类型(extended);对其它运算符,只要有一个
运算数是实数类型,它的结果就是扩展类型;另外,只要有一个运算数是Int64类型,它的结果就是Int64类型;否则
,结果就是整数类型。
如果一个运算数是整数的子界类型,它就像整数类型一样被对待。
•xdivy的值取整数,也就是取得x/y的值,然后以0的方向取得最近的整数。
•mod运算返回对运算数进行整数除后得到的余数。
换句话说,就是xmody=x-(xdivy)*y。
布尔运算符not、and、or和xor作用于任何布尔类型的运算数,并返回一个布尔类型的值。
使用$B编译器指示字控制计算方式,默认状态是{$B-},它采用部分计算。
要在局部进行完全计
算,在代码中使用{$B+}指示字。
你也可以在CompilerOptions对话框中选择CompleteBoolean
Evaluation选项,此时在整个项目范围使用完全计算。
///部分计算equals短路计算inC++/C#
若任何一个运算数是variant类型,编译器总是进行完全计算(即使在{$B-}状态下)
Logical(bitwise)operators(位逻辑运算符):
notandorxorshlshr
•位反(not)运算的返回类型和运算数相同;
•若and、or或xor的运算数都是整数类型,则它的返回类型是包含运算数所有可能的值、且范围最小的预定义(内置)整数类型;•运算xshly和xshry把x的值向左或向右移y个位,也就等同于x乘或除以2^y(2的y次方),返回类型和x相同。
比如,若N存储的是01101(10进制的13),那么Nshl1返11010(10进制26)。
注意,y的值被解释为对x所属类型大小(位数)进行模运算,比如,若x是一个integer,xshl40被解释为xshl8,因为integer的大小是32位(4字节),40mod32等于8。
关系运算符=、<>、<、>、<=和>=都能对字符串进行操作 +运算符连接两个字符串
•+运算符的运算数可以是字符串、packedstring(packedarraysoftypeChar)或字符。
但是,若其中一个运算数
是宽字符(WideChar)类型,其它运算数必须是长字符串。
•+运算符的返回结果和任何字符串类型是兼容的。
但是,若运算数都是短字符串或字符,并且它们的组合长度大于255
,则返回结果取前面的255个字符。
关系运算符<、>、<=和>=能对PChar类型进行操作。
其它的指运算符:
+-指针加减^取得指针所指的内容 =<>
等于不等于
对于Pointer类型,在dereference之前必须进行类型转换。
•若I是一个整数,P是一个字符指针,那么P+I是把P的地址加上I,也就是一个指向P后面
第I个字符处的指针(表达式I+P等同于P+I);P–I是把P的地址减去I,也就是一个指向P
前面第I个字符处的指针。
•若P和Q都是字符指针,那么P–Q计算P的地址(高地址)和Q地址(低地址)之差,也就
是返回一个表示P和Q之间字符数目的整数。
P+Q没有意义。
Setoperators(集合运算符):
+并集-差集*交集<=小于等于(子集)>=大于等于(超集)=等于<>不等于in成员关系
以下规则适用于+、–和*运算符:
•当且仅当序数(集合基础类型中的一个值)O属于集合X或集合Y(或同时属于X和Y)时,
O属于X+Y;当且仅当O属于X但不属于Y时,O属于X–Y;当且仅当O同时属于X和Y
时,O属于X*Y。
•+、–和*的运算结果属于集合类型setofA..B,这里A是结果中的最小序数,B是结果中的
最大序数。
以下规则适用于<=、>=、=、<>和in运算符:
•只有当X(集合)中的每个成员也是Y(集合)中的成员时,X<=Y才为真;Z>=W等同于
W<=Z;只有当U(集合)和V(集合)正好拥有相同的成员时,U=V才为真,否则U<>V
为真;
•对于序数O和集合S,只有当O是S的一个成员时,OinS才为真。
•除了实数和整数能一起比较外,两个运算数必须是兼容的类型;
•对字符串进行比较,是依据它的每个字符在扩展ASCII字符集中的顺序,字符类型被当作长度
为1的字符串;
•两个packedstring要进行比较,它们必须具有相同数目的元素;一个具有n个元素的packedstring
与一个字符串比较时,它被看作长度为n的字符串;
•只有当两个PChar指针都指向同一个字符数组的范围内时,<、>、<=和>=运算符才能作用
于它们;
•运算符=和<>能以类或类引用类型作为运算数。
当用于类类型时,=和<>的计算规则与
指针一样,只有当C和D指向同一个实例对象时,C=D为真,否则C<>D为真;当用于类
引用时,只有当C和D表示同一个类时,C=D为真,否则C<>D为真。
as和is运算符使用类和对象(实例)作为运算数,as也用于接口类型。
@运算符返回一个变量、函数、过程或方法的地址,也就是说,@运算符构建一个指向运算数的
指针。
•若X是一个变量,@X返回X的地址(当X是一个过程类型的变量时有特殊的规则,请参考语
句和表达式中的过程类型)。
若默认的编译器指示字{$T–}在起作用,则@X的类型是
Pointer(通用指针);在{$T+}状态下时,@X的类型是^T,这里T是X的类型;
•若F是一个例程(一个函数或过程),@F返回F的入口点,@F的类型总是Pointer;
•当@作用于类的方法时,必须使用类名来限定方法名。
比如
@TMyClass.DoSomething
它指向TMyClass的DoSomething方法。
Setconstructors(集合构造器)
[5,6,7,8]
[5..8]
[red,green,MyColor]
[1,5,10..Kmod12,23]
[’A’..’Z’,’a’..’z’,Chr(Digit+48)]
集合构造器[]表示空集
字符串、数组、数组属性以及指向字符串或数组的指针能被索引。
比如:
FileName[21]
强制类型转换的语法是
typeIdentifier(expression)
若表达式是一个变量,结果被称为variabletypecast(变量转换);否则,结果是一个valuetypecast(值转换)。
虽
然它们的语法相同,但它们有不同的转换规则。
在值转换中,类型标志符和转换的表达式必须都是有序类型或指针类型。
值转换的例子包括
Integer(’A’)
Char(48)
Boolean(0)
Color
(2)
Longint(@Buffer)
声明的语法以及声明的位置取决于要定义的标志符的种类。
通常,声明只能出现在块(block)的开始处,
以及单元的接口或实现部分的开始处(在uses子句之后)。
Hint指示字platform、deprecated和library能附加在任何声明之后。
在声明过程或函数的情况下,应
使用分号把hint指示字和声明的其它部分分开。
比如:
procedureSomeOldRoutine;stdcall;deprecated;
varVersionNumber:
Reallibrary;
typeAppError=class(Exception)
...
endplatform;
当源代码在{$HINTSON}{$WARNINGSON}状态下编译时,对使用上述指示字声明的标志符的每个引
用都将产生一个适当的提示或警告。
使用platform标记一个条目和特定的操作系统(比如Windows和
Linux)相关;使用deprecated表示条目已经废弃或支持它仅为了向后兼容性;使用library表示依赖于
特定的库或组件框架(比如VCL或CLX)。
赋值语句的格式如下
variable:
=expression
这里,variable是任何变量引用,包括变量、变量类型转换、解除引用的指针,或者一个结构变量的组
成部分;expression是任何一个赋值兼容的表达式。
(在函数块中,variable能被函数名取代,参考Procedures
andfunctions。
当启用扩展语法时({$X+}),调用函数也可以像调用过程那样 当这样调用函数时,它的返回值被忽略。
gotolabel
label:
statement
labellabel;
labellabel1,...,labeln;
•复合语句或with语句只是简单地执行一系列语句;
•条件语句,也就是if或case语句,根据指定的标准,最多执行一个分支;
•循环语句,包括repeat、while和for循环,重复执行一系列语句;
•一组特殊的语句,包括raise、try...except和try...finally结构,用来创建和处理异常。
with语句的语法是
withobjdostatement
或
withobj1,...,objndostatement
if语句有两种形式:
if...then和if...then...else
比如,
ifJ=0then
Exit
else
Result:
=I/J;
ifJ<>0then
begin
Result:
=I/J;
Count:
=Count+1;
end
elseifCount=Lastthen
Done:
=True
else
Exit;
CaseStatements(Case语句):
caseselectorExpressionof
caseList1:
statement1;
...
caseListn:
statementn;
else
statements;
end
caseIof
1..5:
Caption:
=’Low’;
6..9:
Caption:
=’High’;
0,10..99:
Caption:
=’Outofrange’;
else
Caption:
=’’;
end;
selectorExpression是任何一个有序类型的表达式(字符串无效),和C++一样的。
。
ObjectPascal有三种循环:
repeat语句、while语句和for语句。
使用Break和Continue过程来控制repeat、while或for语句的流程。
repeat语句的语法是
repeatstatement1;...;statementn;untilexpression
比如:
repeat
Write(’Enteravalue(0..9):
’);
Readln(I);
until(I>=0)and(I<=9);
while语句的语法是
whileexpressiondostatement
比如:
whileI>0do
begin
ifOdd(I)thenZ:
=Z*X;
I:
=Idiv2;
X:
=Sqr(X);
end;
for语句的语法是
forcounter:
=initialvaluetofinalvaluedostatement
或
forcounter:
=initialvaluedowntofinalvaluedostatement
比如:
forC:
=RedtoBluedoCheck(C);
一个块包含一系列的声明,后面跟一个符合语句。
所有的声明必须一起出现在块的开始处,所以,块的
形式是
declarations;
begin
statements;
end;
比如:
functionUpperCase(constS:
string):
string;
var
Ch:
Char;
L:
Integer;
Source,Dest:
PChar;
begin
...
end;
类型可以分为基本(fundamental)和一般(generic)类型。
基本类型的范围和形式是相同的,不管是基于何种CPU和
操作系统;而一般类型的范围和形式是平台相关的
大多数内置类型属于基本类型,但少数整数、字符、字符串和指针类型属于一般类型。
在需要的时候使用一般数据类型是一个好注意,因为它们提供优化的性能和轻便性。
类型也可以分为简单类型、字符串类型、结构类型、指针类型、过程类型和变体类型。
下面的提纲显示了ObjectPascal数据类型的分类:
simple简单类型
ordinal有序类型
integer一般(generic)整数类型是Integer和Cardinal
基本整数类型包括Shortint、Smallint、Longint、
Int64、Byte、Word和Longword
character基本字符类型是AnsiChar和WideChar。
一般字符类型是Char,它相当于AnsiChar。
Boolean布尔类型为Boolean、ByteBool、WordBool和LongBool,Boolean是首选的
enumerated
subrange
real实数类型 Real48SingleDoubleExtendedCompCurrency
string 字符串类型ShortStringAnsiStringWideString
structured
set
array
record
file
class
classreference
interface
pointer
procedural
Variant
(typeidentifier)
标准函数SizeOf作用于所有变量和类型标志符,它返回一个整数,表明存储指定类型的数据所需要的内存数(字节)。
有序类型包括整数、字符、布尔、枚举和子界类型。
有序类型定义一个有次序的数值集合,除了它的第一个值以外,其它每个值都有一个唯一的前驱值(predecessor);除了最后一个外,其它每个值都有一个唯一的后继值(successor)
Ord 有序类型表达式 序数值
Pred有序类型表达式 表达式的前驱值
Succ有序类型表达式 表达式的后继值
High有序类型的变量或标志符类型的最大值
Low 有序类型的变量或标志符类型的最小值
例程High、Low、Succ、Pred、Inc、Dec、IntToStr和IntToHex完全支持Int64参数。
而且,Round、Trunc、StrToInt64和StrToInt64Def返回Int64类型的值;
少数例程(包括Ord)根本不能对Int64数值进行操作。
当把整数类型的最后一个值增大或把第一个值减少时,结果将回到整数类型的开头或尾部
。
内置函数Chr,返回一个在AnsiChar或WideChar取值范围内任意一个整数的字符值。
比如,Chr(65)返回字母A。
Inc()是什么呢?
对ByteBool、WordBool和LongBool来说,若它的序数不为0,它就被认为是True。
在一个需要Boolean类型的环境种,
编译器自动把非0值转换为True。
在ObjectPascal中,布尔表达式不能和整数或实数进行换算。
所以,若X是一个整数变量,语句
ifXthen...;
会产生编译错误
定义一个枚举类型,使用下面的语法:
typetypeName=(val1,...,valn)
typeSize=(Small=5,Medium=10,Large=Small+Medium);
比如:
typeSuit=(Club,Diamond,Heart,Spade);
在声明变量时,可以直接使用(val1,…,valn)结构,它就像一个类型名称:
varMyCard:
(Club,Diamond,Heart,Spade);
子界类型表示其它有序类型(称为基础类型)的一个子集:
它的形式为Low..High
•Extended类型比其它实数类型有更高的精度,但不够轻巧。
当使用Extended类型创建的文件要跨平
台共享时,务必小心