Thema: TNotifyEvents

Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#20

AW: TNotifyEvents

  Alt 14. Jan 2020, 11:56
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)

Geändert von Medium (14. Jan 2020 um 12:01 Uhr)
  Mit Zitat antworten Zitat