Intégrer une MDIChild form dans un SpiltContainer
-
dimanche 12 février 2012 20:16
Bnjour,
Dans le cadre du développement d'un projet en visual C++ 2008, je souhaite ouvrir les MIDChild form dans l'un des panneau du SpiltContainer de la MIDParent. Je pensais programmer suiavnt le code ci-dessous mais il y aune erreur de compilation. Quelqu'un sait-il comment surmonter ce problème?
Merci d'vance.
private: System::Void nouveauToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
Form2^ newMDIChild = gcnew Form2();
// Set the Parent Form of the Child window.
//newMDIChild->MdiParent = this
newMDIChild->MdiParent = this->splitContainer1->Panel2->Handle;
// Display the new form.
newMDIChild->Show();
}
Réponses
-
mercredi 15 février 2012 09:29Modérateur
La solution la plus classique est de ne pas mettre les données dans les formulaires.
Utilisez un objet dédié stockant vos données.
Passez cet objet en paramètre des constructeurs de vos formulaires.
Lors du chargement des données depuis un fichier, vous remplissez cet objet dédié.
Utilisez le DataBinding (donc les Event associé) pour que tous les formulaires soient notifié des modifications et mettent à jour leur affichages des données.
Paul Bacelar, Ex - MVP VC++
- Proposé comme réponse Ciprian DuduialaMicrosoft Contingent Staff, Owner mercredi 15 février 2012 12:16
- Marqué comme réponse Ciprian DuduialaMicrosoft Contingent Staff, Owner samedi 18 février 2012 11:13
-
mercredi 15 février 2012 23:10Auteur de réponse
Je ne vois pas où est allouée la mémoire pour le tableau Def_Point.
array<double, 2> ^Def_Point = gcnew array<double, 2>(4,6);
- Marqué comme réponse Ciprian DuduialaMicrosoft Contingent Staff, Owner samedi 18 février 2012 11:13
-
jeudi 16 février 2012 08:59Propriétaire
Bonjour,
Pas de problème. J Mais si vous décidez de changer la stratégie, vous pouvez aussi revenir sur le thread initial et le clôturer : le plus simple et de poster un message pour spécifier que vous avez renoncé à la piste initiale et puis marquer comme réponse ce message. Comme ça on évitera chercher des solutions qui peuvent être inutiles pour vous. Merci de nouveau de votre compréhension et collaboration.
Concernant votre dernière question : Le mot clé array vous permet de créer un tableau dynamique qui est alloué dans le heap de CLR (voir aussi cet exemple), donc il suffit de changer dans l’exemple de Pierre les valeurs 4 et 6 avec celles dont vous avez besoin. Consultez aussi cet article pour voir plusieurs exemples.
Cordialement,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
- Marqué comme réponse Ciprian DuduialaMicrosoft Contingent Staff, Owner samedi 18 février 2012 11:13
-
vendredi 17 février 2012 15:09
Merci pour ton aide Ciprian,
J'ai corrigé l'erreur en remplaçant la dernière ligne du second boc de code par :
Def_Point = gcnew array<double,2></double,2>(3,*Nb_Points);
et ça compile désormais sans erreur.
Toutes les réponses
-
lundi 13 février 2012 08:06ModérateurPouvez-vous indiquer l'erreur de compilation et la ligne ? SVP
Paul Bacelar, Ex - MVP VC++
-
lundi 13 février 2012 09:33
Bonjour,
Merci pour votre aide mais maintenant, j'ai décidé de créer mon application MDI de la facçon suivante :
La fenêtre principale contient un panel sur la gauche avec un spiltter pour redimensionner le panel. J'ai ajouté sur ce panel un dataGridView. Sur la partie vide à droite du panel, je souhaite ouvrir une fenêtre fille grâce à une boîte de dialogue FileOpen.
Le fichier à sélectionner sera un fichier texte dans lequel chaque contient des coordonnées X, Y et Z séparée par des tabulation.
Comment puis-je récupérer les données du ficheir texte?
Comment puis-je garder une copie du chemin du fichier dans la fenêtr fille?
Merci d'avance.
-
mardi 14 février 2012 20:46
Bonjour,
Mon application (C++/CLI) contient un formulaire principal dans lequel se trouve un dataGrigView. Dans le menu de mon formulaire principal, je peux ouvrir un formulaire (ChildForm) qui récupére des données (Coordonnées de points X, Y et Z) dans un fichier texte.
Je souhaite pouvoir afficher ses coordonnées X, Y et Z dans la dataGridView de ma fenêtre principale mais je n'arrive pas à passer des données entre les deux formulaires. Quelqu'un connaitrait-il solution à mon problème?
Après avoir recherher sur internet, je pense que l'on peut gérer ça avec "Event" mais je ne sias pas comment l'intégrer dans mon code.
Merci d'avance.
- Modifié CAO_JIM53 mardi 14 février 2012 21:23
- Type modifié Ciprian DuduialaMicrosoft Contingent Staff, Owner mercredi 15 février 2012 12:15 doublon
- Fusionné Ciprian DuduialaMicrosoft Contingent Staff, Owner mercredi 15 février 2012 12:15 thread double
-
mercredi 15 février 2012 09:29Modérateur
La solution la plus classique est de ne pas mettre les données dans les formulaires.
Utilisez un objet dédié stockant vos données.
Passez cet objet en paramètre des constructeurs de vos formulaires.
Lors du chargement des données depuis un fichier, vous remplissez cet objet dédié.
Utilisez le DataBinding (donc les Event associé) pour que tous les formulaires soient notifié des modifications et mettent à jour leur affichages des données.
Paul Bacelar, Ex - MVP VC++
- Proposé comme réponse Ciprian DuduialaMicrosoft Contingent Staff, Owner mercredi 15 février 2012 12:16
- Marqué comme réponse Ciprian DuduialaMicrosoft Contingent Staff, Owner samedi 18 février 2012 11:13
-
mercredi 15 février 2012 10:07
Je vous remercie pur votre aide.
Je comprends effectivement la méthode que vous me demandez d'appliquer mais étant novice en C++/CLI, je ne sais pas comment l'appliquer concrètement à mon projet.
Pourriez-vous m'indiquez les étapes à suivre et si possible des exemples de code?
-
mercredi 15 février 2012 11:40Propriétaire
Bonjour,
Pour lire les données de votre fichier texte il suffit obtenir la ligne avec les trois coordonnées et puis utiliser la méthode Split avec le séparateur ‘\t’ et le résultat sera un tableau avec les trois coordonnées.
Pour garder une copie du chemin vers le fichier dans la fenêtre fille le plus simple est d’ajouter un membre dans la classe Form2 qui sera modifié soit via une propriété, soit directement par un constructeur avec un paramètre de la classe Form2.
Pour autres questions concernant le langage VC++ je vous invite consulter aussi cette liste des articles.
Cordialement,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
-
mercredi 15 février 2012 12:14Propriétaire
Bonjour, CAO_JIM53,
Je vois que vous avez mis une deuxième fois la même question. Dans l’étiquette sur les forums MSDN on vous demande de poster vos questions une seule fois pour éviter les confusions et pour permettre aux membres de notre communauté suivre le progrès que vous avez fait pour résoudre votre problème. Donc, je vais fusionner les deux questions.
Merci de votre compréhension et collaboration.
Cordialement,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
-
mercredi 15 février 2012 22:50
Veuillez m'excuser mais comme j'ai choisis d'appréhender différemment mon projet, la question était légèrement différent ce qui m'a poussé à poser une nouvelle question.
J'ai avancé sur le code en créant une classe managée dont voici le code :
#pragma once namespace Archi_3D { using namespace System; using namespace System::Windows::Forms; ref class Liste_Points { private: double ^Coordonne_X; double ^Coordonne_Y; double ^Coordonne_Z; Int32 ^Nb_Points; String ^msg; public: array<double,2> ^Def_Point; Liste_Points(OpenFileDialog ^Chemin_Fichier) { String ^str_Line_XYZ; IO::StreamReader ^StreamR = gcnew IO::StreamReader(Chemin_Fichier->OpenFile(), System::Text::Encoding::Default); str_Line_XYZ = StreamR->ReadLine(); //Lecture de la première ligne Nb_Points=Convert::ToInt32((str_Line_XYZ->Split('\t'))[1]); //Récupération du nombre de point à importer //Affichage du nombre de point dans une boîte de dialogue msg = Convert::ToString(Nb_Points); MessageBox::Show(msg,"Nombre de points",MessageBoxButtons::OK); str_Line_XYZ = StreamR->ReadLine(); //Lit une ligne vide dans le fichier str_Line_XYZ = StreamR->ReadLine(); //Lit la ligne X, Y et Z dans le fichier //Récupération des coordonnées X, Y et Z for (int i=0; i < 5;i++) { str_Line_XYZ = StreamR->ReadLine(); //Lit une ligne de données dans le fichier for (int j=0; j<3; j++) { Def_Point[j,i] = Convert::ToDouble(str_Line_XYZ->Split('\t')[j]); //Collecte des coordonnées X, Y et Z } } } }; }Cependant, le programme se compile mais lorsque j'ouvre un formulaire fils qui appelle cette classe, l'errreur suivante est détectée sur la dernière ligne de code :
Une exception non gérée du type 'System.NullReferenceException' s'est produite dans Archi_3D.exe
Informations supplémentaires : La référence d'objet n'est pas définie à une instance d'un objet.
- this 0x01440408 { Coordonne_X=<valeur non définie> Coordonne_Y=<valeur non définie> Coordonne_Z=<valeur non définie> ...} Archi_3D::Liste_Points^
Avez-vous une idée de modification du code pour supprimer cette erreur?
-
mercredi 15 février 2012 23:10Auteur de réponse
Je ne vois pas où est allouée la mémoire pour le tableau Def_Point.
array<double, 2> ^Def_Point = gcnew array<double, 2>(4,6);
- Marqué comme réponse Ciprian DuduialaMicrosoft Contingent Staff, Owner samedi 18 février 2012 11:13
-
mercredi 15 février 2012 23:23
Effectivement, ce doit être la cause de l'erreur.
Cependant, je ne connais pas par aavnce la taille du tableau. est-ilpossible d'allouer dynamiquement la mémoire ne focntion des beoins?
-
jeudi 16 février 2012 08:59Propriétaire
Bonjour,
Pas de problème. J Mais si vous décidez de changer la stratégie, vous pouvez aussi revenir sur le thread initial et le clôturer : le plus simple et de poster un message pour spécifier que vous avez renoncé à la piste initiale et puis marquer comme réponse ce message. Comme ça on évitera chercher des solutions qui peuvent être inutiles pour vous. Merci de nouveau de votre compréhension et collaboration.
Concernant votre dernière question : Le mot clé array vous permet de créer un tableau dynamique qui est alloué dans le heap de CLR (voir aussi cet exemple), donc il suffit de changer dans l’exemple de Pierre les valeurs 4 et 6 avec celles dont vous avez besoin. Consultez aussi cet article pour voir plusieurs exemples.
Cordialement,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
- Marqué comme réponse Ciprian DuduialaMicrosoft Contingent Staff, Owner samedi 18 février 2012 11:13
-
jeudi 16 février 2012 12:36
Pourquoi est ce que les deux codes suivants ne donnent pas le même résultats?
private: //double ^Coordonne_X; //double ^Coordonne_Y; //double ^Coordonne_Z; Int32 ^Nb_Points; String ^msg; public: array<double,2> ^Def_Point; Liste_Points(OpenFileDialog ^Chemin_Fichier) { String ^str_Line_XYZ; IO::StreamReader ^StreamR = gcnew IO::StreamReader(Chemin_Fichier->OpenFile(), System::Text::Encoding::Default); str_Line_XYZ = StreamR->ReadLine(); //Lecture de la première ligne Nb_Points=Convert::ToInt32((str_Line_XYZ->Split('\t'))[1]); //Récupération du nombre de point à importer Def_Point = gcnew array<double,2>(3,Convert::ToUInt32(Nb_Points));
private: //double ^Coordonne_X; //double ^Coordonne_Y; //double ^Coordonne_Z; UInt32 ^Nb_Points; String ^msg; public: array<double,2> ^Def_Point; Liste_Points(OpenFileDialog ^Chemin_Fichier) { String ^str_Line_XYZ; IO::StreamReader ^StreamR = gcnew IO::StreamReader(Chemin_Fichier->OpenFile(), System::Text::Encoding::Default); str_Line_XYZ = StreamR->ReadLine(); //Lecture de la première ligne Nb_Points=Convert::ToUInt32((str_Line_XYZ->Split('\t'))[1]); //Récupération du nombre de point à importer Def_Point = gcnew array<double,2>(3,Nb_Points);Le premier bloc de code ne renvoit pas d'erreur alors que le second me renvoit une erreur m'informant qu'il ne peut pas convertir "UIin" en "int".
-
vendredi 17 février 2012 09:42ModérateurA quelle ligne SVP ?
Paul Bacelar, Ex - MVP VC++
-
vendredi 17 février 2012 09:53Propriétaire
Bonjour,
Je crois que le message correct d’erreur concerne la conversion 'System::UInt32 ^' vers 'int'. La différence est que dans le première cas Convert::ToUInt32(Nb_Points) retourne un UInt32 (voir le type retourne par Convert::ToUInt32), tandis que dans le deuxième cas Nb_Points est du type UInt32 ^.
Cordialement,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
-
vendredi 17 février 2012 15:09
Merci pour ton aide Ciprian,
J'ai corrigé l'erreur en remplaçant la dernière ligne du second boc de code par :
Def_Point = gcnew array<double,2></double,2>(3,*Nb_Points);
et ça compile désormais sans erreur.


