博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Delphi 函数指针 过程/函数类型
阅读量:5364 次
发布时间:2019-06-15

本文共 1367 字,大约阅读时间需要 4 分钟。

Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针。函数指针的声明只需要参数列表;如果是函数,再加个返回值。下面讲解指向非对象(一般的)函数/过程的函数指针。

例如声明一个过程类型,该类型带一个通过引用传递的整型参数:

type 

  IntProc = procedure (var Num: Integer); //IntProc是指向过程的函数指针

这个过程类型与任何参数完全相同的例程兼容,即用它声明的变量,可以指向任何此类函数,并通过其进行函数的调用。

下面是一个兼容例程:

procedure DoubleTheValue (var Value: Integer);beginValue := 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; 

转载于:https://www.cnblogs.com/kfx2007/archive/2012/09/17/2688677.html

你可能感兴趣的文章
CSS: caption-side 属性
查看>>
CSS3中box-sizing的理解
查看>>
Web.Config文件配置之配置Session变量的生命周期
查看>>
mysql导入source注意点
查看>>
linux下编译安装nginx
查看>>
DLL 导出函数
查看>>
windows超过最大连接数解决命令
查看>>
12个大调都是什么
查看>>
angular、jquery、vue 的区别与联系
查看>>
Intellij idea创建javaWeb以及Servlet简单实现
查看>>
代理网站
查看>>
Open multiple excel files in WebBrowser, only the last one gets activated
查看>>
FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时
查看>>
最近邻与K近邻算法思想
查看>>
【VS开发】ATL辅助COM组件开发
查看>>
FlatBuffers In Android
查看>>
《演说之禅》I & II 读书笔记
查看>>
thinkphp3.2接入支付宝支付接口(PC端)
查看>>
response和request
查看>>
【转】在Eclipse中安装和使用TFS插件
查看>>