F: TIntegerFunction; {F是一个无参数、返回整数值的函数}
Proc: TProcedure; { Proc是一个无参数过程}
SP: TStrProc; { SP是一个使用string类型参数的过程}
M: TMathFunc; { M是一个使用Double类型参数、返回Double值的函数}
procedure FuncProc(P: TIntegerFunction); { FuncProc是一个过程,它的参数是
一个无参数、返回整数值的函数
上面的所有变量都是过程指针,也就是指向过程或函数地址的指针。若想引用一个实例对象的方法(参考Classes and objects),你需要在过程类型的名称后面加上of object。比如
type
TMethod = procedure of object;
TNotifyEvent = procedure(Sender: TObject) of object;
这些类型表示方法指针。方法指针实际上是一对指针:第一个存储方法的地址,第二个存储方法所属的对象的引用。给出下面的声明
type
TNotifyEvent = procedure(Sender: TObject) of object;
TMainForm = class(TForm)
procedure ButtonClick(Sender: TObject);
...
end;
var
MainForm: TMainForm;
OnClick: TNotifyEvent
我们就可以进行下面的赋值:
OnClick := MainForm.ButtonClick;
两个过程类型是兼容的,如果它们具有
z 相同的调用约定,
z 相同类型的返回值(或没有返回值),并且具有
z 相同数目的参数,并且相应位置上的类型也相同(参数名无关紧要)
过程指针和方法指针是不兼容的。nil可以赋给任何过程类型。
嵌套的过程和函数(在其它例程中声明的例程)不能被用作过程类型值,内置的过程和函数也不可以。若想使用内置的过程作为过程类型值,比如Length,你可以给它加一个包装:
function FLength(S: string): Integer;
begin
Result := Length(S);
end;
Procedural types in statements and expressions(语句和表达式中的过程类型)
当一个过程变量出现在赋值语句的左边时,编译器期望右边是一个过程类型值。赋值操作把左边的变量}
- 65 -
Data types, variables and constants
当作指针,它指向右边指示的过程或函数。但在其它情形,使用过程变量将调用它引用的过程或函数,你甚至可以对过程变量传递参数:
var
F: function(X: Integer): Integer;
I: Integer;
function SomeFunction(X: Integer): Integer;
...
F := SomeFunction; // 把SomeFunction赋给F
I := F(4); // 调用函数,把结果赋给I
在赋值语句中,左边变量的类型决定右边的过程(或方法)指针的解释,比如
var
F, G: function: Integer;
I: Integer;
function SomeFunction: Integer;
...
F := SomeFunction; // 把SomeFunction赋给F
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23665-45.html
因为现代战争将没有胜利者
我们希望能有更多的好心人可以帮帮她们