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 dynamique de fenêtre


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 création dynamique de fenêtre
    Bonjour,
    J'aimerai faire une création de fenêtre dynamique. Je m'explique: lorsque j'appuie sur un bouton, j'aimerai ouvrir une Form contenant des informations. Si j'appuie sur ce même bouton alors que la Form ouverte n'est pas fermée, j'aimerai en créé une identique à la première.

    J'ai trouvée une fonction CreateForm, seulement les explications disent de ne pas appeler cette fonction dans une application.
    L'instruction new ne reconnait pas le type TForm.

    Est ce que quelqun sait comment faire?
    Merci d'avance

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    Par défaut
    bonjour

    pour ma part j'ai une Form modèle que je peux créer dynamiquement.
    je l'ai appelé Formulaire
    j'utilise new et delete pour créer et supprimer les forms (copies du modèle) dont j'ai besoin
    je stocke l'adresse de chaque Form dans une TList pour pouvoir l'identifier et la manipuler par la suite (mes Forms sont identifiées par une variable unique)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TFformulaire* Formulairex = new TFformulaire(this);
    Liste_de_Form->Add(Formulairex);
     
    Formulairex= 	(TFformulaire*) Liste_de_Form->Items[nbr];

  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
    Ok, c'est cool j'ai adapté ton code à mon application et ca ne génère pas d'erreur (super ) mais je dois surement créer des Form dont la propriété Visible est à false. Ce qui m'amène à la question suivante:

    Comment fais tu pour les manipuler indépendemment les unes des autres ? :

  4. #4
    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
    Merci Emmental

    Je ne sais toujours pas comment les manipuler séparément, mais après avoir mis la propriété visible de ma fenêtre copié à true, je les vois!!!
    C'est exactement ce que je voulais.


    Par contre, pourrait tu m'expliquer comment les manipuler s'il te plait?

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    Par défaut
    j'ai oublié de préciser qu'il fallait mettre cette fiche modèle dans la catégorie"fiches disponibles", par oposition aux fiches créées automatiquement
    sur bds2006 : Projet/options/Fiches...

    quant à manipuler mes fiches individuellement, je ne sais pas si c'est la meilleure méthode, mais je les identifie par un nom particulier au moment de leur création et ce nom comporte un chiffre que j'incrémente à chaque création... il suffit d'extraire ce chiffre qu je retrouve dans ma variable "nbr"

    quand je rappelle une fiche, j'utilise un pointeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TFformulaire*  Formulaired;
    Formulaired = (TFformulaire*) F1->Liste_de_Form->Items[F1->nbr];
    voila, si quelqu'un a d'autres idées cela m'interesse

  6. #6
    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
    J'ai réussi à y accéder de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    ((TForm3*) Liste_de_Form->Items[fenetre])->Label13->Caption="Envoie de données, Trame n°"+IntToStr(fenetre);
    J'ai remarqué que l'évènement généré sur la Form de base (OnClikButton) est le même sur la Form créé.

    C'est nickel, encore un grand MERCI à toi !

  7. #7
    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
    Excuse moi d'insister, mais j'ai des soucis sur la supression des Forms créées. J'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        delete ((TForm3*) Liste_de_Form->Items[num_fenetre]);
    mais cela me génère une erreur. J'ai aussi tenté avec "exit(0)", mais cela me ferme mon application. J'ai aussi essayé de simuler l'évènement OnClose de la fenêtre, mais le passage du paramètre "Action" à caFree ne passe pas, et cette action n'a aucun effet.

    Pourrais tu m'expliquer comment tu fais, s'il te plais?

  8. #8
    Membre éprouvé
    Avatar de Freeze
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 131
    Par défaut
    Salut,

    et t'as essayé :

    pour la fermeture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((TForm3*) Liste_de_Form->Items[num_fenetre])->Close();

  9. #9
    Membre averti

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    Par défaut
    bonjour

    d'après ce que j'ai constaté, tu ne peux pas faire le delete dans la Form qui a été créée dynamiquement
    là tu peux juste faire, par exemple:
    mais cela ne détruit pas la Form, il faut le faire ailleurs dans ton programme

  10. #10
    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
    Tout d'abord, encore une fois merci Emmental et ,merci Freeze pour ta proposition.

    J'ai essayé le Close() mais cela ne marche pas, j'aurais aimé que la fenêtre se ferme d'elle même et comme Emmental l'a dit, il n'y a que le Hide qui "simule" cette effet.

    Mais finalement, la meilleure solution reste de la fermer manuellement à l'aide de la croix prévue à cette effet .

    Merci encore

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Je sais que c'est déjà résolu, mais as-tu essayé de fermer ta fenêtre avec
    Release() ?

  12. #12
    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
    Je viens d'essayer et malheureusement sans succès, mais merci quand même pour ta proposition Patrick.

  13. #13
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    J'ai fait un test avec Close et cela semble fonctionner. Je ne comprends pas la source de ton problème. Voici mon code s'il peut t'aider:

    Une fiche avec 3 boutons:
    Button1->Caption="Ouvrir fiche n°1"
    Button2->Caption="Ouvrir fiche n°2"
    Button3->Caption="Fermer fiche et ses descendants"

    TForm1.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 Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// IDE-managed Components
      TButton *Button1;
      TButton *Button2;
      TButton *Button3;
      void __fastcall Button1Click(TObject *Sender);
      void __fastcall Button2Click(TObject *Sender);
      void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
      void __fastcall Button3Click(TObject *Sender);
    private:	// User declarations
    public:		// User declarations
      __fastcall TForm1(TComponent* Owner);
      TForm1 *form1;
      TForm1 *form2;
     
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    TForm1.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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
      form1=NULL;
      form2=NULL;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     
      if (!form1) {
        form1=new TForm1(NULL);            // Pas de owner si la fenêtre se ferme toute seule
        if (!form1) return;                // Erreur!
        form1->Caption=Caption+":1";
      }
     
      form1->Show();
     
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
     
      if (!form2) {
        form2=new TForm1(NULL);            // Pas de owner si la fenêtre se ferme toute seule
        if (!form2) return;                // Erreur!
        form2->Caption=Caption+":1";
      }
     
      form2->Show();
     
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
      if (form1) form1->Close();
      if (form2) form2->Close();
     
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
      // Close form
      Close();
    }
    //---------------------------------------------------------------------------

  14. #14
    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
    C'est sympa, merci de m'avoir donné ton code source

    J'ai essayé tout simplement le "Close();", et en effet je ferme ma fenêtre, mais quand j'insère le code juste avant pour le traitement de ma liste comportant les adresses des Forms, l'instruction Close génère alors une erreur. Mais ne t'inquiète pas, je contourne le problème à présent en imposant l'utilisateur de la fermer manuellement (ce qui m'arrange en fait).

    Merci encore de partager votre expérience et pour vos bons conseils

  15. #15
    Membre confirmé
    Inscrit en
    Mai 2003
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 81
    Par défaut
    Dans l'aide de delphi j'ai trouvé ce commentaire :

    TObject.Free

    Avertissement : Ne libérez jamais explicitement un composant dans l'un de ses propres gestionnaires d'événement ou dans un gestionnaire d'événement d'un composant qu'il possède ou contient. Par exemple, ne libérez pas un bouton, ou la fiche le possédant, dans son gestionnaire d'événement OnClick.

  16. #16
    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
    Ok, je vais tester ca.
    Merci, mais sinon, j'ai réussi à négocier pour ne pas avoir à la fermer par logiciel.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 29/09/2019, 14h54
  2. [D7] Création dynamique de Form
    Par jer64 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 03/08/2003, 12h20
  3. [Rave Report] problème de création dynamique
    Par Nivux dans le forum Rave
    Réponses: 2
    Dernier message: 24/05/2003, 00h07
  4. TWebBrowser et création dynamique
    Par BakaOnigiri dans le forum Web & réseau
    Réponses: 2
    Dernier message: 01/09/2002, 10h53
  5. Création dynamique de TImages
    Par Dric dans le forum C++Builder
    Réponses: 10
    Dernier message: 08/07/2002, 12h36

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