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 :

Création de Composant


Sujet :

C++Builder

  1. #1
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut Création de Composant
    Bonjour à Tous

    J'essaye de créer un composant permettant d'avoir une grille de CheckBox.

    J'ai donc suivit le tuto de création d'un composant présenté sur le site.
    J'ai fait dériver mon composant de TCustonGrid.

    J'y ai éjouté deux propriétés pour gérer la Colonne et la ligne ou commence les CheckBox.

    Mon souci c'est que j'aimerais lorsque l'on modifie le Nombre de Lignes ou de Colonnes de la grille de pouvoir mettre a jour les propriétés de début de ligne et de colonne des Checkbox si celles-ci ne cadrent plus avec les proportions de la grille.

    Mon souci, c'est que les variables et les méthodes d'écriture pour ces propriétés sont privé donc pas accessible dans ma classe dérivée. (ColCount, RowCount, SetColCount() et SetRowCount). J'ai voulu recréer ces variables et méthodes dans ma classe et gérer cela moi même mais cela ne modifie pas la grille.

    Est-ce que quelqu'un aurait une solution ?

    Merci d'avance pour votre aide

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Hello,

    TCustomGrid::ColCount et TCustomGrid::RowCount sont protected, tu devrais donc y avoir accès (au moins avec Builder 6 et les plus récents !)

    Si tu les as redéfinies, rajoutes un appel à la propriété de la classe de base dans tes accesseurs:
    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
    __property ColCount = {read=LireNbColonnes,       write=MajNbColonnes};
     
    ....
     
    int __fastcall TMaGrille::LireNbColonnes(void)
    {
      ...
      return TCustomGrid::ColCount;
    } 
     
    void __fastcall TMaGrille::MajNbColonnes(int nbColonnes)
    {
      ...
      TCustomGrid::ColCount = nbColonnes;
    }

  3. #3
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Salut totoche76 et merci pour ta réponse

    Chez moi elles sont privées dans TCustomDrawGrid ainsi que leurs méthodes d'écriture

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 469
    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 469
    Points : 24 905
    Points
    24 905
    Par défaut
    Citation Envoyé par kurul1 Voir le message
    Chez moi elles sont privées dans TCustomDrawGrid ainsi que leurs méthodes d'écriture
    Tu confonds FRowCount qui est le membre privé et RowCount qui est une propriété protégée que l'on peut publié comme dans la TDrawGrid !

    Sache qu'il est possible de redéfinir complètement une propriété pour lui spécifier tes propres accesseurs comme te la proposer totoche76, bon, en général, mes fonctions accesseurs ont le même nom que les privées, cela ne pose aucun problème, même en protégé, cela ne pose pas de problème, faut juste faire attention si virtual ou pas !


    En même temps, des TCheckBox dans une Grid, cela se fait en 1 ligne de code dans OnDraw et la fonction DrawFrameControl
    Voir ce sujet CheckBox dans un StringGrid

    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
    //---------------------------------------------------------------------------
    void __fastcall TBeginningCPPMainForm::StringGrid1DrawCell(TObject *Sender,
          int ACol, int ARow, TRect &Rect, TGridDrawState State)
    {
     if (ACol == 1)
     {
       DrawFrameControl(((TStringGrid*)Sender)->Canvas->Handle, &Rect, DFC_BUTTON, DFCS_BUTTONCHECK | ((int)((TStringGrid*)Sender)->Objects[ACol][ARow]));
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall TBeginningCPPMainForm::StringGrid1Click(TObject *Sender)
    {
     if (((TStringGrid*)Sender)->Col == 1)
     {
       int StateChecked = ((int)((TStringGrid*)Sender)->Objects[((TStringGrid*)Sender)->Col][((TStringGrid*)Sender)->Row]);
       StateChecked = StateChecked ? 0 : DFCS_CHECKED;
       ((TStringGrid*)Sender)->Objects[((TStringGrid*)Sender)->Col][((TStringGrid*)Sender)->Row] = (TObject*)StateChecked;
     }
    }
    tu peux modifer le rectangle pour obtenir la bonne taille de case !

    J'espère que tu n'es pas parti sur la création de contrôle réelle avec une gestion approximative du défilement, avec un ancien collègue, on avait essayé, c'est une très mauvaise idée !

    Personnellement, dès que j'ai eu besoin de checkbox, j'ai utilisé une TListView ou TCheckListBox, ce n'est qu'en 2009 que j'ai utilisé cela dans DBGrid avec DrawFrameControl (avant j'ai bcp abusé du WordWrap dans un DBGrid), et encore plus recemment dans une TStringGrid et une TImageList
    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
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Merci à toi aussi ShaiLeTroll pour ta réponse

    Je vais étudier cela et sinon pour le post à totoche76, je n'avais pas fait gaf qu'il appelait la propriété de la classe mère et non la variable (préfixe F) du coup ca va mieux fonctionner mon histoire.

  6. #6
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Je reviens vers toi ShaiLeTroll car je n'y arrive pas, j'ai toujours une erreur

    j'ai donc ajouter ceci dans la fonction DrawCell

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Evenement OnDrawCell
    void __fastcall TCheckBoxGrid::DrawCell(int ACol, int ARow, const TRect &ARect, TGridDrawState AState)
    {
       // On dessine
       DrawFrameControl(Canvas->Handle, &Rect, DFC_BUTTON, DFCS_BUTTONCHECK | ((int)Objects[ACol][ARow]));
    }
    J'ai une erreur sur le paramètre Rect cela me dit que cela ne correspond pas à un tagRECT *

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 469
    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 469
    Points : 24 905
    Points
    24 905
    Par défaut
    Attention, tu dois avoir un conflit entre Rect et ARect

    Rect doit être considéré le pointer de fonction Classes::Rect()
    ARect (A comme Argument) qui est le paramètre

    C'est con effectivement une différence de nommage entre
    Rect dans l'Event OnDrawCell (TDrawCellEvent)
    ARect dans la méthode virtuelle TCustomGrid:: DrawCell

    Attention, n'oublie pas d'appeler TCustomGrid:: DrawCell pour les autres colonnes !

    en général, comme je viens delphi, je fais comme dans la VCL, je redéclare un inherited
    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

  8. #8
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Merci à toi, c'était bien cela.

    Par contre je n'arrive toujours pas à gérer le click dans le composant car j'ai quand même créer un composant. Si je surcharge l'évenement OnClick dans mon projet et non dans le composant cela fonctionne (projet ou je pose ma CheckBoxGrid).

    Sinon autre souci, je voudrais ajouter des cases à coché sur des cases fixées, j'arrive à les dessiner mais le click ne fonctionne pas dessus, aurais-tu une idée

    Merci d'avance

Discussions similaires

  1. [Création de composant] Surcharge de OnMouseMove
    Par yoghisan dans le forum Composants VCL
    Réponses: 2
    Dernier message: 18/02/2004, 22h34
  2. [Création de composant] Composant exclu de ComponentCount
    Par yoghisan dans le forum Composants VCL
    Réponses: 6
    Dernier message: 18/02/2004, 12h45
  3. [Création de composant] Focus
    Par Pedro dans le forum Composants VCL
    Réponses: 4
    Dernier message: 16/02/2004, 13h57
  4. Ordre de création de composant
    Par bobby-b dans le forum Composants VCL
    Réponses: 4
    Dernier message: 15/09/2003, 19h05
  5. [Kylix] Création de composant
    Par glub dans le forum EDI
    Réponses: 2
    Dernier message: 08/01/2003, 16h58

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