Intégrer une MDIChild form dans un SpiltContainer
-
domingo, 12 de fevereiro de 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();
}
Todas as Respostas
-
segunda-feira, 13 de fevereiro de 2012 08:06ModeradorPouvez-vous indiquer l'erreur de compilation et la ligne ? SVP
Paul Bacelar, Ex - MVP VC++
-
segunda-feira, 13 de fevereiro de 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.
-
terça-feira, 14 de fevereiro de 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.
- Editado CAO_JIM53 terça-feira, 14 de fevereiro de 2012 21:23
- Tipo Alterado Ciprian Duduiala quarta-feira, 15 de fevereiro de 2012 12:15 doublon
- Mesclado Ciprian Duduiala quarta-feira, 15 de fevereiro de 2012 12:15 thread double
-
quarta-feira, 15 de fevereiro de 2012 09:29Moderador
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++
- Sugerido como Resposta Ciprian Duduiala quarta-feira, 15 de fevereiro de 2012 12:16
- Marcado como Resposta Ciprian Duduiala sábado, 18 de fevereiro de 2012 11:13
-
quarta-feira, 15 de fevereiro de 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?
-
quarta-feira, 15 de fevereiro de 2012 11:40
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.
-
quarta-feira, 15 de fevereiro de 2012 12:14
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.
-
quarta-feira, 15 de fevereiro de 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?
-
quarta-feira, 15 de fevereiro de 2012 23:10Usuário que responde
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);
- Marcado como Resposta Ciprian Duduiala sábado, 18 de fevereiro de 2012 11:13
-
quarta-feira, 15 de fevereiro de 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?
-
quinta-feira, 16 de fevereiro de 2012 08:59
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.
- Marcado como Resposta Ciprian Duduiala sábado, 18 de fevereiro de 2012 11:13
-
quinta-feira, 16 de fevereiro de 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".
-
sexta-feira, 17 de fevereiro de 2012 09:42ModeradorA quelle ligne SVP ?
Paul Bacelar, Ex - MVP VC++
-
sexta-feira, 17 de fevereiro de 2012 09:53
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.
-
sexta-feira, 17 de fevereiro de 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.


