Announcement

Collapse
No announcement yet.

problem mit pascal-regelung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • problem mit pascal-regelung

    hallo,<br>
    <br>
    wenn ich in meinem programm eine w-botschaft folgendermassen abfange:<br>
    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;<br>
    was passiert da eigentlich? <br>
    denn genau diese methode ist in 'customform' auch genau so <br>
    deklariert, also nicht mit virtual bzw. dynamic. wenn ich diese methode nun genauso deklariere wie sie<br>
    im vorgänger ('tcustomform') deklariert ist, so müsste ich ja die vorgängermethode <br>
    verdecken. führe ich nun meine aktionen aus, und möchte das das standardverhalten<br>
    trotzdem läuft, so rufe ich am ende meiner methode mit 'inherited' eben dieses verhalten auf.<br>
    soweit alles klar, hoffe ich. wenn ich aber nun die methode:<br>
    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;<br>
    anders benenne z. b.:
    procedure WMEraseBkgnd__Test(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;<br>
    so wird mit inherited dennoch das standardverhalten hergestellt, woher weiss der compiler dass<br>
    ich mit inherited die methode:
    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;<br>
    meine????<br>
    weiss er es vielleicht dadurch, dass ich die selbe windows-botschaft-abfange wie der vorfahr???<br>
    mfg<br>
    ake

  • #2
    Hi

    Es gibt im Delphi/PASCAL verschiedene Typen von Methoden. Methoden sind Prozeduren oder Funktionen die einem Object zugeordnet sind. All diese Methoden haben gegenüber normalen Funktionen/Prozeduren eines gemeinsam. Sie haben einen impliziten und unsichtbaren ersten Parameter, genannt Self, einen Zeiger auf das Object oder die Klasse selber. So, das zur Grundlage. Nun gibts aber noch verschiedene Typen von Methoden:

    <li>abstrakte
    <li>statische
    <li>virtuelle
    <li>dynamische
    <li>Ereignisse
    <li>Klassenmethoden

    <pre>

    type
    TMyObject = class
    procedure XYZ; <b>statische Methode</b>
    class procedure XYZ; <b>Klassenmethode</b>
    [class] procedure XYZ; abstract; <b>abstrakte Methode</b>
    [class] procedure XYZ; virtual; <b>virtuelle Methode</b>
    procedure XYZ; dynamic; <b>dynamische methode</b>
    procedure XYZ; dynamic; 10; <b>dynam. mit ID</b>
    procedure XYZ; message; 10; <b>dynam. mit ID</b>
    private
    FEvent: TNotifyEvnet; <b>Ereigniss</b>
    end; <br>

    </pre>

    Nun virtualle und dynamische Methoden können überschrieben werden.
    Bei virtuallen Methoden enthält das Object ein internen Zeiger auf die zu nutzende Funktion, d.h. beim überschreiben von virtuellen Methoden wird einfach der neue zeiger auf die neue Funktion abgespeichert. Dynamische Methoden besitzen eine 16Bit Index, also ein Word, zur Identifizierung. Willst Du eine Dynamische Methode aufrufen ist es EGAL wie sie heist einzigst der Index in die DMT (dynamische Methoden Tabelle) ist entscheidend. message Methoden sind nichts anderes als dynamische Methoden einzigst mit dem Unterschied das der Index gleichzeitig die Message darstellt. D.h. wm_ErasBkGnd = $0014 + $C000 = $C014 = Index der dynamischen methode. Der Vorteil von dynamischen Message-Methoden besteht darin das z.B. die methode mit dem Index $C014 überhaupt nicht existieren muss. Sollte das der fall sein ruft Delphi die Methode .Defaulthandler() auf die wiederum die message an die Standard fensterprozedur weiterleitet.

    Gruß Hage

    Comment

    Working...
    X