Delphi 事件回调管理的例子
在开发VCL或程序时,会用到一个Object的事件要触发好多相关对象的方法。也就是1..N的例子。
在Java中可以通过Interface相关的模式编程,在delphi中也可以实现,不过我通过一个TNotifier类来封装了,以后别的类要实现的时候,直接在属性中Implements TNotifier就可以了。
源代码下载
 
在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
    FOwner: TObject;
    FList: TList;
  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
  p: PNotifyEvent;
begin
  New(p);
  p^ := Event;
  FList.Add(p);
end;
procedure TNotifier.Clear;
var
  I: Integer;
begin
  for I := 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
  I: Integer;
  p:PNotifyEvent;
begin
  for I := 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
  I: Integer;
  p,p1:PNotifyEvent;
begin
  New(p1);
  try
    p1^ := Event;
    for I := 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
    FNotifier: TNotifier;
    function GetNotifier: INotifier;
  public
    constructor Create;
    destructor Destroy; 
    property Notifier: INotifier 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.GetNotifier: INotifier;
begin
  result := FNotifier;
end;
end.
源代码下载
 
                     
                    
                 
                    
                 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号