过程类型

6.3.4 过程类型
  Object Pascal允许把过程和函数作为一个整体赋给变量和作为参数传递。实现这一功能的途径是使用Object Pascal的过程类型。
 声明一个过程类型的语法与声明过程或函数的首部的语法相似,不同的是声明一个过程类型时不需要过程或函数保留字后面的标识符。声明过程类型时可以指定一种调用约定方式,缺省的调用方式是Register。下面是声明过程类型的举例:
type 
TProcedure = procedure
TStrProc = procedure(const S: string);
TMathFunc = function(X: Double): Double;
  上例声明的三个过程类型中,第一个是不带任何参数的过程,第二个是带一个参数S的过程,第三个是带一个参数X的函数,函数返回值为Double
  过程类型根据其是否运用于对象分为两类:全局过程指针和方法指针。
  声明过程类型时不带of Object的是全局过程指针。全局过程指针指向的是全局的过程或函数。例如上面的过程类型Tprocedure,TstrProc,TMathFunc都是全局过程指针。
  声明过程类型时带有of Object的是方法指针。方法指针指向的是一个对象的过程或函数方法。例如下面的过程类型是方法指针。
type TMethod = procedure of object;
TNotifyEvent = procedure(Sender: TObject) of object;
  声明过程类型变量的方法与声明其它类型变量的方法相同,下面例子声明两个过程类型变量:
var Proc:TProcedure; 
  StrProc:TStrProc;
  过程类型变量的值可以取下列四种之一:
 nil一个过程类型变量
 一个全局过程或函数标识符一个方法指示符下面举例说明过程类型的用法。
type TMainForm = class(TForm) 
  procedure ButtonClick(Sender: TObject);
  ...
  end;
var MainForm: TMainForm; 
  MathFunc: TMathFunc; 
  OnClick: TNotifyEvent;
function Tan(Angle: Double): Double;
  begin 
   Result := Sin(Angle) / Cos(Angle);
  end;
  上例的TMainForm是一个类类型,TMathFunc是前面定义的全局过程指针,TnotifyEvent是前面定义的方法指针。其中MathFunc和OnClick是两个过程类型变量。变量MathFunc和OnClick的赋值方式为:
  MathFunc := Tan;OnClick := MainForm.ButtonClick;
  调用结果为:
X := MathFunc(X);{等价于 X := Tan(X) }
OnClick(Self);{等价于 MainForm.ButtonClick(Self) }
  过程类型变量值等于NIL表示该过程类型变量没有赋值,因此在过程语句或函数调用中使用值等于NIL的过程类型变量将发生错误。防止的办法是使用Assigned()函数。例如:
  if Assigned(OnClick) then OnClick(Self);
  如果给定的过程类型变量已经赋值,Assigned函数返回TRUE,如果给定的过程类型变量值为NIL,Assigned函数返回FALSE。在把一个过程或函数赋给一个过程类型变量时要注意赋值兼容,必须满足下列条件:调用约定方式必须相同。?参数个数必须相同,相应的数据类型必须相同。?函数返回的值类型必须相同。

http://www.000webhost.com/386316.html

posted on 2010-10-27 17:46  dengdeng  阅读(498)  评论(0编辑  收藏  举报

导航