Events in Listen verwalten

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.