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.
源代码下载
posted on 2007-01-09 11:35 Bona shen 阅读(2155) 评论(0) 编辑 收藏 举报