A
Meep Meep schrieb:
also ich werd mal einfach so drauf los raten...
BEGIN_MESSAGE_MAP und END_MESSAGE_MAP(TForm); wird irgendwas sein
Du brauchst nicht raten.
Um mich mal selbst zititern zu dürfen:
Tutorial schrieb:
Die MessageHandler sind nichts anderes als drei Macros, die zusammengesetzt eine überschriebene Dispatch- Methode ergeben. Deshalb kann man auch nicht diese Macros verwenden und gleichzeitig die Dispatch- Methode überschreiben.
hm, klingt noch ein wenig Theoretisch. Deshalb schauen wir uns mal den Aufbau der Macros an:
#define BEGIN_MESSAGE_MAP \
virtual void __fastcall Dispatch(void Message) \
{ \
switch (((PMessage)Message)->Msg) \
{
#define VCL_MESSAGE_HANDLER(msg,type,meth) \
case msg: \
meth(((type *)Message)); \
break;
#define END_MESSAGE_MAP(base) \
default: \
base::Dispatch(Message); \
break; \
} \
}
BEGIN_MESSAGE_MAP definiert den ersten Teil des Funktionsrumpfes mit der Einleitung des switch- Teiles. Die Eingefügen VCL_MESSAGE_HANDLER jedes Nachrichtentyps bilden dabei die case- Teile. Der Parameter msg stellt die Bedingung im Case- Zweig dar. Innerhalb des Case- Zweiges wird die ebenfalls übergebene Funktion methmit den Parameter type* aufgerufen. In der Regel ist der Typ des Parameters TMessage. Aber auch andere nachrichtspezifische Typen sind möglich. END_MESSAGE_MAP bildet den Schlussteil der Methode und sorgt dafür, dass die Dispatch- Methode des Vorgängers aufgerufen wird, wenn die Nachricht nicht abgefangen wurde.
Die Dispatch- Vorgängermethode wird nicht aufgerufen, wenn die Nachricht in einer der VCL_MESSAGE_HANDLER abgefangen wird. Deshalb muss man in der angegebenen Methode die Dispatch- Methode des Vorgängers oder die DefaultHandler- Methode aufrufen.
[/quote]
was in den methoden steht kannst du ignorieren. Habs schließlich irgendwo rauskopiert.