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 :

Problème de Passage d'un Form à un Autre.


Sujet :

C++Builder

  1. #1
    Invité(e)
    Invité(e)
    Par défaut Problème de Passage d'un Form à un Autre.
    Bonjour,

    (Je développe un logiciel de gestion de note).

    Voila j'explique mon problème:

    - j'ai une variable globale int statusWindows;
    - j'ai une classe TForm1 qui contient un TEdit et un Bouton.
    - j'ai une classe TForm2 qui contient plusieurs TEdit ainsi q'un Bouton.

    Avec ma Form1, le TEdit1 récupere un Entier (nombre_eleve) et le Bouton envoie l'Entier à cette fonction: Recup();

    Je voudrais faire en sorte que la fonction Recup( ) crée une TForm2 dynamique à chaque Fermeture de la TForm2 précedente gràce au Bouton du TForm2 crée dynamiquement qui correspond à : statusWindows = 0; TForm2 -> Close();

    Donc Je voudrais créer des TForm2 dynamique (autant qu'il y a de nombre_eleve) et afficher les une apres les autres quand on clique sur un Bouton.

    Le problème c'est que quand la 1ere TForm2 est crée et que je clique sur le Bouton pour la fermer et passer à l'autre, rien ne se passe...

    Voici mon code:


    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
     //declarer en global
     
    int statusWindows;
     
    void Recup(int NombreDeleve)
    {
      int i=0;
      char bof[15];
     
    //Fonction Creation Dynamique Fenetre pour chaque eleve !
      for(i=1;i <  NombreDeleve+1;i++)
      {
             TForm2 *F;
             F = new TForm2(Form2);
             // bof = Eleve n° X
             sprintf(bof, "Eleve n° %d", i);
     
            //Caption = bof
            F-> Caption = bof;
     
            //Edit3 -> Numero de l'éleve
            F -> Edit3 -> Text = i;
     
            if  (statusWindows == 0) Fshow(F);
            i++;
       }
    }
     
     
    bool Fshow( TForm2 *x)
    {
                  statusWindows = 1;
                  x -> Show();
    }


    dans TForm2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     void __fastcall TForm2::Button1Click(TObject *Sender)
    {
    statusWindows = 0;
    Form2->Close();
    }

  2. #2
    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
    Votre énoncé est assez confus, je sais trop que répondre.

    Je constate que vos fonctions ne sont pas des méthodes, ce qui ne se fait pas trop en C++ Builder. Et votre variable générale devrait plutôt faire partie de la classe principale, ainsi qu'il est d'usage.

    Mais sur le fond, je ne puis répondre n'ayant pas tellement compris ce que vous voulez faire.

    Prenez la peine de reformuler et j'essaierai de vous aider.

    À bientôt
    Gilles

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Comment pourrais-je détecter la fermeture d'une TForm2 crée dynamiquement a partir de la TForm1 ?

    Car je voudrais récupérer un Entier sur la TForm1 qui sera le nombre de TForm2 à créer dynamiquement.

    Sachant que les TForm2 devront s'afficher les unes après les autres. Comment puis-je faire en sorte que la prochaine TForm2 s'affiche apès que la TForm2 précédente se termine (grâce à un ButtonOnClick ou autre...).

    Merci,

  4. #4
    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
    Pour détecter la fermeture d’une fenêtre créée dynamiquement, il faut associée la fenêtre créée à un événement OnClose en respectant la liste des arguments de ce type de fonction.

    Par exemple, dans la classe principale TForm1, vous déclarez une variable NbFen (nombre de fenêtres), un pointeur de liste pour les adresses des fenêtres, et deux méthodes, un pour le clic sur le bouton et l’autre pour la fermeture.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int NbFen;
    TList *pTL;
     
    void __fastcall BClick(TObject*);
    void __fastcall FClose(TObject*, TCloseAction&);
    On initialise les variables dans le constructeur de la classe principale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
    pTL=new TList;
    NbFen=0;
    }
    On rend la mémoire du TList au moment du OnDestroy de l’application.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
    delete pTL;
    }
    Admettons que les fenêtres se créent sur clic d’un bouton de Form1. On peut procéder comme suit :

    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
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    TForm *f;
    TButton *b;
     
    f=new TForm(Application);
    pTL->Add(f);
    f->Visible=true;
    f->Caption="Fenêtre "+IntToStr(++NbFen);
    f->OnClose=FClose;
    b=new TButton(f);
    b->Parent=f;
    b->Caption="GO!";
    b->OnClick=BClick;
    b->Tag=NbFen; 
    }
    Vous voyez qu’on a associé au clic du bouton notre méthode BClick et à la fermeture de la fenêtre créée notre méthode FClose, déclarées dans la classe principale. Le Tag du bouton contient l’indice incrémenté de l’item dans la TList. Dans ces conditions, on retrouve facilement son adresse,au moment du clic.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void __fastcall TForm1::BClick(TObject *Sender)
    {
    TForm *f;
    TButton *b;
     
    b=(TButton*)Sender;
    f=(TForm*)pTL->Items[b->Tag-1];
    f->Close();
    }
    Comme le Sender correspond au bouton cliqué de la fenêtre créée dynamiquement, on lit le tag du bouton, l’adresse dans la TList à cet indice décrémenté correspond à l’adresse de la fenêtre en question que l’on ferme. Dans ces conditions, la méthode FClose de Form1 est appelée au moment de sa fermeture, vous avez la main et vous faites que ce vous voulez. Notamment vous pourrez écrire Action=caFree pour libérer la mémoire correspondant à cette fenêtre si elle disparaît définitivement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void __fastcall TForm1::FClose(TObject *Sender, TCloseAction &Action)
    {
    }
    À bientôt
    Gilles

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/06/2009, 09h29
  2. Réponses: 2
    Dernier message: 23/11/2008, 14h39
  3. passage d'un form à un autre
    Par totoche dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 15/11/2007, 09h48
  4. Réponses: 2
    Dernier message: 23/05/2007, 16h47
  5. passage d'une form à l'autre
    Par mat-tech dans le forum Delphi
    Réponses: 8
    Dernier message: 13/05/2006, 15h15

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