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

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. 【转】listView中,checkBox的显示和隐藏

    原文网址:http://www.cnblogs.com/vicma/p/3460500.html 在listView中,每个item都有一个ChexBox,当显示的时候在listView外面设置一个按 ...

  2. JAVA 面试整理,面试汇总

    1.JAVA是通过重写和重载来实现多态性的. 重写:同样的方法签名,不同的方法实现 重载:同样的方法名,不同的参数类型或参数个数 2.JAVA中如果存在不再使用的对象,但是程序又持有该对象的引用,就会 ...

  3. github atom创建自己的语法高亮

    使用atom一段时间了,有些插件还不是很成熟.比如项目中使用protobuf,早就有人写了语法高亮(https://github.com/podgib/atom-protobuf),但是效果不是很好. ...

  4. ASP.NET获取用户端的真实IP

    ASP.NET获取用户端的真实IP在各种场景都能用到,但是用户网端变幻莫测情况众多,获取真实IP还真是不容易啊.下面分享个比较好一点的方法: 获取IP初始版本 /// <summary> ...

  5. c语言数组小练习

    //查找数组中最大的值: #include<stdio.h> int main01() { , , , , , , , , , ,,}; ]; int i; ;i < ]);i++) ...

  6. intent-filter data Uri 意图过滤器 详解

    组件的intent-filter属性         如果一个 Intent 请求在一片数据(Uri)上执行一个动作(Action), Android 如何知道哪个应用程序的哪个组件能用来响应这个请求 ...

  7. 【回顾整理】HTML+CSS个的两个实战项目

    一:麦子商城首页制作 代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset= ...

  8. ADO.NET之使用DataGridView控件显示从服务器上获取的数据

    今天回顾下ADO.NET中关于使用DataGridiew控件显示数据的相关知识 理论整理: 使用 DataGridView 控件,可以显示和编辑来自多种不同类型的数据源的表格数据. SqlDataAd ...

  9. 根据控件Id得到控件

    在做动态获取控件时,时常需要根据Id得到控件,并对该控件进行操作,此时用 /// <summary>        /// 根据控件id得到控件        /// </summa ...

  10. for语句应用:乘法表

    乘法表: for语句应用: 1: 2: public class chengfa { 3: public static void main(String[] args) { 4: //int i; 5 ...