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 d'un objet d'un form a l'autre


Sujet :

C++Builder

  1. #1
    Membre habitué

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 207
    Points : 133
    Points
    133
    Par défaut Création d'un objet d'un form a l'autre
    Salut à tous !

    Voila j'ai un projet C++ Builder 6 dans lequel j'utilise une liste chainée qui crée des Label. Lorsque je déclare ma classe et l'implément dans un unité et que j'utilise ma classe dans la Form correspondant à cette unité tout fonctionne, mais lorsque je déclare le header de cette unité dans une autre unité afin d'utiliser cette classe lors que je veus l'uitiliser, mes Label ne s'affiche plus.

    Je vais mettre mon code pour illustrer les choses :

    Ceci est le code dans lequel mes Label devrait s'afficher : Display_page.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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #include <string>
    #pragma hdrstop
    #include "Display_page.h"
    #include "Label_list.h"
    #include "Main_page.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    Tdisplay *display;
    //---------------------------------------------------------------------------
    __fastcall Tdisplay::Tdisplay(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall Tdisplay::FormShow(TObject *Sender)
    {
    //Cette partie devrati afficher le Label
    label test(-2147483621,"tutu",120,120); 
    }
    //---------------------------------------------------------------------------
    Ceci est la déclaration de ma classe : Label_list.h

    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
    //---------------------------------------------------------------------------
     
    #ifndef Label_listH
    #define Label_listH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    //--------------------------------------------------------------------------
    class label
    {
    private :
            TLabel * MyLabel;
            long int color;
            char * text;
     
            int MyTop;
            int MyLeft;
     
            label * nextlabel;
     
    public :
     
            label(long int this_color, char * this_text, int My_Top, int My_Left);
    };
    //---------------------------------------------------------------------------
    #endif
    Cette partie contient l'implémentation de ma classe Label : Label_list.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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    //---------------------------------------------------------------------------
    #include "Label_list.h"
    #include "Main_page.h"
    #include "Display_page.h"
     
    label::label(long int this_color, char * this_text, int My_Top, int My_Left):
    color(this_color), text(this_text), MyTop(My_Top), MyLeft(My_Left)
    {
            nextlabel = 0;
            MyLabel = new TLabel(Application);
            MyLabel->Parent = display;
            MyLabel->Caption = text;
            MyLabel->Left = MyTop;
            MyLabel->Top = MyLeft;
            MyLabel->Show();
    }
     
    //---------------------------------------------------------------------------
     
    #pragma package(smart_init)
    Pour une question de l'isibilité je n'ai pas mit tout le code, mais seulement celui qui pose problème.

    Je tien juste préciser que le nom de la Form qui contiendra mon Label s'appelle display

    Merci à ceux qui liront ce post et qui m'apporteront leur aide
    @@++

  2. #2
    Inactif
    Inscrit en
    Janvier 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 15
    Points : 17
    Points
    17
    Par défaut
    verifie en tracant si display est a null, ca m'etonnerais pas.
    si c'est pas le cas, faire un inspect de la variable avec un cast : ((tform *)display)->caption

    pour voir si c'est bien le caption de la form qui doit recevoir les labels

    en plus, je suis pas persuadé que le mieux pour l'owner soit Application... moi je mettrait NULL et je me chargerait de detruire le label dans le destructeur... mais ca depend de l'utilisation, bien sur...

  3. #3
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut,
    ton code est correct a part une petite erreur dans le constructeur de ton Label tu utilise implicitement le nom du parent du Label
    il est préférable d'utiliser d'utiliser un pointeur sur la Form ou tu veux afficher tes Label,par ailleurs le code pour la couleur est incorrect
    corrections
    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
     
    //Label_listH 
    public :
     
            label(long int this_color, char * this_text, int My_Top, int My_Left,TWinControl* Owner);
    //Label_list.cpp
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    //---------------------------------------------------------------------------
    #include "Label_list.h"
    #pragma package(smart_init)
     
    label::label(long int this_color, char * this_text, int My_Top, int My_Left,TWinControl* Owner):
    text(this_text),
    MyTop(My_Top),
    MyLeft(My_Left)
     
    {
            nextlabel = 0;
            MyLabel = new TLabel(Application);
            MyLabel->Parent = Owner;
            MyLabel->Caption = text;
            MyLabel->Left = MyTop;
            MyLabel->Top = MyLeft;
            MyLabel->Color= this_color
            MyLabel->Show();
    }
     
    // Form création du label
    void __fastcall TDisplay::FormShow(TObject *Sender)
    {
      label test(-2147483621,"tutu",120,120,this);
    }
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  4. #4
    Membre habitué

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 207
    Points : 133
    Points
    133
    Par défaut
    Alors j'ai essayé vos solution mais cela ne fonctionne toujours pas :

    venom pour ta solution :
    • display n'est pas nul
      Est lorsque je fait un ShowMessage de ((tform *)display)->caption il m'affiche display(qui est effectivement le nom de ma form)

    DjmSoftware pour ta solution :

    J'ai effectuer tes modifications mais cela ne fonctionne pas.
    @@++

  5. #5
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    C'est un problème de parent, il faudrait rajouter comme argument au contructeur le parent qui doit assumer l'affichage. Donc sa déclaration serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    label(long int, char*, int, int, TForm*);
    On a ajouté le pointeur sur TForm qui sera le parent. Le constructeur va devenir 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
    label::label(long int this_color,
                 char * this_text,
                 int My_Top,
                 int My_Left,
                 TForm* Affichage)
     
    {
            nextlabel = 0;
            MyLabel = new TLabel(Application);
            MyLabel->Parent = Affichage; // là on a le bon parent
            MyLabel->Caption = this_text;
            MyLabel->Left = My_Top;
            MyLabel->Top = My_Left;
            MyLabel->Show();
    }
    Et l'affichage aura lieu comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    label test(-2147483621,"tutu",120,120, Form1);
    Si maintenant, vous voulez que ça s'affiche dans Form2, vous remplacerez Form1 par Form2, c'est tout.

    À bientôt
    Gilles

  6. #6
    Membre habitué

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 207
    Points : 133
    Points
    133
    Par défaut
    Salut,

    alors j'ai fait ce que tu ma marquer, mais lorsque ce que je lance l'exécution et le lieur me fait une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Lieur Erreur] Unresolved external 'label::label(long, char *, int, int, Controls::TWinControl *)' referenced from C:\DOCUMENTS AND SETTINGS\SCHOEPFERS\DESKTOP\BIND SOF2\DISPLAY_PAGE.OBJ
    Je ne comprend pas pourquoi ?? de quoi cela peut-il venir ??

    En tout cas merci de m'aider
    @@++

  7. #7
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Moi j'ai essayé comme ça et ça marche sur deux formes Form1 et Form2. Le compilateur vous dit Unresolved external 'label::label(long, char *, int, int, Controls::TWinControl *), le dernier argument est un TForm* et non un Controls::TWinControl *, ici c'est autre chose, c'est un problème de déclaration et de liaison (link). Pour ma part, la classe label, je l'ai simplement copiée-collée dans unit1.h, je n'ai pas créé de header en plus, sinon il faut bien vérifier que ce header a bien été inclus chaque fois que la classe label est invoquée.

    À bientôt
    Gilles

  8. #8
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut,
    le code que je t'ai fourni est parfaitement fonctionnel su mon PC
    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  9. #9
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    DjmSoftware, je viens de m'apercevoir qu'en fait on propose la même solution c'est-à-dire en rajoutant l'adresse du parent si ce n'est que j'avais proposé TForm* et vous TWinControl*, ce qui est à peu près la même chose. C'est ce qui m'avais échappé en première lecture en sorte que je n'avais pas réussi à faire marcher votre processus, c'est ce qui explique que j'avais proposé autre chose ou plutôt ce que je croyais être autre chose. Donc votre solution marche très bien, j'espère que notre internaute y arrivera.

    À bientôt
    Gilles

  10. #10
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Bonjour Gilles,
    je crois que notre internaute a simplement oublié d'ajouter à son projet le fichier Label_list.cpp
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  11. #11
    Membre habitué

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 207
    Points : 133
    Points
    133
    Par défaut
    Bonjour,

    Alors je suis en trian de chercher ce qui ne fonctionne pas. Je veux jsute préciser que :
    • J'ai bien ajouté le fichier Label.cpp a mon projet.

      Lorsque j'utilise comme paramètre TWinControl*, mon programme ce compile et se lance, mais mon label de s'affiche toujours pas.

      Lorsque j'utilise comme paramètre TForm*, le lieur me fait toujours l'erreur précisée en dessus.

    Je vais encore cherche.

    Merci de m'aider c'est bien sympathique

    PS: Merci de me tutoyer, je suis un petit jeunet...
    @@++

  12. #12
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    C'est impossible, il y a une autre erreur quelque part. Repartez de zéro.

    1) Entrez dans C++ Builder et sauvez Unit1 et Projet1.
    2) Créez votre classe label dans un .h en déclarant bien le prototype avec TWinControl*

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    label(long int, char*, int, int, TWinControl*);
    3) Dans Unit1.cpp rajoutez le constructeur de la classe

    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
    label::label(long int this_color,
                 char * this_text,
                 int My_Top,
                 int My_Left,
                 TWinControl* Affichage)
     
    {
            nextlabel = 0;
            MyLabel = new TLabel(Application);
            MyLabel->Parent = Affichage;
            MyLabel->Caption = this_text;
            MyLabel->Left = My_Top;
            MyLabel->Top = My_Left;
            MyLabel->Show();
    }
    4) Rajoutez deux boutons dans Form1
    5) Creéz une Form2
    6) Rajouter l'include de la classe dans Unit1.cpp et dans Unit2.cpp
    7) Rajoutez deux boutons dans Form1
    8) Le premier bouton va rendre visible Form2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Form2->Visible=true;
    }
    9) Le deuxième va afficher le label dans Form1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    label test(-2147483621,"tutu",120,120, Form1);
    }
    10) Ajoutez un bouton à Form2
    11) Le bouton va afficher le label dans Form2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
    label test(-2147483621,"tutu",120,120, Form2);
    }
    12) Exécutez : quand vous cliquez le bouton2 de Form1, le label s'affiche dans Form1, vous cliquez maintenant le bouton1 de Form1, ça vous affiche Form2, vous cliquez sur le bouton de Form2 et le label s'affiche bien dans Form2.

    À bientôt
    Gilles

  13. #13
    Membre habitué

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 207
    Points : 133
    Points
    133
    Par défaut
    Merci bien pour cette marche à suivre super complète, en fait comme cela ça fonctionne méverveilleusement bien !

    Et créer le Label dans une autre fenêtre fonctionne aussi à mérveille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::Button2Click(TObject *Sender) 
    { 
    label test(-2147483621,"tutu",120,120, Form2); 
    }
    Donc je vais refaire mon code depuis le début sa sera plus simple !!

    Vraiment merci bien de votre aide !!
    C'est super simpa.

    A plus
    @@++

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

Discussions similaires

  1. [1.x] Création d'un objet, form non valide et vide
    Par insane1 dans le forum Symfony
    Réponses: 3
    Dernier message: 02/11/2010, 09h20
  2. [1.x] Création d'objets avec Embeded form
    Par Adesfire dans le forum Symfony
    Réponses: 4
    Dernier message: 08/01/2010, 16h07
  3. Problème création d'un objet dans une Form
    Par helico2 dans le forum C++/CLI
    Réponses: 7
    Dernier message: 02/01/2008, 16h32
  4. [Résolu][C#]Accéder à un objet d'un form depuis un autre
    Par pierre1256 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 02/06/2006, 23h05
  5. [Reflexivite]création dynamique d'objet et Héritage
    Par norkius dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 26/10/2004, 11h37

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