AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

"inherited" in Windows-Messages?

Ein Thema von pstruh · begonnen am 16. Aug 2007 · letzter Beitrag vom 16. Aug 2007
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#11

Re: "inherited" in Windows-Messages?

  Alt 16. Aug 2007, 18:34
hier wird die botschaftsbehandlung nicht im herkömlichen Sinne überschrieben. Es wird ein Messagehandler "registriert" an den eben bei eintreffen der Message diese geschickt wird. Will man die Message jetzt in den originalen Messagehandler bringen (die Nachrichtenschleife oder andere registrierte Messagehandler von Klassen von denen man geerbt hat) ist eben das inherited notwendig.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#12

Re: "inherited" in Windows-Messages?

  Alt 16. Aug 2007, 18:40
Zitat von Khabarakh:
waren dort alle Botschaftsmethoden statisch
Die waren noch nie statisch. WndProc war schon immer virtual und alle "message WM_XXX" sind dynamische Methoden (eintrag in der DMT [Dynamic Method Table])
  Mit Zitat antworten Zitat
pstruh
(Gast)

n/a Beiträge
 
#13

Re: "inherited" in Windows-Messages?

  Alt 16. Aug 2007, 19:13
Hallo zusammen, nun nicht mehr aus dem Büro, sondern von zu Haus! Bin erstaunt, welche interessanten Antworten auf meine, aus professioneller Sicht wohl recht naive, Frage hervorgebracht hat. Ich bedanke mich noch einmal bei allen Beteiligten - ist echt ein sehr aktives und hilfreiches Forum...
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#14

Re: "inherited" in Windows-Messages?

  Alt 16. Aug 2007, 19:22
um geanz genau zu erfahren was passiert bei dem aufruf von inherited in einem Messagehandler, schalte einfach mal die Debug-DCUs ein und steppe mit F7 hinein.
Du wirst einen Unterschied feststellen bei "abfangen" einer Nachricht welche bereits abgefangen wurde, von der klasse von der du erbst, und einer Nachricht die direkt an die DefWindowProc von Windows durchgeleitet wird.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#15

Re: "inherited" in Windows-Messages?

  Alt 16. Aug 2007, 21:04
Zitat:
Botschaftsmethoden statisch
Falsch. Botschaftsmethoden sind schon imemr dynamische Methoden gewesen. Also auch keine virtuelle Methoden !!
Dynamische Methoden zeichnen sich dadurch aus das der Methode eine eindeutige Slot-ID zugeordnet wird. Das ist meistens ein Word der ein Index in die DMT -> Dynamic Method Table der Klasse ist. Virtuelle Methoden sind in der VMT der Klasse gespeichert. Der Unterschied besteht im Speicherverbrauch dieser Tabellen. Die DMT ist wesentlich kompakter benötigt aber einen echt rießigen Calling-Overhead beim Aufrufen einer solchen Methode. Dynmisch statt Virtuell bezieht sich nämlich auf die Art und Weise wie man eine Dynamische Methode aufruft und benutzt. Man hat ja erstmal nur eine Slot-ID und ein Objekt. Nun muß eine Aufrufprocedure innerhalb der DMT dieser Objektklasse nach einem Eintrag mit der Slort-ID der Methode suchen. Findet sich in dieser Klasse keine Dynamische Methode mit dieser ID so wird mit der Vorfahrklasse das gleiche gemacht. Man sucht also ausgehend von der aktuellen Klasse des Objecte alle DMTs aller Vorfahrklassen so lange durch bis man die Slot-ID gefunden hat. Dort wird dann auch der Zeiger in das Codesegement an der die reale Methode steht gespeichert. Eine Klasse als Struktur erbt also ganz unterschiedlich bezogen auf die DMT und VMT. Die VMT einer neuen Klasse ist eine komplette Kopie der Vorfahrklasse plus alle virtuallen Methoden die in der neuen Klasse deklariert wurden. Logisch da nur so eine 1 zu 1 Beziehung der Virtuellen Methoden in der komplette Klassenhirarchie ermöglicht wird. An der gleichen Position in der VMT steht immer die gleiche virtuelle Methode der kompletten Hierarchie, sonst könnte man garnicht eine Methode überschreiben. Die DMT einer neuen Klasse enthält dagegen nur die Einträge an dynamischen Methoden die in dieser Klasse implementiert wurden. Wurde eine dynamische Methode der Vorfahrklasse überschrieben so wird auch in der DMT der neuen klasse ein Eintrag mit der entsprechenden Slot-ID stehen, ansonsten fehlt dieser Eintrag. Die VMT wiederum kopiert alle virtuellen Methoden für jede Klasse egal ob die aktuelle Klasse sie überschreibt oder nicht. Das kostet Speicherplatz.

Und in meinen Worten steckt noch was, ich sagte DMT -> Methoden die implementiert wurden und VMT -> Methoden die deklariert wurden. Der Unterschied besteht nämlich darin das bei dynamischen Methoden exakt 2^16 Stück möglich wären und das das schon in der Klasse TObjekt festgelegt ist. Man kann also mit dynamischen Methoden Funktionaliät festlegen ohne wissen zu müssen wann, wo und ob die reale Implementierung einer dynamischen Methode real erfolgt. Dazu muß man aber in der Basisklasse keine Platzhaltermethode wie bei virtuellen Methoden vorsehen, also selbst die Implementation der Basisfunktionaliät kann bei dynamischen Methoden entfallen. Das einzigste was notwendig ist ist

1.) ein einheitliches Parameterinterface, bei Botschaftsmethoden eben die Einigung auf (var Msg: TMessage);
2.) die Bedeutung der Slot-IDs als Konstanten, eben wm_Paint = $xxxx.

Nun inherited kann man aufrufen vor oder nach der eigenen Implementierung oder auch garnicht. Das hängt einfach von der Zielsetzung ab.
Wird inherited in einer virtuellen Methode aufgerufen dann ist das wenig Code. Man schaut in der VMT der Vorfahrklasse am exakt gleichen Index wie die akteulle Methode nach und lädt von dort den Zeiger auf die Vorfahrmethode und ruft sie per CALL auf (Parameter nicht vergessen). Bei dynamischen Methoden ist das bischen aufwendiger kann ja die Vorfahrklasse garkeine Implementierung zur aktuellen Slot-ID besitzen. Man muß also auch wieder mit einer speziellen Suchfunktion erstmal die DMTs der Vorfahrklassen durchsuchen.

Die Slot-ID ist die Zahl die man bei dynamischen Methoden hinter deren Deklaration vergeben muß oder kann Botschaftmethoden sind dynamische Methoden mit dem Unterschied das man diese Slot-ID per "message wm_Paint" o.ä vorgibt.

Übrigens Botschaftmethoden sind nicht begrenzt auf Windows-Controls sondern funktionieren mit allen Klassen abgleitet von TObject. Das macht zb. Sinn für Datenobjekte zb. Nodes und Node-Bäume die Daten hierarisch verwalten und denoch auf Eingaben der Maus, des Keyboards oder sich selber zeichnen sollen. Auch Broadcasting Botschaften lassen sich so auf Datenobjekte anwenden, einfach indem man seine eigene Message Methoden in diese Datenobjekte implementiert.

Gruß Hagen
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:56 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