zoukankan      html  css  js  c++  java
  • Delphi 匿名函数的几个实际应用(一)  转

    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的指向参数。

     

     

    可以临时指定一个局部变量,作为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属性保存指针信息。

     

  • 相关阅读:
    逆向project实战--Acid burn
    《图说VR入门》——DK2入门及其资源汇总
    (UML总结三)UML与软件project
    架构设计:负载均衡层设计方案(3)——Nginx进阶
    測试人员的核心能力与素养
    Codeforces Round #Pi (Div. 2)(A,B,C,D)
    ZOJ Problem Set
    Hive怎样加入第三方JAR
    使用ScriptEngineManager解析json
    java中servletContextListener、httpSessionListener和servletRequestListener使用整理
  • 原文地址:https://www.cnblogs.com/luckForever/p/7254701.html
Copyright © 2011-2022 走看看