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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 093
    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 093
    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

+ 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