Delphi 匿名函数的几个实际应用(一)  转

摘要:
以下示例向按钮添加匿名单击事件,声明常规方法指针类型,并向自定义按钮类添加新的事件处理程序。[delphi]viewplaincopytypeTAnonNotif=参考过程;//interceptorclassTButton=classprivateFAnon单击:TAnonNotif;程序设置单击;公共程序单击;推翻publicpropertyNonClick:TANonNotifradFAnonClickwriteSetAnClick;终止这个类的代码很容易理解。setter方法保存新指针,Click方法在处理标准过程之前调用它。[delphi]查看普通复制程序T按钮。设置AnClick;beginFAnonClick:=值;终止[delphi]查看普通复制程序T按钮。点击从继承的FAnonClick开始分配;终止如何使用此新事件处理程序?[delphi]查看普通复制程序TFormAnonButton。btnAssignClick;beginbtnInvoke。AnClick:=procedurebeginShowMessage;终止使用这种方式似乎没有意义,因为您可以使用通常的方法来实现此效果。接下来,为了显示差异,使用匿名方法来捕获组件指针。此组件的指针指定一个事件处理程序函数,该函数用于通过Sender指向参数。
busintel 专栏

包含如下的六个部分:

 

Anonymous Event Handlers 匿名事件处理器

Timing Anonymous Methods 计时功能匿名方法

Thread Synchronization with the VCL   VCL线程同步

Parallel For Loop 并行循环

AJAX in Delphi Delphi AJAX

Debating the AJAX Demo AJAX应用的辩论

匿名事件处理器

 

 

早期时候,Delphi有一个很特别的特性,就是可以用方法指针实现事件处理器。现在使用更高级的匿名方法,更加有效使用这个特性,可以绑定一个新的行为到一个事件,优点是:

 ①无需声明独立的方法,并且能捕获方法的执行上下文,

 ②也就避免了方法传参时,添加额外的字段到表单。


 下面的例子,给按钮添加了一个匿名点击事件,声明了一个常规的方法指针类型,并且给自定义按钮类添加一个新的事件处理器。

 

  1. type  
  2.   TAnonNotif reference to procedure (Sender: TObject);  
  3.   // interceptor class  
  4.   TButton class (StdCtrls.TButton)  
  5.   private  
  6.     FAnonClick: TAnonNotif;  
  7.     procedure SetAnonClick(const Value: TAnonNotif);  
  8.   public  
  9.     procedure Click; override;  
  10.   public  
  11.     property AnonClick: TAnonNotif  
  12.     read FAnonClick write SetAnonClick;  
  13.   end 

 

这个类的代码很容易理解,setter方法保存新的指针,Click方法在处理标准过程之前调用它(当可用时,调用OnClick事件处理)。

 

  1. procedure TButton.SetAnonClick(const Value: TAnonNotif);  
  2.   begin  
  3.     FAnonClick := Value;  
  4.   end 

 

 

  1. procedure TButton.Click;  
  2.   begin  
  3.     if Assigned (FAnonClick) then  
  4.      FAnonClick (self)  
  5.     inherited 
  6.   end 

 

 

 怎样使用这个新的事件处理函数?一般来说你为它可以指定一个匿名方法来使用它。

 

  1. procedure TFormAnonButton.btnAssignClick(  
  2. Sender: TObject);  
  3.   begin  
  4.     btnInvoke.AnonClick :=  
  5.       procedure (Sender: TObject)  
  6.       begin  
  7.         ShowMessage ((Sender as TButton).Caption);  
  8.       end 
  9.   end  

 

 

似乎这样使用没有意义,因为可以使用通常方法达到这个效果。下面,为了显示不同,用匿名方法捕获一个组件指针,这个组件的指针指定了一个事件处理函数,通过Sender的指向参数。

 Delphi 匿名函数的几个实际应用(一)  转第1张

 

可以临时指定一个局部变量,作为Sender匿名方法的参数,隐藏btnKeepRefClick方法的Sender参数:

  1. procedure TFormAnonButton.btnKeepRefClick(  
  2. Sender: TObject);  
  3.   var  
  4.     aCompRef: TComponent;  
  5.   begin  
  6.     aCompRef := Sender as TComponent;  
  7.     btnInvoke.AnonClick :=  
  8.       procedure (Sender: TObject)  
  9.         begin  
  10.           ShowMessage ((Sender as TButton).Caption  
  11.           assigned by ' aCompRef.Name);  
  12.         end 
  13.     end 

 

 

 当你按下btnInvoke按钮,妳可以看到组件名标题与指定的匿名函数处理器:

 

 一个更复杂的情况通过下面的两个按钮演示处理,通过点击表单接收一个匿名方法处理器,分辨鼠标左键或右键,并且捕获鼠标点击位置:

 

  1. procedure TFormAnonButton.FormMouseDown(  
  2. Sender: TObject; Button: TMouseButton;  
  3. Shift: TShiftState; X, Y: Integer);  
  4. begin  
  5. if Button mbLeft then  
  6. btnLeftInvokeForm.AnonClick :=  
  7. procedure (Sender: TObject)  
  8. begin  
  9. (Sender as TButton).Caption :=  
  10. 'Last left on [' IntToStr (X)  
  11. ',' IntToStr (Y) ']' 
  12. end  
  13. else  
  14. btnRightInvokeForm.AnonClick :=  
  15. procedure (Sender: TObject)  
  16. begin  
  17. (Sender as TButton).Caption :=  
  18. 'Last right on [' IntToStr (X)  
  19. ',' IntToStr (Y) ']' 
  20. end 
  21. end 

 

 

这是另一个捕获执行上下文的例子,但是这次同时有两个捕获操作(每一个的数据都保持在内存),并且可以处理更多。为了使用方法指针实现相同的操作,你必须保持一个鼠标点击数组,捆绑到每一个目标组件,或者使用组件的Tag属性保存指针信息。

 

免责声明:文章转载自《Delphi 匿名函数的几个实际应用(一)  转》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇蓝桥杯的矩阵乘法监控框架选型下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

教程-Delphi 调用控制面板设置功能

应用程序运行时,有时需要对系统环境有特殊要求。例如,在Delphi数据库应用程序中可能需要进行BDE(Borland Database Engine)或ODBC数据源名称(DSN:Data Source Name)的设置;在网络应用程序中可能需要进行网络配置设置、Modem属性设置或用户拨号连接的帐号和密码的设置并保存在系统中;在CTI(Computer-...

Delphi下Webbrowser的使用技巧

1>调用网页中已知对象   src := WebBrowser1.OleObject.document.getElementByIdx(’id1′).src其实就是javascript中的 getElementByID 的函数 2>获得网页中的某个变量值 Html中的代码 : <script> var userID=123<...

delphi 解析Json格式(转自:http://blog.csdn.net/jayqiang/article/details/7066824)

SuperObject 是开源的 Delphi 的 JSON 工具包,可生成 JSON 数据以及进行 JSON 解析。 [delphi] view plaincopy  unit Unit6;      interface      uses     Windows, Messages, SysUtils, Variants, Classes, G...

delphi 集合类型探究

集合是由具有某些共同特征的元素构成的一个整体。在pascal中,一个集合是由具有同一有序类型的一组数据元素所组成,这一有序类型称为该集合的基类型。  一、集合类型的定义和变量的说明  集合类型的一般形式为:    set of 基类型;  基类型可以是任意顺序类型, 而不能是实型或其它构造类型。同时,基类型的数据的序号不得超过255。例如下列说明是合法的:...

Delphi2007升级到Delphi 2010总结

这两天把一个使用Delphi2007成功升级到了Delphi2010。升级途中很艰辛,总结了 以下经验与大家分享。另外,D7使用的第三方组件,由于官方没有发布For Delphi2010的更新,修改的第三 方组件列表见文章尾部。1,PChar因为Delphi不支持无类型指针的算术运算,很多程序员使用 PChar来代替Pointer,即使指针指向目标并不是P...

Delphi指针及其它(转)

一、指针:指向一个内存地址的变量或参数。二、定义指针的方式如下:P: Pointer; //定义了可以指向任何类型的指针,Pointer 为无类型指针;Q, R: ^TType; //定义了指向 TType 类型的两个指针,TType 可是是各种//基本类型或自己定义的各种类型,也可以如下定义:// type PType = ^TType;// var Q...