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 :

Surcharge d'une méthode virtuelle protégée dans un TCustomImageList


Sujet :

C++Builder

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Points : 179
    Points
    179
    Par défaut Surcharge d'une méthode virtuelle protégée dans un TCustomImageList
    Bonjour,

    J’ai une classe, nommons la TMyImageList, héritant d’un TCustomImageList.

    Je souhaiterai surcharger la méthode DoDraw, définie de la manière suivante dans TCustomImageList:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    protected:
    virtual void __fastcall DoDraw(int Index, Graphics::TCanvas* Canvas, int X, int Y, unsigned Style, bool Enabled = true);
    Dans mon .h, j’ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class TMyImageList : public TCustomImageList{
      //….
      protected:
      virtual void __fastcall DoDraw(int Index, Graphics::TCanvas* Canvas, int X, int Y, unsigned Style, bool Enabled = true);
      //…
    };
    Et dans mon .cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void __fastcall TMyImageList::DoDraw(int Index, Graphics::TCanvas* Canvas, int X, int Y, unsigned Style, bool Enabled){
      //…
    }
    Mon problème est que lorsque j’utilise TMyImageList, à aucun moment il ne passe par cette méthode surchargée, mais continue à passer dans celle du TCustomImageList !

    Je n’arrive pas à comprendre pourquoi. Une idée ?

    Merci.

    Cordialement,
    Benjamin

  2. #2
    Membre habitué
    Inscrit en
    Mars 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 105
    Points : 133
    Points
    133
    Par défaut
    Bonjour,

    Il ne faut pas déclarer la méthode "virtual" dans la classe surchargée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class TMyImageList : public TCustomImageList{
      //….
      protected:
      void __fastcall DoDraw(int Index, Graphics::TCanvas* Canvas, int X, int Y, unsigned Style, bool Enabled = true);
      //…
    }
    Cf l'aide de builder sur la surcharge de méthode.

    Nicolas

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Points : 179
    Points
    179
    Par défaut
    Bonsoir,

    Avant toute chose merci pour ton aide.

    Concernant la surcharge d'une méthode virtuelle, je crois ne pas me tromper en disant que sa redéclaration en virtuelle est juste redondante, mais en rien illégale.

    Dans le doute j'ai tout de même testé ta solution, et malheureusement j'ai toujours le même problème.

    Je me permets donc de poster un petit example illustrant mon problème:

    Dans le .h:

    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
     
    //---------------------------------------------------------------------------
     
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ComCtrls.hpp>
    //---------------------------------------------------------------------------
    class TMyImageList : public TCustomImageList{
      public:
      __fastcall TMyImageList(TComponent *Owner);
      protected:
      void __fastcall DoDraw(int Index, Graphics::TCanvas* Canvas, int X, int Y, unsigned Style, bool Enabled = true);
    };
     
    class TForm1 : public TForm
    {
    __published:	// IDE-managed Components
    private:	// User declarations
      TMyImageList *MyImageList;
      TToolBar     *MyToolBar;
      TToolButton  *MyToolButton;
    public:		// User declarations
      __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    Dans le .cpp :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
     
    __fastcall TMyImageList::TMyImageList(TComponent *Owner):TCustomImageList(Owner){
     
    }
     
    void __fastcall TMyImageList::DoDraw(int Index, Graphics::TCanvas* Canvas, int X, int Y, unsigned Style, bool Enabled){
     
    }
     
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
      //Chargement d'un bitmap
      Graphics::TBitmap *LoadedBMP = new Graphics::TBitmap();
      LoadedBMP->LoadFromFile("32x32.bmp");
     
      //Crétaion de l'image list
      MyImageList = new TMyImageList(this);
      MyImageList->Width  = LoadedBMP->Width;
      MyImageList->Height = LoadedBMP->Width;
      //Chargement du bitmap dans l'image list
      MyImageList->AddMasked(LoadedBMP,LoadedBMP->Canvas->Pixels[0][LoadedBMP->Height-1]);
     
      //Libération du Bitmap
      LoadedBMP->Free();
     
      //Création de la toolbar
      MyToolBar = new TToolBar(this);
      MyToolBar->Parent = this;
      MyToolBar->Images = MyImageList;
     
      //Crétation d'un ToolButton
      MyToolButton = new TToolButton(MyToolBar);
      MyToolButton->Parent = MyToolBar;
      MyToolButton->ImageIndex = 0;
     
    }
    //---------------------------------------------------------------------------
    Donc avec ce code, en plaçant un break point sur la méthode DoDraw, on devrai s'y arréter lors du chargement de l'application. Or ce n'est pas le cas...

    Une idée? Merci d'avance!

    Cordialement,
    Benjamin

Discussions similaires

  1. trouver le rang dans la VMT d'une méthode virtuelle
    Par acx01b dans le forum Langage
    Réponses: 20
    Dernier message: 13/10/2013, 04h49
  2. Réponses: 4
    Dernier message: 11/10/2013, 12h08
  3. Accès à une méthode virtuelle protégée ou privée
    Par boulouch dans le forum Langage
    Réponses: 9
    Dernier message: 22/07/2010, 09h55
  4. Réponses: 6
    Dernier message: 10/10/2007, 20h11
  5. une méthode qui écrit dans la sortie html ?
    Par iubito dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 03/12/2003, 15h34

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