none
Finaliser la maquette RRS feed

  • Question

  • Bonjour,

    suite à mes nombreuses questions et à votre efficience dans les réponse, j'arrive aujourd'hui dans la phase finale de la maquette.

    J'ai cependant un bug d'affichage qui m'oblige a répéter l'appui sur le bouton de fin de la Form OpenAFile.

    Je vais mettre d'abord le code de la classe, puis la grille d'écran

    #include "StdAfx.h"
    #include <string>
    #include <stdio.h>
    #include <stdlib.h>
    #include < vcclr.h >
    #include <iostream>
    
    #include "OpenAFile.h"
    namespace Test6 {
    
    	using namespace System;
    	using namespace std;
    	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(void)
    		{
    			OpenAFile::InitializeComponent();
    			//
    			//TODO: ajoutez ici le code du constructeur
    			//
    		}
    
    		OpenAFile::OpenAFile( Form^ form1)
            {
     			this->form1 = form1;
    			OpenAFile::InitializeComponent();
    			textBox6->Text = L"English";
    			textBox7->Text = L"Word Document";
    			textBox4->Text = L"Interbase";
    			textBox5->Text = L"Coherence";
    			Test6::OpenAFile^ newWindow = this;
    			if( openFileDialog2->RestoreDirectory == false)
    			    openFileDialog2->InitialDirectory = "c:\\";
    			newWindow->ShowDialog();//Dialog
    			wsFileToOpen = L"D:\usr";
            }
    
    		OpenAFile::~OpenAFile()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    		
    		void OpenAFile::InitializeComponent(void)
    		{
    			this->textBox4 = (gcnew System::Windows::Forms::TextBox());
    			this->textBox5 = (gcnew System::Windows::Forms::TextBox());
    			this->textBox6 = (gcnew System::Windows::Forms::TextBox());
    			this->textBox7 = (gcnew System::Windows::Forms::TextBox());
    			this->textBox8 = (gcnew System::Windows::Forms::TextBox());
    			this->textBox9 = (gcnew System::Windows::Forms::TextBox());
    			this->textBox10 = (gcnew System::Windows::Forms::TextBox());
    			this->button4 = (gcnew System::Windows::Forms::Button());
    			this->button5 = (gcnew System::Windows::Forms::Button());
    			this->button6 = (gcnew System::Windows::Forms::Button());
    			this->label8 = (gcnew System::Windows::Forms::Label());
    			this->label9 = (gcnew System::Windows::Forms::Label());
    			this->label10 = (gcnew System::Windows::Forms::Label());
    			this->openFileDialog2 = (gcnew System::Windows::Forms::OpenFileDialog());
    			this->label1 = (gcnew System::Windows::Forms::Label());
    			this->label2 = (gcnew System::Windows::Forms::Label());
    			this->label3 = (gcnew System::Windows::Forms::Label());
    			this->label4 = (gcnew System::Windows::Forms::Label());
    			this->SuspendLayout();
    			// 
    			// textBox4
    			// 
    			this->textBox4->Location = System::Drawing::Point(665, 86);
    			this->textBox4->Name = L"textBox4";
    			this->textBox4->Size = System::Drawing::Size(147, 20);
    			this->textBox4->TabIndex = 4;
    			this->textBox4->TextChanged += gcnew System::EventHandler(this, &OpenAFile::textBox4_TextChanged);
    			// 
    			// textBox5
    			// 
    			this->textBox5->Location = System::Drawing::Point(665, 189);
    			this->textBox5->Name = L"textBox5";
    			this->textBox5->Size = System::Drawing::Size(147, 20);
    			this->textBox5->TabIndex = 5;
    			this->textBox5->TextChanged += gcnew System::EventHandler(this, &OpenAFile::textBox5_TextChanged);
    			// 
    			// textBox6
    			// 
    			this->textBox6->Location = System::Drawing::Point(96, 326);
    			this->textBox6->Name = L"textBox6";
    			this->textBox6->Size = System::Drawing::Size(191, 20);
    			this->textBox6->TabIndex = 6;
    			this->textBox6->TextChanged += gcnew System::EventHandler(this, &OpenAFile::textBox6_TextChanged);
    			// 
    			// textBox7
    			// 
    			this->textBox7->Location = System::Drawing::Point(96, 437);
    			this->textBox7->Name = L"textBox7";
    			this->textBox7->Size = System::Drawing::Size(191, 20);
    			this->textBox7->TabIndex = 7;
    			this->textBox7->TextChanged += gcnew System::EventHandler(this, &OpenAFile::textBox7_TextChanged);
    			// 
    			// textBox8
    			// 
    			this->textBox8->Location = System::Drawing::Point(96, 260);
    			this->textBox8->Name = L"textBox8";
    			this->textBox8->Size = System::Drawing::Size(100, 20);
    			this->textBox8->TabIndex = 14;
    			this->textBox8->TextChanged += gcnew System::EventHandler(this, &OpenAFile::textBox8_TextChanged);
    			// 
    			// textBox9
    			// 
    			this->textBox9->Location = System::Drawing::Point(96, 205);
    			this->textBox9->Name = L"textBox9";
    			this->textBox9->Size = System::Drawing::Size(191, 20);
    			this->textBox9->TabIndex = 15;
    			this->textBox9->TextChanged += gcnew System::EventHandler(this, &OpenAFile::textBox9_TextChanged);
    			// 
    			// textBox10
    			// 
    			this->textBox10->Location = System::Drawing::Point(99, 152);
    			this->textBox10->Name = L"textBox10";
    			this->textBox10->Size = System::Drawing::Size(188, 20);
    			this->textBox10->TabIndex = 16;
    			this->textBox10->TextChanged += gcnew System::EventHandler(this, &OpenAFile::textBox10_TextChanged);
    			// 
    			// button4
    			// 
    			this->button4->Location = System::Drawing::Point(543, 421);
    			this->button4->Name = L"button4";
    			this->button4->Size = System::Drawing::Size(75, 23);
    			this->button4->TabIndex = 8;
    			this->button4->Text = L"Cancel";
    			this->button4->UseVisualStyleBackColor = true;
    			this->button4->Click += gcnew System::EventHandler(this, &OpenAFile::button4_Click);
    			// 
    			// button5
    			// 
    			this->button5->Location = System::Drawing::Point(661, 421);
    			this->button5->Name = L"button5";
    			this->button5->Size = System::Drawing::Size(75, 23);
    			this->button5->TabIndex = 9;
    			this->button5->Text = L"Process";
    			this->button5->UseVisualStyleBackColor = true;
    			this->button5->Click += gcnew System::EventHandler(this, &OpenAFile::button5_Click);
    			// 
    			// button6
    			// 
    			this->button6->Location = System::Drawing::Point(99, 82);
    			this->button6->Name = L"button6";
    			this->button6->Size = System::Drawing::Size(75, 23);
    			this->button6->TabIndex = 10;
    			this->button6->Text = L"Load File";
    			this->button6->UseVisualStyleBackColor = true;
    			this->button6->Click += gcnew System::EventHandler(this, &OpenAFile::button6_Click);
    			// 
    			// label8
    			// 
    			this->label8->AutoSize = true;
    			this->label8->Location = System::Drawing::Point(96, 136);
    			this->label8->Name = L"label8";
    			this->label8->Size = System::Drawing::Size(54, 13);
    			this->label8->TabIndex = 11;
    			this->label8->Text = L"File Name";
    			// 
    			// label9
    			// 
    			this->label9->AutoSize = true;
    			this->label9->Location = System::Drawing::Point(93, 189);
    			this->label9->Name = L"label9";
    			this->label9->Size = System::Drawing::Size(48, 13);
    			this->label9->TabIndex = 12;
    			this->label9->Text = L"File Path";
    			// 
    			// label10
    			// 
    			this->label10->AutoSize = true;
    			this->label10->Location = System::Drawing::Point(94, 244);
    			this->label10->Name = L"label10";
    			this->label10->Size = System::Drawing::Size(47, 13);
    			this->label10->TabIndex = 13;
    			this->label10->Text = L"File Disk";
    			// 
    			// openFileDialog2
    			// 
    			this->openFileDialog2->FileName = L"openFileDialog2";
    			this->openFileDialog2->FileOk += gcnew System::ComponentModel::CancelEventHandler(this, &OpenAFile::openFileDialog2_FileOk);
    			// 
    			// label1
    			// 
    			this->label1->AutoSize = true;
    			this->label1->Location = System::Drawing::Point(96, 307);
    			this->label1->Name = L"label1";
    			this->label1->Size = System::Drawing::Size(55, 13);
    			this->label1->TabIndex = 17;
    			this->label1->Text = L"Language";
    			// 
    			// label2
    			// 
    			this->label2->AutoSize = true;
    			this->label2->Location = System::Drawing::Point(96, 418);
    			this->label2->Name = L"label2";
    			this->label2->Size = System::Drawing::Size(83, 13);
    			this->label2->TabIndex = 18;
    			this->label2->Text = L"Document Type";
    			// 
    			// label3
    			// 
    			this->label3->AutoSize = true;
    			this->label3->Location = System::Drawing::Point(665, 67);
    			this->label3->Name = L"label3";
    			this->label3->Size = System::Drawing::Size(84, 13);
    			this->label3->TabIndex = 19;
    			this->label3->Text = L"Database Name";
    			// 
    			// label4
    			// 
    			this->label4->AutoSize = true;
    			this->label4->Location = System::Drawing::Point(665, 170);
    			this->label4->Name = L"label4";
    			this->label4->Size = System::Drawing::Size(72, 13);
    			this->label4->TabIndex = 20;
    			this->label4->Text = L"Database File";
    			// 
    			// OpenAFile
    			// 
    			this->AutoSize = true;
    			this->ClientSize = System::Drawing::Size(977, 552);
    			this->Controls->Add(this->label4);
    			this->Controls->Add(this->label3);
    			this->Controls->Add(this->label2);
    			this->Controls->Add(this->label1);
    			this->Controls->Add(this->textBox10);
    			this->Controls->Add(this->textBox9);
    			this->Controls->Add(this->textBox8);
    			this->Controls->Add(this->label10);
    			this->Controls->Add(this->label9);
    			this->Controls->Add(this->label8);
    			this->Controls->Add(this->button6);
    			this->Controls->Add(this->button5);
    			this->Controls->Add(this->button4);
    			this->Controls->Add(this->textBox7);
    			this->Controls->Add(this->textBox6);
    			this->Controls->Add(this->textBox5);
    			this->Controls->Add(this->textBox4);
    			this->Location = System::Drawing::Point(96, 387);
    			this->Name = L"OpenAFile";
    			this->Text = L"Open a File";
    			this->ResumeLayout(false);
    			this->PerformLayout();
    
    		}
    
    	 System::Void OpenAFile::button4_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();
    	 }
    	 
    	 System::Void OpenAFile::button5_Click( System::Object^  sender, System::EventArgs^ e)
    	 {
    		Test6::OpenAFile^ FormToOpen = this;
    		FormToOpen->Close();
    	 }
    	 
    	 System::Void OpenAFile::openFileDialog2_FileOk( System::Object^ sender, System::ComponentModel::CancelEventArgs ^ e)
    	 {
    		
    	 }
    	 
    	 System::Void OpenAFile::button6_Click( System::Object^  sender, System::EventArgs^ e)
    	 {
    		Stream^ myStream;
    		int len;
    		int ind;
    		int lastind;
    		System::String^ wsLocalString;
    		System::String^ wsLocalName;
    		System::String^ wsLocalPath;
    		System::String^ wsLocalDisk;
    		System::String^ wsLocalExtension;
    		OpenFileDialog^ openFileDialog2 = gcnew OpenFileDialog;
    		
    		openFileDialog2->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
    		openFileDialog2->FilterIndex = 2;
    		openFileDialog2->RestoreDirectory = true;
    		if( openFileDialog2->ShowDialog() == System::Windows::Forms::DialogResult::OK )
    		{
    			if( (myStream = openFileDialog2->OpenFile()) != nullptr )
    			{
    				// on acquiert la chaine
    				wsLocalString = openFileDialog2->FileName;
    				// on la découpe
    				// Substring découpe un chaine à partir de 1° caractère jusque à la longeur de la sous chaine
    				ind = wsLocalString->IndexOf( L"\\");
    				lastind = wsLocalString->LastIndexOf( L"\\");
    				len = wsLocalString->Length;
    				lastind--;
    				len = len - 26;
    				wsLocalDisk = wsLocalString->Substring( 0, ind);
    				wsLocalPath = wsLocalString->Substring( ind, lastind);
    				wsLocalName = wsLocalString->Substring( lastind + 2, len);
    				// et on affiche le résutat.
    				textBox10->Text = wsLocalName;
    				textBox9->Text = wsLocalPath;
    				textBox8->Text = wsLocalDisk; 
    				// on la convertit en wstring
    				using namespace Runtime::InteropServices;
                    const wchar_t* chars = (const wchar_t*)(Marshal::StringToHGlobalUni( wsLocalName)).ToPointer();
                    wsFileToOpen.append( chars);
                    Marshal::FreeHGlobal(IntPtr((void*)chars));
    				chars = (const wchar_t*)(Marshal::StringToHGlobalUni( wsLocalDisk)).ToPointer();
    				wsDiskOfTheFile.append( chars);
    				Marshal::FreeHGlobal(IntPtr((void*)chars));
    				chars = (const wchar_t*)(Marshal::StringToHGlobalUni( wsLocalPath)).ToPointer();
    				wsPathOfTheFile.append( chars);
    				Marshal::FreeHGlobal(IntPtr((void*)chars));
    				/*
    				wcout << wsDiskOfTheFile << endl;
    				wcout << wsPathOfTheFile << endl;
    				wcout << wsFileToOpen << endl;
    				printf_s("%s\n", wsDiskOfTheFile);
    				printf_s("%s\n", wsPathOfTheFile);
    				printf_s("%s\n", wsFileToOpen);
    				*/
    				myStream->Close();
    			}
    		}
    	}
    };
    

    Deux questions à ce sujet:

    J'ai mis en commentaire les instructions d'affichage, pour éliminer un potentiel effet de bord: il n'y en a pas, mais ce code ne me donne pas de résultat. je ne dois pas savoir ou chercher la sortie standard?

    Je ne sais pas ce que c'est la fenètre mémoire. Je l'ai longuement cherchée elle aussi.

    De ce fait je n'ai toujours pas vérifié la correcte initialisation des variables wsFileToOpen ....

    Quel est le symptôme du dysfonctionnement?

    Cette form bien remplie demannde deux fois L'appui sur le bouton, que ce soit cancel ou process ? d'ou vient ce dysfonctionnement?

    Pour le reste, tout fonctionne bine à l'ouverture de la première form la progess bar est cachée et elle apparait après la fin de vie de la form OpenAFile.


    Jean Noël Martin

    samedi 5 mai 2012 09:39

Réponses

  • Moi j'ai compté 3 questions ;-)

    - La double-commande pour fermer la fenêtre (corrigée)

    - La sortie standard

    - La fenêtre mémoire

    La sortie standard

    Si vous avez créé un projet Winform, le fichier contenant l'applicatifs aura dans les en-têtes indiquant que votre exécutable s'exécutera dans le Sous-System Windows, le chargeur de l'OS ne "créera" pas de console pour lui.

    Cela ne pose aucun problème pour les applications graphiques.

    Pour les problématiques de type debugging Old School, à base d'une armada de printf dans une console et non d'un simple débuggeur interactif, sous Windows, c'est OutputDebugString (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363362(v=vs.85).aspx).

    C'est une fonction bien plus puissante et simple à mettre en oeuvre dans ce contexte. Elle n'a pas besoin de console, pas de C-Runtime particulière, plus rapide, activable/désactivable (cool pour la production ;-) ) etc...

    Cela permet de voir ces traces dans un débuggeur attaché au processus, dans la fenêtre "Output/Sortie" de VS par exemple.

    Des utilitaires comme DebugView (http://technet.microsoft.com/en-us/sysinternals/bb896647) permettent des les visualiser en live.

    Mais le debugging à base de printf n'est pas la méthode que je préconise car elle est très très lourde et trop limité.

    Une bonne maîtrise du débuggeur de VS permet de couvrir 99,999% des cas. Voir réponse à la question suivante ;-)

    La fenêtre mémoire

    Il s'agit d'une chausse-trappe pour novice et je viens de vérifier qu'il existe toujours sous VS2010.

    Le truc, c'est que VS à deux modes d'affichage, un quand on travail sur le source sans session de debbuging, et un autre quand une session de debbugging est en cours. Les "fenêtres" ouvertes et leurs tailles changent quand on commence une session de debugging.

    Mais ce changement, est visuel (changement dans le layout des fenêtres) mais change aussi le contenu des menus.

    Donc pour avoir accès aux fenêtres "Mémoire", il faut que vous ayez commencé une session de debugging (avec F5 par exemple), là, dans le menu "Déboguer", vous aurez beaucoup plus d'option qu'auparavant, dont "Déboguer"->"Fenêtres"->"Mémoire"->"Mémoire xx".

    P.S.: les vues "Mémoire xx" c'est un peu comme les vues "Espion xx", et si vous ne connaissez pas la Vue "Espion", je ne vois pas comment vous avez pu voir le contenu "erroné" de vos variables.


    Paul Bacelar, Ex - MVP VC++

    lundi 7 mai 2012 10:40
    Modérateur

Toutes les réponses

  • Pour ce qui est du double affichage, il y avait un ShowDialog de trop.

    le code devient

    #include "StdAfx.h"
    #include <string>
    #include <stdio.h>
    #include <stdlib.h>
    #include < vcclr.h >
    #include <iostream>
    
    #include "OpenAFile.h"
    namespace Test6 {
    
    	using namespace System;
    	using namespace std;
    	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(void)
    		{
    			OpenAFile::InitializeComponent();
    			//
    			//TODO: ajoutez ici le code du constructeur
    			//
    		}
    
    		OpenAFile::OpenAFile( Form^ form1)
            {
     			this->form1 = form1;
    			OpenAFile::InitializeComponent();
    			textBox6->Text = L"English";
    			textBox7->Text = L"Word Document";
    			textBox4->Text = L"Interbase";
    			textBox5->Text = L"Coherence";
    			if( openFileDialog2->RestoreDirectory == false)
    			    openFileDialog2->InitialDirectory = "c:\\";
            }
    
    		OpenAFile::~OpenAFile()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}

    Les autres questions restent d'actualité: je ne clos pas la discussion de ce fait

    J'ai mis en commentaire les instructions d'affichage, pour éliminer un potentiel effet de bord: il n'y en a pas, mais ce code ne me donne pas de résultat. je ne dois pas savoir ou chercher la sortie standard?

    Je ne sais pas ce que c'est la fenêtre mémoire. Je l'ai longuement cherchée elle aussi.


    Jean Noël Martin


    samedi 5 mai 2012 16:56
  • Moi j'ai compté 3 questions ;-)

    - La double-commande pour fermer la fenêtre (corrigée)

    - La sortie standard

    - La fenêtre mémoire

    La sortie standard

    Si vous avez créé un projet Winform, le fichier contenant l'applicatifs aura dans les en-têtes indiquant que votre exécutable s'exécutera dans le Sous-System Windows, le chargeur de l'OS ne "créera" pas de console pour lui.

    Cela ne pose aucun problème pour les applications graphiques.

    Pour les problématiques de type debugging Old School, à base d'une armada de printf dans une console et non d'un simple débuggeur interactif, sous Windows, c'est OutputDebugString (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363362(v=vs.85).aspx).

    C'est une fonction bien plus puissante et simple à mettre en oeuvre dans ce contexte. Elle n'a pas besoin de console, pas de C-Runtime particulière, plus rapide, activable/désactivable (cool pour la production ;-) ) etc...

    Cela permet de voir ces traces dans un débuggeur attaché au processus, dans la fenêtre "Output/Sortie" de VS par exemple.

    Des utilitaires comme DebugView (http://technet.microsoft.com/en-us/sysinternals/bb896647) permettent des les visualiser en live.

    Mais le debugging à base de printf n'est pas la méthode que je préconise car elle est très très lourde et trop limité.

    Une bonne maîtrise du débuggeur de VS permet de couvrir 99,999% des cas. Voir réponse à la question suivante ;-)

    La fenêtre mémoire

    Il s'agit d'une chausse-trappe pour novice et je viens de vérifier qu'il existe toujours sous VS2010.

    Le truc, c'est que VS à deux modes d'affichage, un quand on travail sur le source sans session de debbuging, et un autre quand une session de debbugging est en cours. Les "fenêtres" ouvertes et leurs tailles changent quand on commence une session de debugging.

    Mais ce changement, est visuel (changement dans le layout des fenêtres) mais change aussi le contenu des menus.

    Donc pour avoir accès aux fenêtres "Mémoire", il faut que vous ayez commencé une session de debugging (avec F5 par exemple), là, dans le menu "Déboguer", vous aurez beaucoup plus d'option qu'auparavant, dont "Déboguer"->"Fenêtres"->"Mémoire"->"Mémoire xx".

    P.S.: les vues "Mémoire xx" c'est un peu comme les vues "Espion xx", et si vous ne connaissez pas la Vue "Espion", je ne vois pas comment vous avez pu voir le contenu "erroné" de vos variables.


    Paul Bacelar, Ex - MVP VC++

    lundi 7 mai 2012 10:40
    Modérateur
  • J'essaie et je rends compte

    J'ai essayé les vues fenêtres mais je n'arrive pas à ouvrir une fenêtre sur une variable précise.

    J'ai télécharger le Viewer je l'essaie et je rends compte

    Tout ce la ne m’empêche pas d'avancer J'ai recréer un projet image de la maquette qui va être mon projet de migration. J'ai enregistré les différentes étapes et je compte en faire un getting started avec Visual et les forms.


    Jean Noël Martin



    lundi 7 mai 2012 15:44
  • Je ne vois pas de quel Viewer vous parlez.

    Si vous avez des problèmes avec les fenêtres "espion", je ne sais pas trop vous aider.

    Si vous avez lu un livre sur VS2010 et que vous ne voyez toujours pas comment se servir d'un "espion" un autre thread sur le sujet serait pertinent.

    Pour les vues "Mémoire", elles ne fournissent qu'une vue de la mémoire du processus en cours de debugging. Vous donnez, dans le champ de saisie, une adresse dans l'espace d'adressage du processus en cours de debugging, et il vous affiche le contenu de la mémoire du processus à cette adresse et au suivante, selon le mode de visualisation que vous avez sélectionné.

    Si le mémoire n'est pas mappée à l'adresse indiqué, la vue affiche des "??".


    Paul Bacelar, Ex - MVP VC++

    mercredi 9 mai 2012 11:21
    Modérateur