In .NET ist es möglich, einem Event mehrere Eventhandler zuzuordnen. Mit folgendem Code, der aus
diesem Thread stammt, zeigt
Phoenix wie dies auch unter Delphi (
Win32) möglich ist.
Delphi-Quellcode:
private
m_events: array of TNotifyEvent;
public
procedure RegisterEvent(event: TNotifyEvent);
procedure UnregisterEvent(Subscriber: TObject);
...
////////////////////////////////////////////////////////////////////////////////
// register event to distributor
////////////////////////////////////////////////////////////////////////////////
procedure TFrmEventTest.RegisterEvent(Event: TNotifyEvent);
begin
SetLength( m_events, Length(m_events) + 1 );
m_events[ Length(m_events) - 1 ] := Event;
end;
////////////////////////////////////////////////////////////////////////////////
// unregister event from distributor
////////////////////////////////////////////////////////////////////////////////
procedure TFrmEventTest.UnregisterEvent(Subscriber: TObject);
var
i: integer;
begin
for i := 0 to Length(m_events) - 1 do
begin
if TMethod(m_events[i]).Data = Subscriber then
begin
m_events[i] := m_events[Length(m_events) - 1];
SetLength(m_events, Length(m_events) - 1);
end;
end;
end;
////////////////////////////////////////////////////////////////////////////////
// distribute the event
////////////////////////////////////////////////////////////////////////////////
procedure TFrmEventTest.btnEventClick(Sender: TObject);
var
i: integer;
begin
for i := 0 to Length(m_events) - 1 do
m_events[i](Sender);
end;
Man beachte dass ein Objekt mehrere Events registrieren kann und dann auch mehrfach benachrichtigt wird. Ein unregister hebt nur die erste Registrierung wieder auf, die anderen bleiben unberührt.
Im Anhang ein kleines D5-Beispiel, das Phoenix vor ein paar Jahren gebastelt hat (170 KB).