none
Résolution du problème de déclaration RRS feed

  • Question

  • bonjour, j'ai profondément avancé dans le cadre de  la discussions Structuration des codes et données en C++/CLI

    Elle m'as permis de bien structurer mon code avec les pièces de code dans un fichier  cpp et les headers dans un fichier .h

    mais je n'arrive pas a éliminer le dernier problème de compilation

    J'ai résolu tous les autres.

    // d'abord le header de la classe OpenAFile.
    #ifndef OpenAFile_H
    #define OpenAFile_H
    
    #pragma once
    #include <stdio.h>
    #include <stdlib.h>
    #include <string>
    #include "StdAfx.h"
    #include "SpecificationLoader.h"
    static std::string sFileToOpen;
    static std::string sPathOfTheFile;
    static std::string sDiskOfTheFile;
    namespace Test6 {
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::IO;
        /// <summary>
    	/// Description résumée de OpenAFile
    	/// </summary>
    	public ref class OpenAFile : public System::Windows::Forms::Form
    	{
    	public: 
    		Form^ form1;
    		Test6::OpenAFile^ objOpenAFile;
    		OpenAFile(void);
    		OpenAFile(Form^ form1);
    		void InitializeComponent(void);
    	private:
    		System::Void button2_Click(System::Object^ sender, System::EventArgs^  e);
    		System::Void button1_Click(System::Object^ sender, System::EventArgs^  e);
    		System::Void button3_Click(System::Object^  sender, System::EventArgs^  e); 
    	    System::Windows::Forms::Button^			button1;
    		System::Windows::Forms::Button^			button2;
    		System::Windows::Forms::Button^			button3;
    		System::Windows::Forms::Label^			label1;
    		System::Windows::Forms::Label^			label2;
    		System::Windows::Forms::Label^			label3;
    		System::Windows::Forms::Label^			label4;
    		System::Windows::Forms::Label^			label5;
    		System::Windows::Forms::TextBox^		textBox1;
    		System::Windows::Forms::TextBox^		textBox2;
    		System::Windows::Forms::TextBox^		textBox3;
    		System::Windows::Forms::TextBox^		textBox4;
    		System::Windows::Forms::ProgressBar^	progressBar1;
    		System::Windows::Forms::OpenFileDialog^ openFileDialog1;
    		System::ComponentModel::Container^		components;
    	protected:
    		~OpenAFile();
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
    		/// le contenu de cette méthode avec l'éditeur de code.
    		/// </summary>
    #pragma endregion
    };
    }
    #endif
    
    
    // ensuite le code de la classe OpenAFile
    #include "StdAfx.h"
    #include <string>
    #include "OpenAFile.h"
    namespace Test6
    {
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::IO;
    		
    	    OpenAFile::OpenAFile()
    		{
    			InitializeComponent();
    			//
    			//TODO: ajoutez ici le code du constructeur
    		}
    
    		OpenAFile::OpenAFile(  Test6::SpecificationLoader^ form1)
            {
                
    			this->form1 = form1;
    			Test6::OpenAFile objOpenAFile = this;
    			InitializeComponent();
    			textBox1->Text = L"English";
    			textBox2->Text = L"Word Document";
    			textBox3->Text = L"Interbase";
    			textBox4->Text = L"Coherence";
    			Test6::OpenAFile* newWindow = this;
    			System::EventArgs^  e;
                sFileToOpen = button3_Click( this, e);
    			newWindow->ShowDialog();//Dialog
            }
    
    		/// <summary>
    		/// Nettoyage des ressources utilisées.
    		/// </summary>
    		OpenAFile::~OpenAFile()
    		{
    			if( components)
    			{
    				delete components;
    			}
    		}
    		
    		
    		void OpenAFile::InitializeComponent(void)
    		{
    			this->label1 = (gcnew System::Windows::Forms::Label());
    			this->button1 = (gcnew System::Windows::Forms::Button());
    			this->button2 = (gcnew System::Windows::Forms::Button());
    			this->label2 = (gcnew System::Windows::Forms::Label());
    			this->label3 = (gcnew System::Windows::Forms::Label());
    			this->textBox1 = (gcnew System::Windows::Forms::TextBox());
    			this->label5 = (gcnew System::Windows::Forms::Label());
    			this->textBox2 = (gcnew System::Windows::Forms::TextBox());
    			this->textBox3 = (gcnew System::Windows::Forms::TextBox());
    			this->textBox4 = (gcnew System::Windows::Forms::TextBox());
    			this->openFileDialog1 = (gcnew System::Windows::Forms::OpenFileDialog());
    			this->button3 = (gcnew System::Windows::Forms::Button());
    			this->SuspendLayout();
    			// 
    			// label1
    			// 
    			this->label1->AutoSize = true;
    			this->label1->Font = (gcnew System::Drawing::Font(L"Arial", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
    				static_cast<System::Byte>(0)));
    			this->label1->Location = System::Drawing::Point(478, 93);
    			this->label1->Name = L"label1";
    			this->label1->Size = System::Drawing::Size(99, 16);
    			this->label1->TabIndex = 1;
    			this->label1->Text = L"Database name";
    			// 
    			// button1
    			// 
    			this->button1->Location = System::Drawing::Point(609, 430);
    			this->button1->Name = L"button1";
    			this->button1->Size = System::Drawing::Size(75, 23);
    			this->button1->TabIndex = 2;
    			this->button1->Text = L"Process";
    			this->button1->UseVisualStyleBackColor = true;
    			this->button1->Click += gcnew System::EventHandler(this, &Test6::OpenAFile::button1_Click);
    			// 
    			// button2
    			// 
    			this->button2->Location = System::Drawing::Point(479, 430);
    			this->button2->Name = L"button2";
    			this->button2->Size = System::Drawing::Size(75, 23);
    			this->button2->TabIndex = 3;
    			this->button2->Text = L"Cancel";
    // Enfin le code le la classe supérieur
    		this->button2->UseVisualStyleBackColor = true;
    			this->button2->Click += gcnew System::EventHandler(this, &OpenAFile::button2_Click);
    			// 
    			// label2
    			// 
    			this->label2->AutoSize = true;
    			this->label2->Font = (gcnew System::Drawing::Font(L"Arial", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
    				static_cast<System::Byte>(0)));
    			this->label2->Location = System::Drawing::Point(478, 243);
    			this->label2->Name = L"label2";
    			this->label2->Size = System::Drawing::Size(67, 16);
    			this->label2->TabIndex = 5;
    			this->label2->Text = L"File Name";
    			// 
    			// label3
    			// 
    			this->label3->AutoSize = true;
    			this->label3->Font = (gcnew System::Drawing::Font(L"Arial", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
    				static_cast<System::Byte>(0)));
    			this->label3->Location = System::Drawing::Point(9, 224);
    			this->label3->Name = L"label3";
    			this->label3->Size = System::Drawing::Size(99, 16);
    			this->label3->TabIndex = 7;
    			this->label3->Text = L"Document Type";
    			// 
    			// textBox1
    			// 
    			this->textBox1->Font = (gcnew System::Drawing::Font(L"Arial", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
    				static_cast<System::Byte>(0)));
    			this->textBox1->Location = System::Drawing::Point(12, 329);
    			this->textBox1->Name = L"textBox1";
    			this->textBox1->Size = System::Drawing::Size(215, 22);
    			this->textBox1->TabIndex = 8;
    			// 
    			// label5
    			// 
    			this->label5->AutoSize = true;
    			this->label5->Font = (gcnew System::Drawing::Font(L"Arial", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
    				static_cast<System::Byte>(0)));
    			this->label5->Location = System::Drawing::Point(9, 301);
    			this->label5->Name = L"label5";
    			this->label5->Size = System::Drawing::Size(64, 16);
    			this->label5->TabIndex = 10;
    			this->label5->Text = L"Language";
    			// 
    			// textBox2
    			// 
    			this->textBox2->Font = (gcnew System::Drawing::Font(L"Arial", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
    				static_cast<System::Byte>(0)));
    			this->textBox2->Location = System::Drawing::Point(12, 255);
    			this->textBox2->Name = L"textBox2";
    			this->textBox2->Size = System::Drawing::Size(215, 22);
    			this->textBox2->TabIndex = 11;
    			// 
    			// textBox3
    			// 
    			this->textBox3->Font = (gcnew System::Drawing::Font(L"Arial", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
    				static_cast<System::Byte>(0)));
    			this->textBox3->Location = System::Drawing::Point(481, 128);
    			this->textBox3->Name = L"textBox3";
    			this->textBox3->Size = System::Drawing::Size(192, 22);
    			this->textBox3->TabIndex = 12;
    			// 
    			// textBox4
    			// 
    			this->textBox4->Font = (gcnew System::Drawing::Font(L"Arial", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
    				static_cast<System::Byte>(0)));
    			this->textBox4->Location = System::Drawing::Point(481, 283);
    			this->textBox4->Name = L"textBox4";
    			this->textBox4->Size = System::Drawing::Size(192, 22);
    			this->textBox4->TabIndex = 13;
    			// 
    			// openFileDialog1
    			// 
    			this->openFileDialog1->FileName = L"openFileDialog1";
    			// 
    			// button3
    			// 
    			this->button3->Location = System::Drawing::Point(13, 46);
    			this->button3->Name = L"button3";
    			this->button3->Size = System::Drawing::Size(75, 23);
    			this->button3->TabIndex = 14;
    			this->button3->Text = L"Choice a file";
    			this->button3->UseVisualStyleBackColor = true;
    			this->button3->Click += gcnew System::EventHandler(this, &Test6::OpenAFile::button3_Click);
    			// 
    			// OpenAFile
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(760, 509);
    			this->Controls->Add(this->button3);
    			this->Controls->Add(this->textBox4);
    			this->Controls->Add(this->textBox3);
    			this->Controls->Add(this->textBox2);
    			this->Controls->Add(this->label5);
    			this->Controls->Add(this->textBox1);
    			this->Controls->Add(this->label3);
    			this->Controls->Add(this->label2);
    			this->Controls->Add(this->button2);
    			this->Controls->Add(this->button1);
    			this->Controls->Add(this->label1);
    			this->Name = L"OpenAFile";
    			this->Text = L"OpenAFile";
    			this->ResumeLayout(false);
    			this->PerformLayout();
    
    		}
    	
    		System::Void Test6::OpenAFile::button2_Click(System::Object^ sender, System::EventArgs^  e) 
    		{
    				 Test6::OpenAFile^ FormToOpen = this;
    				 FormToOpen->Close();
    		}
    	    
    		System::Void OpenAFile::button1_Click(System::Object^ sender, System::EventArgs^  e)
    		{
    				 // on récupère dans la grille les éléments saisis et on débute le traitement
    				 // on rend la main a la form1 pour afficher la progress bar
    				 
    				 Test6::OpenAFile^ FormToOpen = this;
    				 FormToOpen->Close();
    
    //				 this->form1->progressBar1->Value = 50;
    		}
    
    
             System::Void OpenAFile::button3_Click(System::Object^  sender, System::EventArgs^  e)
    		 {
    			Stream^ myStream;
    			System::String^ wsLocalString;
    			OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog;
    			openFileDialog1->InitialDirectory = "c:\\";
    			openFileDialog1->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
    			openFileDialog1->FilterIndex = 2;
    			openFileDialog1->RestoreDirectory = true;
    			if( openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK )
    			{
    				if( (myStream = openFileDialog1->OpenFile()) != nullptr )
    				{
    					wsLocalString = openFileDialog1->SafeFileName;
    					//sFileToOpen = wsLocalString;
    					// Insert code to read the stream here.
    					myStream->Close();
    				}
    			}
    		 }
    }
    

    Et il me reste une seuls non conformité de compilation qui me résiste:

      Toutes les sorties sont à jour.
      OpenAFile.cpp
    OpenAFile.cpp(22): error C2511: 'Test6::OpenAFile::OpenAFile(Test6::SpecificationLoader ^)' : impossible de trouver la fonction membre surchargée dans 'Test6::OpenAFile'
              d:\usr\memoria\dev\aln_kernel\make\test6\test6\OpenAFile.h(24) : voir la déclaration de 'Test6::OpenAFile'
      SpecificationLoader.cpp
      Génération de code en cours...
    
    ÉCHEC du build.


    Jean Noël Martin

    jeudi 3 mai 2012 12:14

Réponses

  • Vous ne suivez pas mes conseils et vous êtes en train de les payer cash.

    1- StdAfx.h doit toujours être le premier include des .cpp et est inutil dans les .h

    2- Si un .h est utilisé dans de nombreux fichiers du projet et que son contenu ne change pas, il doit être mis en #include dans le fichier StdAfx.h (example : stdio.h, stdlib.h ou string, mais là, je pense que c'est une gros erreur d'utiliser les types natifs à la place de System::String de .NET)

    3- Vous utilisez .h comme un "déclarateur" d'interface mais vous avez tous les membres privés dedans, c'est nul. Utilisez un type Interface pour spécifier l'interface public de votre formulaire. OpenAFile implémentera cette interface, c'est tout.

    4- En découpant la classe OpenAFile en 2 fichiers, le Designer graphique ne sera plus opérationnel. Pas sûr mais très probable.

    5- le #include <string> dans le .cpp, il sert à rien, sauf ralentir la compilation.

    6- Lié à l'erreur de compilation

    Dans le .h

    OpenAFile(void);
    OpenAFile(Form^ form1);

    Mais dans le cpp

    OpenAFile::OpenAFile(  Test6::SpecificationLoader^ form1)


    "void" est différent de "Test6::SpecificationLoader" et "Test6::Form^" est différent de "Test6::SpecificationLoader"

    C'est donc tout à fait logique que le compilateur gueule, vous lui définissez un constructeur que vous n'avez pas déclaré dans le .h.

    C'est l'illustration même de la lourdeur de la méthode C++ "standard" qui fait perdre du temps sur ces conneries.

    Avec un fichier pour une classe d'implémentation et une interface, vous n'avez pas ces contraintes si la méthode ne fait pas partie de l'interface, tout sera dans un seul fichier, par construction synchrone entre l'API et l'implémentation.

    7-

    sFileToOpen = button3_Click( this, e);

    WTF, ça compile ???????????????????

    sFileToOpen est un std::string (une globale et en plus même pas threadsafe, bonjour les soirées de debugging :-((((((((( )

    button3_Click "renvoye" un System::Void, c'est quoi l'opérateur de cast magique qui "convertie" un "System::Void" et std::string ???????

    En résumé, arrêtez de faire n'importe nawak, utilisez des System::String et n'utilisez pas de fichier .cpp pour les classes de formulaires.


    Paul Bacelar, Ex - MVP VC++

    jeudi 3 mai 2012 16:11
    Modérateur
  • Conversions dans le code de jonction IHM-métier

    voir le thread : http://social.msdn.microsoft.com/Forums/fr-FR/visualcplusfr/thread/95aa1730-118e-4e19-95be-dfea8b0e1a75


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse JeanNoel53 vendredi 4 mai 2012 17:21
    vendredi 4 mai 2012 11:48
    Modérateur

Toutes les réponses

  • Vous ne suivez pas mes conseils et vous êtes en train de les payer cash.

    1- StdAfx.h doit toujours être le premier include des .cpp et est inutil dans les .h

    2- Si un .h est utilisé dans de nombreux fichiers du projet et que son contenu ne change pas, il doit être mis en #include dans le fichier StdAfx.h (example : stdio.h, stdlib.h ou string, mais là, je pense que c'est une gros erreur d'utiliser les types natifs à la place de System::String de .NET)

    3- Vous utilisez .h comme un "déclarateur" d'interface mais vous avez tous les membres privés dedans, c'est nul. Utilisez un type Interface pour spécifier l'interface public de votre formulaire. OpenAFile implémentera cette interface, c'est tout.

    4- En découpant la classe OpenAFile en 2 fichiers, le Designer graphique ne sera plus opérationnel. Pas sûr mais très probable.

    5- le #include <string> dans le .cpp, il sert à rien, sauf ralentir la compilation.

    6- Lié à l'erreur de compilation

    Dans le .h

    OpenAFile(void);
    OpenAFile(Form^ form1);

    Mais dans le cpp

    OpenAFile::OpenAFile(  Test6::SpecificationLoader^ form1)


    "void" est différent de "Test6::SpecificationLoader" et "Test6::Form^" est différent de "Test6::SpecificationLoader"

    C'est donc tout à fait logique que le compilateur gueule, vous lui définissez un constructeur que vous n'avez pas déclaré dans le .h.

    C'est l'illustration même de la lourdeur de la méthode C++ "standard" qui fait perdre du temps sur ces conneries.

    Avec un fichier pour une classe d'implémentation et une interface, vous n'avez pas ces contraintes si la méthode ne fait pas partie de l'interface, tout sera dans un seul fichier, par construction synchrone entre l'API et l'implémentation.

    7-

    sFileToOpen = button3_Click( this, e);

    WTF, ça compile ???????????????????

    sFileToOpen est un std::string (une globale et en plus même pas threadsafe, bonjour les soirées de debugging :-((((((((( )

    button3_Click "renvoye" un System::Void, c'est quoi l'opérateur de cast magique qui "convertie" un "System::Void" et std::string ???????

    En résumé, arrêtez de faire n'importe nawak, utilisez des System::String et n'utilisez pas de fichier .cpp pour les classes de formulaires.


    Paul Bacelar, Ex - MVP VC++

    jeudi 3 mai 2012 16:11
    Modérateur
  • Je suis d'accord avec vos observations, mais j'ai quand même besoin de sortir de l'ihm en std::wstring


    Jean Noël Martin

    vendredi 4 mai 2012 09:57
  • Conversions dans le code de jonction IHM-métier

    voir le thread : http://social.msdn.microsoft.com/Forums/fr-FR/visualcplusfr/thread/95aa1730-118e-4e19-95be-dfea8b0e1a75


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse JeanNoel53 vendredi 4 mai 2012 17:21
    vendredi 4 mai 2012 11:48
    Modérateur