回调函数与Delphi的事件模型

2016-01-29 14:10 61 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的组件是在主线程中)是在回调体中创建的线程,因此要有临界区保护。
 

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

延伸阅读
//根据字符串,拆分字符串,相当于vb中的split函数 function SplitString(const Source,ch:string):TStringList; var   temp:String;   i:Integer; begin   Result:=TStringList.Create;   //如果是空自符串则返回空列表   if Source=''   then exit; &nbs...
标签: Web开发
jQuery事件模型的功能有: 提供建立事件处理程序的统一方法; 允许在每个元素上为每个时间类型建立多个处理程序; 采用标准的事件类型名称,例如click或mouseover; 使用Event实例可用作处理程序的参数; 对Event实例的最常用的属性进行规范化; 为取消事件和阻塞默认操作提供统一方法。 jQuery绑定事件处理程序: bind()命令 $('img')...
标签: Web开发
SAX2解析器读XML文档,然后产生基于特殊符号的事件。SAX2解析器实际上并不为该文档在内存中创建一棵树结构,它序列的处理一个文档的内容并产生相关的事件。 比如,当你进行基于事件的编程的时候,你可以创建函数来响应用户定义的事件(比如OnClick事件)。在利用SAX进行编程的时候,需要注意的是,是解析器而不是用户产生事件。 ...
翻译的不好,请见谅。 翻译:鲁小班 文件: 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  ...

经验教程

268

收藏

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