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

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/

Delphi 函数指针(函数可以当参数)的更多相关文章

  1. 返回指针的函数 ------ 指针函数(pointer function)

    指针函数: 其本质是一个函数, 其函数返回值为某一类型的指针. 定义形式: 类型 *指针变量名(参数列表): 例如: int *p(int i,int j); p是一个函数名,该函数有2个整形参数,返 ...

  2. C++学习笔记2_函数.函数指针.函数模板

    1. 内联函数void printAB(int a,int b){ cout<<(a)<<(b)<<endl;}int main(void){ for(int i= ...

  3. C 函数指针 函数指针数组 转移表

    内容来自<c和指针>,整理后方便个人理解 高级声明 cdel程序可以方便的给出声明的释义 指向函数的指针 int ( *f ) ( int n_values, float amount ) ...

  4. C++基础——函数指针 函数指针数组

    ==================================声明================================== 本文版权归作者所有. 本文原创,转载必须在正文中显要地注明 ...

  5. C/C++ 一段代码区分数组指针|指针数组|函数指针|函数指针数组

    #include<stdio.h> #include<stdlib.h> #include<windows.h> /* 举列子说明什么是函数指针 */ //以一个加 ...

  6. 【嵌入式开发】C语言 命令行参数 函数指针 gdb调试

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...

  7. C语言 命令行参数 函数指针 gdb调试

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...

  8. Callback函数详解(我感觉,回掉函数的本质是函数指针,在业务做循环处理的时候,调用一下通知外部)

    2010年的最后一天了,转载一篇自己认为还不错的文章与大家分享.希望对大家有所帮助. 一,回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度 ...

  9. typedef 函数指针 数组 std::function

    1.整型指针 typedef int* PINT;或typedef int *PINT; 2.结构体 typedef struct { double data;}DATA,  *PDATA;  //D ...

  10. 谈谈自己对C语言中函数指针的一些理解 (第一次写博客,有点小兴奋哈)

    1.函数指针声明的格式及简单的使用 (1)格式:(返回值)(*函数指针名)(参数列表)    例如:声明一个无参数无返回值的函数指针(void)(*p)(void). (2)将函数指针指向某个无参数无 ...

随机推荐

  1. Linux系统编程(37)—— socket编程之UDP服务器与客户端

    典型的UDP客户端/服务器通讯过程: 编写UDP Client程序的步骤 1.初始化sockaddr_in结构的变量,并赋值.这里使用"8888"作为连接的服务程序的端口,从命令行 ...

  2. Hp vPv

  3. ArcGIS加载高德、OSM和谷歌等地图

    1. 引言 网络地图对于我们来说已经不是什么新鲜事了,上面有各大互联网公司收集的海量的地理空间数据.一般网络地图的地图是以切片形式存在的,因此,本文重点讲述如何将这些网络切片地图加载并显示再ArcGI ...

  4. Github开源Java项目(Disconf)上传到Maven Central Repository方法详细介绍

    最近我做了一个开源项目 Disconf:Distributed Configuration Management Platform(分布式配置管理平台) ,简单来说,就是为所有业务平台系统管理配置文件 ...

  5. git 错误

    1  执行  Git add  somefile 的时候,出现 如下 错误: If no other git process is currently running, this probably m ...

  6. apache shiro内置过滤器 标签 注解

    内置过滤器 anon(匿名)  org.apache.shiro.web.filter.authc.AnonymousFilter authc(身份验证)       org.apache.shiro ...

  7. httpclient post请求实例(自己写的)

    package com.gop.gplus.trade.common.utils; import org.apache.commons.httpclient.HttpClient;import org ...

  8. IIS7.0 Windows Server 2008 R2 下配置证书服务器和HTTPS方式访问网站

    配置环境 Windows版本:Windows Server 2008 R2 Enterprise Service Pack 1 系统类型: 64 位操作系统 了解HTTPS 为什么需要 HTTPS ? ...

  9. Appium依据xpath获取控件实例随笔

    如文章<Appium基于安卓的各种FindElement的控件定位方法实践>所述,Appium拥有众多获取控件的方法.当中一种就是依据控件所在页面的XPATH来定位控件. 本文就是尝试通过 ...

  10. Android的深度定制版阿里云os(Android的山寨)

    阿里云OS(YunOS)是阿里巴巴集团的智能手机操作系统,依托于阿里巴巴集团电子商务领域积累的经验和强大的云计算平台,基于LINUX开发. 魅族4阿里yun OS版已上市.[1] 1简介 阿 里云OS ...