Delphi函数指针的使用(转)

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;

一个指向函数的指针在赋值指向函数时,不需要显示地取函数的地址。

例:

var F:function(X:Integer):Integer;

...

function aa(X:Integer):Integer;

不需要: F:=^aa;

只要:F:=aa;就可以了。

F:=aa可能是一个函数类型变量赋值,也可能是调用aa函数过程。

如果F不是一个函数过程类型,它就是一个函数调用。

但是只要是出现在表达式中,就一定是函数过程的调用。

例:if A:=fun then

A:=fun一定是一个函数过程的调用,将返回值赋予A

注意,如果fun是一个过程(它没有返回值)或它需要参数(需要写上参数),那就会产生语法错误。

如果要显示说明它是一个赋值语句而不是函数过程的调用,可以这样写

if @A :=@fun then

@A是将A转换成一个无类型指针(它本身就是以指针形式存在)

@fun是取得函数过程fun的地址

可以通过@@A的方式取得该过程函数变量的地址,而不是它指向的函数过程的地址

void SetProcessDataProc(NOTISFYDATAISRECEIVED ProcessDataProc)
参数:ProcessDataProc —— 回调函数指针。
返回值:无
功能:设置数据到达通知函数。动态连接库主动通知用户有新数据到达,随后用户就可以立即查询相关数据。用户调用此接口函数设置通知函数以后,每当新数据到达,动态连接库就通过这个通知函数通知用户。通知函数原型必须如下:(函数名称和参数名称可以不同)
void ProcessDataProc(int iBedNo,unsigned char ucDataType,WPARAM wParam);
其中,iBedNo参数表示到达数据所对应的设备号。
ucDataType表示到达数据类型。ucDataType值与对应的数据包类型以及常调用的接口函数如表1所示。对于表中没有列举的数据包类型,数据包内没有有用的数据。
wParam用于传递其他信息,保留,暂时没有使用。
所以,SetProcessDataProc接口函数的参数类型NOTISFYDATAISRECEIVED可以定义如下:
typedef void(* NOTISFYDATAISRECEIVED)(int iBedNo,unsigned char ucDataType,WPARAM wParam);
这是一个动态连接库中一个函数,我现在想在delphi中调用该函数,请问该如何定义上述类型和函数。

void ProcessDataProc(int iBedNo,unsigned char ucDataType,WPARAM wParam);

->
procedure ProcessDataProc(iBedNo: Integer; ucDataType:BYTE; wParam: WPARAM);stdcall;

typedef void(* NOTISFYDATAISRECEIVED)(int iBedNo,unsigned char ucDataType,WPARAM wParam);
->
type NOTISFYDATAISRECEIVED = procedure of(iBedNo: Integer; ucDataType:BYTE; wParam: WPARAM) of object;///

时间: 2024-10-31 18:52:07

Delphi函数指针的使用(转)的相关文章

Delphi函数指针的两种定义(对象方法存在一个隐藏参数self,所以不能相互赋值)

delphi中经常见到以下两种定义 Type TMouseProc = procedure (X,Y:integer); TMouseEvent = procedure (X,Y:integer) of Object; 两者样子差不多但实际意义却不一样, TMouseProc只是单一的函数指针类型; TMouseEvent是对象的函数指针,也就是对象/类的函数/方法 区别在于类方法存在一个隐藏参数self,也就是说两者形参不一样,所以不能相互转换 这也就是为什么delphi中可以这样赋值 but

Delphi 函数指针(三大好处:灵活,委托的本质,回调机制)

首先学习: 指向非对象(一般的)函数/过程的函数指针 Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针.函数指针的声明只需要参数列表:如果是函数,再加个返回值.例如声明一个过程类型,该类型带一个通过引用传递的整型参数: type   IntProc = procedure (var Num: Integer); 这个过程类型与任何参数完全相同的例程兼容,即用它声明的变量,可以指向任何此类函数,并通过其进行函数的调用.下面是一个兼容例程: procedure Dou

Delphi中的函数指针判断是否为空

delphi函数指针 只有@@p才代表了函数指针本身的地址   assigned(p) 判断是否为空 或者用 @p=nil 来判断函数指针是不是为空 Delphi中的函数指针实际上就是指针,只是在使用的时候有些不同 函数指针要先定义一个函数类型,比如 type TTestProc = procedure of object; 这是一个最简单的函数类型,没有参数,也没有返回值,并且要求是类的成员函数 类的成员函数其实就代表了调用的时候参数的不同,因为类的成员函数隐含着一个对象参数,而不是显式写明,

Delphi的函数指针

不求全面,先留个爪: TNotifyEvent = procedure(Sender: TObject) of object; TMethod = record Code, Data: Pointer; end; 判断两个按钮的事件是否相等: procedure TForm1.Button5Click(Sender: TObject); var f1,f2: TNotifyEvent; begin f1:=Button1.OnClick; f2:=Button2.OnClick; if (@[e

终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good

这点是与C语言不一样的地方,以前我一直都没有明白这一点,所以总是不明白:函数地址再取地址算怎么回事? ---------------------------------------------------------------------------------------------------------------- 在学习Delphi的时候,一个很好的建议是和C/C++去类比着学习,从指针,到内存管理,到数组,到面向对象……各个方面,都是有很多可以相似和或者也有不同的方,类比着学习,一

Delphi(procedure&procedure .... of object )函数指针与方法指针 .

Delphi(procedure&procedure .... of object )函数指针与方法指针 . delphiobjectbuttonintegerdelphi中经常见到以下两种定义 Type TMouseProc = procedure (X,Y:integer); TMouseEvent = procedure (X,Y:integer) of Object; 两者样子差不多但实际意义却不一样, TMouseProc只是单一的函数指针类型; TMouseEvent是对象的函数指针

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

2010年的最后一天了,转载一篇自己认为还不错的文章与大家分享.希望对大家有所帮助. 一,回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函数)有何不同呢? 使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数. 而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利

成员函数指针与高性能的C++委托

成员函数指针与高性能的C++委托(上篇) 撰文:Don Clugston 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做"闭包(closure)"或"委托 (delegate)")在一些语言中已经证明了它宝贵的价值.在Delphi (Object Pascal)中,面向对象的函数指针是Borland可视化组建库(VCL,Visual Component Library)的基础.而在目前,C#使"委托&

Delphi函数的out、var等关键字的作用,和使用场景

问题描述 Delphi函数的out.var等关键字的作用,和使用场景 Delphi函数的out.var等关键字的作用,和使用场景,我知道var是作为传值调用,但是像out这个关键字又是什么作用呢? 解决方案 在过程或函数中,out主要用于COM和CORBA技术,Delphi解释: An out parameter, like a variable parameter, is passed by reference. With an out parameter, however, the init