Wurde im Parent einer eigenen Kompo geklickt?



  • Hi,

    in der Header:

    class PACKAGE TMLPopUpWindow : public TCustomControl
    {
    private:
    TMessageEvent DefaultApplicationMessage; 
    public:
                   virtual __fastcall ~TMLPopUpWindow();
    }
    

    [ Dieser Beitrag wurde am 09.03.2003 um 20:08 Uhr von AndreasW editiert. ]



  • OK jetzt bin ich denke ich mal ziemlich durcheinander gekommen...
    Also ich habe jetzt:

    /*  Header-Datei  */
    public:
            __fastcall TColoredPopUpMenu(TComponent* Owner); // Ist ja Standard immer drin
            virtual __fastcall ~TColoredPopUpMenu();
    private:
            TMessageEvent DefaultApplicationMessage;
    protected:
            void __fastcall CreateWnd(void);
            void __fastcall OnAppMessage(MSG& Msg, bool& Handled);
    
    //----------------------------------------------------------------------
    
      /*  cpp-Datei  */
    __fastcall TColoredPopUpMenu::TColoredPopUpMenu(TComponent* Owner)
            : TCustomControl(Owner)
    {
    }
    //---------------------------------------------------------------------------
    __fastcall TColoredPopUpMenu::~TColoredPopUpMenu()
    {
      Application->OnMessage = DefaultApplicationMessage;
    }
    //---------------------------------------------------------------------------
    void __fastcall TColoredPopUpMenu::CreateWnd(void)
    {
      TCustomControl::CreateWnd();
      DefaultApplicationMessage = Application->OnMessage;
      Application->OnMessage    = OnAppMessage;
    }
    //---------------------------------------------------------------------------
    void __fastcall TColoredPopUpMenu::OnAppMessage(MSG& Msg, bool& Handled)
    {
      if(DefaultApplicationMessage)
      {
        DefaultApplicationMessage(Msg,Handled);
      }
      if(Visible && Msg.hwnd != Handle && Msg.message==WM_RBUTTONDOWN)
      {
         ShowMessage("Tach Auch");
      }
    }
    //---------------------------------------------------------------------------
    

    Wieder mal empfängt der garnichts?!? Warum nicht?

    MFG Aoeke



  • Hi,

    sieht doch gut aus. Wo klickst du denn mit der rechten Maustaste drauf ?



  • Na also ich habe die Kompo jetzt halt Manuell in ein Projekt gepackt, wo der
    Parent = Form1 ist.
    Und da klicke ich dann auch mit Rechts rauf und nichts passiert...
    Kein "Tach auch" erscheint... 😞

    MFG Aoeke

    P.S. Man ich muss dich hier jetzt ja mal loben, so schnell wie die Antworten
    immer kommen... 😃



  • Hi,

    setzt mal in der Methode OnAppMessage HAltepunkte. Prüfe ob dort überhaupt Nachrichten ankommen.

    DAs musse eigentlich funktionieren.



  • Prüfe ob dort überhaupt Nachrichten ankommen.
    DAs musse eigentlich funktionieren.

    Nope. Leider nicht. Es kommt nichts an. 😞 😞 😞
    Warum ist das nur alles so schwierig??? 🙂

    MFG Aoeke



  • Hast du auch das geheime Hauptfenster überhaupt erstellt?



  • Original erstellt von <Fritz>:
    Hast du auch das geheime Hauptfenster überhaupt erstellt?

    Was meinst du jetzt damit???

    MFG Aoeke



  • Application->OnMessage ist hier IMHO total unangebracht. Der Benutzer der Kompo weiß ja nichts davon. Was nun, wenn er Application->OnMessage eine andere Funktion zuweist?
    Die neue WindowProc für das Parent braucht nicht in den Quelltext der Parent-Klasse!



  • hm,

    setz mal vor der Zeilen einen Haltepunkt:

    -> Application->OnMessage = OnAppMessage;
    -> if(Visible && Msg.hwnd != Handle && Msg.message==WM_RBUTTONDOWN)

    Der Debugger müsste bei beiden halten.

    Das muss funktionieren...



  • @Aoenke: Er ist ein Troll. Ignoriere ihn und lies dir lieber meine letzten Beitrag auf Seite 1 durch.



  • Ich bin überhaupt kein Troll. Das mit dem geheimen Fenster steht sogar in den FAQs.



  • Original erstellt von WebFritzi:
    Die neue WindowProc für das Parent braucht nicht in den Quelltext der Parent-Klasse!

    Also kann ich das auch in den Kompo-Quelltext reinbringen ja???
    Aber wenn ich das mache, fängt der doch die Messages von der Kompo ab, oder
    irre ich mich da???

    @ AndreasW : Der hält aber bei keinem der beiden...

    MFG Aoeke



  • Original erstellt von WebFritzi:
    Application->OnMessage ist hier IMHO total unangebracht. Der Benutzer der Kompo weiß ja nichts davon. Was nun, wenn er Application->OnMessage eine andere Funktion zuweist?
    Die neue WindowProc für das Parent braucht nicht in den Quelltext der Parent-Klasse!

    ähm, das Problem besteht immer. Mit dein Vorschlag die WindowProc des Parent zu überschreiben machst du ja genau das selbe. Beides sind Funktionspointer.
    Nur das deine Version ein Hacken hat. Der Parent könnte ja auch ein Panel sein. Was ist nun , wenn der User auf ein andere Panel klickt ? Das kannst du dann ja nicht mehr abdecken... Sogesehen ist dein Lösungsansatz wohl unangebracht.



  • ziehe folgende CodeZeilen in den Konstruktor:

    DefaultApplicationMessage = Application->OnMessage;
      Application->OnMessage    = OnAppMessage;
    

    dann müsste es gehen...



  • OK das geht erstmal, der empfängt Messages... 😃

    if(/*Visible && Msg.hwnd != Handle && */Msg.message == WM_RBUTTONDOWN)
      {
         ShowMessage("Tach Auch");
      }
    

    Das Visible && Msg.hwnd != Handle habe ich erstmal "weggemacht", da der
    mir dann immer die Exception Element " hat kein übergeordnetes Fenster.
    aufn Tisch schmeißt...
    Jetzt reagiert der aber auf alle WM_RBUTTONDOWN der gesamten Anwendung...
    Wie kann ich das jetzt machen, dass der nur die des Parent verwendet???



  • //---------------------------------------------------------------------------
    void __fastcall TMLPopUpWindow::OnAppMessage(MSG& Msg, bool& Handled)
    {
    if(DefaultApplicationMessage && DefaultApplicationMessage!=OnAppMessage)
          DefaultApplicationMessage(Msg,Handled);
      if(Showing &&HandleAllocated() && Msg.hwnd!=Handle &&(Msg.message==WM_LBUTTONDOWN || Msg.message==WM_RBUTTONDOWN))
          {
            if(Msg.hwnd==Parent->Handle)
              {
                 // mach was 
              }
          }
    

    [ Dieser Beitrag wurde am 09.03.2003 um 21:42 Uhr von AndreasW editiert. ]

    [ Dieser Beitrag wurde am 09.03.2003 um 21:43 Uhr von AndreasW editiert. ]



  • Original erstellt von Aoeke:
    [QB]Das Visible && Msg.hwnd != Handle habe ich erstmal "weggemacht", da der
    mir dann immer die Exception Element " hat kein übergeordnetes Fenster.
    aufn Tisch schmeißt...

    Deshalb hatte ich die Zeilen in CreateWnd. Du hast irgendwie diese Methode nicht richtig überschrieben, sodass deine Methode nie Aufgerufen wurde.



  • Msg.hwnd != Handle : ==> Element " hat kein übergeordnetes Fenster. 😞
    Ich hab den Rest auch mal überprüft: Showing ist false, genauso wie
    HandleAllocated()...

    MFG Aoeke

    *Letzter Beitrag für heute... Ich schau morgen wieder rein!!!*



  • Original erstellt von AndreasW:
    **
    ähm, das Problem besteht immer. Mit dein Vorschlag die WindowProc des Parent zu überschreiben machst du ja genau das selbe. Beides sind Funktionspointer.**

    Da hste recht. Hab ich nicht dran gedacht.

    Original erstellt von AndreasW:
    **
    Nur das deine Version ein Hacken hat. Der Parent könnte ja auch ein Panel sein. Was ist nun , wenn der User auf ein andere Panel klickt ? Das kannst du dann ja nicht mehr abdecken... Sogesehen ist dein Lösungsansatz wohl unangebracht**

    Hier verstehe ich nicht, was du meinst. Wo soll das andere Panel liegen? Ebenfalls im Parent-Panel? Dann wird bei deiner Lösung aber auch nichts ausgelöst:

    if(Msg.hwnd==Parent->Handle)
    {
    // mach was
    }

    Die Frage ist auch, ob Aoenke das überhaupt will. Möchte er, dass die Message immer behandelt wird, wenn nur auf ein Fenster geklickt wird, das ein Child vom Parent-Panel ist? Oder möchte er nur auf Klicks direkt im Parent-Panel reagieren? Ich denke, hier ist eher die zweite Version üblich.


Anmelden zum Antworten