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

Windows Forms Discussion :

[C#][VS2003] Instance unique


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Points : 80
    Points
    80
    Par défaut [C#][VS2003] Instance unique
    Voilà, j'ai développé un éditeur de texte muni de la fonction Rechercher sous VS2003.
    Je me retrouve avec ma Form1 (l'éditeur de texte) et ma Form2 (recherche de mot), Form1 appelle Form2 en sélectionnant l'option qu'il faut dans mon mainMenu.
    J'aurais aimé ne pouvoir autoriser qu'une seule instance de Form2, c'est-à-dire que tant que Form2 n'est pas fermé, je ne peux pas en crée un autre. Et fermer la Form2 suppose que cette instance est détruite.

    J'ai regardé un petit peu le design pattern Singleton, je n'ai pas tout compris mais je ne suis pas sûr que ce soit réellement ça que je cherche.
    Une idée svp ?

    Voilà comment j'appelle ma Form2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private void menuRechercher_Click(object sender, System.EventArgs e)
            {
                 Form2 form2 = new Form2(richTextBox, false); // instanciation de Form2
                 Form2.Text = "Menu Rechercher"; // un paramètre optionnel
            }

    Je viens de trouver le tutoriel sur le site : http://faqcsharp.developpez.com/?pag...gleinstanceapp
    Est-il obligatoire d'utiliser les Threads pour résoudre mon problème ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 130
    Points : 91
    Points
    91
    Par défaut
    Une solution un peu simplète serait de déclarer un champ form2 dans ta classe form1 :

    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
    public class form1 : form{
    Form2 form2; // la référence sur la form qui serait créée
    ...
    ...
    private void menuRechercher_Click(object sender, System.EventArgs e)
            {
                 if (form2==null) // si ça pointe sur null c'est 
                                      // qu'il n'y a pas d'insatance
                 {
                 form2 = new Form2(richTextBox, false); // instanciation de Form2
                 Form2.Text = "Menu Rechercher"; // un paramètre optionnel
                 }
             }
    }
    ....
    } // class

  3. #3
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Citation Envoyé par Mandotnet
    Une solution un peu simplète serait de déclarer un champ form2 dans ta classe form1 :

    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
    public class form1 : form{
    Form2 form2; // la référence sur la form qui serait créée
    ...
    ...
    private void menuRechercher_Click(object sender, System.EventArgs e)
            {
                 if (form2==null) // si ça pointe sur null c'est 
                                      // qu'il n'y a pas d'insatance
                 {
                 form2 = new Form2(richTextBox, false); // instanciation de Form2
                 Form2.Text = "Menu Rechercher"; // un paramètre optionnel
                 }
             }
    }
    ....
    } // class
    Le problème avec cette solution est que tu as une instance de form2 par form1.
    Il faut voir si ça correspond à ce que tu as besoin (exemple : application MDI avec possibilité de lancer une recherche par document ouvert, en même temps).

    S'il te faut vraiment une et une seule form2 ouverte quoiqu'il arrive, il vaut mieux se diriger vers le DP singleton, effectivement, dont voici une implémentation possible :
    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
    public partial class Form2 : Form
    {
        private static Form2 myInstance = null;
     
        public static Form2 getInstance() {
            if (myInstance == null)
                myInstance = new Form2();
            return myInstance;
        }
     
        private Form2() {
            InitializeComponent();
        }
    }
     
    public partial class Form1 : Form
    {
        public Form1() {
            InitializeComponent();
        }
     
        private void Form1_Load(object sender, EventArgs e) {
            Form2 form = Form2.getInstance();
            // TODO
        }
    }

  4. #4
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 584
    Points : 265
    Points
    265
    Par défaut
    ou surcharger la classe form et faire un singleton.

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Points : 80
    Points
    80
    Par défaut
    Je me suis tourné vers la solution proposée par davcha, et ça fonctionne, merci bien .

    Par contre lorsque la Form2 est fermée, il faut que dans la méthode qui permet de fermer Form2, j'initialise avec
    afin de pouvoir rappeler une Form2 si besoin.
    Par contre je n'ai pas encore réussi à récupérer la fermeture de la Form2 via la croix en haut à droite, il me faudrait récupérer cette action et ajouter mon initialisation de myInstance à null.

  6. #6
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    tu as la fermeture de la fenetre par la fonction FormClosing de celle-ci...

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Points : 80
    Points
    80
    Par défaut
    Je la définie comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    this.Closing += new CancelEventHandler(FormClosing);
     
    // ...
     
    public void FormClosing(object sender, CancelEventArgs e)
            {
                myInstance = null;
            }
    Et tout fonctionne, merci bien
    C'est vraiment une bombe, VS2003 .

  8. #8
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    parfait alors, continu bien...

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

Discussions similaires

  1. Instance unique des fenetres.
    Par TryExceptEnd dans le forum Delphi
    Réponses: 8
    Dernier message: 03/01/2007, 21h09
  2. Réponses: 1
    Dernier message: 20/06/2006, 15h11
  3. [VB] Instance unique d'une application
    Par Mimoza dans le forum Windows Forms
    Réponses: 8
    Dernier message: 19/06/2006, 17h51
  4. [MFC] instance unique de dialogue non modale
    Par venomelektro dans le forum MFC
    Réponses: 5
    Dernier message: 02/02/2005, 12h41
  5. [VB6] [DLL] DLL à instance unique
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 19/09/2003, 08h07

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