![]() |
Multicast Events: Var Parameter
Hintergrund:
Ich bastel an einer Liste für Multicast-Events in älteren Delphiversionen. Dabei gibt es ein Object, das die Liste hat (Master) und mehrere andere Objekte (Handler) die entsprechende Event-Handler implementieren. Die Frage: Tja..die Frage ist nun, ob es überhaupt Sinn macht, Var-Parameter in diesen Events zu unterstützen. Technisch ist das machbar (wenn auch nicht unbedingt einfach), aber ich kann mir grad kein Szenario vorstellen, wo das wirklich sinnig wär. Was meint Ihr dazu ? |
AW: Multicast Events: Var Parameter
Wenn du Prioritäten einbaust ist es zumindest nutzbar.
Der wichtigste gewinnt. In der API für Minecraft Server Plugins gibt es z.B. oft Events die von mehreren Plugins verarbeitet werden und bei denen das Plugin auch Daten im Event zurückgeben kann. Das funktioniert dann wie oben beschrieben. Ob du das willst/brauchst musst du dann selbst überlegen. |
AW: Multicast Events: Var Parameter
Prioritäten ?
Wenn dann sollte der Master schon alle Var-Parameter aller Handler bekommen (also im Endeffekt ein Array bzw. eine Liste). Zum besseren Verständnis ein Beispiel:
Delphi-Quellcode:
h1..h3 hängen sich nun an das Event von Master. Master löst das Event aus (ExecuteEvent) und
Type
TMyEvent = Procedure (var aInt:Integer) of object; TMaster = Class(TObject) : Procedure ExecuteEvent; end; THandlerPlus = Class(TObject) : Procedure HandleMyEvent(var aInt:integer); : THandlerMinus = class(TObject) : Procedure HandleMyEvent(var aInt:integer); THandlerMal = Class(TObject) : Procedure HandleMyEvent(var aInt:integer); var master : TMaster; h1 : TPlusHandler; h2 : TMinusHandler; h3 : TMalHandler; übergibt 42. Rückgabe wäre dann (45,39,126). |
AW: Multicast Events: Var Parameter
wäre das nicht gleich Callback ?
gruss |
AW: Multicast Events: Var Parameter
Zitat:
Du kannst halt die Eventhandler nacheinander aufrufen und nach jedem Aufruf den Var-Parameter in eine Liste schreiben. Oder zu rufst die Eventhandler nacheinander auf und reichst den var-Parameter immer weiter durch (im Idealfall wie gesagt mit Prioritäten). Das sind beide Möglichkeiten und wie du es bei einem speziellen Event implementierst hängt von dem Event ab und was das Event am Ende haben will. Ein var-Parameter wie "CanClose" macht halt als Array z.B. keinen Sinn. Es sei denn Mehrheit entscheidet am Ende :mrgreen: |
AW: Multicast Events: Var Parameter
@EWeiss
Ein Callback oder Event seitens der Eventliste wäre eine Möglichkeit, das zu handeln. Eine andere ein Array of const als Rückgabewert. Hat beides seine Vor- und Nachteile. Die Frage ist aber eher, ob es Sinn macht so einen Mechanismus überhaupt zu implementieren. @Neutral General Ziel diese "kleinen" (hust....) Projektes ist eine Art EventManager, der verschiedene Events und ihre Handler managed (und natürlich ggf auch aufrufen) kann. |
AW: Multicast Events: Var Parameter
Zitat:
Denn für mich ist eine Callback letztendlich nichts anderes als eine Liste von Events welche mir definierte Zustände schaltet bzw. diese auch zurückgeben kann. Daher würde ich auf diesen Mechanismus verzichten. Aber es ist letztendlich deine Entscheidung ob du das für besser oder sinnvoll empfindest. gruss |
AW: Multicast Events: Var Parameter
Ob nun Event basiert, Callback oder Array ist eine Frage der Implementierung.
Mir gehts eher darum ob eine Implementierung (egal welche) überhaupt im Rahmen von Multicast-Events sinn macht. |
AW: Multicast Events: Var Parameter
Zitat:
Dann kann ich nicht weiter mit reden da ich noch keine "Multicast Events" bisher benötigt habe. gruss |
AW: Multicast Events: Var Parameter
Kleines Beispiel:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} uses Spring; type {$M+} TCallback = reference to procedure(var x: Integer); procedure Add(var x: Integer); begin x := x + x; end; procedure Mul(var x: Integer); begin x := x * x; end; procedure Main; var e: Event<TCallback>; i: Integer; begin e.Add(Add); e.Add(Mul); i := 3; e.Invoke(i); Writeln(i); // 36 e.Clear; e.Add(Mul); e.Add(Add); i := 3; e.Invoke(i); Writeln(i); // 18 end; begin Main; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:37 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