Mausereignisse bei TComboBox



  • Ich benutze in meinem Programm ein Label um Popups an verschiedenen Positionen anzuzeigen, vergleichbar mit IfranView, Open Office oder ähnlichem. Auf jedenfall benutze ich bei den meisten Komponenten wie TButton oder TRichEdit das MouseMove Ereignis, doch dieses ist bei TComboBox nicht zu finden. Daher würde ich gerne wissen was es für Alternativen gibt, mit denen ich die Mausposition herausbekomme und checken kann ob ich mit der Maus mich über der Combo Box befinde.



  • Das Ereignis selbst implementieren:

    Stichwort: Botschaftszuordnungstabellen in der HeaderDatei

    BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_MOUSEMOVE, TWMMouseMove, WMMouseMove)
    END_MESSAGE_MAP(TForm)



  • Hallo

    Dann must du einen entsprechenden Event selber definieren, in dem du die WIndows-Message abfängst und auswertest. Siehe dazu dieses Tutorial.

    bis bald
    akari



  • PS:

    Sofern du weitere Infos für die Botschaftszuordnungstabellen willst, schicke eine Mail (cecke@marquardtnet.info), sende dann eine HTML-Seite. War zuviel zum posten



  • Erstma danke an alle. Wenn ich nun eine MessageMap schreibe, dann kann ich diese in einem Objekt ja nur 1 Mal machen und zwar für das Objekt in dessen public Bereich es steht, richtig? Also in meinem TS_TXT_Edit, das von TForm erbt.

    Ich habe nun eine Funktion für MouseMove, doch das läuft auf das gleiche Problem hinaus, denn diese Message gilt nur, wenn ich mich auf der Form bewege, doch diese ist verdeckt von allerlei Komponenten. Wie kriege ich es hin, dass andere Komponenten des Programmes auf eine MouseMove Message reagieren, zum Beispiel eine TComboBox, oder ähnliches. Muss ich da erst eine Klasse erstellen, die zum Beispiel von TComboBox erbt und in der nur die MessageMap abgearbeitet wird?

    Oder gibt es eine Lösung die näher liegt, mir ist sie bis jetzt noch nicht in den Sinn gekommen.



  • Hallo

    Muss ich da erst eine Klasse erstellen, die zum Beispiel von TComboBox erbt und in der nur die MessageMap abgearbeitet wird?

    Korrekt.

    bis bald
    akari



  • Ich habe das nächste Problem habe folgende Klasse von TComboBox abgeleitet:

    class TEig_ComboBox : public TComboBox
    {
    private:
            void __fastcall EMouseMove(TWMMouseMove &Message);
    public:
            BEGIN_MESSAGE_MAP
            MESSAGE_HANDLER(WM_MOUSEMOVE,TWMMouseMove,EMouseMove)
            END_MESSAGE_MAP(TComboBox)
    };
    
    void __fastcall TEig_ComboBox::EMouseMove(TWMMouseMove &Message)
    {
            Application->MessageBoxA("jfhej","sfdkhsdlf",0);
    }
    

    so nun kann ich aber mit new keine Instancen der Klasse erzeugen, der Compiler schreibt er kann den Standartkonstruktor nicht erstellen. Ok gesagt getan mit:

    __fastcall TEig_ComboBox();
    
    __fastcall TEig_ComboBox::TEig_ComboBox()
    {
    }
    

    einen erstellt, jetzt meckert etwas von wegen

    [C++ Fehler] Text.cpp(11): E2251 Standardkonstruktor zum Initialisieren der Basisklasse 'TComboBox' nicht gefunden
    

    so nun meine Frage wenn beides nicht geht, wie soll ich das Problem dann bitte lösen? Bitte um Hilfe!



  • Hallo

    Dann solltest du dich erstmal mit den Grundlagen der OOP beschäftigen

    void __fastcall TEig_ComboBox(Classes::TComponent* AOwner);
    
    void __fastcall TEig_ComboBox::TEig_ComboBox(Classes::TComponent* AOwner) : TComboBox(AOwner)
    {
    }
    

    bis bald
    akari



  • Jo das habsch vergessen muss ja auf den Konstruktor von der geerbten Klasse verweisen, thx.



  • Haut immer noch nicht ganz hin:

    class TEig_ComboBox : public TComboBox
    {
    private:
            void __fastcall EMouseMove(TWMMouseMove &Message);
    public:
            __fastcall TEig_ComboBox(Classes::TComponent* AOwner);
            BEGIN_MESSAGE_MAP
            MESSAGE_HANDLER(WM_MOUSEMOVE,TWMMouseMove,EMouseMove)
            END_MESSAGE_MAP(TComboBox)
    };
    //==============================================================================
     __fastcall TEig_ComboBox::TEig_ComboBox(Classes::TComponent* AOwner) : TComboBox(AOwner)
     {
     }
    //==============================================================================
    void __fastcall TEig_ComboBox::EMouseMove(TWMMouseMove &Message)
    {
            Application->MessageBoxA("jfhej","sfdkhsdlf",0);
    }
    

    bis dahin verstanden.

    TEig_ComboBox *font_name_cbox_alt;
     font_name_cbox_alt=new TEigComboBox(S_TXT_Edit);//so der Name meiner Form
    

    wenn ich jetzt dem font_name_cbox_alt Objekt Eigenschaften zuweise dann sagt er:
    Das Element besitzt kein übergeordnetes Fenster? Wie gebe ich solch ein Fenster an? Ich dachte mit der AOwner Parameter im Konstruktor, aber das scheint nicht zu stimmen? Also Akari hilf mir weiter und wenn ich fragen darf kennst ein gutes Tut für OPP, denn ich verstehe es in Grundzügen doch weis ich manchmal nicht, worauf ich zu achten habe.



  • Hallo

    font_name_cbox_alt=new TEigComboBox(S_TXT_Edit);
    font_name_cbox_alt->Parent = S_TXT_Edit;
    //.. weitere Eigenschaften zuweisen
    

    außerdem solltest du S_TXT_Edit durch this ersetzen, wenn diese Code in einer Methode von S_TXT_Edit steht.

    Hier ist ein C++ Grundlagen-tutorial.
    Für den Builder findest du hier ein Tutorial.

    bis bald
    akari



  • danke das erste tutorial kenn ich noch nicht, da ich nur in OPP meine Schwierigkeiten habe, werd ich mir den Teil Mal zu Gemüte führen. Das Builder Tut hab ich schon durch besonders im Bezug auf Dll's. Auf jedenfall thx für deine Hilfe.


Anmelden zum Antworten