Delphi 函数指针(函数可以当参数)
首先学习: 指向非对象(一般的)函数/过程的函数指针
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)实现回调机制
函数指针很有用啊,是高级程序员的必修。
例子
- {********************************************************
- 函数指针(指向一般函数和过程)
- UnitOwner:coco.zhang
- Last Modified:2008-10-5
- *********************************************************}
- unit DelegateUnit;
- interface
- procedure Func1;
- {定义两个函数型构相同但功能不同的函数}
- function FuncAdd(VarA , VarB : Integer):Integer;
- function FuncSub(VarA , VarB : Integer):Integer;
- type
- DelegateFunc1 = procedure;
- DelegateFuncCalc = function(VarA , VarB : Integer):Integer;
- var
- I : Integer;
- implementation
- procedure Func1;
- begin
- Writeln('Func1 was called!');
- end;
- function FuncAdd(VarA , VarB : Integer):Integer;
- begin
- Result := VarA + VarB;
- end;
- function FuncSub(VarA , VarB : Integer):Integer;
- begin
- Result := VarA - VarB;
- end;
- end.
客户端调用
- program Delegate;
- {$APPTYPE CONSOLE}
- uses
- DelegateUnit;
- var
- ADelegateFunc1 : DelegateFunc1;
- ADelegateFuncCalc : DelegateFuncCalc;
- begin
- {通过函数指针调用过程}
- ADelegateFunc1 := Func1;
- ADelegateFunc1 ;
- {通过同种方式调用不同函数}
- ADelegateFuncCalc := FuncAdd;
- Writeln(ADelegateFuncCalc(3,5));
- ADelegateFuncCalc := FuncSub;
- Writeln(ADelegateFuncCalc(3,5));
- end.
Func1 was called!
8
-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;
Delphi 函数指针(函数可以当参数)的更多相关文章
- 返回指针的函数 ------ 指针函数(pointer function)
指针函数: 其本质是一个函数, 其函数返回值为某一类型的指针. 定义形式: 类型 *指针变量名(参数列表): 例如: int *p(int i,int j); p是一个函数名,该函数有2个整形参数,返 ...
- C++学习笔记2_函数.函数指针.函数模板
1. 内联函数void printAB(int a,int b){ cout<<(a)<<(b)<<endl;}int main(void){ for(int i= ...
- C 函数指针 函数指针数组 转移表
内容来自<c和指针>,整理后方便个人理解 高级声明 cdel程序可以方便的给出声明的释义 指向函数的指针 int ( *f ) ( int n_values, float amount ) ...
- C++基础——函数指针 函数指针数组
==================================声明================================== 本文版权归作者所有. 本文原创,转载必须在正文中显要地注明 ...
- C/C++ 一段代码区分数组指针|指针数组|函数指针|函数指针数组
#include<stdio.h> #include<stdlib.h> #include<windows.h> /* 举列子说明什么是函数指针 */ //以一个加 ...
- 【嵌入式开发】C语言 命令行参数 函数指针 gdb调试
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...
- C语言 命令行参数 函数指针 gdb调试
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...
- Callback函数详解(我感觉,回掉函数的本质是函数指针,在业务做循环处理的时候,调用一下通知外部)
2010年的最后一天了,转载一篇自己认为还不错的文章与大家分享.希望对大家有所帮助. 一,回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度 ...
- typedef 函数指针 数组 std::function
1.整型指针 typedef int* PINT;或typedef int *PINT; 2.结构体 typedef struct { double data;}DATA, *PDATA; //D ...
- 谈谈自己对C语言中函数指针的一些理解 (第一次写博客,有点小兴奋哈)
1.函数指针声明的格式及简单的使用 (1)格式:(返回值)(*函数指针名)(参数列表) 例如:声明一个无参数无返回值的函数指针(void)(*p)(void). (2)将函数指针指向某个无参数无 ...
随机推荐
- 【Linux】部署apache
部署前的准备: 1.安装apr #wget http://mirror.bit.edu.cn/apache/apr/apr-1.4.8.tar.gz #tar -zxvf apr-1.4.8.tar. ...
- Centos6 httpd与tomcat整合发布
有时候需要在Web入口地址中隐藏非80端口,而最常见的方案是整合httpd和tomcat ,下面是通过mod_jk实现httpd和tomcat整合的详细流程,希望对大家有所帮助. OS: CentOS ...
- Binary Tree Zigzag Level Order Traversal (LeetCode) 层序遍历二叉树
题目描述: Binary Tree Zigzag Level Order Traversal AC Rate: 399/1474 My Submissions Given a binary tree, ...
- 认识v$fixed_view_definition
认识v$fixed_view_definition v$fixed_view_definition 这个视图功能很强,可以将一些视图的数据来源(视图的定义)给找出来.直接举例: 1.v$sessi ...
- java中 SSL认证和keystore使用
java中 SSL认证和keystore使用 2013-10-12 11:08 10488人阅读 评论(0) 收藏 举报 目录(?)[+] 好久没用过SSL认证了,东西久不用,就有点生疏. ...
- css+javascript 写的HTML5 微信端输入支付密码键盘
微信端没有纯数字键盘,用html5写了一个模仿ios输入支付密码键盘效果 keyboard.js var _keyboard = {}; $(document).ready(function(){ _ ...
- js-权威指南学习笔记4
第五章 语句 1.在JS中没有块级作用域,在语句块中声明的变量并不是语句块私有的. 2.尽管函数声明语句和函数定义表达式具有相同的函数名,但二者仍然不同.两种方式都创建了新的函数对象,但函数声明语句中 ...
- lesson3.1:java公平锁和非公平锁及读写锁
关于这四种锁的各自情况,网上有很多文章做了介绍,本不想单独开章节介绍,本章只介绍这四种锁的一些源码特点及注意事项. demo 源码:https://github.com/mantuliu/javaAd ...
- 获取WebView加载HTML时网页中的内容
main.xml如下: [html] view plaincopy <RelativeLayout xmlns:android="http://schemas.android.com/ ...
- Guzzle php resetful webservice farmework
Guzzle is a PHP HTTP client that makes it easy to work with HTTP/1.1 and takes the pain out of consu ...