mai
2007
Il y a une question qui revient très souvent sur le forum C++/CLI c’est la récupération d’une valeur depuis une autre Form.
C’est un mécanisme pas si complexe que ca mais qui nécessite quelques notions de bases de C++.
Donc en attendant d’être intégrée dans la faq C++/CLI, je vais vous indiquer ici comment faire.
Imaginons que nous voulions faire une application qui ouvre une fenetre qui possède un textBox et un bouton. Lors du click sur le bouton, on affiche une deuxième form qui possède elle aussi un bouton et un textBox (ca aurait pu etre un label). On souhaite lors du clic sur le bouton de la deuxième form afficher la valeur saisie dans le textBox de la première form…
Voici comment on peut faire :
Dans la form1, je dépose le textBox1 et le boutton
J’ajoute une nouvelle form, Form2 dans laquelle je mets le textbox et le bouton.
le but est de pouvoir lire la valeur saisie dans la Form1 depuis la Form2 sachant que c’est la form1 qui va créer la form2.
Donc, en toute logique, dans la form1, on va avoir à un endroit la création et l’affichage de la form2. Comme il faut que la form2 connaisse la form1, on va lui passer l’objet form1 (c’est à dire this), disons dans le constructeur :
maForm2->Show();
Dans la form2, on aura donc fatalement la récupération de la form1 dans le constructeur :
{
Form1 ^currForm1 = laForm1; // sachant qu'en vrai, on aura currForm1 comme membre privé de la classe
}
et au moment de récupérer la valeur, on aura un
textBox1->Text = currForm1->GetValeur();
GetValeur sera bien sur une méthode publique de form1 :
String ^GetValeur()
{
return textBox1->Text;
}
Tant est si bien que dans Form1.h, on va devoir faire un
#include "Form2.h"
pour pouvoir instancier la form2
et dans la Form2.h, on va devoir faire un
#include "Form1.h"
pour pouvoir utiliser la form1
Si vous essayez de compiler directement comme ca, il va y avoir une tripotée d’erreurs, la plus significative étant qu’il ne connait pas Form2, avec une erreur du genre dans Form1.h :
error C2143: erreur de syntaxe : absence de ‘;’ avant ‘^’ sur la ligne
Form2 ^ currForm2;
Comme on s’en doute, chaque fichier incluant l’autre, il y a des inclusions croisées qui empechent la bonne compilation.
Pour que ceci compile, il faut plusieurs choses :
Déjà, déporter l’impémentation des méthodes des classes dans un .cpp (plus précisément, toutes celles qui utilisent des méthodes ou des attributs de Form2 pour le fichier form1.h et toutes celles qui utilisent des méthodes ou des attributs de Form1 pour form2.h).
Donc, il faut créer un fichier Form1.cpp (form2.cpp étant généré automatiquement lors de l’ajout d’une nouvelle form).
Dans mon .h, j’ai donc laissé la définition des méthodes :
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e);
et dans le .cpp, j’ai mis l’implémentation des méthodes :
#include "Form1.h"
namespace testWinforms {
System::Void Form1::Form1_Load(System::Object^ sender, System::EventArgs^ e)
{
currForm2 = gcnew Form2(this);
}
System::Void Form1::button1_Click(System::Object^ sender, System::EventArgs^ e)
{
currForm2->Show();
}
}
NB : ne pas oublier le namespace, ni l’opérateur de résolution de portée.
Idem dans form2.h
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e);
et dans le Form2.cpp
{
textBox1->Text = currForm1->GetValeur();
}
Voilà pour le premier point.
Il reste encore à faire une chose pour que ca compile, c’est faire une déclaration anticipée de Form1 dans le fichier Form2.h.
par exemple, en premier dans le namespace
ref class Form1;
il restera plus qu’à faire de meme dans le fichier form1.h : déclarer form2 de cette facon :
ref class Form2;
Compilez mainteant, tout est ok
Bonne prog,
Nico
3 Commentaires + Ajouter un commentaire
Commentaires récents
- [Tests] Arrange Act Assert, une traduction ? dans
- [UnitTest][C#] Tester une méthode privée dans
- Récupérer une valeur d’un contrôle depuis une autre Form / inclusions croisées et déclaration anticipée dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
Archives
- janvier 2013
- avril 2012
- janvier 2012
- juin 2011
- janvier 2011
- décembre 2010
- novembre 2010
- septembre 2010
- juin 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- mai 2009
- avril 2009
- mars 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
j ai un grand problème, il y a une semaine que je cherche comment envoyer une valeur d’un formulaire 1 vers un formulaire 2 dans un textbox en c++
s’il vous plais aide moi
mon application contient 2 form 1 et 2
form 1 calcule les nombre de mettre du tissu et il contient une label qui permet l’ouverture d’un deuxieme form qui doit recevoire le nb de mettres dans un textbox readonly
comment je vais faire
???????
chez moi, on peut continuer à prévisualiser la Form2
c’est sur que cela perturbe un peu l’IDE, mais globalement, il s’en sort plutot bien
merci encore mais j’ai remarqué quelque chose : on (enfin moi, je ne sais pas pour les autres) ne peut plus prévisualiser la Form2.
Au lieu de cela, il m’affiche « Le concepteur n’a pas pu être affiché pour ce fichier, car aucune des classes qu’il contient ne peut être créée. »
Est-ce normal ? Y-a-t’il une solution ?