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 constructeur d'un formulaire/fiche avec une classe de données


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2011
    Messages : 20
    Points : 20
    Points
    20
    Par défaut Surcharge constructeur d'un formulaire/fiche avec une classe de données
    Bonjour à tous, et à toutes,

    Arrivant de C# je débarque sur un projet en Borland C++ Builder XE, et bien entendu le passage de C# à C++ sous Borland est un chemin parcouru d’embuches…

    Je rencontre donc un petit problème « tout simple », et surtout de base que vous avez forcément rencontrée à un moment ou à un autre…

    Je cherche tout simplement à surcharger le constructeur par défaut d’un formulaire (fiche chez Borland) en lui ajoutant comme paramètre supplémentaire une classe.

    C’est une version un brin plus complexe que dans ce sujet là : URL="http://www.developpez.net/forums/d232088/c-cpp/outils-c-cpp/cppbuilder/surcharge-constructeur-form/"]Surcharge-constructeur-form[/URL]

    Petite explication de ce que je cherche à faire :
    J’ai un formulaire FrmContexte, qui contient un ensemble de contrôles.
    Je veux donc charger des valeurs par défaut dans c’est contrôles via les variables membres d’une classe.
    À la validation du formulaire FrmContexte, je sauvegarde le contenu de mes contrôles dans la classe et je retourne cette dernière.

    Ensuite pour l’initialisation de la classe, je compte passer par un fichier xml. Et idem pour la sauvegarde des infos de la classe.

    Mon problème est le suivant : Je ne sais pas comment faire pour passer en paramètre à mon constructeur de formulaire, ma classe de données.

    Voici mon code :

    ClasseTest.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class ClasseTest{
     
    private:
    	int _nombrePlaces;//Déclaration des variables membres de la classe
     
    public:
    	ClasseTest();//Constructeur standard
    	~ClasseTest();//Destructeurs
     
    	//Déclaration des propriétés de la classe
    	void setNombrePlaces(int nombrePlaces);
    	int getNombrePlaces();
    };
    ClasseTest.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
    #include "ClasseTest.h"
     
    //Définition du constructeur et du destructeur de la classe
    ClasseTest::ClasseTest(){
    	_nombrePlaces=0;
    }
     
    ClasseTest::~ClasseTest(){
    }
     
    //Définition des propriétés de la classe
    int ClasseTest::getNombrePlaces(){
    	return _nombrePlaces;
    }
     
    void ClasseTest::setNombrePlaces(int nombrePlaces){
       _nombrePlaces=nombrePlaces;
    }
    Mon formulaire dans lequel je souhaite passer une instance de cette classe via le constructeur surchargé.
    FrmContexte.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //#include "ClasseTest.h"//pas possible sinon erreur de redéfinition multiple de la classe ClasseTest
     
     
    class TFormContexte : public TForm
    {
    __published:
     
    public:
    __fastcall TFormContexte(TComponent* Owner);//Constructeur par défaut.
    __fastcall TFormContexte(TComponent* Owner, ClasseTest p_ClasseTest);//Constructeur surcharger perso
    } ;
    extern PACKAGE TFormContexte *FormContexte;
    FrmContexte.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "ClasseTest.h"
    ClasseTest m_ClasseTest;
     
    __fastcall TFormContexte::TFormContexte(TComponent* Owner)
    	: TForm(Owner)
    {
    }
     
    __fastcall TFormContexte::TFormContexte(TComponent* Owner, ClasseTest p_ ClasseTest)
    	: TForm(Owner)
    {
    	m_ ClasseTest = p_ClasseTest;
    }
    Dans un formulaire SDI de base, avec un menu perso (juste pour faire un test)
    SDIMain.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "ClasseTest.h"
     
    void __fastcall TSDIAppForm::Action_MenuTest_ContexteExecute(TObject *Sender)
    {
     
    	ClasseTest* l_ClasseTest;//Déclaration de ma variable locale du type ClasseTest
    	l_ClasseTest= new ClasseTest();//on initialise l'instance de la l_ClasseTest avec le constructeur par défaut
    	//... et on la passe en paramètre au constructeur surcharger du formulaire
    	TFormContexte* l_ptTFormContexte = new TFormContexte(NULL, l_ClasseTest);
    	l_ptTFormContexte->ShowModal();
    }

    Actuellement je me retrouve coincer car dans FrmContexte.h, ma classe de données ClasseTest, n'est pas connue (pas de référence à cette dernière).
    Je ne peut pas mettre un #include "ClasseTest.h, sous peine d'avoir une erreur de redéfinition de ma classe ClasseTest.


    Si quelqu’un a une idée, une piste, voire même un exemple je suis preneur!

    Merci d’avance à tous, et toutes pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Pense à mettre de IFDEF !
    Lorsque tu fais nouvelle unité cela génère automatiquement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //---------------------------------------------------------------------------
    #ifndef ClasseTestH
    #define ClasseTestH
    //---------------------------------------------------------------------------
     
    TON CODE ENTRE LES DEUX !
     
    //--------------------------------------------------------------------------
    #endif
    Cela permet d'éviter les inclusions multiples !
    Je suis sous C++Builder depuis 6 mois, je trouvais qu'en Delphi les uses c'était bien plus simple !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    __fastcall TFormContexte(TComponent* Owner, ClasseTest p_ClasseTest);
    Pense que l'objet p_ClasseTest sera copié dans m_ClasseTest (qui est un membre de ta classe TFormContexte et non une variable dans le CPP, fait gaffe à cela aussi)

    Si tu veux éviter les copies, utilise * pour utiliser des pointeurs !
    Attention, pour chaque new il faut un delete, il faut libérer en C++ par de GarbageCollector !
    C'est l'avantage de l'allocation statique sans * ni new, cela permet une libération automatique (voir RAII)
    les Objets VCL sont évidemment incompatible avec le RAII, il faut souvent utiliser un __finally pour effecteur le delete d'où l'importance des destructeurs lors d'une composition !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2011
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    @ShaiLeTroll :
    Encore une fois tu viens à mon secours! Une nouvelle fois, merci pour aide vraiment très précieuse.
    J’ai de la chance d’être tombé sur un spécialiste du C++ Builder

    Bon je viens de mettre un #ifndef ClasseTestH, mais malheureusement ça n’as pas l’air de lui plaire complètement, vus que je me retrouve avec une erreur :
    [BCC32 Erreur] FrmContexte.h(527): E2303 Nom de type attendu

    On dirait bien qu’il ne reconnaît pas ma classe ClasseTest et du coup la variable que je viens de créer de ce type là.

    Voici mon code, si avec tes yeux de lynx et d’expert tu peux arriver à trouver ce qui cloche :
    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
     
    //---------------------------------------------------------------------------
     
    #ifndef FrmContexteH
    #define FrmContexteH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <XPMan.hpp>
    //---------------------------------------------------------------------------
     
    //Prise en compte des classes personnalisées
    //#include "ClasseTest.h"
    #ifndef ClasseTestH
    #define ClasseTestH
     
     
    class TFormContexte : public TForm
    {
    __published:	// Composants gérés par l'EDI
     
    private:	// Déclarations utilisateur
     
    public:		// Déclarations utilisateur
    	__fastcall TFormContexte(TComponent* Owner);
    	HIDESBASE __fastcall TFormContexte(TComponent* AOwner, int p_iValeur);//Constructeur surcharger perso
    	HIDESBASE __fastcall TFormContexte(TComponent* AOwner, ClasseTest p_ClasseTest);//Constructeur surcharger perso
    	__fastcall ~TFormContexte();
     
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TFormContexte *FormContexte;
    //---------------------------------------------------------------------------
    #endif
    #endif

    Pour les pointeurs c’est ce que je vais faire par la suite.
    Le but n’étant pas de faire une copie, sinon je vais être obligé ensuite d’égaliser la copie avec l’originale.

    Le but étant de partir d’une instance de cette classe ClasseTest, avec des valeurs par def., définit dans mon formulaire SDI, de la transmettre à mon formulaire FormContexte, puis de la remplir avec éventuellement de nouvelles valeurs, et de la récupérer en sortie du formulaire FormContexte, dans mon formulaire SDI

    Pour le delete, t’inquiète je connais… Ok, là dans l’exemple j’ai fait ça à la vas vite.
    Mais c’est clair que si je veux éviter les fuites mémoires, les effets de bords avec des données pas détruites et utilisées malgré tout (ce qui peux vite devenir problématique, car on ne regarde pas au bon endroit), je vais utiliser le delete (avec mon beau destructeur).

    C’est clair que c’est la règle de base : Un new = un delete

    Pour les RAII, je vais regarder ton post.


    En tout cas si tu peux jeter un coup d’œil sur mon erreur ça serait super. Dès que ce point marchera, je vais pouvoir m’amuser comme un petit fou avec C++ Builder

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Citation Envoyé par otacon ghost Voir le message
    aide vraiment très précieuse.
    J’ai de la chance d’être tombé sur un spécialiste du C++ Builder
    Spécialiste
    En fait, je n'en fais que depuis Décembre 2010 ! (7 Mois quoi)
    Mais 10 ans de Delphi avant !

    Sinon ClasseTestH n'a rien à faire dans FrmContexte.h puisqu'il y a déjà FrmContexteH

    Rétabli le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "ClasseTest.h"
    ClasseTestH doit déjà être dans ClasseTest.h

    Utilise toujours "Nouvelle Unité" pour créer ton couple H\CPP, cela crée des fichiers avec le minimum indispensable, en plus, le DEFINE est utilisé par l'IDE, sous mon C++Builder 2007,
    si le DEFINE FichierH correspond au Fichier.h et Fichier.cpp cela groupe les fichiers dans l'éditeur
    si le DEFINE FichierTrucH correspond au FichierMachin.h et FichierMachin.cpp comme FichierMachin et FichierTruc c'est différent, l'IDE fait une crise et ne groupe plus les fichiers !
    Va comprendre !

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2011
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    @ShaiLeTroll :
    Et bien chapeau bas mon problème venais bien du fait que je n'avais pas fais une unité, mais un fichier .cpp & .h à la main...

    Avec une unité ça marche nickel

    Arf, comme quoi c’était un petit rien qui me mettait tout en erreur!
    Bref, milles merci pour m'avoir résolu ce problème!

    Spécialiste
    En fait, je n'en fais que depuis Décembre 2010 ! (7 Mois quoi)
    Mais 10 ans de Delphi avant !
    Arf, alors qu'est-ce que ça va donnez quand tu auras 10 ans de C++ Builder...

    Pour ma part c'est :
    - 1 ans de MFC/C++
    - 1 ans de Borland C++
    - 9 ans de .NET C#/VB .Net
    - 11 ans de VB6
    Les deux derniers presque en parallèle... Non, je ne suis pas un ancêtre lol

    Alors le retour aux sources es difficile... Je pense C# avant tout le reste... D'ou mes problèmes...

    En tout cas encore merci tu m'as enlever une belle épide du pied!

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/05/2013, 17h57
  2. [PDF] Remplir un formulaire PDF avec une base de données
    Par psgkiki dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 31/03/2009, 16h40
  3. Réponses: 1
    Dernier message: 28/11/2007, 09h31
  4. Surcharge de << avec une class Template ?
    Par elraton dans le forum Langage
    Réponses: 10
    Dernier message: 04/01/2007, 09h34
  5. [Surcharge]Operateur<< avec une classe maison
    Par KeNnEdY dans le forum C++
    Réponses: 6
    Dernier message: 14/09/2005, 15h51

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