eigene Botschaften zwischen Komponenten verschicken



  • Hallo Leute!

    Ich hab hiere in kleines Problem mit dem versenden von Botschaften.
    und zwar habe ich eigene visuelle Komponenten geschrieben, die auf einem Formular platziert werden. Ich möchte nun, dass diese Kompoenenten mein Hauptformular benachrichtigen, wenn sich ihre Eigenschaften ändern.

    ich hab mir da jetzt einiges aus der Hilfe und aus dem BCB-Tutorial zusammengesucht.

    meine eigene Kompoenente sendet in einer ihrer Methoden eine CM_MYMESSAGE (beinhaltet keine Daten!)
    an die Applikation mittels

    #define CM_MYMESSAGE (WM_APP + 400)
    SendMessage(Application->Handle, CM_MYMESSAGE, 0, 0);
    

    und im Hauptformular fange ich die Message per MESSAGE_MAP so ab:

    in der main.h
    #define CM_MYMESSAGE (WM_APP + 400)
    protected:
       void __fastcall CMMyMessage(TMessage &Message);
       BEGIN_MESSAGE_MAP
          MESSAGE_HANDLER(CM_MYMESSAGE, TMessage, CMMyMessage)
       END_MESSAGE_MAP(TFom)
    
    in der main.cpp
    void __fastcall TMainForm::CMMyMessage(TMessage &Message)
    {
      Label1->Caption = "Message empfangen";
    }
    

    Das Problem ist nun nur, dass diese nie ankommt, bzw die Methode CMMyMessage() nie aufgerufen wird.
    Woran kann das liegen?



  • Du bist 100% sicher, daß die Message abgeschickt wird (via Breakpoint überprüft)?

    Du bist sicher, daß die Message-ID WM_APP + 400 nicht bereits anderweitig belegt ist?



  • JFK schrieb:

    Du bist 100% sicher, daß die Message abgeschickt wird (via Breakpoint überprüft)?

    das Programm ruft definitiv die Funktion SendMessage() auf, ob auch wirklich die Message abgesetzt wird weiß ich nicht. wie kann ichs überprüfen?

    JFK schrieb:

    Du bist sicher, daß die Message-ID WM_APP + 400 nicht bereits anderweitig belegt ist?

    ja ist frei (ist ne ID aus derm Borland-Hilfe)

    Hab jetzt etwas herumprobiert und jetzt funktionierts! hab alles gleich gelassen, bis auf das SendMessage(). Ich schick die Message nicht an Application, sondern an den Owner (und der ist TMainForm).
    Also so gehts:

    SendMessage((dynamic_cast<TForm*>(Owner))->Handle, CM_MYMESSAGE, 0, 0);
    

    Die Frage ist nur, sollte es nicht auch funktionieren, wenn die Message nach Application geht bzw. was ist falsch an Verison 1?



  • Zum 1.: das meinte ich.

    Zum 2.: überprüf doch mal, ob beide Handles gleich sind. Das sollten sie eigentlich (laut Beschreibung in der Hilfe), da Application->Handle auf die MainForm verweisen sollte...



  • JFK schrieb:

    Zum 2.: überprüf doch mal, ob beide Handles gleich sind.

    Sind die nicht!!!

    PS: und das ist gut so.

    Edit:
    Zitate bitte auf das Notwendigste beschränken. Danke!
    -Jansen



  • hallo,

    Application->Handle und MainForm->Handle sind zwei verschiedene paar Stiefel. Application hat ein eigenes Fenster (dieses sieht man bloß nicht, da es i. d. R. immer unsichtbar ist und bleibt. Application->Handle verweißt also auf dieses unsichtbare Fenster. Somit kann es nicht das selbe Handle sein. Und die message kann nicht verarbeitet werden, da der message-handler im bereich von MainForm definiert wurde...

    mfg
    murph



  • Das war mir neu! Und was ist der Sinn dieser Konstruktion? Das die Application auch ohne sichtbares Hauptfenster per Messages erreichbar ist?



  • JFK schrieb:

    Das war mir neu! Und was ist der Sinn dieser Konstruktion? Das die Application auch ohne sichtbares Hauptfenster per Messages erreichbar ist?

    Achte mal auf die diversen Event-Handler des Application-Objektes. Dann weißt du's.


Anmelden zum Antworten