Ich habe eine Lösung für dieses Problem implementiert, die in so gut wie jeder Version von Delphi funktioniert - sie wurde ursprünglich in Delphi 7 implementiert, obwohl ich sie nicht in früheren Versionen getestet habe (aber wenn Sie selbst Delphi 7 verwenden, dann ist das alles, was Sie wissen müssen, nicht wahr?) :)
iirc war dies zumindest teilweise die Inspiration für Allen Bauers Beitrag. Sie können meine Implementierung in einigen Videos sehen und den Code herunterladen aus meinem Blog :
Die Beiträge, die Sie interessieren, sind mit "Multicast" gekennzeichnet. Der Download-Link für den endgültigen Code lautet verfügbar in dieser Stelle .
Bei meinem Ansatz leiten Sie eine Klasse von TMultiCastEvent ab. Ihre abgeleitete Klasse muss lediglich einen einfachen Typsicherheitsschutz für das Hinzufügen, Entfernen und Aufrufen eines Ereignisses mit einer bestimmten Signatur implementieren.
Eine Implementierung für TNotifyEvent - procedure(Sender: TObject) - wird zusammen mit der Implementierung zur Verfügung gestellt, sowohl "um Sie in Gang zu bringen" (die meisten "nützlichen" Multicast-Ereignisse sind einfache Benachrichtigungen) als auch als Beispiel dafür, wie man Multicast-Ereignisklassen für bestimmte Ereignissignaturen ableiten kann.
Sobald Sie Ihre Multicast-Ereignisklasse haben, können Sie reguläre "Event-Handler" austauschbar mit der Multicast-Version verwenden, z.B. bei einer imaginären Schaltflächenklasse mit einem Multicast-On_Click-Ereignis (ich habe die Konvention übernommen, einen Unterstrich in den Ereignisnamen einzufügen, um ihn als Multicast zu kennzeichnen, im Gegensatz zu regulären "Unicast"-Ereignissen):
Code, der einem Unicast-Klickereignis einen Handler zuweist:
Button.OnClick := MyClickHandler;
Sie können denselben Handler direkt zu einem mehrfach gesendeten Benachrichtigungsereignis hinzufügen:
MultiCastButton.On_Click.Add(MyClickHandler);
Meine Implementierung enthält auch eine Reihe von Verfeinerungen, wie z. B. die Möglichkeit, Ereignisse zu deaktivieren und Handler automatisch aus Handlern zu entfernen, wenn das implementierende Objekt zerstört wird (dies beinhaltet eine kleine Menge an Hausarbeit, die bei Bedarf ignoriert werden kann, die aber unter bestimmten Umständen nützlich sein kann).
All dies wird in meinen Blogbeiträgen beschrieben und demonstriert.
Genießen Sie. :)