• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Delphi函数指针(函数可以当参数)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

首先学习: 指向非对象(一般的)函数/过程的函数指针

Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针。函数指针的声明只需要参数列表;如果是函数,再加个返回值。例如声明一个过程类型,该类型带一个通过引用传递的整型参数:

type 
  IntProc = procedure (var Num: Integer);

这个过程类型与任何参数完全相同的例程兼容,即用它声明的变量,可以指向任何此类函数,并通过其进行函数的调用。下面是一个兼容例程:

procedure DoubleTheValue (var Value: Integer);
begin
Value := Value * 2;
end;

函数指针能用于两种不同的目的:声明函数指针类型的变量;或者把函数指针作为参数传递给另一例程。利用上面给定的类型和过程声明,你可以写出下面的代码:

var 
  IP: IntProc; 
  X: Integer; 
begin 
  IP := DoubleTheValue; 
  X := 5; 
  IP (X); 
end;

虽然这种调用方法比直接调用麻烦了,那么我们为什么要用这种方式呢?

(1)因为在某些情况下,调用什么样的函数需要在实际中(运行时)决定,你可以根据条件来判断,实现用同一个表达,调用不同的函数,很是灵活.

(2)利用函数指针我们可以实现委托,委托在.NEt中被发挥的淋漓尽致,但Delphi同样能实现

(3)实现回调机制

函数指针很有用啊,是高级程序员的必修。

例子

  1. {********************************************************
  2.   函数指针(指向一般函数和过程)
  3. UnitOwner:coco.zhang                           
  4.   Last Modified:2008-10-5   
  5. *********************************************************}
  6. unit DelegateUnit;
  7. interface
  8.      procedure Func1;
  9.      {定义两个函数型构相同但功能不同的函数} 
  10.      function    FuncAdd(VarA , VarB : Integer):Integer;
  11.      function    FuncSub(VarA , VarB : Integer):Integer;
  12. type
  13.      DelegateFunc1 = procedure;
  14.      DelegateFuncCalc = function(VarA , VarB : Integer):Integer;
  15. var
  16.    I : Integer;
  17. implementation
  18.    procedure Func1;
  19.    begin
  20.        Writeln('Func1 was called!');
  21.    end;
  22.    function    FuncAdd(VarA , VarB : Integer):Integer;
  23.    begin
  24.         Result := VarA + VarB;
  25.    end;
  26.     function    FuncSub(VarA , VarB : Integer):Integer;
  27.    begin
  28.         Result := VarA - VarB;
  29.    end;
  30.    end.

客户端调用

  1. program Delegate;
  2. {$APPTYPE CONSOLE}
  3. uses
  4.   DelegateUnit;
  5. var
  6.    ADelegateFunc1 : DelegateFunc1;
  7.    ADelegateFuncCalc : DelegateFuncCalc;
  8. begin
  9.     {通过函数指针调用过程}
  10.     ADelegateFunc1  := Func1;
  11.     ADelegateFunc1 ;
  12.     {通过同种方式调用不同函数}
  13.     ADelegateFuncCalc  := FuncAdd;
  14.     Writeln(ADelegateFuncCalc(3,5));
  15.     ADelegateFuncCalc  := FuncSub;
  16.     Writeln(ADelegateFuncCalc(3,5));
  17. end.
运行结果
D:\Projects\Delphi7\src\GofProjects\Delegate>Delegate 
Func1 was called! 

-2

http://www.cnblogs.com/fengyuwuzu1980/archive/2008/12/23/1360268.html

--------------------------------------------------------------------------------------------------------------------

Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针。函数指针的声明只需要参数列表;如果是函数,再加个返回值。下面讲解指向非对象(一般的)函数/过程的函数指针。

例如声明一个过程类型,该类型带一个通过引用传递的整型参数:

type 
  IntProc = procedure (var Num: Integer); //IntProc是指向过程的函数指针

这个过程类型与任何参数完全相同的例程兼容,即用它声明的变量,可以指向任何此类函数,并通过其进行函数的调用。

下面是一个兼容例程:

procedure DoubleTheValue (var Value: Integer);
begin
Value := Value * 2;
end;

函数指针能用于两种不同的目的:声明函数指针类型的变量;或者把函数指针作为参数传递给另一例程。利用上面给定的类型和过程声明,你可以写出下面的代码:

var 
  IP: IntProc; 
  X: Integer; 
begin 
  IP := DoubleTheValue; 
  X := 5; 
  IP (X); 
end;

虽然这种调用方法比直接调用麻烦了,那么我们为什么要用这种方式呢?

(1)因为在某些情况下,调用什么样的函数需要在实际中(运行时)决定,你可以根据条件来判断,实现用同一个表达,调用不同的函数,很是灵活.

(2)利用函数指针我们可以实现委托,委托在.NEt中被发挥的淋漓尽致,但Delphi同样能实现

(3)实现回调机制

 delphi中可以通过函数指针把一个函数作为参数来传递,然后在另外一个函数中调用。

     1) 首先,申明函数指针类型TFunctionParameter。

        type
           TFunctionParameter = function(const value : integer) : string;

      2) 定义准备被作为参数传递的函数

          function One(const value : integer) : string;
          begin
             result := IntToStr(value) ;
          end;

          function Two(const value : integer) : string;
          begin
             result := IntToStr(2 * value) ; 
          end;
      
      3) 定义将要使用动态函数指针参数的函数

         function DynamicFunction(f : TFunctionParameter; const value : integer) : string;
         begin
            result := f(value) ;
         end;

       4) 上面这个动态函数的使用实例

         var
            s : string;
         begin
            s := DynamicFunction(One,2006) ;
            ShowMessage(s) ; //will display "2006"

            s := DynamicFunction(Two,2006) ;
            ShowMessage(s) ; // will display "4012"
         end; 

--
 
http://anony3721.blog.163.com/blog/static/511974201071425836199/

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
理解 Delphi 的类(六) - 认识类的封装发布时间:2022-07-18
下一篇:
Delphi Dataset CurValue发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap