![]() |
Multicast in Delphi
Liste der Anhänge anzeigen (Anzahl: 1)
In .NET ist es möglich, einem Event mehrere Eventhandler zuzuordnen. Mit folgendem Code, der aus
![]()
Delphi-Quellcode:
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.
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; Im Anhang ein kleines D5-Beispiel, das Phoenix vor ein paar Jahren gebastelt hat (170 KB). |
Re: Multicast in Delphi
Nachtrag:
Beim Unregister wird die Reihenfolge der Event-Registrierungen durcheinandergebracht, indem das letzte Event in der Liste die Lücke ersetzt und dann das Array verkürzt wird. Ist die Reihenfolge wichtig, so müssen alle Events nach der Lücke nach vorne gezogen werden:
Delphi-Quellcode:
////////////////////////////////////////////////////////////////////////////////
// unregister event from distributor //////////////////////////////////////////////////////////////////////////////// procedure TFrmEventTest.UnregisterEvent(Subscriber: TObject); var i: integer; found: boolean; begin found := false; for i := 0 to Length(m_events) - 1 do begin if not found then begin found := TMethod(m_events[i]).Data = Subscriber; end else begin m_events[i-1] := m_events[i]; end; end; if found then begin SetLength(m_events, Length(m_events) - 1); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz