一:过程类型
⒈什么是过程类型
把一个变量声明为过程类型,可以把一个过程或函数作为一个整体赋给这个变量或者把这个变量作为
参数传递给其它过程或函数。
声明一个过程类型的语法同声明一个过程或函数的首部语法相似,不同的是在保留字Procedure或fun-
ction后不需要有过程或函数的标识符,例如:
Type
Proc1=Procedure;
Proc2=Procedure(VarX,Y:integer);
Proc3=Function(X:Double):Double;
上例中,声明了三个过程类型,第一个是不带任何参数的过程,第二个是带两个参数的过程,第三个是
带一个Double类型的参数并返回Double类型值的函数。
同声明一个过程或函数一样,您在声明一个过程类型时可以指定一种调用约定方式,缺省就是Register
方式。
下面我们举例说明过程类型的用法:
Type
SwapProc=Procedure(Var X,Y:Integer);
MathFunc=Function(X:Double):Double;
{以上是类型声明部分}
Var
P:SwapProc;
F:MathFunc;
{以上把P说明为SwapProc 类型的变量,把F说明为MathFunc类型的变量}
Procedure Swap(var A,B:integer);
Var
Temp:Integer;
Begin
Temp:=A;
A:=B;
B:=Temp;
End;
Function Tan(Angle:Double);
Begin
Tan:=Sin(Angle)/Cos(Angle);
End;
{以上定义了一个过程和一个函数}
P:=Swap;
F:=Tan;
{以上把Swap过程赋给P变量,把Tan函数赋给F变量}
P(I,J); {相当于调用Swap(I,J)}
X:=F(X); {相当于X:=tan(X)}
这里举例说明了一个过程或函数可以赋给一个过程类型的变量,事实上过程类型的数据还可以作为参
数传递给其它过程或函数。
注意:不能把过程类型直接作为函数的返回类型,不过您可以让函数的返回类型为指针类型,让指针
指向一个过程或函数的地址。
当把一个过程或函数赋给一个过程类型的变量时要注意赋值相容,只有满足下列条件才是赋值相容的。
调用约定方式必须相同。
参数个数必须相同,相应的其数据类型必须相同,但参数名不一定必须相同。
函数的返回类型必须相同。
Object Pascal规定,nil同任何过程类型相容。
过程类型根据其是否运用于对象分为两大类:一类是全局过程指针,另一类是方法指针。
全局过程指针指向的是全局的过程或函数,例如上例中的SwapProc和MathFunc,这类过程类型在声明时
没有Of object 部分。
方法指针在明时必须加上Of object,表示它所指向的是一个对象的方法,程序示例如下:
Type
TNotifyEvent=Procedure (Sender:Tobject) Of Object;
有了方法指针后,要扩展一个对象,不需要重新派生出一个新的,只要把其它对象的方法赋给个这个
方法指针就可以了,这样可以避免对象的层次过多。
方法指针通常用于把对象的事件同一段已有的代码(可能是其它对象的)相联系起来,例如您想定义
用户单击按钮时的缺省行为,您不必从 Tbutton对象派生出一个新对象并重载它的响应单击的行为,
您只需要把一段已有的代码同一个方法指针联系起来。
方法指针的示例如下:
Type
TNotifyEvent=Procedure(Sender:Tobject) Of Object;
Type
TAnObject=Class(TObject)
FOnClick:TNotifyEvent;
End;
TAnOtherObject=Class(TObject)
Procedure AMethod(Sender:Tobject);
end;
Var
AnObject:TAnObject;
AnOtherObject:TAnotherObject;
Begin
AnObject:=TAnobject.Create;
AnotherObject:=TAnotherObject.Create;
AnObject.FOnClick:=AnotherObject.Amethod;
end;
过程类型
最新推荐文章于 2021-08-02 18:04:15 发布