Man bekommt den Owner und die Methode zusammen übergeben?
Delphi-Quellcode:
constuctor TEventHandler<T>.Create(OwnerMethod: T; AddEvents: array of T);
begin
inherited Create(TComponent(TMethod(OwnerMethod).Data)); // Owner
for M in AddEvents do
Add(M);
end;
statt
Delphi-Quellcode:
eventHandler := TEventHandler<TNotifyEvent>.Create(Button1);
eventHandler.Add(ClickHandler1);
eventHandler.Add(ClickHandler2);
Button1.OnClick := eventHandler.Invoke;
einfach
Delphi-Quellcode:
eventHandler := TEventHandler<TNotifyEvent>.Create(Button1.OnClick);
eventHandler.Add(ClickHandler1);
eventHandler.Add(ClickHandler2);
oder gar so
TEventHandler<TNotifyEvent>.Create(Button1.OnClick, [ClickHandler1, ClickHandler2]);
.
In dem TMethod (Button1.OnClick) steckt ja schon alles drin > die aufzurufende Methode und das Objekt, welches man als Owner verwenden kann.
Ja, ich geb's zu ... ich bin ein schreibfauler Programmierer
, aber ich steh dazu
Mich würde es ehrlich gesagt sehr wundern, wenn das funktioniert...
Wenn ich so einen
TEventHandler
erzeuge, so möchte ich den doch einem Event zuweisen, welches bisher noch kein Event zugewiesen hat, also bei dem folgendes zutrifft:
Delphi-Quellcode:
TMethod(OnClick).Code = Nil
TMethod(OnClick).Data = Nil
Selbst wenn jedoch bereits ein Event an mein
OnClick
zugewiesen ist, enthält
TMethod(OnClick).Data
jedoch eine Referenz auf das Objekt, dem der Eventhandler gehört, nicht jedoch zu dem Objekt, welches die Eventeigenschaft hat...
Im Code:
Delphi-Quellcode:
Button1.OnClick := Form1.HandleOnClick;
Assert(TMethod(Button1.OnClick).Data = Button1); // schlägt fehl
Assert(TMethod(Button1.OnClick).Data = Form1); // erfolgreich
Wenn ich nicht die ganzen letzten Jahre das Konzept von
TMethod
missverstanden hab, dann kann deine Unterstützung der Schreibfaulheit nicht funktionieren.
Gruß,
Sven