回调函数与Delphi的事件模型

2016-01-29 14:10 63 1 收藏

回调函数与Delphi的事件模型,回调函数与Delphi的事件模型

【 tulaoshi.com - Delphi 】

 
回调函数:

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

  这种方式,调用者在一个线程,被调用者在另一个线程。

  在Windows API中有一些函数使用回调函数,例如CreateThread、SetWindowLong等。对应的回调函数定义为如下形式:
  
  function CallBackFunc(Wnd: HWND; Msg, WParam, LParam: Longint): Longint;stdcall;
  
  procedure ThreadFunction(Ptr: Pointer);stdcall;

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

  Delphi事件模型:
  
  在Delphi的VCL中有很多可视化组件都是使用事件模型,例如TForm的OnCreate事件,其原理是:在设计时指定事件函数,在运行时事件触发,则会调用在设计时指定的事件函数。
  
  在机制上,Delphi事件模型与回调是一样的。但具体形式有些区别,纯的回调函数是全局函数的形式,而Delphi事件是对象方法的形式,即可以定义如下回调函数类型

  type
  
  TCallBackFunc = procedure (pData: Pointer) of object;
  
  这就使得Delphi事件只能在Delphi内部使用,而回调函数是可以跨语言的。
  
  另外还要注意,回调函数一般(在Delphi的组件是在主线程中)是在回调体中创建的线程,因此要有临界区保护。
 

来源:http://www.tulaoshi.com/n/20160129/1492700.html

延伸阅读
翻译的不好,请见谅。 翻译:鲁小班 文件: ActnList CreateAction 函数 创建一个指定类型的Action,显示在action list editor中。 EnumRegisteredAction 过程 枚举已经注册的Action RegisterAction 过程 注册Action UnRegisterAction 过程 反注册Action 文件: Classes Bounds 函数 输入上下高宽...
实在说,我对delphi的理解不是很深入,使用它写过一些小程序,不过鉴于borland的传奇,还是看了李维那本vcl内幕剖析,最终的感觉不是对delphi多么狂热,反而是另样的深入理解了c++的优缺点以及模式设计一些理念的深化,不过,仍旧对borland抱有尊敬,另外也羡慕那些使用delphi的人,控间好多啊,:)这个是我早期从bbs上收集的文章,暂...
标签: Web开发
jQuery事件模型的功能有: 提供建立事件处理程序的统一方法; 允许在每个元素上为每个时间类型建立多个处理程序; 采用标准的事件类型名称,例如click或mouseover; 使用Event实例可用作处理程序的参数; 对Event实例的最常用的属性进行规范化; 为取消事件和阻塞默认操作提供统一方法。 jQuery绑定事件处理程序: bind()命令 $('img')...
翻译的不好,请见谅。 翻译:鲁小班 文件: ActnList CreateAction 函数 创建一个指定类型的Action,显示在action list editor中。 EnumRegisteredAction 过程 枚举已经注册的Action RegisterAction 过程 注册Action UnRegisterAction 过程 反注册Action 文件: Classes Bounds 函数 输入上...
  原文出处 《Windows网络编程技术》第8章 完成端口模型 由于原书附的是C代码,我把其翻译成Delphi代码。   其中winsock2.pas在delphi中不带,要另外下载http://jungla.dit.upm.es/~bti/files/winsock2.pas     program CompletionIO; {$APPTYPE CONSOLE} uses  ...

经验教程

588

收藏

22
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部