Events in Listen verwalten
Delphi Artikel
Wie kann man Listen von Events in Delphi verwalten?
type
TEventListener = class( TObject )
private
fEvents: Array of TNotifyEvent;
public
destructor Destroy; override;
procedure Notify( Sender: TObject );
procedure Register( AEvent: TNotifyEvent );
procedure UnRegister( AEvent: TNotifyEvent );
end;
implementation
destructor TEventListener.Destroy;
begin
fEvents := nil;
inherited;
end;
procedure TEventListener.Notify( Sender: TObject );
var
i: integer;
begin
for i:=0 to High(fEvents) do
if Assigned( fEvents[i] )
then fEvents[i](Sender);
end;
procedure TEventListener.Register( AEvent: TNotifyEvent );
var
i, max: integer;
begin
if not Assigned( AEvent )
then Exit;
max := High(fEvents);
for i:=0 to max do
if (TMethod(fEvents[i]).Code = TMethod(AEvent).Code) and
(TMethod(fEvents[i]).Data = TMethod(AEvent).Data)
then Exit; // Ereignis-Methode bereits registriert
Inc( max );
SetLength( fEvents, max+1 );
fEvents[max] := AEvent;
end;
procedure TEventListener.UnRegister( AEvent: TNotifyEvent );
var
i, max: integer;
begin
if not Assigned( AEvent )
then Exit;
max := High(fEvents);
for i:=0 to max do
if (TMethod(fEvents[i]).Code = TMethod(AEvent).Code) and
(TMethod(fEvents[i]).Data = TMethod(AEvent).Data)
then begin
fEvents[i] := nil;
Dec(max);
if (i <= max)
then System.Move(fEvents[i + 1], fEvents[i],
(max - i + 1) * SizeOf(TNotifyEvent));
SetLength( fEvents, max+1 );
Exit;
end;
end;
Das ganze lässt sich bequem in andere Klassen einbinden ...
property OnChange: TEventListener read FOnChange;
... und ist in vielen Fällen ausreichend, d.h. TNotifyEvent genügt meistens.
Bei Bedarf können weitere Parameter auch mit dem Sender-Objekt übergeben werden.