* 如果 TFunctionParameter 是一个方法(一个对象实例的),则需要在过程类型声名中加上 of object , 比如:
TFunctionParameter = function(const value : integer) : string of object;
* 如果 f 参数可能被传入 nil, 则应该用 Assigned 函数检测一下。
* 同时这也解决了编译错误 "Incompatible type: 'method pointer and regular procedure'"。
附英文原文:
How to Use a Function or a Procedure as a Parameter in another Function
Zarko Gajic,
In Delphi, procedural types (method pointers) allow you to treat procedures and functions as values
that can be assigned to variables or passed to other procedures and functions.
Here's how to call a function (or procedure) as a parameter of another function (or procedure) :
1. Declare the function (or procedure) that will be used as a parameter.
In the example below, this is "TFunctionParameter".
2. Define a function that will accept another function as a parameter.
In the example below this is "DynamicFunction"
type
TFunctionParameter = function(const value : integer) : string;
...
function One(const value : integer) : string;
begin
result := IntToStr(value) ;
end;
function Two(const value : integer) : string;
begin
result := IntToStr(2 * value) ;
end;
function DynamicFunction(f : TFunctionParameter) : string;
begin
result := f(2006) ;
end;
...
//Example usage:
var
s : string;
begin
s := DynamicFunction(One) ;
ShowMessage(s) ; //will display "2006"
s := DynamicFunction(Two) ;
ShowMessage(s) ; // will display "4012"
end;
Note:
* Of course, you decide on the signature of the "TFunctionParameter": whether it is a procedure or a function,
how many parameters does it take, etc.
* If "TFunctionParameter" is a method (of an instance object) you need to add the words of object to
the procedural type name, as in:
TFunctionParameter = function(const value : integer) : string of object;
* If you expect "nil" to be specified as the "f" parameter, you should test for this using the Assigned function.
* Fixing the "Incompatible type: 'method pointer and regular procedure'"Author:
Passion Time: 2007-6-15 11:21