Delphi-PRAXiS
Seite 2 von 2     12   

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 Kann ich Windows-Messagehandler einer Form auslagern? (https://www.delphipraxis.net/178117-kann-ich-windows-messagehandler-einer-form-auslagern.html)

Zacherl 18. Dez 2013 16:50

AW: Kann ich Windows-Messagehandler einer Form auslagern?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1240270)
Ich verstehe die Implementation von
Delphi-Quellcode:
TObject.Dispatch(var Message)
zwar nicht im Geringsten (so viel Assembler)

Die habe ich mir auch vor kurzem zu Gemüte geführt.

Delphi-Quellcode:
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;
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.

Warum die Nachricht nicht größer als $C000 sein darf, verstehe ich allerdings nicht.

sirius 18. Dez 2013 17:08

AW: Kann ich Windows-Messagehandler einer Form auslagern?
 
Na zu dynamischen (und auch virtuellen) Methoden in Delphi habe ich hier mal was geschrieben:
http://forum.delphi-treff.de/index.p...mic#post231727

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.

Zacherl 18. Dez 2013 18:06

AW: Kann ich Windows-Messagehandler einer Form auslagern?
 
Zitat:

Zitat von sirius (Beitrag 1240275)
Na zu dynamischen (und auch virtuellen) Methoden in Delphi habe ich hier mal was geschrieben:
http://forum.delphi-treff.de/index.p...mic#post231727

Danke dir :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 Uhr.
Seite 2 von 2     12   

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