一:什么是pascal?
Pascal语言是由瑞士苏黎士工艺专科学校的Niklaus Wirth教授在1971年设计的。
二:什么是Turbo Pascal?
Turbo Pascal比汇编语言高级并且更加容易使用和学习,所以Turbo Pascal语言的诞生在个人电脑上特别
受到欢迎。
三:Delphi跟Pascal有什么渊源?
Borland在Pascal语言的9个版本以后,在1995年发布了Delphi,从而把Pascal转入一种视觉编程语言。
一:Object Pascal语言的词法
从这章开始分别就Object Pascal的语法等内容做了详细的介绍。如果您还是一个Delphi初学者,您应该了
解并掌握这些基本的内容。 其实,里面的很多内容不仅是对Delphi, 还有对很多OOP的程序开发的概念有
一个相当不错的引导。
我先向大家详细介绍DELPHI的词法篇,本篇解释了绝大部分的Object Pascal的语法单位,这在正确书写程
序时是非常重要的内容。
在运算符的解释里还简略提到有关数据类型运算的问题。
注释
标识符
赋值操作符
@标识符
字符指针操作符
逻辑操作符
类型强制转换符
集合操作符
保留字和特殊符号
运算符
算术运算操作符
位操作符
关系运算操作符
运行期类型识别操作符
字符串操作符
可变类型的操作
以上是将要讲述的内容,下面详细阐述。
⑴注释
注释用于增加程序的可读性,您应当养成做注释的习惯。 在Object Pascal中,注释是用{和}或(*和*)括起
来的一段文字,如果注释中只有一行,也可以像C++那样用//表示注释开始,如下例:
Procedure TForm1.Button1Click(Sender:TObject);
Begin
Caption:='新标题';{把Form1的标题改为'新标题'}
Color:=clBlue; (* 把Form1的背景颜色改为蓝色*)
Height:=100; //把Form1的高度改为100
End;
注释可以出现在任何空格可出现的地方,编译器在编译程序时会自动忽略注释。
注意:注释的内容中不能}或*),因为编译器把它们作为注释结束符号,注释也不能嵌套。
有一个特殊情况是,如果{或(*后紧跟着一个$符号(不能有空格),编译器把它作为编译开关,而不是注释
。
⑵标识符 Object
Pascal语言是由各种词法单位构成的,如常量、变量、类型、过程、函数、单元等,要在程序中使用这些词
法单位,首先要定义标识符。所谓标识符,就是给这些词法单位取个名称,用来区别于其它词法单位。
在Object Pascal 中,定义标识符要注意这么:
(1)标识符不区别大小,例如MyProc与myproc是同一个标识符。
(2)标识符只能以字母或下划线打头,不能是数字。
(3)标识符可以是任意长度,但只有头63个是有效的。 (4)标识符中间不允许有空格。
(5)不允许使用Object Pascal语言的保留字作为标识符如For、Do等(参见保留字与编译指令),也尽量不
要用预定义的标准标识符作为您自己的标识符,如Integer、Word、True、False等,因为这有可能引起混乱。
(6)在Object Pascal中,有许多对象具有相同标识符的特性或方法等,在引用这些特性或方法时,要加限
定符号,例如:
Panel1.Caption:='...';
Button1.Caption:='...';
上例中,都是修改Caption特性,但一个是属于panel1,另一个是属于Button1。
⑶@标识符
@是一元操作符,用于获得操作数地址指针,操作数可以是变量、过程、函数以及类类型中的方法,程序示例
如下:
Procedure ChangeValue(X:Integer);
Var Ptr:^Integer;
Begin
Ptr:=@X;
Writeln(Ptr^);
Ptr^:=15;
End;
假设主程序如下:
Var Param:Integer;
Begin
Param:=10;
ChangeValue(Param);
Writeln(Param); {10}
End;
上例中,ChangeValue过程首先声明了一个指向整形数的指针Ptr,然后用@操作符取出X的地址赋给Ptr指针,
并显示Ptr指针指向的数,最后改变这个数。不过要注意:在调用了ChangeValue后,尽管形参X的值被改为
15,但实参Param的值仍然是10.
三
当操作数是变量时,@操作符返回的是指向这个数的指针。
当操作数是过程或函数的数值参数时,@操作符返回的是形参在栈中的地址。
当操作数是过程或函数的变量参数时,@操作符返回的是指向实参的地址。
当操作数为过程或函数时,@操作符返回的是过程或函数的入口,这通常用于把一个过程或函数传递给用汇编
语言写的例程。有的API函数要求一个函数地址的入口,也可以使用它。
⑷赋值操作符 在Object pascal当中,赋值操作符是:=。
注意不要同比较符号=相混淆,在大多数的开发语言中,没有区分这二者。象C++和VB等程序,赋值号与比
较号是一样的。
⑸逻辑操作符 逻辑操作符的操作数是布尔表达,
结果也是布尔值,可以这么认为,逻辑操作符构成了一个复合的布尔表达式。
除了Not是一元操作符外,其它逻辑操作符是两元操作符,
Not(逻辑非),把True 变成False,把False变成True,例如:
If Not(X>Y) Then... {当X不大于Y时就...}
And(逻辑与),相当于汉语中"并且"的意思,例如:
If (X>Y) And (M>N) Then... {当X大于Y并且M大于N就...}
Or(逻辑或),相当于汉语的"或者"的意思,例如:
If (X>Y) Or (M>N) Then...{当X大于Y或者M大于N就...}
Xor(逻辑异或),当两边的操作数一个为True另一个为False时结果为True,当两边的操作数都为True或都为
False时结果为False。
Object Pascal中有一个编译开关$B,缺省是{$B-}状态,当复合的布尔表达式值已经很明显的时候,就不要
再计算每一个操作数的值,当其中一个操作数包含有函数调用时,这种方式能节约时间和代码长度。当编译开
关为{$B+}状态时,即使复合的布尔表达式的值很明显,仍然要计算每一个操作数的值,包括函数调用。
⑹字符指针操作符
关于字符指针的概念请参见数据类型Pchar。
字符指针操作符是+和-,分别用于使指针增大或减小一个偏移量,如果是两个字符指针相减,结果为两个指针
之间的距离。
下面举例说明字符指针操作符的用法,假设P和Q是两个字符指针,K是一整型数,
P+K,生成了一个新指针,指向P后面的K个字符。
P-K,生成一个新指针,指向P前面的K个字符。
P-Q,计算两个指针之间的距离。
注意:P和Q必须是指向相同的字符数组的指针,才可以进行P-Q计算,否则结果无意义。
⑺类型强制转换符 Object Pascal提供了一个专门的类型强制转换符As,其语法如下:
对象 As 对象类型
例如上面的例子可改为:
Procedure TForm1.Click(Sender:Tobject);
Begin
If Sender Is TButton Then (Sender As TButton).Height:=50;
End;
上例中,通过As操作符把Sender转换成TButton类型。
As 操作符通常用在With语句中,程序示例如下:
Procedure TForm1.Click(Sender:Tobject);
Begin
If Sender Is TButton Then (Sender As TButton).Height:=50;
End;
使用As操作符要注意两点:
一是它的优先级比引用操作符低,因此如果要引用某个对象的特性或方法,必须先用括弧括起来,例如:
(Sender As TButton).Caption:='&MyButton';
二是要注意操作符两边的操作数必须是赋值相容的类型,否则转换可能会引起异常。
⑻集合操作符 集合操作符用于对集合类型的数据进行某些操作。
注意:虽然集合操作符借用了算术操作符的+、-、*等符号,但对集合类型来说,是不能进行算术运算的,这
些符号有特殊的意义,下面我们举例说明这些操作符的用法。假设有两个集合A和B:
A+B其结果是属于集合A或集合B的元素组成的集合(并集)。
A-B其结果是集合A中不属于集合B的元素组成的集合。
A*B其结果是同时属于集合A和集合B的元素组成的集合(交集)。
还有个特殊的集合运算符是In(也可以说是关系运算符),用于判断某个元素是否在集合中,其结果是布尔
值,例如:
Read(Ch);
If Ch In ['a'..'z'] Then...
上例中,首先读一个字符,然后判断这个字符是否在集合中。
⑼保留字和特殊符号
所谓保留字,就是Object Pascal语言中具有特殊和固定意义的单词,如For、And、If、Begin等,Object
pascal不允许把保留字作为标识符。
由于Object Pascal是不区分大小写的,因此保留字也是不区分大小写的,例如And和AND是同一个字。
缺省情况下,Delphi的代码编辑器用黑体字显示保留字,以区别于其它语言成份。
除了保留字外,Object Pascal还预定义了一些特殊符号,如下所示:
+ - * / = < > [ ] . , ( ) : ; ^ @ { } $ # <= >= := .. (* *)
(. .)
其中有的是作为运算符,有的配对使用作为分界符。
⑽运算符 Object Pascal提供了下列基本运算(按优先级排列):
最高优先级:@ Not
次优先级:* / Div Mod As And Shl Shr
再次优先级: + - Or Xor
最低优先级: = <> < > <= >= In Is
进行运算特别要注意运算符的优先级,一般是这么个原则:
当一个操作数两边的运算符的优先级不同时,这个操作数属于优先级高的运算符。例如:2+3*4的结果是14
而不是20。
当一个操作数两边的运算符的优先级相同时,这个操作数属于它左边的运算符。例如:10 mod 3 * 2的结果
为2,而不是4。
括号优先级最高,可以把括号内的表达式作为一个操作数。
下面分别介绍各个运算符。
①算术运算操作符
算术运算操作符是两元操作符,用于进行诸如加减乘除等运算,Object Pascal中共有6种算术运算操作符:
+ (加号) - (减号) * (乘号)
以上3种操作符,当两个操作数都是整数时,操作结果为整数,两个操作数只要有一个褛,操作结果就是实数。
/ (除号)不管操作数是整数还是实数,操作结果都是实数。
Div(整数除),两个操作数必须是整数,结果是商的整数部分
Mod(取模),两个操作数必须是整数,结果是两数相除的余数。
注意:上述3种运算符右边的操作数不能是0,否则将触发一个异常。另外Object
Pascal规定,在进行取模运算时,当左边的操作数为正时结果为正,左边的操作数为负的结果为负,与除数
无关。例如:-28 Mod 3 结果为-1, 28 Mod -3 结果为1。
另外,后面要讲到,+ 、-、*这3个算术操作符还可以当作其它操作符。
②位操作符 除了Not是一元操作符外,其它位操作符是两元操作符,其操作数只能是整数,结果也是整数。
Not(按位非),也就是把操作数的每一位取反,1变成0,0变成1,例如Not 15 其结果为240。(15的二进制值
为00001111,而240的二进制值为11110000)。
And(按位与),当两个位都为1时,结果的这一位为1。
Or(按位或),当两个位中有一个是1时,结果的这一位为1。
Xor(按位异或),当两个位相异时,结果的这一位为1。
Shl(左移),例如:2 Shl 7结果为256(相当于E1乘以2的E2次方,其中E1为左边的操作数,E2为右边的操
作数)。(2的二进制值为10,256的二进制值为100000000)。
Shr(右移),例如: 256 Shr 7结果为 2(相当于E1除以2的E2次方的整数部分)。
③关系运算操作符 关系运算就是对两个相同类型的操作数进行比较,根据比较结果返回一个布尔值。
=,判断两个操作数是否相等,操作数可为简单类型、类、类引用、指针、集合、字符串或可变类型。
<>,判断两个操作数是否不相等,操作数可以是简单类型、类、类引用、指针、集合、字符串或可变类型。
<,判断左边的操作数是否小于右边的操作数,操作数可以是简单类型、字符串、Pchar 或可变类型
>,判断左边的操作数是否大于右边的操作数,操作数可以是简单类型、字符串、Pchar或可变类型。
<=,判断左边的操作数是否小于或等于右边的操作数,操作数可以是简单类型、字符串、Pchar或可变类型。
>=,判断左边的操作数是否大于或等于右边操作数,操作数可以是简单类型、字符串、Pchar或可变类型。
<=,用于两个集合类型的比较。
>=,用于两个集合类型的比较。
⒒运行期类型识别操作符
Is是Object pascal提供的用于在运行期访问对象类型的操作符,其结果是一个布尔值。
当对象就是指定的对象类型或该对象类型的继承类型时,Is的结果就是True,反之就是False。
Is操作符实际上也是一种关系运算符,因此,is操作符通常用在If 语句中,程序示例如下:
Procedure TForm1.Click(Sender:Tobject);
Begin
If Sender Is TButton Then TButton(Sender).Height:=50;
End;
上例中,如果产生这个事件的对象是TButton就把Sender进行类型强制转换,并把按钮的高度改为50。注意,
即使Sender就是TButton类型,但不能直接引用Sender的特性,而必须先进行类型强制转换。
另外要注意:Is的优先级和关系运算符是同一个级别。
⒓字符串操作符 +操作符还能用于字符串或字符相加,其结果是字符串。
如果两个操作数都是短字符串,相加后的结果如果超过了255个字符,超过的部分将被截掉。如果两个操作数
中有一个是长字符串,结果也就是长字符串(关于长短字符串的概念请参见数据类型)。
程序示例如下:
Caption:='窗口的名字是:'+'MyWindow';
上例中,把两个字符串相加,并赋给Caption;
⒔可变类型的操作
Object Pascal提供了一个新的数据类型Variant,运行这种类型的操作有+、-、*、/、Div、Mod、Shl、Shr、
And、Or、Xor、Not等。
下一章将介绍:Object Pascal语言的数据类型
附 DELPHI Tips:
(每章文章后我都会附一个比较有用的Tips给大家,这些Tips都是我平常实际使用到的,相信能够帮助大家
实际解决一些问题。)
如何在网络邻居里选择一台电脑?
类别:系统
uses
ShlObj, ActiveX;
function BrowseComputer(DialogTitle: string; var CompName: string): boolean;
var
BrowseInfo: TBrowseInfo;
ItemIDList: PItemIDList;
ComputerName: array[0..MAX_PATH] of Char;
Title: string;
WindowList: Pointer;
ShellMalloc: IMalloc;
begin
if Failed(SHGetSpecialFolderLocation(Application.Handle, CSIDL_NETWORK, ItemIDList)) then
raise Exception.Create('Unable open browse computer dialog');
try
FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
BrowseInfo.hwndOwner := Application.Handle;
BrowseInfo.pidlRoot := ItemIDList;
BrowseInfo.pszDisplayName := ComputerName;
Title := DialogTitle;
BrowseInfo.lpszTitle := PChar(Pointer(Title));
BrowseInfo.ulFlags := BIF_BROWSEFORCOMPUTER;
WindowList := DisableTaskWindows(0);
try
Result := SHBrowseForFolder(BrowseInfo) <> nil;
finally
EnableTaskWindows(WindowList);
end;
if Result then CompName := ComputerName;
finally
if Succeeded(SHGetMalloc(ShellMalloc)) then
ShellMalloc.Free(ItemIDList);
end;
end;
Pascal语言是由瑞士苏黎士工艺专科学校的Niklaus Wirth教授在1971年设计的。
二:什么是Turbo Pascal?
Turbo Pascal比汇编语言高级并且更加容易使用和学习,所以Turbo Pascal语言的诞生在个人电脑上特别
受到欢迎。
三:Delphi跟Pascal有什么渊源?
Borland在Pascal语言的9个版本以后,在1995年发布了Delphi,从而把Pascal转入一种视觉编程语言。
一:Object Pascal语言的词法
从这章开始分别就Object Pascal的语法等内容做了详细的介绍。如果您还是一个Delphi初学者,您应该了
解并掌握这些基本的内容。 其实,里面的很多内容不仅是对Delphi, 还有对很多OOP的程序开发的概念有
一个相当不错的引导。
我先向大家详细介绍DELPHI的词法篇,本篇解释了绝大部分的Object Pascal的语法单位,这在正确书写程
序时是非常重要的内容。
在运算符的解释里还简略提到有关数据类型运算的问题。
注释
标识符
赋值操作符
@标识符
字符指针操作符
逻辑操作符
类型强制转换符
集合操作符
保留字和特殊符号
运算符
算术运算操作符
位操作符
关系运算操作符
运行期类型识别操作符
字符串操作符
可变类型的操作
以上是将要讲述的内容,下面详细阐述。
⑴注释
注释用于增加程序的可读性,您应当养成做注释的习惯。 在Object Pascal中,注释是用{和}或(*和*)括起
来的一段文字,如果注释中只有一行,也可以像C++那样用//表示注释开始,如下例:
Procedure TForm1.Button1Click(Sender:TObject);
Begin
Caption:='新标题';{把Form1的标题改为'新标题'}
Color:=clBlue; (* 把Form1的背景颜色改为蓝色*)
Height:=100; //把Form1的高度改为100
End;
注释可以出现在任何空格可出现的地方,编译器在编译程序时会自动忽略注释。
注意:注释的内容中不能}或*),因为编译器把它们作为注释结束符号,注释也不能嵌套。
有一个特殊情况是,如果{或(*后紧跟着一个$符号(不能有空格),编译器把它作为编译开关,而不是注释
。
⑵标识符 Object
Pascal语言是由各种词法单位构成的,如常量、变量、类型、过程、函数、单元等,要在程序中使用这些词
法单位,首先要定义标识符。所谓标识符,就是给这些词法单位取个名称,用来区别于其它词法单位。
在Object Pascal 中,定义标识符要注意这么:
(1)标识符不区别大小,例如MyProc与myproc是同一个标识符。
(2)标识符只能以字母或下划线打头,不能是数字。
(3)标识符可以是任意长度,但只有头63个是有效的。 (4)标识符中间不允许有空格。
(5)不允许使用Object Pascal语言的保留字作为标识符如For、Do等(参见保留字与编译指令),也尽量不
要用预定义的标准标识符作为您自己的标识符,如Integer、Word、True、False等,因为这有可能引起混乱。
(6)在Object Pascal中,有许多对象具有相同标识符的特性或方法等,在引用这些特性或方法时,要加限
定符号,例如:
Panel1.Caption:='...';
Button1.Caption:='...';
上例中,都是修改Caption特性,但一个是属于panel1,另一个是属于Button1。
⑶@标识符
@是一元操作符,用于获得操作数地址指针,操作数可以是变量、过程、函数以及类类型中的方法,程序示例
如下:
Procedure ChangeValue(X:Integer);
Var Ptr:^Integer;
Begin
Ptr:=@X;
Writeln(Ptr^);
Ptr^:=15;
End;
假设主程序如下:
Var Param:Integer;
Begin
Param:=10;
ChangeValue(Param);
Writeln(Param); {10}
End;
上例中,ChangeValue过程首先声明了一个指向整形数的指针Ptr,然后用@操作符取出X的地址赋给Ptr指针,
并显示Ptr指针指向的数,最后改变这个数。不过要注意:在调用了ChangeValue后,尽管形参X的值被改为
15,但实参Param的值仍然是10.
三
当操作数是变量时,@操作符返回的是指向这个数的指针。
当操作数是过程或函数的数值参数时,@操作符返回的是形参在栈中的地址。
当操作数是过程或函数的变量参数时,@操作符返回的是指向实参的地址。
当操作数为过程或函数时,@操作符返回的是过程或函数的入口,这通常用于把一个过程或函数传递给用汇编
语言写的例程。有的API函数要求一个函数地址的入口,也可以使用它。
⑷赋值操作符 在Object pascal当中,赋值操作符是:=。
注意不要同比较符号=相混淆,在大多数的开发语言中,没有区分这二者。象C++和VB等程序,赋值号与比
较号是一样的。
⑸逻辑操作符 逻辑操作符的操作数是布尔表达,
结果也是布尔值,可以这么认为,逻辑操作符构成了一个复合的布尔表达式。
除了Not是一元操作符外,其它逻辑操作符是两元操作符,
Not(逻辑非),把True 变成False,把False变成True,例如:
If Not(X>Y) Then... {当X不大于Y时就...}
And(逻辑与),相当于汉语中"并且"的意思,例如:
If (X>Y) And (M>N) Then... {当X大于Y并且M大于N就...}
Or(逻辑或),相当于汉语的"或者"的意思,例如:
If (X>Y) Or (M>N) Then...{当X大于Y或者M大于N就...}
Xor(逻辑异或),当两边的操作数一个为True另一个为False时结果为True,当两边的操作数都为True或都为
False时结果为False。
Object Pascal中有一个编译开关$B,缺省是{$B-}状态,当复合的布尔表达式值已经很明显的时候,就不要
再计算每一个操作数的值,当其中一个操作数包含有函数调用时,这种方式能节约时间和代码长度。当编译开
关为{$B+}状态时,即使复合的布尔表达式的值很明显,仍然要计算每一个操作数的值,包括函数调用。
⑹字符指针操作符
关于字符指针的概念请参见数据类型Pchar。
字符指针操作符是+和-,分别用于使指针增大或减小一个偏移量,如果是两个字符指针相减,结果为两个指针
之间的距离。
下面举例说明字符指针操作符的用法,假设P和Q是两个字符指针,K是一整型数,
P+K,生成了一个新指针,指向P后面的K个字符。
P-K,生成一个新指针,指向P前面的K个字符。
P-Q,计算两个指针之间的距离。
注意:P和Q必须是指向相同的字符数组的指针,才可以进行P-Q计算,否则结果无意义。
⑺类型强制转换符 Object Pascal提供了一个专门的类型强制转换符As,其语法如下:
对象 As 对象类型
例如上面的例子可改为:
Procedure TForm1.Click(Sender:Tobject);
Begin
If Sender Is TButton Then (Sender As TButton).Height:=50;
End;
上例中,通过As操作符把Sender转换成TButton类型。
As 操作符通常用在With语句中,程序示例如下:
Procedure TForm1.Click(Sender:Tobject);
Begin
If Sender Is TButton Then (Sender As TButton).Height:=50;
End;
使用As操作符要注意两点:
一是它的优先级比引用操作符低,因此如果要引用某个对象的特性或方法,必须先用括弧括起来,例如:
(Sender As TButton).Caption:='&MyButton';
二是要注意操作符两边的操作数必须是赋值相容的类型,否则转换可能会引起异常。
⑻集合操作符 集合操作符用于对集合类型的数据进行某些操作。
注意:虽然集合操作符借用了算术操作符的+、-、*等符号,但对集合类型来说,是不能进行算术运算的,这
些符号有特殊的意义,下面我们举例说明这些操作符的用法。假设有两个集合A和B:
A+B其结果是属于集合A或集合B的元素组成的集合(并集)。
A-B其结果是集合A中不属于集合B的元素组成的集合。
A*B其结果是同时属于集合A和集合B的元素组成的集合(交集)。
还有个特殊的集合运算符是In(也可以说是关系运算符),用于判断某个元素是否在集合中,其结果是布尔
值,例如:
Read(Ch);
If Ch In ['a'..'z'] Then...
上例中,首先读一个字符,然后判断这个字符是否在集合中。
⑼保留字和特殊符号
所谓保留字,就是Object Pascal语言中具有特殊和固定意义的单词,如For、And、If、Begin等,Object
pascal不允许把保留字作为标识符。
由于Object Pascal是不区分大小写的,因此保留字也是不区分大小写的,例如And和AND是同一个字。
缺省情况下,Delphi的代码编辑器用黑体字显示保留字,以区别于其它语言成份。
除了保留字外,Object Pascal还预定义了一些特殊符号,如下所示:
+ - * / = < > [ ] . , ( ) : ; ^ @ { } $ # <= >= := .. (* *)
(. .)
其中有的是作为运算符,有的配对使用作为分界符。
⑽运算符 Object Pascal提供了下列基本运算(按优先级排列):
最高优先级:@ Not
次优先级:* / Div Mod As And Shl Shr
再次优先级: + - Or Xor
最低优先级: = <> < > <= >= In Is
进行运算特别要注意运算符的优先级,一般是这么个原则:
当一个操作数两边的运算符的优先级不同时,这个操作数属于优先级高的运算符。例如:2+3*4的结果是14
而不是20。
当一个操作数两边的运算符的优先级相同时,这个操作数属于它左边的运算符。例如:10 mod 3 * 2的结果
为2,而不是4。
括号优先级最高,可以把括号内的表达式作为一个操作数。
下面分别介绍各个运算符。
①算术运算操作符
算术运算操作符是两元操作符,用于进行诸如加减乘除等运算,Object Pascal中共有6种算术运算操作符:
+ (加号) - (减号) * (乘号)
以上3种操作符,当两个操作数都是整数时,操作结果为整数,两个操作数只要有一个褛,操作结果就是实数。
/ (除号)不管操作数是整数还是实数,操作结果都是实数。
Div(整数除),两个操作数必须是整数,结果是商的整数部分
Mod(取模),两个操作数必须是整数,结果是两数相除的余数。
注意:上述3种运算符右边的操作数不能是0,否则将触发一个异常。另外Object
Pascal规定,在进行取模运算时,当左边的操作数为正时结果为正,左边的操作数为负的结果为负,与除数
无关。例如:-28 Mod 3 结果为-1, 28 Mod -3 结果为1。
另外,后面要讲到,+ 、-、*这3个算术操作符还可以当作其它操作符。
②位操作符 除了Not是一元操作符外,其它位操作符是两元操作符,其操作数只能是整数,结果也是整数。
Not(按位非),也就是把操作数的每一位取反,1变成0,0变成1,例如Not 15 其结果为240。(15的二进制值
为00001111,而240的二进制值为11110000)。
And(按位与),当两个位都为1时,结果的这一位为1。
Or(按位或),当两个位中有一个是1时,结果的这一位为1。
Xor(按位异或),当两个位相异时,结果的这一位为1。
Shl(左移),例如:2 Shl 7结果为256(相当于E1乘以2的E2次方,其中E1为左边的操作数,E2为右边的操
作数)。(2的二进制值为10,256的二进制值为100000000)。
Shr(右移),例如: 256 Shr 7结果为 2(相当于E1除以2的E2次方的整数部分)。
③关系运算操作符 关系运算就是对两个相同类型的操作数进行比较,根据比较结果返回一个布尔值。
=,判断两个操作数是否相等,操作数可为简单类型、类、类引用、指针、集合、字符串或可变类型。
<>,判断两个操作数是否不相等,操作数可以是简单类型、类、类引用、指针、集合、字符串或可变类型。
<,判断左边的操作数是否小于右边的操作数,操作数可以是简单类型、字符串、Pchar 或可变类型
>,判断左边的操作数是否大于右边的操作数,操作数可以是简单类型、字符串、Pchar或可变类型。
<=,判断左边的操作数是否小于或等于右边的操作数,操作数可以是简单类型、字符串、Pchar或可变类型。
>=,判断左边的操作数是否大于或等于右边操作数,操作数可以是简单类型、字符串、Pchar或可变类型。
<=,用于两个集合类型的比较。
>=,用于两个集合类型的比较。
⒒运行期类型识别操作符
Is是Object pascal提供的用于在运行期访问对象类型的操作符,其结果是一个布尔值。
当对象就是指定的对象类型或该对象类型的继承类型时,Is的结果就是True,反之就是False。
Is操作符实际上也是一种关系运算符,因此,is操作符通常用在If 语句中,程序示例如下:
Procedure TForm1.Click(Sender:Tobject);
Begin
If Sender Is TButton Then TButton(Sender).Height:=50;
End;
上例中,如果产生这个事件的对象是TButton就把Sender进行类型强制转换,并把按钮的高度改为50。注意,
即使Sender就是TButton类型,但不能直接引用Sender的特性,而必须先进行类型强制转换。
另外要注意:Is的优先级和关系运算符是同一个级别。
⒓字符串操作符 +操作符还能用于字符串或字符相加,其结果是字符串。
如果两个操作数都是短字符串,相加后的结果如果超过了255个字符,超过的部分将被截掉。如果两个操作数
中有一个是长字符串,结果也就是长字符串(关于长短字符串的概念请参见数据类型)。
程序示例如下:
Caption:='窗口的名字是:'+'MyWindow';
上例中,把两个字符串相加,并赋给Caption;
⒔可变类型的操作
Object Pascal提供了一个新的数据类型Variant,运行这种类型的操作有+、-、*、/、Div、Mod、Shl、Shr、
And、Or、Xor、Not等。
下一章将介绍:Object Pascal语言的数据类型
附 DELPHI Tips:
(每章文章后我都会附一个比较有用的Tips给大家,这些Tips都是我平常实际使用到的,相信能够帮助大家
实际解决一些问题。)
如何在网络邻居里选择一台电脑?
类别:系统
uses
ShlObj, ActiveX;
function BrowseComputer(DialogTitle: string; var CompName: string): boolean;
var
BrowseInfo: TBrowseInfo;
ItemIDList: PItemIDList;
ComputerName: array[0..MAX_PATH] of Char;
Title: string;
WindowList: Pointer;
ShellMalloc: IMalloc;
begin
if Failed(SHGetSpecialFolderLocation(Application.Handle, CSIDL_NETWORK, ItemIDList)) then
raise Exception.Create('Unable open browse computer dialog');
try
FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
BrowseInfo.hwndOwner := Application.Handle;
BrowseInfo.pidlRoot := ItemIDList;
BrowseInfo.pszDisplayName := ComputerName;
Title := DialogTitle;
BrowseInfo.lpszTitle := PChar(Pointer(Title));
BrowseInfo.ulFlags := BIF_BROWSEFORCOMPUTER;
WindowList := DisableTaskWindows(0);
try
Result := SHBrowseForFolder(BrowseInfo) <> nil;
finally
EnableTaskWindows(WindowList);
end;
if Result then CompName := ComputerName;
finally
if Succeeded(SHGetMalloc(ShellMalloc)) then
ShellMalloc.Free(ItemIDList);
end;
end;