IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

m�thode qui permet d'�crire dans un editbox WinForm .net Visual C++


Sujet :

C++/CLI

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Par d�faut m�thode qui permet d'�crire dans un editbox WinForm .net Visual C++
    Bonjour,

    voila quelques jours que j'essaie en vain d'�crire du text dans "editbox1" (qui est dans Form1.h) depuis le main.

    l'erreur que j'ai c'est
    Erreur 1 error C3699: '*'*: impossible d'utiliser cette indirection sur le type 'b::Form1'
    et
    Erreur 2 error C2059: erreur de syntaxe*: '>'
    voici mon code ci dessous:

    Form1.h
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    #pragma once
    #include <string>
    namespace b {
     
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
     
    	/// <summary>
    	/// Description résumée de Form1
    	/// </summary>
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    		void MarshalString ( System::String^ s, std::string& os )
    		{   
    			using namespace System::Runtime::InteropServices;   
    			const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();   
    			os = chars;   
    			Marshal::FreeHGlobal(IntPtr((void*)chars));
    		}
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: ajoutez ici le code du constructeur
    			//
     
    		}
    		void setLog(std::string text)
    		{
    			String^ tmp;
    			MarshalString(tmp, text);
    			this->textBox1->AppendText(tmp);
    		}
     
    		static void StaticSetLog( std::string text ) 
    		{ 
    			Form1* Obj = std::string<Form1*>( text ); 
    			Obj->setLog(text); 
    		} 
     
    	protected:
    		/// <summary>
    		/// Nettoyage des ressources utilisées.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::TextBox^  textBox1;
     
    	protected: 
     
    	private:
    		/// <summary>
    		/// Variable nécessaire au concepteur.
    		/// </summary>
    		System::ComponentModel::Container ^components;
     
    #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>
    		void InitializeComponent(void)
    		{
    			this->textBox1 = (gcnew System::Windows::Forms::TextBox());
    			this->SuspendLayout();
    			// 
    			// textBox1
    			// 
    			this->textBox1->Location = System::Drawing::Point(12, 13);
    			this->textBox1->Multiline = true;
    			this->textBox1->Name = L"textBox1";
    			this->textBox1->ScrollBars = System::Windows::Forms::ScrollBars::Vertical;
    			this->textBox1->Size = System::Drawing::Size(260, 237);
    			this->textBox1->TabIndex = 0;
    			this->textBox1->Text = L"lol";
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(284, 262);
    			this->Controls->Add(this->textBox1);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->ResumeLayout(false);
    			this->PerformLayout();
     
    		}
    #pragma endregion
    	};
    }
    b.cpp (c'est mon main)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // b.cpp*: fichier projet principal.
     
    #include "stdafx.h"
    #include "Form1.h"
     
    using namespace b;
     
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
    	// Activation des effets visuels de Windows*XP avant la création de tout contrôle
    	Application::EnableVisualStyles();
    	Application::SetCompatibleTextRenderingDefault(false); 
     
     
    	// Créer la fenêtre principale et l'exécuter
    	Application::Run(gcnew Form1());
    	//Form1::textBox1->appendText("test");
    	Form1::StaticSetLog("test lol");
    	return 0;
    }
    vous noterez la tentative : //Form1::textBox1->appendText("test"); mais �a n'a pas fonctionn�.

    Si quelqu'un peut m'indiquer ce que je fais mal ce serait super. (en esperant sutout ne pas avoir le droit � des "�a ne respecte pas les normes ISO C++" ou en win32 c'est mieux... si je demande �a c'est qu'au final j'ai pas trop le choix...)

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    D�j�, ton appel � MarshalString() dans setLog() est dans le mauvais sens.
    Je pense que tu peux simplement le remplacer par tmp=gcnew String(text.c_str());.

    Quant � ton dernier probl�me:
    Code C++/CLI : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    Form1^ myForm = gcnew Form1();
    myForm->textBox1->AppendText("test");
    Application::Run(myForm);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Par d�faut
    Merci, c'est exactement �a !!! (j'avais trop la tete dedans pour le voir )

    pour le marshal, j'ai v�rifi� vite fait c'est bien �a

    maintenant, j'aimerais pouvoir inclure ceci dans un autre programme.
    L'id�e est de r�cup�rer les logs du main dans cette textbox...

    je pense que l'on va devoir faire des threads (alors que la form est dans un thread?) mais c'est surtout apr�s ou j'ai un pb. comment envoyer mon string (ou string^) apr�s l'application::run? (est-ce un simple pb de mise � jour de la textbox ou si l'on a besoin d'un thread comment r�cup�rer l'acc�s � cette textbox???)

    De ce que j'ai cru comprendre et tester, il me faut un thread qui me permette de lancer la form, mais cependant je perd le controle du soft principal tant que la fenetre est la... et je n'ai pas trouv� de m�thode pour �crire depuis n'importe quelle classe apr�s le main... (j'ai regard� du cot� des invoke, des databinding bidirectionnals...)

    Merci de m'aider

  4. #4
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Le Run() contient une boucle, se termine quand le form est ferm�.

    Soit tu fais un programme GUI sans aucune op�ration longue, soit tu bosses avec tes op�rations longues dans un thread donn� et la GUI dans un autre thread. Apr�s, un coup de myForm->Invoke(delegate) peut faire appeler n'importe quelle fonction dans le contexte du thread de GUI, depuis n'importe quel autre thread du processus.*

    *en laissant de c�t� les notions d'AppDomain, qui ne nous int�ressent pas ici.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Par d�faut
    Du coup, �a ne sert � rien que je test plus loin tant que j'ai pas r�gl� ce pb^^

    J'ai cru voir que l'on pouvait le faire en "trick" une m�thode qui permet de faire attendre la fin du thread principal pour �viter de souffrir de la boucle.

    Il n'y a pas un moyen plus simple? (et sinon, c'est quoi? un event listener sur quel d�clencheur???)

  6. #6
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Pourquoi ne pas tout simplement mettre le Application::Run() dans un autre thread?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. m�thode qui permet de Charger ComboBox
    Par fatimazohra dans le forum NetBeans
    R�ponses: 2
    Dernier message: 28/04/2009, 14h14
  2. R�ponses: 2
    Dernier message: 27/04/2009, 22h23
  3. [MySQL] Requ�te mysql qui permet de chercher dans une base de donn�es compl�te.
    Par your_joker dans le forum PHP & Base de donn�es
    R�ponses: 4
    Dernier message: 18/07/2008, 10h28
  4. R�ponses: 1
    Dernier message: 02/04/2008, 19h27
  5. M�thode qui permet de modifier le code d'une page apr�s affichage .. ?
    Par winnie82 dans le forum G�n�ral JavaScript
    R�ponses: 15
    Dernier message: 04/07/2006, 15h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo