IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Avertissement lors surchage de fonction


Sujet :

C++Builder

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut Avertissement lors surchage de fonction
    Salut à tous,

    je travail (toujours) sur un petit composant tout bête qui finallement me pose pas mal de problèmes.

    Je souhaiterais maintenant effectuer une action lorsque l'utilisateur enfonce un le bouton de sa souris (évènement OnMouseDown).

    Donc d'après l'aide je dois surcharger une fonction MouseDown dans la partie protected de ma classe, ce qui me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    protected:
     
       virtual void __fastcall MouseDown ( System::TObject* Sender,
             TMouseButton Button, Classes::TShiftState Shift, int X, int Y );
    Cependant lors de la compilation j'obtient l'avertissement suivant :

    Citation Envoyé par C++ Builder
    [C++ Avertissement] TImageButton.h(44): W8024 La classe de base '_fastcall TImageButton::MouseDown(TObject *,TMouseButton,TShiftState,int,int)' est aussi une classe de base de '_fastcall TControl::MouseDown(TMouseButton,TShiftState,int,int)'
    Et j'ai bien l'impression que ma fonction MouseDown n'est jamais appelée. Je pense bien que c'est en relation avec cet avertissement mais je ne sais pas quoi faire.

    Merci d'avance pour votre aide !

  2. #2
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Exact !

    Je suppose que TImageButton hérite plus ou moins directement de TControl. Or TControl a déjà une fonction MouseDown qui n'est pas virtuelle. Donc dès qu'on appelle TControl::MouseDown on passe dans la fonction de base, et non dans celle que tu as surchargé.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Pourtant dans l'aide ils disent de faire comme cela (l'exemple est avec la fonction Click).

    Donc comment faire pour passer par ma fonction ? Ce doit bien être possible !

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 192
    Par défaut
    Es-tu sûr d'avoir besoin de redéclarer la méthode dans ta définition de classe? Est-ce que ça n'en ajoute pas une autre au lieu de la surcharger, avec potentiellement un nombre de paramètres différents qui entrainerait la confusion du compilateur ?

  5. #5
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Oui, je pense qu'en spécifiant explicitement la classe TImageButton::MouseDown, la bonne fonction sera appelée. Sauf que le système ne le fera pas, puisque il ne connait pas la classe TImageButton. Ce qui veut dire que les MouseDown appelés lors d'un clic réel de la souris iront dans TControl::MouseDown. Mais si toi, dans ton code, tu appelles TImageButton::MouseDown, ça appelera ta fonction.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 192
    Par défaut
    je n'ai pas bien compris ta réponse, désolé.
    Ce que je voulais dire, c'est que dans l'aide, on indique simplement d'implémenter la nouvelle méthode de gestion d'événements, pas d'en déclarer une autre dans la définition de la classe. Ce qu'on veut, c'est bien que la gestion par défaut (donc la méthode de la classe "mère") soit remplacée par la nôtre (une méthode la surchargeant), non?
    Si c'est le cas, pourquoi le système irait appeler la méthode MouseDown d'une classe ancêtre si la méthode est redéfinie dans la classe qui reçoit en premier l'événement ?
    Enfin, j'ai peut être rien compris... j'y connais rien à la création de composants

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    borisd -> oui il faut le déclarer dans la classe, mais c'est pour cela qu'on met le mot clef virtual.

    10_GOTO_10 -> désolé je te suis pas...pétard inside ?

    Merci qd même pour votre aide...

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Dans ce cas, il vaut mieux dériver à partir de TCustomControl.
    En effet, les événements sont déjà publiés dans un TImage, ce qui n'est pas le
    cas dans une classe de base telle que TCustomControl.

    Si tu as besoin d'un bool Stretch, il suffit de faire une test, dans sa méthode Paint
    pour déterminer s'il faut dessiner le Picture->Bitmap avec Canvas->Draw(...) ou avec
    Canvas->StretchDraw(...).

    A noter que la couleur de fond d'un TCustomControl est donnée par Brush->Color.

    J'ai développé pour tester un objet style TButton.. et ça fonctionne bien.

    A plus !

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Et bien j'ai suivi tes conseils...je suis parti d'un TCustomControl, mais j'ai toujours ces avertissements...

  10. #10
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Je les déclare en public :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void __fastcall MouseDown(TMouseButton Button, TShiftState Shift,
                                int X, int Y);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void __fastcall MouseUp(TMouseButton Button, TShiftState Shift,
                                int X, int Y);
    A plus !

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Salut, je dois avoir la poisse c'est pas possible.

    Je les ais déclarer en public, et j'ai changé leur entête pour avoir la même chose que toi (ce que j'avais avant venait de l'aide mais je l'avais pas pris au bon endroit).

    Résultat :
    [C++ Erreur] ImageButton.h(37): E2113 Conflits de fonction virtuelle '_fastcall TImageButton::MouseDown(TMouseButton,TShiftState,int,int)' avec la classe de base 'TControl'
    idem pour MouseUp....

    Qu'ais-je fait encore :

    Merci pour ton aide henderson !

  12. #12
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Voici la class de mon composant pour tester tout ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    class PACKAGE TCustomControl2 : public TCustomControl
    {
    private:
    TPicture *FPictureUp;
    TPicture *FPictureDown;
    TMouseEvent FOnMouseDown;
    TMouseEvent FOnMouseUp;
    bool FStatus;
    bool FStretch;
    bool FAutoSize;
    protected:
    public:
        __fastcall TCustomControl2(TComponent* Owner);
        __fastcall ~TCustomControl2();
        void __fastcall Paint();
        void __fastcall SetPictureUp(TPicture *Value);
        void __fastcall SetPictureDown(TPicture *Value);
        void __fastcall SetStatus(bool Value);
        void __fastcall SetStretch(bool Value);
        void __fastcall SetAutoSize(bool Value);
        void __fastcall MouseDown(TMouseButton Button, TShiftState Shift,
                                int X, int Y);
        void __fastcall MouseUp(TMouseButton Button, TShiftState Shift,
                                int X, int Y);
    __published:
    __property bool AutoSize = {read=FAutoSize, write=SetAutoSize};
    __property bool Status = {read=FStatus, write=SetStatus};
    __property bool Stretch = {read=FStretch, write = SetStretch};
    __property TPicture *PictureUp = {read=FPictureUp, write=SetPictureUp};
    __property TPicture *PictureDown = {read=FPictureDown, write=SetPictureDown};
    __property TMouseEvent OnMouseDown = {read=FOnMouseDown, write=FOnMouseDown};
    __property TMouseEvent OnMouseUp = {read=FOnMouseUp, write=FOnMouseUp};
     
    };
    Par contre je me demande s'il ne faut pas déclarer les deux OnMouse... en protected ?

    Autrement ça fonctionne très bien ! Le seul gag que j'ai, est qu'à l'édition, mes
    propriétes du type Picture ne sont pas correctement initialisées : l'une indique (vide)
    ce qui est normal mais par contre l'autre inque (Bitmap) comme si... alors qu'à ce moment
    là elle devrait être vide. Dans le constructeur, je ne fait rien d'autre que de leur affecter
    un new TPicture !

    Pour info je travaille toujours avec BCB3 Pro !

    A plus (A demain) !

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Salut,

    je n'avais pas déclarer les évènement FOnMouseDown, mais cela ne me rapporte que plus d'erreur. Déjà sous la version 6 pour la souris ce sont des TMouseEvent, ensuite à la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    __property OnMouseDown = { read = FOnMouseDown, write = FOnMouseDown };
    J'obtient l'erreur suivante :
    [C++ Erreur] ImageButton.h(38): E2347 Mauvaise correspondance de paramètre dans le spécificateur d'accès read de la propriété OnMouseDown
    Et mes deux erreurs qui sont toujours là :
    [C++ Erreur] ImageButton.h(29): E2113 Conflits de fonction virtuelle '_fastcall TImageButton::MouseDown(TMouseButton,TShiftState,int,int)' avec la classe de base 'TControl'

    [C++ Erreur] ImageButton.h(30): E2113 Conflits de fonction virtuelle '_fastcall TImageButton::MouseUp(TMouseButton,TShiftState,int,int)' avec la classe de base 'TControl'
    Merci henderson mais ça marche toujours pas

  14. #14
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Chez moi aussi puisque j'ai bien donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private :
    TMouseEvent FOnMouseDown;
    TMouseEvent FOnMouseUp;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public :
    //Sans doute à mettre dans protected
    __property TMouseEvent OnMouseDown = {read=FOnMouseDown, write=FOnMouseDown};
    __property TMouseEvent OnMouseUp = {read=FOnMouseUp, write=FOnMouseUp};

    Dans le .cpp, voici ce que donne la MouseDown :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void __fastcall TCustomControl2::MouseDown(TMouseButton Button, TShiftState Shift,
                                        int X, int Y)
    {
    SetStatus(true);
    if(FOnMouseDown != NULL)
        {
        FOnMouseDown(this,Button, Shift, X, Y);
        }
    }
    Tandis que la MouseUp donne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void __fastcall TCustomControl2::MouseUp(TMouseButton Button, TShiftState Shift,
                                        int X, int Y)
    {
    SetStatus(false);
    if(FOnMouseUp != NULL)
        {
        FOnMouseUp(this, Button, Shift, X, Y);
        }
    }
    Pour comprendre SetStatus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TCustomControl2::SetStatus(bool Value)
    {
    FStatus = Value;
    Paint();
    }
    Pour comprendre Paint :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    void __fastcall TCustomControl2::Paint()
    {
     
    TPicture *Picture;
    if(FStatus)
        {
        Picture = FPictureDown;
        }
    else
        {
        Picture = FPictureUp;
        }
    Canvas->Pen->Color = Brush->Color;
    Canvas->Brush->Color = Brush->Color;
    Canvas->Rectangle(0,0,Width, Height);
    if(Stretch)
        {
        TRect D = Rect(0, 0, Width, Height);
        Canvas->StretchDraw(D, Picture->Bitmap);
        }
    else
        {
        //L'image disparait à l'exécution si je ne rajoute pas les deux tests avec le test
        //du AutoSize pour un resize automatique des dimensions du contrôle ! (???...?)
        if((AutoSize) && (Picture->Bitmap->Width != 0) && (Picture->Bitmap->Height != 0))
            {
            Width = Picture->Bitmap->Width;
            Height = Picture->Bitmap->Height;
            }
        Canvas->Draw(0,0,Picture->Bitmap);
        }
    }
    A plus !

  15. #15
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Oui j'ai en gros le même code que toi dans les fonctions...mais bon les erreurs sont toujours là !

  16. #16
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Voila j'ai trouvé la solution...merci developpez.net et surtout CGi -> ICI.

    Donc eh bien il suffisait de rajouter le mot DYNAMIC devant la déclaration des fonctions. Moi je les ais mis en protected (ils disaient de le mettre ici dans l'aide), j'ai donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     DYNAMIC void __fastcall MouseDown( TMouseButton Button, Classes::TShiftState Shift, int X, int Y);
       DYNAMIC void __fastcall MouseUp( TMouseButton Button, Classes::TShiftState Shift, int X, int Y);
    Et ça fonctionne

    Merci beaucoup à henderson, borisd et 10_GOT0_10 pour leur aide...et CGi pour son article

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 31/03/2008, 09h27
  2. [def] surchage de fonction
    Par anthyme dans le forum Général Python
    Réponses: 3
    Dernier message: 06/09/2006, 18h40
  3. [C#] Comment supprimer cet avertissement lors de la compilation ?
    Par Cazaux-Moutou-Philippe dans le forum C#
    Réponses: 8
    Dernier message: 29/04/2006, 14h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo