Grundgerüst für die Verwendung von VCL Messages

  • als erstes im public-Teil der Form-Headerdatei (von der Form, in der die Messages empfangen werden sollen) Messagehandler (Makro), die zugehörigen Funktionen und die Messages definieren
#define WM_TEST_MSG 10000 // Wert für die Message festlegen

class TForm1 : public TForm
{
    __published:
    TButton *Button1;
    TButton *Button2;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Button2Click(TObject *Sender);

    private: // durch die Message aufgerufene Funktion
    void __fastcall TestFunktion(TMessage M);

    public:
    __fastcall TForm1(TComponent* Owner);
    // Message-Map verwaltet die eigentlichen Messages
    BEGIN_MESSAGE_MAP

        // Aufruf: VCL_MESSAGE_HANDLER(Message-Id, Typ, selbstdefinierte Aufruf-Funktion)
        VCL_MESSAGE_HANDLER(WM_TEST_MSG, TMessage, TestFunktion); 

    END_MESSAGE_MAP(TForm) // "TForm" bedeutet, dass der Handler zum Standard-TForm Messagehandler hinzugefügt wird 
};
  • in der Form-CPP die Messagefunktionen programmieren, mit WParam und LParam können beliebige Parameter über die Message mitgeschickt werden
void __fastcall TForm1::TestFunktion(TMessage M)
{
    TForm::Dispatch(&M);

    AnsiString sAusgabeText = "Message angekommen, WParam="+IntToStr(M.WParam)+" LParam="+IntToStr(M.LParam);

    ShowMessage(sAusgabeText); 
} 
// Aufrufen (Auslösen) der Message, Typ 1: 
void __fastcall  TForm1::Button1Click(TObject *Sender)
{
    // Message "WM_TEST_MSG" an Form1 senden
    // und auf deren Ausführung warten
    // WParam = 0
    // LParam = 0
    SendMessage(this->Handle, WM_TEST_MSG, 0, 0); 
}
// Aufrufen (Auslösen) der Message, Typ 2:
void __fastcall  TForm1::Button2Click(TObject *Sender)
{
    // Message "WM_TEST_MSG" an Form1 in den MessageQueue
    // senden und sofort zurückkehren (nicht auf die Ausführung warten)
    // WParam = 0
    // LParam = 0
    PostMessage(this->Handle, WM_TEST_MSG, 0, 0); 
}