![]() |
AW: Kann ich Windows-Messagehandler einer Form auslagern?
Zitat:
Delphi-Quellcode:
Im Prinzip holt er sich mit GetDynaMethod nur per RTTI(?) die Adresse der Funktion, welche mit einem MESSAGE Keyword und der entsprechenden MessageId getaggt ist und ruft diese dann im Kontext der aktuellen Instanz auf.
procedure TObject.Dispatch(var Message);
type THandlerProc = procedure(var Message) of object; var MsgID: Word; Addr: Pointer; M: THandlerProc; begin MsgID := TDispatchMessage(Message).MsgID; if (MsgID <> 0) and (MsgID < $C000) then begin Addr := GetDynaMethod(PPointer(Self)^, MsgID); if Addr <> nil then begin TMethod(M).Data := Self; TMethod(M).Code := Addr; M(Message); end else Self.DefaultHandler(Message); end else Self.DefaultHandler(Message); end; Warum die Nachricht nicht größer als $C000 sein darf, verstehe ich allerdings nicht. |
AW: Kann ich Windows-Messagehandler einer Form auslagern?
Na zu dynamischen (und auch virtuellen) Methoden in Delphi habe ich hier mal was geschrieben:
![]() Eine Message-Methode ist ja nix weiteres als eine Dynamische Methode, bei der wir die Nummer vorgeben (= die Zahl hinter dem Wort "message"). Und getDynamethod macht nix weiter als die Methodentabelle nach der entsprechenden message-ID (= Nummer der dynamischen Methode) zu durchforsten. Dazu muss man ggf. auch rekursiv durch die Elternklassen laufen (gilt zwar nicht für das Problem in diesem Thread, aber davon weiß GetDynaMethod ja nix). Und ein Aufruf einer Methode mit einer anderen Parameterliste ist erstmal kein Problem. Die Maschinensprache kennt sowieso keine Parameter. Die werden per Konvention (stdcall, register, pascal, ...) vorher irgendwo hingelegt. Und bei TMessage sind das ja 4 Zahlen die dann einfach auf dem Stack liegen. Die kann dann die aufgerufene Methode frei interpretieren. Das der Compiler da meckert, wenn die Parameterliste nicht übereinstimmt, ist was Delphieigenes (und auch in den meisten anderen Sprachen). Müsste aber nicht sein. Könnte man auch dem Programmierer überlassen, dass er aufpasst was er macht. |
AW: Kann ich Windows-Messagehandler einer Form auslagern?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz