Delphi基础3

来源:互联网 发布:樱井知香所有作品链接 编辑:程序博客网 时间:2024/05/16 13:58
一:什么是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;