VCL TMessages als Broadcast versenden



  • Hallo,

    folgender Code sollte nach dem Entwicklerhandbuch an alle Controls der Anwendung eine Message versenden:

    #define MEINE_BOTSCHAFT (WM_APP + 400)
    
      TMessage msg;
      msg.Msg= MEINE_BOTSCHAFT;
      msg.WParam= 0;
      msg.LParam= (int) (this);
      msg.Result= 0;
    
      //Abfeuern
      this->Broadcast((void*) (&msg) );
    

    Dieses funktioniert nur bedingt, da die Anwendung aus verschachtelten TFrames besteht.
    Die Nachricht kommt nur an der obersten Verschachtelungsebene der Frames an.

    Was mache ich falsch?



  • wie ich diese sch**** ver****te suchfunktion hasse! 😡 wann wird hier endlich mal was neues installiert oder der alte kram repariert?! nicht mal mit google findet man was! 👎

    schau mal hier, vlei hilft dir das weiter: 🕶

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-42982-and-postdays-is-0-and-postorder-is-asc-and-start-is-10.html



  • Vielen Dank für die Antwort.

    Das gleiche Problem hatte ich damals unter CLX auch.
    Beim Suchen bin ich nicht mal auf meine eigene Loesung gestossen.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-138213-and-highlight-is-.html

    Die Implementierung fuer CLX sieht in etwa so aus:

    void ControllerViMo::broadcast(TWinControl* p_twinc)
    {
     //Dieses Fenster beschiessen
     //(synchroner Windows-API-Aufruf)
     SendMessage(p_twinc->Handle, Event_aenderung_ID, 0, 0);
    
     //seine Kinder beschiessen
     for(int i= 0; i < p_twinc->ComponentCount; ++i)
       {
       //absteigen
       if (TWinControl* twc= dynamic_cast<TWinControl*>(p_twinc->Components[i]))
          {
          //Absteigen
          broadcast(twc);
          }//war es ein TWinControl?
       }//ueber alle Kinder
    }//broadcast
    

    Das System hat jedoch noch zwei Probleme:

    1. Evtl. werden nur die Sub-Controls des Hauptframes beschossen. Andere Forms bleiben unberuecksichtigt.

    2. Waehrend des Nachrichtenversendes aendert sich die Anzahl der Fensterelemente, d.h. die Schleife koennte ins Leere greifen.


Anmelden zum Antworten