Probleme avec controls.add

drx7 Messages postés 16 Date d'inscription dimanche 27 mai 2007 Statut Membre Dernière intervention 8 juin 2009 - 1 juin 2009 à 22:25
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 - 8 juin 2009 à 15:45
bonsoir

je n'arrive pas à résoudre le probleme suivant:

1er cas
Avec l'interface graphique de visualstudio je crée un panel et en ligne de code à l'aide de "controls.Add" j'y ajoute une picturebox, ca marche impecable;

2eme cas
je ne passe pas par l'interface graphique, je crée une methode qui ajoute un panel et ensuite même maneuvre à l'aide de controls.Add j'y ajoute une pictureBox.Et la erreur, lors de la compilation il me dit que je ne peut pas ajouter la picturebox car le panel n'existe pas dans le contexte acutel?

comment contourner cette erreur?

merci
impossible is nothing!

12 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
2 juin 2009 à 05:37
hmm... si c'est une erreur de compilation, je pense que la variable que tu utilises pour representer ton panel n'est pas bien initialisé

Sébastien FERRAND (blog)
Consultant Sénior
[Microsoft Visual C# MVP]
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
2 juin 2009 à 10:08
tu as pensé à faire monPanel = new Panel(); ?

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
0
drx7 Messages postés 16 Date d'inscription dimanche 27 mai 2007 Statut Membre Dernière intervention 8 juin 2009
2 juin 2009 à 17:45
 RE:

voici la partie du code:
-----------------------------------------------------------------------------------------------
                        Panel panel5 = new Panel();
                        this.Controls.Add(panel5);
                        panel5.BackColor = Color.Blue;

                        panel5.Size = new Size(Size.Height + 200, Size.Width);
                        panel5.Size = new Size(Size.Height + 200, Size.Width);

                        this.X = 50;
                        this.Y = 50;
                        this.i = 0;
                        this.nbdecal = 1;

                        if ((250 + (this.i * 250)) <= Size.Height)
                        {

                         picturebox_Panel(BDimg[adr_image], BDimg[adr_image], this.X, this.Y);

--------------------------------------------------------------------------------------------------
et la fonction picturebox_panel()
--------------------------------------------------------------------------------------------------
public void picturebox_Panel(string AdrImg, string name, int posX, int posY)
            {
            PictureBox ImgInPane2 = new System.Windows.Forms.PictureBox();
            ImgInPane2 = new System.Windows.Forms.PictureBox();
            ImgInPane2.BackColor = System.Drawing.Color.Red;
            ImgInPane2.SizeMode = PictureBoxSizeMode.StretchImage;
            ImgInPane2.Location = new System.Drawing.Point(posX, posY);
            ImgInPane2.Name = name;
            ImgInPane2.Size = new System.Drawing.Size(180, 130);
            ImgInPane2.Image = System.Drawing.Image.FromFile(AdrImg);
            panel5.Controls.Add(ImgInPane2);

            }
------------------------------------------------------------------------------------------------------
l'érreur est située dans la fonction "picturebox_panel" derniere ligne, le compilateur me dit que panel5 n'existe pas dans le contexte acutel!

impossible is nothing!
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
2 juin 2009 à 18:12
Les variables locales d'une méthode ne se propagent pas automatiquement aux méthodes qu'elle appelle, et heureusement.
Si tu as besoin de l'instance de Panel représentée par panel5 dans la méthode picturebox_Panel, il va falloir passer la référence en paramètre de cette dernière.

/*
coq
MVP Visual C#
CoqBlog
*/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
drx7 Messages postés 16 Date d'inscription dimanche 27 mai 2007 Statut Membre Dernière intervention 8 juin 2009
2 juin 2009 à 19:11
Re:
je me suis planté de  sujet donc je me repette:

j'ai compris le probleme mais je vois pas comment le regler, quel outil je dois utiliser?

merci
 

impossible is nothing!
0
drx7 Messages postés 16 Date d'inscription dimanche 27 mai 2007 Statut Membre Dernière intervention 8 juin 2009
2 juin 2009 à 20:01
RE:
J'ai trouvé la réponse là voici:

            public void IMG_IN_PANEL(string AdrImg, string name, int posX, int posY, ref Panel X)
            {
            PictureBox ImgInPane2 = new PictureBox();
            ImgInPane2.BackColor = Color.Red;
            ImgInPane2.SizeMode = PictureBoxSizeMode.StretchImage;
            ImgInPane2.Location = new Point(posX, posY);
            ImgInPane2.Name = name;
            ImgInPane2.Size = new Size(180, 250);
            ImgInPane2.Image = Image.FromFile(AdrImg);
            X.Controls.Add(ImgInPane2);
            }

impossible is nothing!
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
2 juin 2009 à 20:07
En l'occurence le mot clé ref ne sert à rien dans ton cas : tout ce que tu veux c'est passer la référence déjà initialisée et l'utiliser.
Le type Panel étant une classe, et donc un type référence, le passage de paramètre se fait déjà par référence =>

public void IMG_IN_PANEL(string AdrImg, string name, int posX, int posY, Panel X)
...

/*
coq
MVP Visual C#
CoqBlog
*/
0
drx7 Messages postés 16 Date d'inscription dimanche 27 mai 2007 Statut Membre Dernière intervention 8 juin 2009
3 juin 2009 à 18:11
re:

ok

j'en profite pour poser une autre question en rapport:

 admettons que je crée un fonction pour créer le panel:

                        public void C_panel()
                        {
                        Panel panelC = new Panel();
                        this.Controls.Add(panelC);
                        panelC.BackColor = Color.Blue;
                        panelC.Size = new Size(Size.Height + 200, Size.Width);
                        panelC.Visible = true;
                        }

j'insert cette fonction dans mon code, et je crée un bouton qui va agir sur l'attribut Visible :

en gros quand je clic sur le bouton
panelC.Visible = false;

sachant que les variables locales d'une méthode ne se propagent pas automatiquement, comment je peut faire?

impossible is nothing!
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
3 juin 2009 à 18:30
Si la méthode est destinée à créer un panel, il est logique qu'elle retourne la référence à l'instance crée : 

                        public Panel C_panel()
                        {
                        Panel panelC = new Panel();
                        this.Controls.Add(panelC);
                        panelC.BackColor = Color.Blue;
                        panelC.Size = new Size(Size.Height + 200, Size.Width);
                        panelC.Visible = true;
                        return panelC;
                        }

Par contre j'ai du mal à suivre ton architecture, ça m'a l'air de partir un peu dans tous les sens.

/*
coq
MVP Visual C#
CoqBlog
*/
0
drx7 Messages postés 16 Date d'inscription dimanche 27 mai 2007 Statut Membre Dernière intervention 8 juin 2009
3 juin 2009 à 19:31
Re:

bon en resumé je suis sur visual studio:

je crée 3 boutons:
le 1er crée un panel
le 2eme insert une image
le 3eme supr le panel

  private void insertPanel_Click(object sender, EventArgs e)
        {
            C_panel("panel1");
        }

        private void insertDansPanel_Click(object sender, EventArgs e)
        {
            IMG_IN_PANEL(@"c:\img", "test.jpg", 50 ,50, ref panel1);
        }

        private void suprPanel_Click(object sender, EventArgs e)
        {
            panel1.Visible = false;
        }

voila donc mes methodes :

  public Panel C_panel(string name)
            {
                Panel panelC = new Panel();
                panelC.Name = name;
                this.Controls.Add(panelC);
                panelC.BackColor = Color.Blue;
                panelC.Size = new Size(Size.Height + 200, Size.Width);
                panelC.Visible = true;
                return panelC;
            }

            public void IMG_IN_PANEL(string AdrImg, string name, int posX, int posY, ref Panel X)
            {
                PictureBox ImgInPane2 = new PictureBox();
                ImgInPane2.BackColor = Color.Red;
                ImgInPane2.SizeMode = PictureBoxSizeMode.StretchImage;
                ImgInPane2.Location = new Point(posX, posY);
                ImgInPane2.Name = name;
                ImgInPane2.Size = new Size(180, 250);
                ImgInPane2.Image = Image.FromFile(AdrImg);
                X.Controls.Add(ImgInPane2);
            }

Le probleme c'est que le compilateur me dit que panel1 n'est pas actif dans le contexte:

je ne sais pas comment faire pour que IMG_IN_PANEL accede à la reference, à part si je les met dans le même bouton :

  private void insertPanel_Click(object sender, EventArgs e)

        {

            C_panel("panel1");

            IMG_IN_PANEL(@"c:\img", "test.jpg", 50 ,50, ref panel1);

        }

merci

impossible is nothing!
0
drx7 Messages postés 16 Date d'inscription dimanche 27 mai 2007 Statut Membre Dernière intervention 8 juin 2009
8 juin 2009 à 15:21
Re:

Personne?

impossible is nothing!
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
8 juin 2009 à 15:45
Déjà, tu as le droit de tenir compte de ce qu'on te dit dans les réponses : le mot-clé ref est totalement inutile devant Panel, puisque Panel est une class, et donc le passage se fait par référence. Le mot-clé ref peut parraître ambigü.
Donc tu peut le virer de tes paramètres de méthode.

Ensuite, il faut que tu regardes le concept objet, car tu ne sembles pas savoir ce qu'est un "membre" (ou "attribut", selon les langages). Car en l'occurrence, avoir une référence à ton panel en membre, c'est une solution très simple à ton problème.

Enfin, fait également attention aux opérateurs d'accès à tes méthodes (public / private / protected / internal). Une méthode doit toujours avoir l'accès le plus faible duquel tu vas l'appeler (par exemple, si tu accèdes à une méthode uniquement à partir d'autres méthodes de ta classe => private).

Donc pour résumer, relis des cours / tutos sur la programmation orientée objet, et tu auras la solution à ton problème.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
0
Rejoignez-nous