Zuerst mal würde ich mich von dem Schlagwort
TNotifyEvent verabschieden. Das führt hier in die Irre. Du suchst nach einem Tutorial über
Eventhandler. TNotifyEvent ist ein Eventhandler unter vielen. Oder genauer gesagt die Deklaration eines Eventhandler-Typen. Ich weiß, noch mehr Fragezeichen
Ein recht gutes Tutorial
kommt von Embarcadero selbst.
Und um deine andere Frage zu beantworten: Die große Mehrheit der Eventhandler sind Prozeduren. Allerdings können technisch gesehen genauso gut auch Funktionen verwendet werden.
Warum sollte bzw. muss ich dann im zweiten Beispiel einen eigenen Event-Typen definieren? Wann macht sowas am meisten Sinn?
Außer zu Lernzwecken? Grundsätzlich solltest du immer erst schauen ob es für deinen jeweiligen Bedarf nicht schon passende Eventhandlertypen gibt.
Eventhandler sind nützlich, wenn du eine Klasse schreibst und diese in einer separaten
Unit liegt. Wenn deine Klasse eine Prozedur in deinem Hauptprogramm aufrufen soll, muss sie ja wissen welche und muss sie auch erreichen können. In schlecht programmierten Codes entstehen bei sowas Kreuzbezüge bzw. zirkuläre Referenzen. Das heißt, die Unit1 bindet Unit2 ein und Unit2 bindet Unit1 ein. Die haben mich schon viele graue Haare gekostet.
Guter Code lagert Klassen in separate Units aus und weist keine zirkulären Referenzen auf. Um das zu erreichen, sind Eventhandler ein guter Weg.