(转)Delphi回调函数及其使用

Delphi回调函数及其使用

1 回调函数的概述

  回调函数是这样一种机制:调用者在初始化一个对象(这里的对象是泛指,包括OOP中的对象、全局函数等)时,将一些参数传递给对象,同时将一个调用者可以访问的函数地址传递给该对象。这个函数就是调用者和被调用者之间的一种通知约定,当约定的事件发生时,被调用者(一般会包含一个工作线程)就会按照回调函数地址调用该函数。
  这种方式,调用者在一个线程,被调用者在另一个线程。

  消息:

  消息也可以看作是某种形式的回调,因为消息也是在初始化时由调用者向被调用者传递一个句柄和一个消息编号,在约定的事件发生时被调用者向调用者发送消息。
  这种方式,调用者在主线程中,被调用者在主线程或者工作线程中。

  Delphi事件模型:

   在Delphi的VCL中有很多可视化组件都是使用事件模型,例如TForm的OnCreate事件,其原理是:在设计时指定事件函数,在运行时事件触发,则会调用在设计时指定的事件函数。

  在机制上,Delphi事件模型与回调是一样的。但具体形式有些区别,纯的回调函数是全局函数的形式,而Delphi事件是对象方法的形式,即可以定义如下回调函数类型

  type

    TCallBackFunc = procedure (pData: Pointer) of object;

  2 回调函数的使用说明

  回调函数主要在两个场合使用,第一个是某些Windows的API要求用回调函数作为其参数地址,另一种是用户在某种特定的场合定义的某个函数需要使用回调函数作为其参数地址,对于用户的定义的函数来说,一般是当调用动态连接库中的函数时使用。

  对于使用一个回调函数主要有以下几个步骤:

  1、定义一个回调函数类型,跟一般的函数过程的定义并没有什么区别,但其定义必须根据需要满足回调函数的函数要求,唯一的区别在于在函数或过程的定义后面必须声明其为windows标准调用;

  例:

  type

  THDFunction= function(I:integer;s:string):integer; stdcall;

对于过程的声明

  type

  THDProcedure=procedure(s:string); stdcall;

  2、 然后根据此原形定义一个相应的函数或过程,对于这个函数或过程来说名字没有什么要求,对函数其参数的类型和返回值的类型必须和定义的回调函数类型完全一致,对于过程来说,只需要其参数类型一样就可以了。

  例:根据上面的函数和过程的原形定义一个相应的函数和一个相应的过程。

  函数原形定义:

  Function HdFunExample(k:integer,sExam:string):integer; stdcall;

  过程定义:

  procedure HdProExample(sExam:string);stdcall;

  3、 在程序中实现此回调函数或着过程;

  Function HdFunExample(k:integer,sExam:string):integer; stdcall;

  Begin

  End;

  procedure HdProExample(sExam:string);stdcall;
 
  begin

  end;

  4、 调用过程;

  回调函数一般作为系统的某个函数的入口地址;

  根据调用函数的原形:

假设有如下调用函数:

  function DyHdFunExample(HdFun:THDFunction;I:integer):boolean;

  注:

  在调用函数中通过对函数指针的处理可以直接调用回调函数(即调用函数中的那个是回调函数类型的参数,直接操作它),使回调函数履行一定的操作。即在调用函数中实现回调函数的功能。

  调用:

  var

  I:integer;

  begin

  I:=DyHdFunExample(@HdFunExample,i);

  //…….

  End;

  3 举例说明

  示例程序在H:/ 回调函数示例/ 目录下面。

  回调函数的使用主要在于Windows原有的API函数,但对于用户的自定义的调用函数一般在于动态连接库中。常规的同一个工程下面一般不需要使用回调函数。(个人认为).。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi中,回调函数通常使用匿名方法或接口来实现。下面是使用匿名方法和接口的两种常见方式: 1. 使用匿名方法: 在Delphi中,可以使用匿名方法作为回调函数。匿名方法是一种没有名称的方法,可以直接在需要的地方定义和使用。以下是使用匿名方法实现回调函数的示例代码: ```delphi type TCallback = reference to procedure(const AValue: Integer); procedure DoSomethingWithCallback(ACallback: TCallback); begin // 执行某些操作 // 调用回调函数 ACallback(42); end; procedure Main; begin DoSomethingWithCallback( procedure(const AValue: Integer) begin // 在这里处理回调函数的逻辑 Writeln('Callback value: ', AValue); end ); end; ``` 2. 使用接口: 另一种常见的方式是使用接口来实现回调函数。首先,定义一个包含回调方法的接口,然后实现该接口并将其传递给需要回调的函数。以下是使用接口实现回调函数的示例代码: ```delphi type ICallback = interface procedure Callback(const AValue: Integer); end; type TCallbackImpl = class(TInterfacedObject, ICallback) procedure Callback(const AValue: Integer); end; procedure DoSomethingWithCallback(ACallback: ICallback); begin // 执行某些操作 // 调用回调函数 ACallback.Callback(42); end; procedure TCallbackImpl.Callback(const AValue: Integer); begin // 在这里处理回调函数的逻辑 Writeln('Callback value: ', AValue); end; procedure Main; var CallbackImpl: TCallbackImpl; begin CallbackImpl := TCallbackImpl.Create; try DoSomethingWithCallback(CallbackImpl); finally CallbackImpl.Free; end; end; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值