http://blog.csdn.net/procedure1984/archive/2009/02/16/3897028.aspx
type
TMyObjectDelegate = procedure (AIntParam: integer; AStringParam: string) of object; //对象的
函数/过程
TMyRegularDelegate = procedure (AIntParam: integer; AStringParam: string); //非对象的(一般的)函数/过程
TMyRegularDelegate = procedure (AIntParam: integer; AStringParam: string); //非对象的(一般的)函数/过程
{ 非对象(一般)的函数列表 }
- function Add(const ANumOne: Double; const ANumTwo: Double): Double;
- begin
- Result := ANumOne + ANumTwo;
- end;
- { TfrmTest }
{ 对象的函数列表 }
function TfrmTest.Add(const ANumOne, ANumTwo: Double): Double;
begin
Result := ANumOne + ANumTwo;
end;
- 说明:如果有 of object 表示必须要声明为类的方法,,否则只要声明为一般的方法
function TfrmTest.xxxxxx: integer;
begin
- case Self.FDelegateType of
dtObject:
begin
dblResult := Self.DoObjectCalc(dblNumOne, dblNumTwo, Self.Add);
//如果需要传入对象方法的地方,错误传入了非对象的add方法
//dblResult := Self.DoObjectCalc(dblNumOne, dblNumTwo, UnitFrmTest.Add);
//则会提示以下错误:
//E2009 Incompatible types: 'regular procedure and method pointer'
end;
dtRegular:
begin
dblResult := DoRegularCalc(dblNumOne, dblNumTwo, UnitFrmTest.Add);
//若为
//dblResult := DoRegularCalc(dblNumOne, dblNumTwo, Self.Add);
//则会提示以下错误:
//E2009 Incompatible types: 'regular procedure and method pointer'
end;
end
增加:如果在需要非对象的add方法时,传入了一个本函数中的子函数,则提示
//E2094 Local procedure/function 'comm' assigned to procedure variable
end;