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 Form


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut surcharge constructeur Form
    Bonjour,

    Je souhaiterai passer un en paramètre à une Form un tableau!
    Mais je n'arrive pas à surcharger le constructeur!

    Comment est ce que je peux faire ?

    Voici le code que je tente mais ça ne fonctionne pas!

    dans le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    __fastcall TFormResult(TComponent* Owner , TCompareResult * tabResult);
    dans le .cpp de ma fenêtre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    __fastcall TFormResult::TFormResult(TComponent* Owner , TCompareResult * tab)
            : TForm(Owner)
    {
    }
    Merci

  2. #2
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Pourquoi ne pas simplement le déclarer come deuxieme constructeur, tu n'a plus qu'a mettre les bon parametre pour qu'il soit appeler a la place de l'autre.

  3. #3
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Salut,
    tu peux toujours déclarer dans ton .h le tableau en extern pour le passer d'une Form à une autre. Il y a un exemple ici.

  4. #4
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    Encore une question:

    J'ai donc fait deux constructeurs dans la fenêtre 2. Et ça fonctionne presque!

    Seulement je passe en argument dans mon constructeur, un objet dont la classe est définie dans mon Unit1.cpp.

    Dans mon Unit2.h je fais donc un include "Unit1.cpp" pour récupérer la définition de cette classe. Mais la j'ai une multitude d'erreur qui se génèrent.

    Comment résoudre ce problème ?

  5. #5
    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
    Normalement tu ne dois pas faire de include avec des .cpp seulement avec des .h (fichiers d'entête).

    La définition de tes classes devrais toujours êtres dans un fichiers .h si tu veux quelles soient utilisées par d'autres classes.

  6. #6
    Membre averti
    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
    Par défaut
    Bonjour à tous,

    Arrivant de C# je démarre un projet Borland C++ et bien entendu je suis complètement perdu dans cet environnement.

    Je cherche à faire exactement ce que Pfeffer cherchait à faire.
    J’ai opté pour la solution avec un constructeur de base, et un constructeur surchargé avec mon paramètre supplémentaire.

    Là où je bute, c’est pour appeler mon constructeur surcharger.
    Voici mon code et mon problème, ce qui sera de suite plus parlant pour tout le monde :

    FrmContexte.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class TFormContexte : public TForm
    {
    __published:	// Composants gérés par l'EDI
     
    public:		// Déclarations utilisateur
    	__fastcall TFormContexte(TComponent* Owner);
    	__fastcall TFormContexte(TComponent* Owner, int p_iValeur);//Constructeur surcharger perso
    };
    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
    14
     
    int l_iValeur;
     
    __fastcall TFormContexte::TFormContexte(TComponent* Owner)
    	: TForm(Owner)
    {
    }
     
    //Définition du constructeur surcharger personnaliser
    __fastcall TFormContexte::TFormContexte(TComponent* Owner, int p_iValeur)
    	: TForm(Owner)
    {
    	l_iValeur = p_iValeur;
    }
    Dans SDIMain.cpp (une page SDI de base avec un item de menu perso)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "FrmContexte.h"
     
    void __fastcall TSDIAppForm::Action_MenuTest_ContexteExecute(TObject *Sender)
    {
    	//FormContexte->ShowModal();//Constructeur par def
    	TFormContexte l_ptTFormContexte = new TFormContexte(NULL, 1);
    	l_ptTFormContexte->ShowModal();
     
    }
    A l’ouverture de la parenthèse du new TFormContexte( je vois bien mes deux constructeurs. Par contre je ne sais pas ce que je dois mettre pour le Owner. J’ai essayé avec un NULL, mais bien entendu cela ne fonctionne pas:
    [BCC32 Erreur] SDIMAIN.CPP(74): E2459 Les classes de style Delphi doivent être construites avec l'opérateur new

    Est-ce que quelqu’un à une idée? Voir même mieux carrément un exemple?

    Merci d’avance pour votre aide.

  7. #7
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Bonjour,
    ton problème ne viens pas de la surcharge de ton constructeur, mais de la manière dont tu déclare l'instance de ta fenêtre, les objet Borland doivent toujours être instancié avec des pointeur, il faut donc que ta variable soit du type TFormContexte*, sinon le reste est bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "FrmContexte.h"
     
    void __fastcall TSDIAppForm::Action_MenuTest_ContexteExecute(TObject *Sender)
    {
        //FormContexte->ShowModal();//Constructeur par def
        TFormContexte* l_ptTFormContexte = new TFormContexte(NULL, 1);
        l_ptTFormContexte.ShowModal();
     
    }

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 055
    Par défaut
    Reprendre un sujet de 2006 ! Ce n'est pas bien !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TFormContexte l_ptTFormContexte = new TFormContexte(NULL, 1);
    Toute petite erreur, il manque l'étoile, en C++, new implique un pointeur, cherche autour de "instanciation ou allocation statique" et "instanciation ou allocation dynamique"


    la Touche F1 si l'on sélectionne une erreur dans la liste fonctionne et propose un descriptif de l'erreur, google avec "E2459" comme mot clé te permet aussi de trouver la Documentation Wiki Embarcadero : Les classes de style Delphi doivent être construites en utilisant l'opérateur new (C++)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TFormContexte * l_ptTFormContexte = new TFormContexte(NULL, 1);
    Pour NULL, il va peut-être rallé car void* n'est pas compatible avec TComponent* ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TFormContexte * l_ptTFormContexte = new TFormContexte((TComponent*)NULL, 1);
    l_ptTFormContexte->ShowModal(); // -> c'est comme (*obj). déréférencement et accès au membre
    otacon ghost ! Attention !
    Tu tombes sur un cas plus subtile que celui de Pfeffer !
    J'ai évoqué cela dans Méthodes Virtuelles appelés depuis un Constructeur - 11

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	__fastcall TForm(TComponent* Owner, int);
    existe déjà !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	/* TCustomForm.CreateNew */ inline __fastcall virtual TForm(Classes::TComponent* AOwner, int Dummy) : TCustomForm(AOwner, Dummy) { }
    Tu vas donc surcharger le constructeur surnommé "CreateNew" !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    __fastcall TFormContexte::TFormContexte(TComponent* Owner, int p_iValeur)
    	: TForm(Owner)
    {
    Dans cette surcharge de CreateNew tu appele le constructeur simple "Create"
    mais Create appel CreateNew avec la spécificité de la VMT des objets Delphi, c'est bien ton CreateNew qui sera de nouveau appelé, alors même en apportant les corrections syntaxiques élémentaires, tu auras une erreur "débordement de pile" à cause d'une recursivité sans fin !

    ta déclaration devra être de la forme suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HIDESBASE __fastcall TFormContexte(TComponent* AOwner, int p_iValeur);
    HIDESBASE va "retirer" le virtual et donc l'override implicite, cela conservera intact le CreateNew de TForm !
    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

Discussions similaires

  1. [2.x] FOS surcharger le Form register
    Par KLeMiX dans le forum Symfony
    Réponses: 1
    Dernier message: 25/11/2013, 12h16
  2. Réponses: 4
    Dernier message: 19/07/2011, 14h34
  3. Surcharge constructeur this et base ?!?
    Par topolino dans le forum C#
    Réponses: 2
    Dernier message: 24/02/2009, 15h15
  4. Surcharge constructeur : Arguments variables et ArrayList
    Par vb2013 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 25/06/2008, 09h39
  5. [1.1][VB.NET] surcharge constructeur conversion restrictive
    Par lucie.houel dans le forum ASP.NET
    Réponses: 3
    Dernier message: 08/12/2006, 15h07

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