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 :

impossible de fermer une fiche créée dynamiquement à l'aide d'un bouton [Débutant]


Sujet :

C++Builder

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 18
    Par défaut impossible de fermer une fiche créée dynamiquement à l'aide d'un bouton
    Bonjours à tous.
    J’espère ne pas avoir fait de doublon en ouvrant cette discussion.
    Je tente de programmer une application composée d'une fiche principale sur laquelle se trouve un bouton.
    Quand on clique sur ce dernier le programme créé une fiche dynamique contenant elle aussi un bouton (dynamique lui aussi!).
    Ce dernier bouton devrait me permettre de fermer la fiche créée dynamiquement mais j’obtiens le message d'erreur suivant :Symbole "fiche1" non défini.
    Je pense que ma Form dynamique fiche1 n'est pas déclarée correctement.

    Voici le contenu de mon fichier .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
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:    // Composants gérés par l'EDI
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
    private:    // Déclarations utilisateur
    TButton *MonBouton;
    void __fastcall MonBoutonClick(TObject *Sender);
     
    public:        // Déclarations utilisateur
        __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif


    Ainsi que le contenu du fichier CPP (unique dans cette application) :

    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
    #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::Button1Click(TObject *Sender)
    {
        TForm*fiche1 =new TForm(this);
     
        MonBouton = new TButton(this);
        MonBouton->Left = 40;
        MonBouton->Top = 40;
        MonBouton->Caption = "Bouton";
        MonBouton->Parent = fiche1;
     
     
        MonBouton->OnClick = MonBoutonClick;
        fiche1->ShowModal();
    }
    //---------------------------------------------------------------------------
     void __fastcall TForm1::MonBoutonClick(TObject *Sender)
    {
        ShowMessage("Clic sur MonBouton = OK");
        //fiche1->Close(); //symbole fiche1 non défini
        delete fiche1; //symbole fiche1 non défini
    }
    Voila, j’espère que ma description est claire.

    Merci pour votre Aide

  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
    Salut, c'est un problème de scope, tu crée fiche1 dans la méthode Button1Click et tu le détruis dans MonBoutonClick. C'est normal qu'il ne soit pas accessible. Si tu veux il faut mettre fiche1 comme attribut privé à ta classe TForm1.

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 18
    Par défaut
    Citation Envoyé par Crayon Voir le message
    Salut, c'est un problème de scope, tu crée fiche1 dans la méthode Button1Click et tu le détruis dans MonBoutonClick. C'est normal qu'il ne soit pas accessible. Si tu veux il faut mettre fiche1 comme attribut privé à ta classe TForm1.
    Merci Crayon,
    je vais essayer et je te tiens au courant.

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 18
    Par défaut ça avance
    Citation Envoyé par sergeprd Voir le message
    Merci Crayon,
    je vais essayer et je te tiens au courant.
    Re bonjour Crayon.

    J'ai déclaré fiche1 comme tu me l'a indiqué.
    Le programme se compile sans problème.
    A l'utilisation il y a des choses que je ne comprends pas:

    le code:
    n'a aucun effet perceptible,

    le code:
    provoque une erreur: Violation d’accès ....module vcl150.bpl ...


    Je ne suis pas certain que la façon que j'ai utilisé pour déclarer "fiche1" soit correcte.

    Voici la déclaration dans le fichier .h dans la class TForm1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private:	// Déclarations utilisateur
    TForm1 *fiche1;
    Connais tu la façon de résoudre ce problème ?

    Merci pour ta patience Crayon.

  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
    Citation Envoyé par sergeprd Voir le message
    Je ne suis pas certain que la façon que j'ai utilisé pour déclarer "fiche1" soit correcte.

    Voici la déclaration dans le fichier .h dans la class TForm1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private:	// Déclarations utilisateur
    TForm1 *fiche1;
    Connais tu la façon de résoudre ce problème ?

    Merci pour ta patience Crayon.
    Ce bout de code veux seulement dire qu'il y aura un pointeur de TForm1 qui sera accessible dans ta classe. Il faut quand même faire un new pour créer l'objet.

  6. #6
    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
    faire un delete dans un gestionnaire d'évènement est une grave erreur !

    Attention que fiche1 ne soit pas à la fois un membre privé et une variable locale

    cela vous arrive de lire l'aide ?
    Pour fermer une fenêtre modale il faut affecter ModalResult de la form concerné ou alors il suffit de créer un TBitBtn avec le type bkClose qui ne nécessite aucun code, avec une variable locale !
    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
     
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      TForm* fiche1 = new TForm(NULL);
      try
      {
        MonBouton = new TBitBtn(fiche1);
        MonBouton->Left = 40;
        MonBouton->Top = 40;
        MonBouton->Kind = bkClose;		
        MonBouton->Parent = fiche1;
     
        fiche1->ShowModal();
      }
       __finally 
      {
         delete fiche1;
      }
    }
    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

  7. #7
    Membre très actif Avatar de nirgal76
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 923
    Par défaut
    tu déclare dans le .h (ce qui n'a rien à faire ici d'ailleurs puisqu'utilisé en variable locale)
    et tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TForm*fiche1 =new TForm(this);
    fiche1, tu veux que ce soit de type TForm* ou TForm1* ?
    (TForm je pense)

    et comme l'a corrigé le vilain Unas, utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TForm* fiche1 = new TForm(NULL);
    plutot que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TForm* fiche1 = new TForm(this);
    car si tu te charge du delete, fiche1 n'a pas besoin d'un owner dans son constructeur.
    Et donne à ton bouton une valeur à sa propriété ModalResult pour qu'il ferme la fenêtre (si c'est là son unique but) car elle est à MrNone (0) par défaut. Et la fonction ShowModal ne sort que si ModalResult est <> 0 (cf. Forms.pas dans les sources de la VCL ou dans l'aide par la touche F1).

  8. #8
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 18
    Par défaut Merci
    Bonjour à tous.

    Merci d'avoir passé du temps pour résoudre mon problème.
    Je vais tester les solutions que vous m'indiquez.

    ShaiLeTroll, merci pour votre réponse.
    Je lis l'aide associé au compilateur mais, malheureusement, je n'ai pas le niveau pour tout comprendre et assimiler rapidement.

    Je vous tiens au courant.

  9. #9
    Membre très actif Avatar de nirgal76
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 923
    Par défaut
    Citation Envoyé par sergeprd Voir le message
    Bonjour à tous.

    Merci d'avoir passé du temps pour résoudre mon problème.
    Je vais tester les solutions que vous m'indiquez.

    ShaiLeTroll, merci pour votre réponse.
    Je lis l'aide associé au compilateur mais, malheureusement, je n'ai pas le niveau pour tout comprendre et assimiler rapidement.

    Je vous tiens au courant.
    Au final, tu auras ça dans le code du bouton de ta fiche principale (moi sous BCB2010) :

    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
     
      TForm* fiche1 = new TForm(reinterpret_cast<TComponent*>(NULL));
      try
      {
        TBitBtn* MonBouton = new TBitBtn(fiche1);
        MonBouton->Left = 40;
        MonBouton->Top = 40;
        MonBouton->Kind = bkClose; // Fait le ModalResult
        MonBouton->Parent = fiche1;
     
        fiche1->ShowModal();
      }
       __finally
      {
         delete fiche1;
      }

  10. #10
    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
    lol, la fin de semaine je fait juste corriger les erreurs de compilation et de linker, j’essaie pas de comprendre se que le programmeur veux faire

    sergeprd, regarde les derniers messages, c'est la bonne façon de faire.

  11. #11
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 18
    Par défaut
    Bonsoir à tous.

    Je viens d'essayer les solutions que vous m'avez proposé.
    Ca fonctionne presque comme je le veux.
    je ferai demain de plus amples essais et je vous en soumettrez les résultats.

    Merci beaucoup pour votre aide!

  12. #12
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 18
    Par défaut
    Bonjour à tous.

    le seul "changement" que j'ai fait, c'est, remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonBouton->Kind = bkClose;
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonBouton->Kind = mrOk;
    Ca me permettra de mémoriser certaines variables avant de fermer "fiche1".
    Je n'ai pas encore assimiler tout ce que vous m'avez appris, mais j'y travaille.

    Mille remerciements à:

    Crayon , ShaiLeTroll et nirgal76.

    Je clôturerai cette discussion si personne n'a de remarque à faire sur le changement que j'ai effectué.

    Sans votre aide, j'aurais abandonné.

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

Discussions similaires

  1. fermer une fenêtre créée dynamiquement
    Par ToraTora dans le forum MFC
    Réponses: 5
    Dernier message: 27/05/2008, 16h01
  2. [ezPDF] Fonction addImage : insérer une image créée dynamiquement
    Par Huntress dans le forum Bibliothèques et frameworks
    Réponses: 37
    Dernier message: 29/11/2005, 11h20
  3. Centrer un texte sur une image créée dynamiquement
    Par rigolman dans le forum Langage
    Réponses: 7
    Dernier message: 11/10/2005, 17h22
  4. Impossible de fermer une base de données en lecture
    Par requiemforadream dans le forum ASP
    Réponses: 7
    Dernier message: 21/04/2005, 16h58
  5. Problèmes avec une TForm créée dynamiquement
    Par Pascal Jankowski dans le forum Composants VCL
    Réponses: 5
    Dernier message: 30/03/2005, 11h55

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