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.

源代码下载



原文地址:https://www.cnblogs.com/jssy/p/615578.html