过程类型和函数类型

27 篇文章 0 订阅
一:过程类型 
    ⒈什么是过程类型   
把一个变量声明为过程类型,可以把一个过程或函数作为一个整体赋给这个变量或者把这个变量作为 
参数传递给其它过程或函数。 

声明一个过程类型的语法同声明一个过程或函数的首部语法相似,不同的是在保留字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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值