none
Intégrer une MDIChild form dans un SpiltContainer

    Dotaz

  • 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();
    }

    12. února 2012 20:16

Odpovědi

Všechny reakce

  • Pouvez-vous indiquer l'erreur de compilation et  la ligne ? SVP

    Paul Bacelar, Ex - MVP VC++

    13. února 2012 8:06
  • 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.

    13. února 2012 9:33
  • 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.


    14. února 2012 20:46
  • 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++

    15. února 2012 9:29
  • 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?

    15. února 2012 10:07
  •  

    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


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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.

    15. února 2012 12:14
  • 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?

    15. února 2012 22:50
  • 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);


    15. února 2012 23:10
  • 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?

    15. února 2012 23:23
  • 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


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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.

    16. února 2012 8:59
  • 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".

    16. února 2012 12:36
  • A quelle ligne SVP ?

    Paul Bacelar, Ex - MVP VC++

    17. února 2012 9:42
  • 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


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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.

    17. února 2012 9:53
  • 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.


    • Upravený CAO_JIM53 17. února 2012 21:40
    • Označen jako odpověď CAO_JIM53 17. února 2012 21:40
    17. února 2012 15:09