[Komponentenentwicklung]bekomme OnMouseEnter nicht hin!



  • Tag

    Ich bastel grad an einer Kompo, bei der ich die EventHandler OnMouseMove und OnMouseLeave einbinden möchte (von TGraphicControl abgeleitet).
    Mit einer Message Map fange ich die Messages CM_MOUSELEVE und CM_MOUSEENTER ab und verweise auf meine Funktionen.
    Die Funktionen(Zeichenroutinen auf ein Canvas) werden auch ausgeführ, nur bekomme ich einen Stack Overflow nach ca. 3 Sekunden.
    Was kann ich falsch gemacht haben?

    Mfg MORL



  • Du hast zum Beispiel keinen genaueren Quellcode gepostet.

    Spaß beiseite, gibst du auch allen Speicher, den du belegst wieder frei?



  • Okay

    *.h

    typedef void __fastcall(__closure *HMouseEnter)(TObject *Sender);
    typedef void __fastcall(__closure *HMouseLeave)(TObject *Sender);
    
    class PACKAGE TVerticalLabel : public TGraphicControl
    {
    private:        
            HMouseEnter fMouseEnter;
            HMouseLeave fMouseLeave;
    protected:
            void __fastcall cmMouseEnter(TMessage);
            void __fastcall cmMouseLeave(TMessage);
    
            BEGIN_MESSAGE_MAP
                    MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, cmMouseEnter);
                    MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, cmMouseLeave);
            END_MESSAGE_MAP(TGraphicControl);
    public:
            __fastcall TVerticalLabel(TComponent* Owner);
    __published:
            __property HMouseEnter OnMouseEnter = {read = fMouseEnter, write = fMouseEnter};
            __property HMouseLeave OnMouseLeave = {read = fMouseLeave, write = fMouseLeave};
    };
    

    *.cpp

    //---------------------------------------------------------------------------
    void __fastcall TVerticalLabel::cmMouseEnter(TMessage Msg)
    {
     if(fMouseEnter) fMouseEnter(this);
     inherited:Dispatch(&Msg);
    }
    //---------------------------------------------------------------------------
    void __fastcall TVerticalLabel::cmMouseLeave(TMessage Msg)
    {
     if(fMouseLeave) fMouseLeave(this);
     inherited:Dispatch(&Msg);
    }
    

    So sieht das in etwa aus.
    Meine Kompo hat eine Eigenschaft Caption, die ich zu Testzwecken im OnMouseEnter Ereignis mal geändert habe. Sie wird auch geändert nur leider zu oft. Kann man die Routine nicht irgendwie stoppen?
    Ich habs mal mit ner bool-Variable probiert, so das die funktionen nur 1 mal durchlaufen werden, aber da kam der StackOverflow sofort wenn man mit der Maus auf die Kompo fährt.
    Irgend was ist da sehr merkwürdig.



  • Und was exakt geschieht in fMouseEnter und fMouseLeave()?



  • Nix.
    Der Code ist genau so wie ich ihn gepostet habe. Wenn ich dann die Komponente installiere und den OnMouse-Event abfrage kommt die Fehlermeldung.
    So ganz genau blick ich durch die Sache noch nich durch. Ich bin sozusagen noch Jungfrau auf dem Gebiet Komponenten erstellen.
    Das fMouseEnter und fMouseLeave sind wohl nur "Speicher" für die 2 Zustände. Ich hab mich nach dem BCB Tutorial gerichtet und da war es ähnlich umgesetzt. Es scheint ja auch irgendwie zu funktionieren, aber irgendwie verrennt sich da was in einer Scheife.
    Ich könnte verrückt werden wegen dem Mist. Da schlägt man sich die ganze Nacht um die Ohren und was bringts...



  • Hi,
    die fMouseEnter und fMouseLeave sind die Ereignisse die im Objektinspektor später verfügbar gemacht werden!

    Mit if (fMouseEnter) überprüfst du, ob dem Ereigniss eine Funktion zugeordnet ist! Wenn ja, dann wird diese zugeordnete Funktion ausgeführt!

    zu deinem Problem: Wo tritt der Fehler denn genau auf? Hast du mal gedebuggt?

    MfG

    Alexander Sulfrian



  • Ich hab das jetzt mal gedebuggt und festgestellt, das meine OnMouseEnter Methode immer wieder aufgerufen wird, bis dann letztendlich die Fehlermeldung kommt. Schuld daran ist wohl das Dispatch(), da dieses die Message weitergiebt und somit kein Ende kommt. Ich habs mal weggelassen und siehe da, es funktioniert.
    Das das immer an solchen Kleinigkeiten hängen muss...

    Vielen Dank an euch!

    Mfg

    MORL



  • Es muss ja auch so aussehen:

    void __fastcall cmMouseEnter(TMessage&);
    
    void __fastcall TVerticalLabel::cmMouseEnter(TMessage& Msg)
    {
       if(fMouseEnter) 
          fMouseEnter(this);
       inherited::Dispatch(&Msg);
    }
    

    Der Doppel-Doppelpunkt ist ebenfalls nicht zu verachten!



  • Na da schau mal einer an. Das ein einziger Doppelpunkt und ein paar "&" so viel Ärger verursachen können, ist wirklich unglaublich.
    Jetzt funzt alles wunderbar.

    Nochmal vielen Dank!

    MORL


Anmelden zum Antworten