1DELPHI语法基础注释在Pascal中,注释括在大括号中或带星号的圆括号中。Delphi也认可C++风格的注释,即把注释放在双斜线后。例如{thisisacomment}(*thisisanothercomment*)//thisisacommentuptotheendoftheline第一种注释方式较简略,使用也较为普遍;第二种方式在欧洲使用较广,因为欧洲的键盘缺少大括号;第三种方式的注释是从C++借用来的,只在32位版本的Delphi中可用,它在给一行代码加短注释时非常有用。上述三种不同的注释方式有益于进行嵌套注释。例如你要注销一段代码,而代码行中又包含真正的注释行,这时采用同一种注释方式是不对的:{...code{comment,creatingproblems}...code}正确的方法是插入第二种注释方式:{...code//thiscommentisOK...code}注意:如果左大括号或圆括号-星号后面跟美元符号($),那么其中的内容就成了编译指令,如{$X+}。使用大写字母Pascal编译器(不象其他语言的编译器)不考虑字符的大小写,因此标识符Myname、MyName、myname、myName、和MYNAME是完全相同的。总体上来说,这是Pascal的一大优点,因为在大小写敏感的语言中,许多语法错误是由不正确的大写引起的。然而大小写不敏感也有不便之处:第一,你必须注意大小写不一致的标识符实际上是相同的,以避免把他们当成不同的元素使用;第二,你必须尽量保持大写使用的一致性,以提高代码的可读性。大写使用的一致性不是编译器强制要求的,但是保持大写使用的一致性是值得提倡的好习惯。一个常用的方法是将每个标识符的第一个字母大写,标识符若由几个词组合而成(中间不能插入空格),每个词的第一个字母应大写:MyLongIdentifierMyVeryLongAndAlmostStupidIdentifier此外,编译器不编译代码中的空格、空行和Tab键空格,这些元素通称为空白,它们只用来提高代码的可读性,不影响编译过程。2不同于BASIC,Pascal语句允许分行书写,即将一条长指令分割成两个或更多的代码行。允许语句分行的缺点(至少对许多BASIC程序员)是:语句结束时不能忘了加分号,更确切地说,必须记着把语句和紧接它的语句分开。语句分行唯一的限制是字符串不能跨行。关于空格和语句分行的使用没有既定的规则,以下是几点经验:•Delphi代码编辑器中有一条竖线叫右边线(RightMargin),你可以把右边线设置在60或70个字符处。如果以这条线为基准,代码不超过这条界限,那么打印到纸上的代码看起来会很好看。否则,打印时长语句会被随意分行,甚至在一个词的中间断开。•当一个函数或过程有多个参数,通常的做法是把各参数放在不同的行上。•你可以在注释行前留一行空白,或把长的代码句分成较小的部分,这样能提高代码的可读性。•用空格隔开函数调用的参数,表达式中的运算符也最好用空格隔开。优化版面关于代码编写风格的最后一条建议是:尽量使用空白优化版面。这一条很容易做到,只需要在写复合句时,以上一句为参照,下一句向右缩进两个空格,复合句内嵌的复合句缩进四个空格,依此类推。例如:if...thenstatement;if...thenbeginstatement1;statement2;end;if...thenbeginif...thenstatement1;statement2;end;相似的缩进格式常用于变量或数据类型声名区,也可用于语句的续行:typeLetters=setofChar;varName:string;begin{longcommentandlongstatement,goingoninthefollowinglineandindentedtwospaces}MessageDlg('Thisisamessage',3mtInformation,[mbOk],0);提出以上代码编写格式只是向你建个议而已,这样代码能更加易读,其实代码格式并不影响编译结果。关键字关键字是ObjectPascal的保留标识符,在语言中有着特殊含义。保留字不能用作标识符,指令字也同样不应该用作标识符,即使编译器允许也最好不用。在实际中你不应该把任何关键字用作标识符。表2.1是面向对象Pascal语言(Delphi4)中特殊标识符的完整列表,其中包括关键字及保留字。表2.1:面向对象Pascal语言中的关键字及保留字关键字作用absolute指令(变量)abstract指令(方法)and运算符(布尔)array类型as运算符(RTTI)asm语句assembler向后兼容(汇编)at语句(异常处理)automated访问类别符(类)begin块标记case语句cdecl函数调用协定class类型const声明或指令(参数)constructor特殊方法contains运算符(集合)default指令(属性)destructor特殊方法dispiddispinterface界面类别符dispinterface类型div运算符do语句downto语句(for)4dynamic指令(方法)else语句(if或case)end块标记except语句(异常处理)export向后兼容(类)exports声明external指令(函数)far向后兼容(类)file类型finalization单元结构finally语句(异常处理)for语句forward函数指令function声明goto语句if语句implementation单元结构implements指令(属性)in运算符(集合)-工程结构index指令(dipinterface界面)inherited语句initialization单元结构inline向后兼容(见asm)interface类型is运算符(RTTI)label声明library程序结构message指令(方法)mod运算符(数学)name指令(函数)near向后兼容(类)nil数值nodefault指令(属性)not运算符(布尔)5object向后兼容(类)of语句(case)on语句(异常处理)or运算符(布尔)out指令(参数)overload函数指令override函数指令package程序结构(控件包)packed指令(记录)pascal函数调用协定private访问类别符(class)procedure声明program程序结构property声明protected访问类别符(类)public访问类别符(类)published访问类别符(类)raise语句(异常处理)read属性类别符readonlydispatch界面类别符record类型register函数调用协定reintroduce函数指令repeat语句requires程序结构(控件包)resident指令(函数)resourcestring类型safecall函数调用协定set类型shl运算符(数学)shr运算符(数学)stdcall函数调用协定stored指令(属性)string类型6then语句(if)threadvar声明to语句(for)try语句(异常处理)type声明unit单元结构until语句uses单元结构var声明virtual指令(方法)while语句with语句write属性类别符writeonlydispatch界面类别符xor运算符(布尔)表达式和运算符建立表达式没有通用的方法,因为要取决于所用的运算符,Pascal包括有逻辑运算符、算术运算符、布尔运算符、关系运算符和集合运算符等等。表达式可用于确定赋给一个变量的值、计算函数或过程的参数、或者判断一个条件,表达式也可以包含函数调用。表达式是对一个标识符的值而不是标识符本身进行运算。所有编程语言中的表达式都是常量、变量、数值、运算符和函数值的合法组合。表达式可以传递给过程或函数的值参,但不能传递给过程或函数中的引用参数。运算符及其优先级如果你以前写过程序,那么你已经知道表达式是什么了。这里我专门讲一下Pascal运算符的特殊部分:运算符的优先级。表2.2中按优先级分组列出了Pascal语言的运算符。与大多数编程语言相反,Pascal语言中and和or运算符的优先级比关系运算符高。因此,如果你的代码为abandcd,编译器首先会编译and运算符,由此导致编译出错。为此你应该把每个表达式用小括号括起来:(ab)and(cd)。同一种运算符用于不同数据类型时它的作用不同。例如,运算符+可以计算两个数字的和、连接两个字符串、求两个集合的并集、甚至给PChar指针加一个偏移量。然而,你不能象在C语言中那样将两个字符相加。另一个特殊的运算符是div。在Pascal中,你能用/计算两个数字(实数或整数)的商,而且你总能得到一个实型结果。如果计算两个整数的商并想要一个整型结果,那么就需要用div运算符。7表2.2:Pascal语言中的运算符及其优先级单目运算符(最高优先级)@取变量或函数的地址(返回一个指针)not逻辑取反或按位取反乘除及按位运算符*相乘或集合交集/浮点相除div整数相除mod取模(整数相除的余数)as程序运行阶段类型转换(RTTI运算符)and逻辑或按位求和shl按位左移shr按位右移加减运算符+相加、集合并集、字符串连接或指针增加一个偏移量-相减、集合差集或指针减少一个偏移量or逻辑或按位或运算xor逻辑或按位异或运算关系及比较运算符(最低优先级)=判断是否相等判断是否不相等判断是否小于判断是否大于=判断是否小于或等于,或是否是一个集合的子集=判断是否大于或等于,或是否是一个集合的父集in判断是否是集合成员is判断对象是否类型兼容(又一个RTTI运算符)集合运算符8集合运算符包括并(+)、差(-)、交(*)、成员检测(in),及一些关系运算符。要把一个元素添加到集合中,你可以采用集合并运算。下面是一个选择字体的Delphi例子:Style:=Style+[fsBold];Style:=Style+[fsBold,fsItalic]-[fsUnderline];另一种方法是利用标准过程Include和Exclude,它们效率更高(但不能用于控件的集合类型属性,因为只能操纵一个元素):Include(Style,fsBold);变量Pascal变量在使用前必须声明,声明变量时必须指定一种数据类型。下面是变量声明的例子:varValue:Integer;IsCorrect:Boolean;A,B:Char;关键字var可以在许多地方使用,例如放在函数或过程的开始部分,用来声明函数或过程的局部变量;也可以放在单元中,用于声明全程变量。var关键字之后是一组变量名列表,每个变量名后跟一个冒号和数据类型名,一行中可以声明多个变量,如上例中最后一句。一旦变量的类型被指定,你只能对变量执行该变量类型支持的操作。例如,在判断操作中用布尔值,在数字表达式中用整型值,你不能将布尔值和整型值混用(在C语言中可以这样)。使用简单的赋值语句,可写出下面的代码:Value:=10;IsCorrect:=True;但下面的语句是不正确的,因为两个变量数据类型不同:Value:=IsCorrect;//error在Delphi中编译这句代码,会出现错误信息:Incompatibletypes:'Integer'and'Boolean'.(类型不兼容:‘整型’和‘布尔型’)。象这样的错误通常是编程错误,因为把一个True或False的值赋给一个整型变量没有什么意义。你不该责怪Delphi提示这样的错误信息,代码中有不对的地方Delphi当然要提出警告。把变量的值从一种类型转换到另一种类型往往不难做到,有些情况下类型转换会自动实现,不过一般情况下需要调用特殊的系统函数,通过改变数据内部表示来实现类型转换。在Delphi中,当你声明全程变量时,你可以赋给它一个初值。例如,你可以这样写:varVa