Portée des objets [Résolu]

Signaler
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
-
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
-
Bonjour,

Y'a un truc que j'ai vraiment du mal à comprendre depuis que j'ai commencé le C#, c'est la portée des variables/objets. Déjà que j'ai mis du temps à comprendre que les variables globales étaient out, là, avec les objets je craque (et donc jviens poser ma tite question hehe)

En gros, j'ai une form frmMain qui a un panel1. Dans une autre forme, frmProperties, je souhaite modifier la couleur de fond du panel1 et donc accéder à ce foutu panel1.

Tout est dans le même namespace. J'ai essayé de bidouiller la déclaration de panel1 de private System.Windows.Forms.Panel panel1 à public, mais rien n'y fait. Si je place du code dans la public partial class frmProperties : Form, je n'ai pas accès au panel1 (frmMain.panel1 <- no go)

Bref, comment faire ?

9 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
Salut,

Tu ne connais ton instance de frmForm1 que depuis le constructeur
Il faut stocker la reference dans une variable pour apres y avoir acces dans toute ta classe

Voila la version corrigée:


<HR>


public
partial
class
frmForm2 :
Form
{

frmForm1 _form1;

public frmForm2(
frmForm1 form1)
{
InitializeComponent();
form1.textBox1.Text =
"text a partir de la form2 !";

this._form1 = form1; // Stocke la reference vers l'instance de form1
}

private
void button1_Click(
object sender,
EventArgs e)
{

this._form1.textBox1.Text =
"Texte a partir du click";
}
}

<HR>



Mx
MVP C#
Messages postés
2
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
5 mai 2006

Peut-tu coller le code pour les deux formulaires ?
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
4
bien sur :>

FORM1.DESIGNER.CS
partial class frmMain
{
...
public System.Windows.Forms.Panel panel1;
...
private void InitializeComponent()
{
...
this.panel1 = new System.Windows.Forms.Panel();
}
}

frmProperties c'est juste une autre windowsform que j'ai ajouté au projet (dans le meme namespace)

Remarque, je parle de panel1 mais je ne peux accéder à aucun autre objet de frmMain à partir de frmProperties.
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
4
(et j'ajoute que ce code est généré par Visual Studio à la création des forms)
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Salut le problème ce n'est pas que tu n'as pas accès à frmMain.panel1 depuis ta deuxième forme, c'est que tu n'as même pas accès à frmMain tout simplement. Pour ça il suffit de passer dans le constructeur de ta 2ème forme, la variable frmMain.

public partial class Form1 : Form
{
public Form1( )
{
InitializeComponent( );
new Form2( this ).Show( );
}
}


public partial class Form2 : Form
{
public Form2( Form1 form1 )
{
form1.Controls[ "Panel1" ].BackColor = Color.AliceBlue;
}
}
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
4
Si si, dans une procedure de la form2, je peux bien faire frmMain.
qqch, en particulier, je peux faire frmMain.var ou var est une variable
déclarée dans frmMain en tant que "static".

En fait, là tu passe la form1 en argument de la form2, moi je voudrais
que form1 soit publique et accessible n'importe ou, en particulier à
partir de form2.

C'est un peu comme en visual basic ou pour modifier une form1 à partir
d'une form2, il suffisait de faire, n'importe ou dans le form2 :

form1!monobjet.propriete=truc. (avec l'opérateur !)
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
Salut,

Tu peux faire frmMain.qqchose(), mais toi ce que tu voudrais faire, c'est instanceDefrmMain.qqChose();
Et pour ca, la solution de Lutinore est la bonne.

A savoir que par convention, on met la premiere lettre d'un nom d'une classe en majuscule en C#.
La ca peut preter a confusion ;) -> voir ici



Mx
MVP C#
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
4
Apres avoir modifié mon code selon les directives de Lutinore, j'ai effectivement accès à la form1, mais que dans "public Form2( Form1 form1 )".

Peut etre que je m'explique mal depuis le debut, alors j'ai uploadé ici :
http://xboxemul.free.fr/cspb.zip
Un projet contenant deux form.
Depuis la premiere form, j'appelle une form2 qui doit modifier une textbox de la form1 en cliquant sur un bouton.

Est-ce que toi ou Lutinore pourriez vite fait le telecharger et me dire ce qui ne va pas ? Y'a 3 lignes de code, c'est juste pour l'exemple ;-)

Merci d'aider les noobs en tous cas :s
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
4
Un grand merci !

Ca marche impec ce coup ci !

En fait ca me semblait bizarre car on pourrait croire que :
this
._form1 = form1;
copie dans _form1 la form1, alors qu'en fait, on copie juste un pointeur vers la form1.

Bref, merci encore :>