Hilfe bei Botschaftsbehandlung...



  • Hallo zusammen,

    Mein erster Eintrag 😉
    Habe folgende Aufgabe zu lösen: Wenn der User auf einen Button klickt, so soll die Message-ID der Botschaft in einer Listbox angezeigt werden. Bei mir wird die Message-ID jedoch nur in der Listbox angezeigt, wenn man direkt auf das Formular klickt - nicht aber, wenn man auf den Button klickt...

    Hier ein Auszug aus dem Code:
    .h-File

    BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_LBUTTONDOWN, TWMLButtonDown, OnLButtonDown)
    END_MESSAGE_MAP(TForm)
    

    Funktionsdeklaration im .h-File:

    void __fastcall OnLButtonDown(TWMLButtonDown &Message) ;
    

    und schliesslich die Implementation:

    void __fastcall TMyListBox::OnLButtonDown(TWMLButtonDown &Message)
    {
    
        if(Message.Keys == MK_LBUTTON)
        {
          ListBox1->Items->Add(Message.Msg) ;
        }
    
        //ansonsten -> Standardbehandlungsroutine
        else
        {
            TMyListBox::Dispatch(&Message) ;
        }
    }
    

    Wie kann ich dem Button nun mitteilen, dass er obige Funktion aufrufen muss, wenn man ihn anklickt?

    Herzlichen Dank für eure Tipps.
    Miracoli

    P.S. Kennt jemand ein gutes Tutorial zur Botschaftsbehandlung mit dem C++Builder?



  • Hi diese Macros, welche du verwendest überschreiben die Dispatch- Methode des Formulars und sehen so aus:

    #define BEGIN_MESSAGE_MAP \ 
      virtual void __fastcall Dispatch(void *Message) \ 
        { \ 
          switch (((PMessage)Message)->Msg) \ 
            { 
      #define VCL_MESSAGE_HANDLER(msg,type,meth) \ 
            case msg: \ 
              meth(*((type *)Message)); \ 
              break; 
      #define END_MESSAGE_MAP(base) \ 
            default: \ 
              base::Dispatch(Message); \ 
              break; \ 
            } \ 
        }
    

    Im Formular werden natürlich nur die Nachrichten des Formulars ankommen.
    Benutze also die Ereignisse des Buttons oder ersetzte die WndProc.

    ICh arbeite gerade an diesen Thema im Tutorial. Mario macht heute oder in den nächsten Tagen ein Update (liegt schon bei ihn), in den bereits diese Themen behandelt werden.

    Siehe link in der Signatur.



  • 1.FAQ
    2.Siehe Signatur unten



  • Da isser ja 😃

    Hast du die Updates drauf ? -> Siehe Mail von mir....



  • So schnell bin ich auch wieder nicht! 😉



  • Herzlichen Dank für eure Antworten und den Link (den ich bereits für die Komponentenprogrammierung zu Rate gezogen habe ;-)).

    Also ich habe nun versucht, die WndProc-Methode wie folgt zu überschreiben:

    void __fastcall TMyListBox::WndProc(Messages::TMessage &MyMessage)
    {
    
        // Falls nicht die linke Maustaste gedrückt wird -> Botschaft
        //ordungsgemäss weiterverarbeiten.
        if(MyMessage.Msg != WM_LBUTTONDOWN)
        {
            TWinControl::WndProc(MyMessage) ;
        }
    
        //ansonsten Botschaften in Listbox anzeigen
        else
        {
            //Id der Message in Listbox anzeigen
            ListBox1->Items->Add(MyMessage.Msg) ;        
        }
    }
    

    Gleicher "Effekt" wie vorhin... Klappt aber immer noch nicht... Wie kann ich den "Link" zwischen dem Button und obiger Methode herstellen?

    Miracoli



  • Hi,

    lese bitte:
    http://bcbcaq.bytamin-c.com/MessagesToEvents.html
    und http://bcbcaq.bytamin-c.com/MessagesToEvents2.html

    ab morgen werden zumindst erste Teile dieses Themas auf Deutsch im Tutorial zu finden sein.



  • Danke für die Links. Werde mir die Infos zu Gemüte führen 😉

    Schönen Abend noch.
    Miracoli



  • um das alles etwas einfacher zu malchen könntest du auf Applicatione->OnMessage reagieren, Msg.hwndmit Button->Handle vergleichen und die ID in die Listbox schreiben.

    Ansonsten die WNDProc- Zuordung des Buttons auf eine neue WndProc umleiten und die Messages abfangen. Siehe dazu in die FAQ.


Anmelden zum Antworten