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 :

[BCB6]DbGrid Acceder a la propriété RowHeights [Interface]


Sujet :

C++Builder

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Points : 91
    Points
    91
    Par défaut [BCB6]DbGrid Acceder a la propriété RowHeights
    Bonjour et Meilleurs Vœux

    J'essaye d'accéder a une propriété protégée du composant DbGrid
    en écriture RowHeights afin de pouvoir modifier la hauteur d'un linge dans une colomne,afin d'afficher correctement une image dans un DBGrid.
    Dans le cas contraire l'image est écrasée

    Je me suis inspiré de la faq Delphi Comment modifier la hauteur d'une ligne dans un TDBGrid ?

    J'ai effectue ceci sans grand sucés (partie 1)
    dans le h de mon formulaire j'ai mis ceci
    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
     
    #ifndef FormAnnuaire2H
    #define FormAnnuaire2H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ComCtrls.hpp>
    #include <DBGrids.hpp>
    #include <Grids.hpp>
    #include <ToolWin.hpp>
    #include "CGiButton.h"
    #include <DBCtrls.hpp>
    #include <ExtCtrls.hpp>
    #include <Menus.hpp>
    //---------------------------------------------------------------------------
    class TFrmAnnu : public TForm{
    __published:	// Composants gérés par l'EDI
    TDBGrid *DBGTel // composant ou je souhaite modifier la hauteur de ligne via RowsHeight
    // bla bla
     
    };
    //---------------------------------------------------------------------------
    // classe ajouté
    class TPublicCustomGrid :TCustomGrid  {
    public:
     
      void __fastcall SetRowHeight(TDBGrid *pGrid,int numligne,int hauteur){
         //this->RowHeights[10]=4;   ok
       TPublicCustomGrid *pPublicCustomGrid=dynamic_cast<TPublicCustomGrid*>(pGrid);
     
     // acces a rowHeight par la suite...
      }
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TFrmAnnu *FrmAnnu;
    //---------------------------------------------------------------------------
    #endif
    J'ai un erreur de compilation :
    [C++ Erreur] FormAnnuaire2.h(60): E2031 Impossible de transtyper de 'TDBGrid *' en 'TPublicCustomGrid *'
    -Comment transtyper mon objet afin qu'il puisse accéder la propriété via la la faq Delphi partie 1 ?

    Comment convertir ce code delphi en C++Builder
    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
     TPublicCustomGrid(DBGrid1).RowHeights[10]:=50;

    -Comment utiliser ceci dans un procédure autre ?

    -Est ce possible de faire ceci de cette manière en C++Builder 6 ?



    merci d'avance de votre aide
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    dynamic_cast effectue un contrôle, essaye un cast basique
    Je n'ai pas testé !

    Après, En delphi, le fait de déclarer une classe dans une unité permet d'accèder au propriété protégée directement, un peu comme un friend protected sur tout le fichier !
    En C++, tu es obligé soit de refaire un accesseur explicite !
    Faudrait tester ces deux variantes !

    Variante 1 : Ajout d'un Accesseur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((THackProtectedCustomGrid*)DBGrid1)->SetRowHeight(10, 50);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //---------------------------------------------------------------------------
    class THackProtectedCustomGrid :TCustomGrid
    {
    public: 
      void __fastcall SetRowHeight(int numligne,int hauteur){this->RowHeights[numligne]= hauteur;}
    };
    Variante 2 : classes Amies
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((THackPrivateCustomGrid*)DBGrid1)->RowHeight[10] = 50;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //---------------------------------------------------------------------------
    class THackPrivateCustomGrid :TCustomGrid
    {
      friend class TFrmAnnu;
    };
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut o_live
    Ceci fonctionne pour une StringGrid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    class TPublicStringGrid: public TCustomGrid
    {
        public:
            using TCustomGrid::RowHeights;
    };
     
    ((TPublicStringGrid*)StringGrid1)->RowHeights[2] = 50;
    }
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Très interessant ce using !

    Mais, RowHeights est accessible depuis une TStringGrid, ce n'est pas un très bon exemple !

    on doit avoir le même résultat avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class THackProtectedCustomGrid: public TCustomGrid
    {
        public:
            __property RowHeights;
    };
    Après tout c'est la méthode standard d'augmentation de visibilité des propriétés VCL !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Suite a l'intervention de ShaiLeTroll j'ai teste sur une DBGrid juste posee sur la Form donc une seule ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    class TPublicCustomGrid: public TCustomGrid
    {
        public:
              __property RowHeights;
    };
    ((TPublicCustomGrid*)DBGrid1)->RowHeights[0] = 50;
    }
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Points : 91
    Points
    91
    Par défaut
    Merci a vous deux
    J'ai utilise le code de blondelle

    Je pense que des choses comme cela pourrait être dans la Faq BCB
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Points : 91
    Points
    91
    Par défaut
    Encore merci a vous deux, le code fonctionne très bien

    Je voudrais avoir une petite explication afin de progresser,
    pour transtyper les objets, le guide du développeur BCB6
    recommande souvent d'utiliser l'opérateur dynamic_cast
    pour plus de sécurité

    Je voudrais savoir pourquoi quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TPublicCustomGrid* p=dynamic_cast< TPublicCustomGrid*>(DBGTel);
    J'obtiens cette erreur de compilation ? :
    [C++ Erreur] E2031 Impossible de transtyper de 'TDBGrid *' en 'TPublicCustomGrid *'

    Cela viens t-il que les classes soit abstraites ?

    merci de vos precisions
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    recommande souvent d'utiliser l'opérateur dynamic_cast pour plus de sécurité
    C'est la réponse à ta question

    TDBGrid hérite hérite de TCustomGrid (via TCustomDBGrid)
    TPublicCustomGrid hérite de TCustomGrid

    il forme tous les deux une branche différente d'héritage de TCustomGrid, l'un n'héritant pas de l'autre, ils sont d'un point de vue objet incompatible d'où l'utilisation d'un cast non protégé pour passer outre la sécurité de vérification d'héritage, voir InheritsFrom() pour la VCL

    Je ne connais pas encore assez bien le C++, je n'ai pas encore compris quelle était l'équivalent sous la forme "type_cast<Type*>(Obj)" de "((Type*)Obj)", le plus ressemblant serait "static_cast"

    TDBGrid n'est pas abstraite
    TCustomGrid (ou TPublicCustomGrid) effectivement ne doit pas être instancié à cause de DrawCell qui n'est implementé qu'à partir de TCustomDrawGrid ou TCustomDBGrid
    Mais cela ne pertube pas le cast, c'est juste une question d'arbre d'héritage différent

    Perso, l'aide est aussi lipide que de la boue, tu as un chariabia de classe de base polymorphe héritée qui entre dans la hiérarchie des sous-classes ... c'est un défi de comprendre quand ça fonctionne ou pas !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. acceder a une propriété après un get initial
    Par naoufal_bago dans le forum JSF
    Réponses: 6
    Dernier message: 31/07/2008, 12h06
  2. Réponses: 4
    Dernier message: 11/10/2006, 10h56
  3. [css] acceder aux propriétés d'un autre objet
    Par bakonu dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 21/10/2005, 12h28
  4. Comment acceder à la propriété d'une imprimante
    Par lassad dans le forum Composants VCL
    Réponses: 1
    Dernier message: 18/10/2005, 13h55
  5. [BCB6] DBGrid et mode de connexion BDD... demain
    Par Seb des Monts dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/01/2004, 13h56

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