zoukankan      html  css  js  c++  java
  • Delphi 事件回调管理的例子

    在开发VCL或程序时,会用到一个Object的事件要触发好多相关对象的方法。也就是1..N的例子。
    在Java中可以通过Interface相关的模式编程,在delphi中也可以实现,不过我通过一个TNotifier类来封装了,以后别的类要实现的时候,直接在属性中Implements TNotifier就可以了。
    unit Unit2;

    interface

    uses
      
    Classes;
    type

      
    INotifier interface;


      
    INotifier interface(IInterface)
      [
    '{0DEBB550-E67D-4CB1-8B16-A7690200D4DF}']
        
    procedure Register(Event:TNotifyEvent);
        
    procedure Unregister(Event:TNotifyEvent);
        
    procedure DoNotify;
      
    end;
      
      
    TNotifier=class(TInterfacedPersistent,INotifier)
      
    private
        
    FOwnerTObject;
        
    FListTList;
      
    protected
      public
        procedure Register
    (Event:TNotifyEvent);
        
    procedure Unregister(Event:TNotifyEvent);
        
    procedure DoNotify;
        
    procedure Clear;
        
    constructor Create(aOwner:TObject);
        
    destructor Destory;
      
    end;

    implementation
    uses
      
    SysUtils;

    type
      
    PNotifyEvent = ^TNotifyEvent;

    { TNotifier }

    procedure TNotifier.Register(Event:TNotifyEvent);
    var
      
    pPNotifyEvent;
    begin
      
    New(p);
      
    p^ := Event;
      
    FList.Add(p);
    end;

    procedure TNotifier.Clear;
    var
      
    IInteger;
    begin
      for 
    := 0 to FList.Count 1 do    // Iterate
      
    begin
        
    Dispose(FList.Items[I]);
      
    end;    // for
      
    FList.Clear;
    end;

    constructor TNotifier.Create(aOwner:TObject);
    begin
      
    FOwner := aOwner;
      
    FList := TList.Create;
    end;

    destructor TNotifier.Destory;
    begin
      
    Clear;
      
    FreeAndNil(FList);
    end;

    procedure TNotifier.DoNotify;
    var
      
    IInteger;
      
    p:PNotifyEvent;
    begin
      for 
    := 0 to FList.Count 1 do    // Iterate
      
    begin
        
    p:=  FList.Items[I];
        
    try
          
    p^(FOwner);
        
    finally
            
    // free resources
        
    end;  // try/finally

      
    end;    // for
    end;

    procedure TNotifier.Unregister(Event:TNotifyEvent);
    var
      
    IInteger;
      
    p,p1:PNotifyEvent;
    begin
      
    New(p1);
      
    try
        
    p1^ := Event;
        
    for := FList.Count 1 downto 0 do    // Iterate
        
    begin
          
    p:= FList.Items[I];
          
    if PInteger(p)^ = PInteger(p1)^ then
          begin
            
    Dispose(p);
            
    FList.Remove(p);
          
    end;
        
    end
      
    finally
          
    Dispose(p1);
      
    end;  // try/finally   // for
    end;

    end.

    //TData class implements INotifier


    unit Unit3;

    interface
    uses
      
    Unit2;
    type
      
    TData class(TObject,INotifier)
      
    private
        
    FNotifierTNotifier;
        
    function GetNotifierINotifier;
      
    public
        constructor 
    Create;
        
    destructor Destroy;
        
    property NotifierINotifier read GetNotifier implements INotifier;
      
    end;
    implementation

    constructor 
    TData.Create;
    begin
      inherited 
    Create;
      
    FNotifier := TNotifier.Create(self);
    end;

    destructor TData.Destroy;
    begin
      
    FNotifier.Free;
      
    inherited Destroy;
    end;

    function TData.GetNotifierINotifier;
    begin
      
    result := FNotifier;
    end;

    end.

    源代码下载



  • 相关阅读:
    linux常用命令-新手入门
    centos-1908安装步骤
    存储过程和函数的一些范例
    在iis7上如何配置来看到asp报错
    如何在ashx页面获取Session值
    SQL--create Table
    NET内存持续增长问题排查
    Socket之服务调用
    编程心得
    vs中无法查找或打开PDB文件
  • 原文地址:https://www.cnblogs.com/jssy/p/615578.html
Copyright © 2011-2022 走看看