Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Sonstiges (https://www.delphipraxis.net/45-library-sonstiges/)
-   -   Delphi Multicast in Delphi (https://www.delphipraxis.net/77899-multicast-delphi.html)

Matze 26. Sep 2006 15:46


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 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).

Phoenix 20. Aug 2007 07:48

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