Announcement

Collapse
No announcement yet.

Eigene Messages!!

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

  • Eigene Messages!!

    Hallo<p>
    Ich habe nochmal eine Frage. Ich habe hier im Forum folgende Code Zeile gefunden.<p>
    <pre>
    procedure WMNCHITTEST(var Msg : TMessage); message WM_NCHITTEST;
    </pre>
    Ich wusste vorher nicht das mann auf diese Art und Weise einer procedure eine Message zuordnen kann. Ich habe dann folgendes versucht.<br>
    Ich habe einen Integer Definiert und ihm dann mit RegisterWindowMessage eine neue Message zugewiesen. Allerdings konnte ich diese Message dann nicht an eine Procedure übergeben. Darauf bekam ich einen Compiler Fehler. Der Compiler verlangt eine Konstante. Darauf hin habe ich in die Unit Messages geguckt, und mir dort alle Messages mal angeguckt. Ich fand dort einen Kommentar der besagte das alle Message unter $0400 reserviert seinen.<br>
    Jetzt wollte ich fragen ob es ohne größere Probleme / Gefahren möglich ist das ich meine eigenen Messages als Konstanten definiere???
    <p>
    Vielen Dank im vorraus!!
    <p>
    Daniel

  • #2
    Das ist ein Problem. Normalerweise sollte eine Message mit wm_User +X; definiert werden. Aber, weisst Du wenn Du Fremkomponenten-kompatibel sein willst welche Messages welche Kompo selber definiert ??? D.h. werden Konstanten benutzt sollte man diese NUR an definitiv bekannte Fenster schicken und niemals als Broadcasts. Dann treten sogut wie keine Probleme auf.
    Alle Messages die nicht gezielt verschickt werden, sondern eben per Broacast an alle Fenster, sollten mit RegisterWindowMessage() erzeugt werden. Um diese Messages selektiv in einem TWinControl auszufiltern muss dann aber die Methode .WndProc() überschrieben werden.

    Gruß Hage

    Comment


    • #3
      Achso, der Grund warum eine als Message deklarierte Methode nur mit Konstanten arbeiten kann liegt darin das eine Message Methode nichts anderes als ein dynamische Methode ist (dynamic). Jede dynamische Methode wird durch ihren 16Bit Word = Index = wm_XXXX identifiziert und die TypInfos einer Klasse enthält dazu eine DMT=Dynamic Method Table. Ein Slot in diser Tabelle wird durch din Index ermittelt und enthält einen Zeiger auf die Methode selber. Im Gegensatz zu normalen Methoden/Functions/Procedures die eben durch den Compiler per Bezeichner=Name identifiziert werden, werden dynamisch Methoden also NUR durch ihren Index=type Word identifiziert. Daraus ergeben sich gravierende Vor-/und nachteile.
      <li>dynm. methoden werden erst zur Laufzeit aufgelösst, das dauert seine Zeit und verlangsammt jeden Einsprung in die methode erheblich
      <li>überschriebene dynm. Methoden MÜSSEN NICHT den gleichen Namen besitzen sondern NUR den gleichen Index.
      <li>für jeden der möglichen 65535 Indexwerte existiert immer eine dynm. methode. Falls keine bestimmte gecodet wurde wird immer der .Defaulthandler aufgerufen (im Falle vom message).
      <li>die DMT= dynamische Methoden Tabelle verbraucht wesentlich weniger Speicherplatz als die VMT=Virtuelle Methoden Tabelle.

      Gruß hage

      Comment


      • #4
        Hallo Hagen<p>
        Vielen Dank für deine schnelle und ausfürliche Antwort!! Ich denke Ich werde mir meine Messages mit WM_USER + x definieren. Vielen Dank für den tipp. Ich werde diese Messages auch nur an gezielte Fenster senden!!
        <p>
        mfg<p>
        Danie

        Comment

        Working...
        X