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 :

Probleme OnDrawCell dynamique


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 5
    Par défaut Probleme OnDrawCell dynamique
    Salut,
    C'est assez facile de créer des pages(TabSheet) de PageControl de facon dynamique, puis d'y ajouter toujours dynamiquement des StringGrid.
    Mon probleme est que j'utilise l'évenement OnDrawCell pour les StringGrid, et là rien ne vas plus, j'obtiens l'erreur suivante :
    [BCC32 Erreur] Unit1.cpp(65): E2109 Ce n'est pas un type autorisé.
    a l'endroit ou j'affecte ma routine OnDrawCell.

    voici mon code : Fichier header
    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
     
    class TForm1 : public TForm
    {
    __published:    // IDE-managed Components
        TPageControl *PC;
        TButton *Button1;
        TButton *Button2;
        TButton *Button3;
        TButton *Button4;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall PCChange(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall FormDestroy(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall Button4Click(TObject *Sender);
    private:    // User declarations
    TStringGrid*    SG;
        void __fastcall SGOnDrawCell(TObject *Sender, int ACol,
                int ARow, TRect &Rect, TGridDrawState State);
    public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
    };
    Fichier 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
     
    void __fastcall TForm1::SGOnDrawCell(TObject *Sender, int ACol,
                int ARow, TRect &Rect, TGridDrawState State)
    {
        //
    }
     
    Utilisation:
    TRect    Rect;
    TGridDrawState State;
    SG = new TStringGrid(this);
    SG->Parent = PC->Pages[PC->ActivePageIndex];
    SG->DefaultDrawing = false;
    SG->OnDrawCell = SGOnDrawCell(Sender, 0, 0, Rect, State);
    Je précise que c'est un petit programme de test, pour essayer de comprendre
    malheureusement je ne comprends pas.
    Quelqu'un saurait?

    Pense aux balises de code le # ce sera plus lisible

  2. #2
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Je pense qu'il faut faire seulement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SG->OnDrawCell = SGOnDrawCell;
    D'après ce que j'ai lue dans la FAQ: http://cpp.developpez.com/faq/bcb/?p...osantdynamique

    Si tout fonctionne n'oublie pas de cliquer sur le bouton

  3. #3
    say
    say est déconnecté
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Par défaut
    je confirmes...c'est le principe.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 5
    Par défaut Probleme OnDrawCell dynamique
    Merci de vos réponses, malheureusement ca ne marche pas.
    J'ai donc créé un tout petit programme pour mettre en évidence le problème.
    Le voici : Header
    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
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ComCtrls.hpp>
    #include <Grids.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// IDE-managed Components
    	TPageControl *PC;
    	void __fastcall FormDestroy(TObject *Sender);
    	void __fastcall FormShow(TObject *Sender);
    private:	// User declarations
    	TStringGrid*	SG;
    	void __fastcall SGOnDrawCell(TObject *Sender);
    public:		// User declarations
    	__fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    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
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::FormShow(TObject *Sender)
    {
    	TTabSheet *TS = new TTabSheet(this);
    	TS->PageControl = PC;
    	TS->Caption = "Page " + IntToStr(PC->PageCount);
     
    	SG = new TStringGrid(this);
    	SG->Parent = PC->Pages[PC->ActivePageIndex];
    	SG->DefaultDrawing = false;
    	SG->OnDrawCell = SGOnDrawCell;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
    	delete SG;
     
    	for(int i=0;i<PC->PageCount;i++)
    		delete PC->Pages[i];
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::SGOnDrawCell(TObject *Sender)
    {
    	//
    }
    Le message d'erreur
    [BCC32 Erreur] Unit1.cpp(27): E2034 Impossible de convertir 'void (_fastcall * (_closure )(TObject *))(TObject *)' en 'TDrawCellEvent'

    J'ai essayé de mettre tous les parametres de l'evenement OnDrawCell: Col, Row, Rect, State, ca ne marche toujours pas.

    What's wrong?

  5. #5
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonsoir,

    Voici le prototype de 'OnDrawCell(...)', donné par l'aide Builder (de BCB6, puisque celle du BDS2006 était un peu ... hum ... ratée, dirons nous):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef void __fastcall (__closure *TDrawCellEvent)(System::TObject* Sender, long ACol, long ARow, TRect Rect, TGridDrawState State);
    So, tu dois donc déclarer ta fonction comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void __fastcall SGOnDrawCell(System::TObject* Sender, long ACol, long ARow, TRect Rect, TGridDrawState State);
    //voire seulement :
    void __fastcall SGOnDrawCell(TObject* Sender, long ACol, long ARow, TRect Rect, TGridDrawState State);
    Fais attention au fait que, dans certains autres évènements, si le prototype indique (par ex) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const TRect Rect //etc
    (c'est juste un exemple)
    si tu ne spécifie pas le 'const', ca peut ne pas marcher, ca m'est arrivé.

    Bon courage,
    @+

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 5
    Par défaut OnDrawCell dynamique résolu
    Merci a tous ceux qui ont pris la peine de me répondre, a défaut de me donner la solution vous m'avez aiguillé et encouragé a persévérer.
    La solution comme toujours est simple, encore que le coup était tordu et vicieux.
    La bonne déclaration dans le header est celle ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void __fastcall SGOnDrawCell(TObject *Sender, int ACol, int ARow, const TRect &Rect, TGridDrawState State);
    et l'utilisation dans le CPP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void __fastcall TForm1::SGOnDrawCell(TObject *Sender, int ACol, int ARow, const TRect &Rect, TGridDrawState State)
    ACol et Arow sont des int, avec des long ça ne marche pas. Et surtout comme l'avait pressenti SunChaser le TRect doit etre préfixé de const.
    Ce qui laisse supposer que l'aide de Borland n'est pas a jour en ce qui concerne cet événement.
    Quoi qu'il en soit, un grand merci!

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

Discussions similaires

  1. [ezPDF] Probleme pdf dynamique
    Par taka10 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 26/01/2007, 11h02
  2. probleme cursor dynamique
    Par juin29 dans le forum Oracle
    Réponses: 5
    Dernier message: 25/11/2006, 08h41
  3. probleme allocation dynamique
    Par ciberju dans le forum C
    Réponses: 2
    Dernier message: 28/08/2006, 09h40
  4. [struts] probleme champs dynamiques
    Par rocco dans le forum Struts 1
    Réponses: 28
    Dernier message: 07/06/2004, 21h26
  5. [LG]Problême Variable dynamique de types différents
    Par pierrOPSG dans le forum Langage
    Réponses: 2
    Dernier message: 29/04/2004, 16h01

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