Da es in .Net denkbar einfach ist, mehr als einen EventHandler an ein Event zu hängen, habe ich auf Basis des source codes von Allen Bauer (
[1],
[2],
[3]) das ganze noch etwas ausgebaut um es möglichst einfach zu machen, Events zuzuweisen.
Leider fand ich in Bauers Beiträgen den vollständigen source code nirgens und musste einiges selbst rekonstruieren.
Es gibt mehrere Möglichkeiten, diese Events zu benutzen.
Angenommen, ich habe einen Button und möchte an das OnClick 2 EventHandler hängen:
Delphi-Quellcode:
var
eventHandler: TEventHandler<TNotifyEvent>;
begin
eventHandler := TEventHandler<TNotifyEvent>.Create(Button1);
eventHandler.Add(ClickHandler1);
eventHandler.Add(ClickHandler2);
Button1.OnClick := eventHandler.Invoke;
end;
Dabei ist interessant, dass man beim Konstruktor einen Owner angeben kann. Dadurch muss man wie bei TComponent üblich nicht um das Freigeben des Objektes kümmern.
Wenn man eine eigene Klasse erstellt gibt es neben dem Erstellen eines TEventHandler<T> Objektes eine andere (und elegantere wie ich finde) Möglichkeit:
Delphi-Quellcode:
type
TFoo = class
private
FOnClick: TEvent<TNotifyEvent>;
public
procedure Click;
property OnClick: TEvent<TNotifyEvent> read FOnClick;
end;
procedure TFoo.Click;
begin
FOnClick.Invoke(Self);
end;
var
foo: TFoo;
begin
foo := TFoo.Create;
foo.OnClick.Add(ClickHandler1);
foo.OnClick.Add(ClickHandler2);
end;
Man muss sich hier nicht um das Erzeugen und Verwalten eines Objektes kümmern, sondern kann das Event fast genauso nutzen wie bei regulären Events, außer, dass die Eigenschaft nur read sein muss (und sollte).