CSharpJSharp
Messages postés98Date d'inscriptionsamedi 17 septembre 2005StatutMembreDernière intervention24 mai 2010
-
4 janv. 2006 à 16:29
CSharpJSharp
Messages postés98Date d'inscriptionsamedi 17 septembre 2005StatutMembreDernière intervention24 mai 2010
-
7 janv. 2006 à 11:46
Bonjour ;
J'ai une forme (class) principale : MainForm sur laquelle j'ai déposé un contrôle button1. J'ai rajouté une deuxième forme (class) OptionsForm.
Donc pour accéder au bouton à partir de OptionsForm, j'ai déclaré l'instance du bouton comme suit :
public static System.Windows.Forms.Button button1 ;
Là, j'ai un problème sur la classe principale : MainForm ????
Y'a-t'il une astuce pour celà !!!
Merciiiii à tous !!!
A voir également:
Accès un un contrôle à partir d'une autre class !!!
CSharpJSharp
Messages postés98Date d'inscriptionsamedi 17 septembre 2005StatutMembreDernière intervention24 mai 20101 4 janv. 2006 à 16:54
Merci pour ton aide !!!
Le problème est :
- Pour accéder au contrôle button1 à partir de OptionsForm, je suis obligé de déclarer le bouton comme public static dans la MainForm... D'où l'erreur :
Le membre static 'Application.MainForm.button1' est inaccessible avec une référence d'instance ; qualifiez-le avec un nom de type
- Et si j'enlève static pour le bouton dans la MainForm, j'ai cette erreur :
Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique 'Application.MainForm.button1'
CSharpJSharp
Messages postés98Date d'inscriptionsamedi 17 septembre 2005StatutMembreDernière intervention24 mai 20101 4 janv. 2006 à 17:00
Ben, j'ai pris comme example un bouton, mais bon, ça va être la même chose pour tous les autres contrôles !!!
Un exemple plus concrêt, si je déclare un contrôle de type ocx ou une connexion à une base de données dans la MainForm, et la deuxième form est, par exemple, une SplashScreen où j'initialise mes contrôles!!!
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 4 janv. 2006 à 17:56
>Ben, j'ai pris comme example un bouton, mais bon, ça va être la même chose pour tous les autres contrôles !!!
>Un exemple plus concrêt, si je déclare un contrôle de type ocx ou une connexion à une base de données dans la >MainForm, et la deuxième form est, par exemple, une SplashScreen où j'initialise mes contrôles!!!
Il y a plusieurs facons de procéder : Passage d'une reference de ton instance a ton autre classe, Delégués/Evenements, Singleton...
Le plus simple, pour que OptionsForm connaisse ton bouton, mets ton bouton en public, et passe l'instance de ta MainForm en parametre a OptionsForm.
Mais tout depend de ce que tu veux vraiment faire de ton bouton depuis OptionsForm pour trouver une solution propre
CSharpJSharp
Messages postés98Date d'inscriptionsamedi 17 septembre 2005StatutMembreDernière intervention24 mai 20101 4 janv. 2006 à 18:22
Et si je prend un autre exemple :
Supposons que j'ai un label, label1, sur la MainForm et au démarrage à l'aide des threads, je veux affecter la valeur "test" au label1 à partir de la OptionsForm.
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 4 janv. 2006 à 18:54
Tu ne peux pas procéder ainsi
MainForm.label1.Text = "Test" ; // ici label1 est dans MainForm
Tout simplement parce que MainForm n'est pas ton instance
Transforme ton code en
<HR>
MainForm maForm = new MainForm();
MyApplication myApplication = new MyApplication( maForm, new OptionsForm(), 0);
<HR>
Ensuite, sachant qu'il faut que OptionsForm accede a maForm, il faut la lui passer en parametre, donc change le constructeur de OptionsForm pour qu'il attende un parametre MainForm
<HR>
public class OptionsForm
{
public MainForm mainForm;
public OptionsForm(MainForm mainForm)
{
this.mainForm = mainForm;
}
// ....
}
<HR>
et tranforme le code ainsi
<HR>
MainForm maForm = new MainForm();
MyApplication myApplication = new MyApplication( maForm, new OptionsForm(maForm), 0);
<HR>
Et finalement, dans ton _Load, tu n'as plus qu'a faire (en ayant mis ton label en public)
<HR>
maForm.Label.Text = "Test";
<HR>
Sinon, je ne vois rien qui fasse appel a un autre Thread dans ton code (mise a part la Thread.Sleep, qui signifie seulement que tu endors le thread principal)
CSharpJSharp
Messages postés98Date d'inscriptionsamedi 17 septembre 2005StatutMembreDernière intervention24 mai 20101 4 janv. 2006 à 19:16
Waw...
J'ai suivi tes instructions à la lettre... Là il me donne un resultat bizzare !!! Une seule fenêtre au démarrage sans aucun contrôle là-dessus et ça bouge pas !!!
Avant j'avais OptionsForm qui s'affiche, puis se ferme pour afficher la MainForm !!!