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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 395
    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 395
    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 395
    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 395
    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 395
    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 395
    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