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 :

Problème d'instanciation d'objet lorsqu'on modifie le formulaire


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 196
    Points : 53
    Points
    53
    Par défaut Problème d'instanciation d'objet lorsqu'on modifie le formulaire
    J'ai une application qui est le jeu des allumettes.
    Pour afficher mes allumettes j'utilise une picture box que j'ai rajouté manuellement dans le designer.cs de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private System.Windows.Forms.PictureBox[] ImageAllumettes;
    Je ne l'ai pas crée via l'outil car je vais ensuite lui assigné les valeurs que je veux et avoir plusieurs images dans cette picturebox.
    Voilà comment ensuite je lui attribue les valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int X = 22;//position de la premiere allumette
                int Y = 28;
     
                for (int i = 0; i < 26; i++)// pour chaque allumettes
                {
                    ImageAllumettes[i] = new System.Windows.Forms.PictureBox();//on ajoute une nouvelle picturebox sur le formulaire
                    ((System.ComponentModel.ISupportInitialize)(ImageAllumettes[i])).BeginInit();//on l'initialise
                    ImageAllumettes[i].Image = global::Jeu_des_Allumettes.Properties.Resources.Allumette;//on lui met l'image de l'allumette
                    ImageAllumettes[i].Location = new System.Drawing.Point(X, Y);//on la place sur le formulaire
                    ImageAllumettes[i].Name = "ImgAllumette" + i;//on la nomme
                    ImageAllumettes[i].Size = new System.Drawing.Size(11, 80);//on lui donne la bonne taille
                    Controls.Add(ImageAllumettes[i]);//on ajoute le controle dans le formulaire
                    X = X + 20;//on prépare la position de la prochaine allumette, + 20 pixel sur l'horizontal
                }
    Le problème est que maintenant à chaque changement du design de mon formulaire que ce soit le 'bougageage' d'un bouton ou d'un label j'ai le droit à un beau :

    La référence d'objet n'est pas définie à une instance d'un objet.
    A l'endroit au moment de l'initialisation de mon allumette...
    D'où vient le problème ? Merci d’avance !

  2. #2
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Hello,

    il ne faut pas toucher au Designer.cs. Place ton code dans le corps de la classe, parce que le contenu de Designer.cs est, comme indiqué dans ses commentaires, la chasse gardée du designer, qui y fait tout ce qu'il veut, y compris supprimer ce qu'il ne sait pas interpréter.
    ಠ_ಠ

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 196
    Points : 53
    Points
    53
    Par défaut
    Merci pour ta réponse.
    Le problème c'est que je n'arrive pas à déclarer mon tableau de Picturebox[] ImageAllumettes dans le corps de ma classe.
    J'ai toujours le droit à une erreur.
    Tu pourrais me dire comment déclarer un tableau de picturebox ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Bonjour,
    pourquoi ne pas utiliser une liste ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<PictureBox> liste_image = new List<PictureBox>();
    Dans une List<> tu peux mettre ce que tu veux. C'est un tableau d'objet string int float textbox MonObjetAMoi etc...
    J'espère que la solution te convient sinon exposes un peu plus ce que tu veux faire.

    Bonne continuation.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 196
    Points : 53
    Points
    53
    Par défaut
    Je n'ai jamais utilisé de liste en fait c'est pour ça
    ça va impliquer le changement d'autres trucs non ? Ou est-ce que ça fonctionne comme un tableau ?
    Dans mon exemple par exemple ?

    J'ai fais comme ça mais j'ai une erreur comme quoi mon index était hors limite

    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
     List<PictureBox> ImageAllumettes = new List<PictureBox>(26);
            Partie PartieEnCours;
     
            public Form1()
            {
                InitializeComponent();
     
     
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                int X = 22;//position de la premiere allumette
                int Y = 28;
     
                for (int i = 0; i < 26; i++)// pour chaque allumettes
                {
     
                  ImageAllumettes[i] = new System.Windows.Forms.PictureBox();//on ajoute une nouvelle picturebox sur le formulaire
                    ((System.ComponentModel.ISupportInitialize)(ImageAllumettes[i])).BeginInit();//on l'initialise
                    ImageAllumettes[i].Image = global::Jeu_des_Allumettes.Properties.Resources.Allumette;//on lui met l'image de l'allumette
                    ImageAllumettes[i].Location = new System.Drawing.Point(X, Y);//on la place sur le formulaire
                    ImageAllumettes[i].Name = "ImgAllumette" + i;//on la nomme
                    ImageAllumettes[i].Size = new System.Drawing.Size(11, 80);//on lui donne la bonne taille
                    Controls.Add(ImageAllumettes[i]);//on ajoute le controle dans le formulaire
                    X = X + 20;//on prépare la position de la prochaine allumette, + 20 pixel sur l'horizontal
                }
    PS = j'ai mis ma liste à 26 car au départ j'ai 26 allumettes.

    Avant j'avais dans mon designer.cs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
               this.ImageAllumettes = new System.Windows.Forms.PictureBox[26];
    et ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            private System.Windows.Forms.PictureBox[] ImageAllumettes;
    Que j'ai supprimé.

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    C'est un tableau dynamique tout bête. Du même genre qu'un ArrayList.
    Voila un petit code qui met œuvre les fonctions de base d'un tableau :

    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
    List<PictureBox> liste_pictureBox = new List<PictureBox>();
                PictureBox picture_box_1 = new PictureBox();
                PictureBox picture_box_2 = new PictureBox();
     
                //ajoute des pictures box dans le tableau
                liste_pictureBox.Add(picture_box_1);
                liste_pictureBox.Add(picture_box_2);
     
                //ma picture box 1 est dans l'index 0 du tableau
                //ma picture box 2 est dans l'index 1 du tableau
                MessageBox.Show("nombre de picture box dans le tableau :" + liste_pictureBox.Count); // affiche 2
     
                //suppression de la picture box 2 dans le tableau
                liste_pictureBox.RemoveAt(1);
     
                MessageBox.Show("nombre de picture box dans le tableau :" + liste_pictureBox.Count); // affiche 1
    Est-ce vraiment une liste de picture box que tu veux ou une liste d'image à charger dans une picture box ?

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Ok c'est bien une liste de picturebox.
    Non ce genre de tableau est dynamique. Tu peux l'initialiser à 26 mais bon...

    Dis moi en plus sur ce que tu veux faire.
    Tu devrais faire on initialisation dans le constructeur et non pas dans la fonction réflexe à l'évènement Load();
    Dans le constructeur tu pourrais faire ta boucle de 0 à <26 déclarer une à une tes 26 picturebox et les ajouter au fur et à mesure dans ta collection (tableau).

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 196
    Points : 53
    Points
    53
    Par défaut
    En fait c'est une liste d'image d'allumette qui en fonction du choix de l'ordinateur ou de la personne se cache.
    DOnc c'est toujours la même image repetee x fois dans ma picture box.
    Je sais pas si je suis clair ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 196
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par lead8209 Voir le message
    Ok c'est bien une liste de picturebox.
    Non ce genre de tableau est dynamique. Tu peux l'initialiser à 26 mais bon...

    Dis moi en plus sur ce que tu veux faire.
    Tu devrais faire on initialisation dans le constructeur et non pas dans la fonction réflexe à l'évènement Load();
    Dans le constructeur tu pourrais faire ta boucle de 0 à <26 déclarer une à une tes 26 picturebox et les ajouter au fur et à mesure dans ta collection (tableau).
    Ok j'ai enlevé le 26 alors

    En fait j'ai une image d'allumettes que je repete 26 fois et que je stocke ensuite dans une liste de picturebox pour ensuite les caché au fur et à mesure que lesjoueurs jouent.

    EDIT : vaudrait mieux que je fasse tout cela dans le Form1 donc ?

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Hmmm je ne sais pas ça dépend de l'architecture de ton appli...
    Tu veux les cacher suite à un clic ?
    C'est quoi le jeu de l'allumette ? Y'a au moins deux joueurs et chacun clique sur une allumette et celui qui clique sur la dernière a perdu ?

    A ce moment là pourquoi pas :
    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
    public Fenêtre_Visualisation() //constructeur
            {
                InitializeComponent();
     
                //création et ajout des pictures box dans le tableau
                List<PictureBox> liste_pictureBox = new List<PictureBox>();
                 PictureBox picture_box_0 = new PictureBox();
                liste_pictureBox.Add(picture_box_0);
                PictureBox picture_box_1 = new PictureBox();
                liste_pictureBox.Add(picture_box_1);
                PictureBox picture_box_2 = new PictureBox();
                liste_pictureBox.Add(picture_box_2);
                PictureBox picture_box_3 = new PictureBox();
                liste_pictureBox.Add(picture_box_3);
                PictureBox picture_box_4 = new PictureBox();
                liste_pictureBox.Add(picture_box_4);
                PictureBox picture_box_5 = new PictureBox();
                liste_pictureBox.Add(picture_box_5);
                PictureBox picture_box_6 = new PictureBox();
                liste_pictureBox.Add(picture_box_6);
                PictureBox picture_box_7 = new PictureBox();
                liste_pictureBox.Add(picture_box_7);
                //etc...
                PictureBox picture_box_25 = new PictureBox();
                liste_pictureBox.Add(picture_box_25);
     
     
                Image allumette = Bitmap.FromFile(@"C:\.........\allumette.bmp") ; //chargement de l'image allumette dans un objet
                for (int i = 0; i < 26; i++) //initialisation des picturebox
                {
                    liste_pictureBox[i].Image = allumette; //initialisation des picture box
                    liste_pictureBox[i].Visible = true;
                    int X = i * 5;
                    int Y = 10;
                    liste_pictureBox[i].Location = new System.Drawing.Point(X, Y);
                    liste_pictureBox[i].Click += new EventHandler(ClicSurPictureBox);
                     Controls.Add(ImageAllumettes[i]);//on ajoute le controle dans le formulaire
     
                }
            }
     
            void ClicSurPictureBox(object sender, EventArgs e)
            {
                //visible = false ;
            }

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 196
    Points : 53
    Points
    53
    Par défaut
    en fait le principe et que chaque joueur tire l'un après lautre de une à 3 allumettes (il ye n a 26 au départ).
    Celui qui tire la dernière a perdu.

    Donc ça veut dire que j'ai une liste déroulante ou je choisis un chiffre entre 1 et 3 ensuite grâce à un bouton ça va cacher les allumettes (de 1 à 3)
    etc...

  12. #12
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Bah tu as toute la solution dans le bout de code que je t'ai posté ^^
    Juste il faut que tu relie la validation de la sélection d'une allumette avec le changement de visibilité du picturebox.


    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     class fenetre_jeu_alumette
         {
     
             /// <summary>
             /// liste des picture box 
             /// </summary>
            List<PictureBox> liste_pictureBox = new List<PictureBox>();
     
     
             /// <summary>
             /// constructeur par défaut qui initialise les picture box avec les images d'alumette et qui les place sur la form
             /// </summary>
            public Fenêtre_Visualisation() //constructeur
            {
     
                InitializeComponent();
     
                //création et ajout des pictures box dans le tableau
     
                PictureBox picture_box_0 = new PictureBox();
                liste_pictureBox.Add(picture_box_0);
                PictureBox picture_box_1 = new PictureBox();
                liste_pictureBox.Add(picture_box_1);
                PictureBox picture_box_2 = new PictureBox();
                liste_pictureBox.Add(picture_box_2);
                PictureBox picture_box_3 = new PictureBox();
                liste_pictureBox.Add(picture_box_3);
                PictureBox picture_box_4 = new PictureBox();
                liste_pictureBox.Add(picture_box_4);
                PictureBox picture_box_5 = new PictureBox();
                liste_pictureBox.Add(picture_box_5);
                PictureBox picture_box_6 = new PictureBox();
                liste_pictureBox.Add(picture_box_6);
                PictureBox picture_box_7 = new PictureBox();
                liste_pictureBox.Add(picture_box_7);
                //etc...
                PictureBox picture_box_25 = new PictureBox();
                liste_pictureBox.Add(picture_box_25);
     
     
                Image allumette = Bitmap.FromFile(@"C:\.........\allumette.bmp"); //chargement de l'image allumette dans un objet
                for (int i = 0; i < 26; i++) //initialisation des picturebox
                {
                    liste_pictureBox[i].Image = allumette; //initialisation des picture box
                    liste_pictureBox[i].Visible = true;
                    int X = i * 5;
                    int Y = 10;
                    liste_pictureBox[i].Location = new System.Drawing.Point(X, Y);
                    Controls.Add(liste_pictureBox[i]);//on ajoute le controle dans le formulaire
     
                }
            }
     
             /// <summary>
             /// fonction appellee lorsqu'un utilisateur selecitonne un chiffre
             /// </summary>
             /// <param name="sender"></param>
             /// <param name="e"></param>
            void SelectionDuNombreDallumette(object sender, EventArgs e)
            {
                int nombreDallummetteSelectionnees = 1;//1 2 ou 3 c'est la regle
                int n_allumetteVisibles = 0;
                foreach(PictureBox unePictureBox in liste_pictureBox)
                {
                    if (unePictureBox.Visible)
                        n_allumetteVisibles++;
                }
                if (nombreDallummetteSelectionnees >= n_allumetteVisibles)
                {
                   if( MessageBox.Show("C'est perdu !\nRecommencer une partie ?","Message",MessageBoxButtons.YesNo,MessageBoxIcon.Question) == DialogResult.Yes)
                   {
                        Application.Restart(); //echappement on rejoue
                   }
                   else
                   {
                       Application.Exit(); //echappement on ne rejoue pas
                   }
                }
                else
                {
                    for(int i=0;i<nombreDallummetteSelectionnees;i++) //il faut cacher n allumettes
                    {
                        foreach (PictureBox unePictureBox in liste_pictureBox) //on parcour le tableau d'allumette jusqu'à ce qu'on en trouve une visible puis la cache
                        {
                            if (unePictureBox.Visible)
                            {
                                unePictureBox.Visible = false;
                                break; //la boucle s'arrete et on passe à l'allumette suivante à cacher ssi il y en a encore à cacher
                            }
                        }                
                    }              
                }
                //echappement un autre joueur doit selecitonner 1-3 allumette
            }
         }

    Voila quelque chose de simplifié. Si tu as des questions.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 196
    Points : 53
    Points
    53
    Par défaut
    Wahou !
    Merci beaucoup pour ton implication !
    Cependant j'aurais du te dire que le reste je l'avais déjà fait ça t'aurait empêcher de faire tout ça pour rien...
    M'enfin je te remercie grandement pour les explications en tout cas car cela m'a servi à faire fonctionner l'application et commencer à découvrir comment fonctionne les listes.

    En tout cas merci énormément

  14. #14
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Pas de soucis
    Au plaisir.

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

Discussions similaires

  1. Problème d'instanciation d'objet
    Par 1974k dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 27/12/2014, 16h58
  2. [PHP 5.3] Problème d'instanciation d'objet
    Par lecra dans le forum Langage
    Réponses: 2
    Dernier message: 08/05/2011, 14h01
  3. [COM] Problème d'instanciation d'objet COM
    Par lpapouk dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 02/07/2008, 15h14
  4. Réponses: 7
    Dernier message: 18/07/2006, 12h23

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