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;函数

 

 

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

例:.net

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

...接口

function aa(X:Integer):Integer;get

不须要: F:=^aa;原型

只要:F:=aa;就能够了。回调函数

 

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

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

 

可是只要是出如今表达式中,就必定是函数过程的调用。

例: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;///

相关文章
相关标签/搜索