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函数,但对于用户的自定义的调用函数一般在于动态连接库中。常规的同一个工程下面一般不需要使用回调函数。(个人认为).。

功能大体描述:Form1中有一个Edit和一个Button,当点击BUTTON时弹出FORM2,FORM2中也有一个EDIT和一个BUTTON,当点击FORM2中的BUTTON时,将FORM2中的EDIT的TEXT属性赋值给FORM1中的EDIT的TEXT。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,StdCtrls;

type
  TForm1 = class(TForm)
    {主窗体中放一个Edit和一个Button}
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    {定义一个用于回调的过程}
    procedure test(str:string);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{引用unit2}
uses unit2;
{$R *.dfm}
{回调过程的实现部分}
procedure TForm1.test(str: string);
begin
  {将str值副给Edit1}
  Edit1.Text:=str;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    {调用Unit2的接口方法}
    CallUnit2(test);
end;

end.

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  {定义一个回调函数类型}
  TFuncCallBack=procedure(str:string) of object;
  TForm2 = class(TForm)
    {Form2中也有一个Edit和一个Button}
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    {定义一个回调函数类型的变量}
    aFuncCallBack:TFuncCallBack;
  public
    { Public declarations }
  end;
  {提供给Unit1调用的接口方法,注意里面的参数的类型}
  procedure CallUnit2(FuncCallBack:TFuncCallBack);

var
  Form2: TForm2;

implementation

{$R *.dfm}
{接口方法的实现部分}
procedure CallUnit2(FuncCallBack:TFuncCallBack);
begin
  Application.CreateForm(TForm2,Form2);
  {将参数赋值给FuncCallBack}
  Form2.aFuncCallBack:=FuncCallBack;

Form2.ShowModal;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
  {当点击Form2的按钮时将Form2中的Edit的值传递给了Form1中的Edit}
  {是不是很神奇?我并没有uses Unit1,但却改变了Form1中Edit的Text属性}
  aFuncCallBack(Edit1.Text);
  ModalResult:=mrOk;
end;

end.

http://blog.csdn.net/tercel99/article/details/4624686

http://blog.csdn.net/tercel99/article/details/4622207

时间: 2024-10-09 10:17:13

Delphi回调函数及其使用的相关文章

delphi回调函数

疯狂delphi delphiXE7.XE8.XE10公开课A 群号:58592705 delphi回调函数 文章来源: http://anony3721.blog.163.com/blog/static/5119742010866050589/ 一.主单元 unit UnMain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graph

Delphi 回调函数及property的使用

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

转:Delphi 回调函数及例子

http://anony3721.blog.163.com/blog/static/5119742010866050589/ { http://anony3721.blog.163.com/blog/static/5119742010866050589/ 例子出处 } unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,StdCt

回调函数及其使用 Delphi

1 回调函数的概述   回调函数是这样一种机制:调用者在初始化一个对象(这里的对象是泛指,包括OOP中的对象.全局函数等)时,将一些参数传递给对象,同时将一个调用者可以访问的函数地址传递给该对象.这个函数就是调用者和被调用者之间的一种通知约定,当约定的事件发生时,被调用者(一般会包含一个工作线程)就会按照回调函数地址调用该函数.   这种方式,调用者在一个线程,被调用者在另一个线程.   消息: 消息也可以看作是某种形式的回调,因为消息也是在初始化时由调用者向被调用者传递一个句柄和一个消息编号,

Delphi对象变成Windows控件的前世今生(关键是句柄和回调函数)

----------------------------------------------------------------------第一步,准备工作:预定义一个全局Win控件变量,以及一个精简化的Win控件类var CreationControl: TWinControl = nil; // 定义全局变量,用来表示每次刚创建的Win控件 TWinControl = class(TControl) private FDefWndProc: Pointer; // 记录原有的窗口过程,但只有

DLL与EXE之间的通讯调用 以及 回调函数的线程执行空间

dll 与 exe 之间的通讯方式有很多种, 本文采用回调函数的方法实现, 本文也将研究多线程,多模块的情况下,回调函数所在的线程, 啥也不说了,先附上代码: 下面的是dll模块的的, dll的工程文件: [delphi] view plaincopy library DllAPP; uses windows, SysUtils, Classes, DllClass in 'DllClass.pas'; {$R *.res} var GDllServer: TDllServer; functio

c回调函数(真不好理解)

什么是回调函数(callback) 模块A有一个函数foo,它向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A发生了什么事情,让A作出相应反应. 那么我们就把foo称为回调函数. 例子: 回调函数是一个很有用,也很重要的概念.当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数.回调函数在windows编程使用的场合很多, 比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,Dr

C++回调函数(callback)的使用

什么是回调函数(callback)    模块A有一个函数foo,他向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A发生了什么事情,让A作出相应反应. 那么我们就把foo称为回调函数.   例子:      回调函数是个很有用,也很重要的概念.当发生某种事件时,系统或其他函数将会自动调用您定义的一段函数.回调函数在windows编程使用的场合很多, 比如Hook回调函数:MouseProc,GetMsgProc连同EnumW

什么是回调函数

什么叫回调函数 (2012-08-02 10:37:43) 转载▼ 标签: 杂谈 分类: C 1 什么是回调 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用:回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口:异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口).