Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Events (https://www.delphipraxis.net/86716-events.html)

scrat1979 18. Feb 2007 15:47


Events
 
Hallo,

ich arbeite gerade zum Lernen ein paar Komponenten-Sourcecodes durch. Dabei ist mir folgendes aufgefallen:

In einer Komponente wurde folgendes selbsterklärendes Event erstellt:

Delphi-Quellcode:
FOnMouseExit      : TNotifyEvent;
Der Aufruf erfolgt weiter unten im Source in einer Prozedur, welche die Message wm_mouseexit o.ä. abfängt, wie folgt:

Delphi-Quellcode:
if assigned(FOnMouseExit) then
    FOnMouseExit(Self);
So weit so gut. Ich habe es aber bisher immer so gemacht, daß ich ein Ereignis zuerst definiert habe mit
Delphi-Quellcode:
Type TMeinEreignis = procedure of object;
[...]
VAR MeinEreignis : TMeinEreignis;
[...]
Das Auslösen des Ereinisses erfolgte analog zu o.g. Beispiel - und funktioniert übrigens ebenfall tadellos. Nun meine Frage: Wo ist der Unterschied / vor- oder Nachteil der beiden Funktionen?!?

Noch was: Gibt es irgendwo im Netz gute Tutorials zum Thema Event und Messages. Ich arbeite mich da gerade zwar ein, aber steige irgendwie noch nicht ganz durch. Die ganzen WM_xxx messages SC_xxx etc. bringen mich noch ziemlich durcheinander, ebenso die messages, welche noch parameter besitzen (z.B. WM_KEYUPMSG o.ä.). Die Einsteigertutorials des Forums habe ich übrigens schon durchgearbeitet, ich würde aber gerne mehr "Hinter die Kulissen" schauen.

Hoffe Ihr könnt mir weiterhelfen,

SCRaT

Neutral General 18. Feb 2007 15:49

Re: Events
 
Der Unterschied zwischen deinem TEreignis und TNotifyEvent?

naja ganz einfach:

Delphi-Quellcode:
TNotifyEvent = procedure(Sender:TObject) of Object;
TMeinEreignis = procedure of object;
Oder habe ich was falsch verstanden?

Christian Seehase 18. Feb 2007 15:52

Re: Events
 
Moin Scrat,

ein wesentlicher Unterschied besteht da nicht.
TNotifyEvent ist so deklariert (sollte auch in der Hilfe stehen):

Delphi-Quellcode:
type TNotifyEvent = procedure (Sender: TObject) of object;
Du verwendest nur eine Variable, wohingegen man in einer Komponente für so etwas private-Felder benutzt.

scrat1979 18. Feb 2007 16:37

Re: Events
 
ok, so weit ist es mir jetzt klar. Aber was für einen Vorteil hat denn der Paramter von Notifyevent (Sender: TObject) in der Praxis? Ich muss ihn ja dann auch z.B. in der Prozedur mit FOnMouseExit(Self) aufrufen, nur der Vorteil ist mir nicht ganz klar. Es wird ja in der Komponente immer nur "self" übergeben (s.o. if assigned....) oder wann könnte der Parameter einen anderen Wert annehmen?!?

Zitat:

Du verwendest nur eine Variable, wohingegen man in einer Komponente für so etwas private-Felder benutzt.
Das Verstehe ich nicht ganz. Was genau meinst Du damit?

SirThornberry 18. Feb 2007 16:43

Re: Events
 
Du kannst zum Beispiel mehren Buttons das gleiche OnClick zuweisen. Durch den übergebenen Sender kannst du dann herausfinden welcher Button diese Procedure aufgerufen hat. Zudem gibt es ja nicht nur diesen Parameter. Zum Beispiel gibt es bei vielen Komponenten auch ein OnCustomDraw wo übergeben wird welcher Teil neu gemalt wird etc.
Zudem muss ein Event nicht immer nur benachrichtigen sondern kann auch abfragen (als Funktion oder mit var-Parameter)

scrat1979 18. Feb 2007 20:56

Re: Events
 
Zitat:

Zitat von SirThornberry
Du kannst zum Beispiel mehren Buttons das gleiche OnClick zuweisen. Durch den übergebenen Sender kannst du dann herausfinden welcher Button diese Procedure aufgerufen hat. Zudem gibt es ja nicht nur diesen Parameter. Zum Beispiel gibt es bei vielen Komponenten auch ein OnCustomDraw wo übergeben wird welcher Teil neu gemalt wird etc.
Zudem muss ein Event nicht immer nur benachrichtigen sondern kann auch abfragen (als Funktion oder mit var-Parameter)

Hmmm.. ok, ich werde es mal testen. Vielleicht werde ich ja aus dem Verhalten des Programmes etwas mehr vertraut, die Hintergrundinfos habe ich ja jetzt :-)

SCRaT


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz