Sieh Event-Handler als Verweis auf eine Prozedur, und Event-Typen als Beschreibung, welche Parameter diese Prozedur haben muss.
Die Grundidee ist, dass du eine Prozedur aufrufen kannst, ohne zu wissen wie diese heißt und wo sie her kommt. Für dich ist nur wichtig, welche Parameter hinein gehen. Was nachher genau aufgerufen wird, bestimmt ein anderer Teil des Programmes, an dem einem Handler eine konkrete echte Prozedur zugewiesen wird.
Delphi-Quellcode:
type
TMyEvent = procedure(Wert1: Integer; Wert2: String) of object;
TMyClass = class
private
FOnMyEvent: TMyEvent;
procedure DoSomething;
public
property OnMyEvent read FOnMyEvent write FOnMyEvent;
end;
implementation
procedure TMyClass.DoSomething;
begin
// mache irgendwas, wobei etwas passiert was MyEvent auslösen soll
if Assigned(FOnMyEvent) then
FOnMyEvent(123, 'Foo');
end;
Delphi-Quellcode:
type
TForm1 = class(TForm)
private
MyObject: TMyClass;
procedure MyEventHandler(Wert1: Integer; Wert2: String);
end;
implementation
procedure TForm1.OnCreate(Sender: TObject);
begin
MyObject := TMyClass.Create;
MyObject.OnMyEvent := MyEventHandler; // <-- ab jetzt ist der Aufruf von FOnMyEvent() oben in TMyClass identisch mit einem Aufruf von MyEventHandler() in TForm1
end;
procedure TForm1.MyEventHandler(Wert1: Integer; Wert2: String);
begin
ShowMessage('Es ist etwas passiert! Und zwar: '+IntToStr(Wert1)+' und '+Wert2); // Ausgabe wenn TMyClass.OnMyEvent() wie oben aufgerufen wird: "Es ist etwas passiert! Und zwar: 123 und Foo"
end;
Der große Vorteil ist, dass TMyClass hierdurch Prozeduren aus anderen Klassen aufrufen kann, ohne die Klasse, deren Herkunft oder sonst irgend etwas zu wissen. Man kann einfach dynamisch irgend eine Prozedur zuweisen - sie muss nur dieselben Parameter haben. Und das stellt man am besten sicher, indem man einen Typ "procedure() of object" nimmt, der diese sog. Signatur typsicher festlegt. TNotifyEvent ist lediglich solch ein Typ, und besagt "irgend eine Prozedur (die einem Objekt zugeordnet ist), die einen Parameter vom Typ TObject hat". Mehr nicht.
Das ganze MUSS nichtmals nur für Events genutzt werden. Das Konzept ist generell verwendbar, bietet sich aber für Events sehr an. (Genau genommen sind "Events" auch nur eine lose Definition, kein eigenständiges Konzept der Sprache an sich. Es sind einfach Methodenzeiger, die aufgerufen werden, wenn dies semantisch als ein Ereignis interpretiert werden kann. Man kann Methodenzeiger auch anders einsetzen. Hier wird's aber etwas philosophischer
)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)