none
Modifier un control dans le .cpp RRS feed

  • Question

  • Je suis débutant en VC++ 2008.

    J'ai une application CLR qui conprend des cases à cocher. Je souhaiterais cocher ou décocher ces cases, dans un fichier *.cpp en fonction des résultats de fonctions.

    J'ai inclut Form1.h dans le cpp mais je n'arrive pas a faire Form1::checkBox1->Checked = true; sachant que Form1 est ouvert au lancement du programme Application::Run(gcnew Form1()).

    Pourriez-vous m'aider?

    Cordialement

    Delje14

    • Déplacé Alex Petrescu mercredi 18 août 2010 12:04 c++ (Origine :Visual Studio - en général)
    mardi 17 août 2010 11:25

Réponses

  • Vous semblez avoir un penchant naturel vers les globals.

    Il faut un peu canaliser ce penchant. :-)

    Pensez à utiliser une implémentation du Design Pattern "Singleton" pour avoir accès à votre Formulaire principale depuis n'importe quel bout de code.

    Un simple membre static de classe Form1 devrait faire l'affaire.

    public ref class Form1 : public System::Windows::Forms::Form
    {

    ...

    public: static Form1^ Instance;

    ...

    }

    ...

    // Create the main window and run it

    Form1::Instance = gcnew Form1();
     Application::Run(Form1::Instance);
    ...

    Vous accédez à votre formulaire depuis n'importe quel bout de code par : "Form1::Instance"

    Attention, vous ne devez jamais accéder aux propriétés des controles depuis un autre thread que celui qui a créé ces controles.

    Vous ne devez donc pas modifier le texte de la textbox dans la callback mais dans une méthode du formulaire en n'oubliant pas de mettre en pratique la méthode Invoke de la classe Control depuis l'objet formulaire.

    http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx


    Paul Bacelar, Ex - MVP VC++
    • Marqué comme réponse Alex Petrescu mercredi 1 septembre 2010 09:50
    dimanche 29 août 2010 22:02
    Modérateur

Toutes les réponses

  • Bonjour,

     

    Si vous voulez modifier la propriété checkBox1 d’un objet de type Form1 dans une méthode d’une autre classe, checkBox1 doit être une variable de type publique. Donc vous devez modifier sa déclaration dans la classe Form1

    private: System::Windows::Forms::CheckBox^  checkBox1;

     

    et la déclarer comme “public”.

     

    Une approche plus correcte est de modifier cette variable a l’intérieur de la classe et utiliser la logique des autres fonctions que vous appelez dans les méthodes de la classe Form1.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

    mercredi 18 août 2010 12:04
  • Mon composant TextBox1 est bien declaré comme public. Dans le fichier *.cpp, j'ai la fonction

    void EcrireTextBox(void)

    {

    Form1 ^f;

    f =

    gcnew Form1();

    f->IDC_TextBox1->AppendText(

    "toto");

    }

    La fonction est bien executée mais rien ne s'écrit dans la TextBox.

     

    Cordialement

     

     

     

     

    jeudi 19 août 2010 11:35
  • Bonjour,

     

    Dans quel fichier se trouve cette fonction ? Vous avez créé ici un autre objet de type Form1, mais il n’est pas l’objet Form1 que vous voyez sur l’écran. Pour modifier les propriétés de cet objet, il vous faut une référence à l’objet lui-même ; il ne faut pas créer un nouvel objet de même type. Donc vous devez soit modifier les propriétés dans une méthode de la classe Form1, soit passer une référence a l’objet Form1 dans la fonction qui fait les modifications.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

    jeudi 19 août 2010 12:21
  • Bonsoir,

     

    Lorsque je créais une appli CLR winform, un fichier Form1.h et un fichier toto.cpp sont créés. Je souhaiterais qu'une fonction de toto.cpp puisseagir sur les objets de la Form1.

    Pouvez-vous m'envoyer un petit exemple?

    jeudi 19 août 2010 15:49
  • Bonjour,

     

    Quand vous créez votre application, le Form1 est le formulaire principal de l’application. C’est ça que la commande de la fonction Main() du fichier <app_name>.cpp signifie:

    Application::Run(gcnew Form1());

     

     

    Si vous voulez créer une fonction en dehors de la classe Form1 qui appellera un objet de type Form1, vous pouvez le créer dans une autre classe (Form2, peut-être) sur ce modèle :

     

    void MaFunc(Form1 f)
    {
    f->IDC_TextBox1->Text = « blabla » ; 
    }
    

     

    Dans ce cas, la boite de texte IDC_TextBox1 doit être déclarée comme public dans la classe Form1.

     

    Si vous envisagez un certain scenario, une courte description sera utile, peut-être je peux mieux vous aider.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

    vendredi 20 août 2010 14:02
  • Bonjour,

    merci pour la réponse.

    En fait, dans mon appli, j'ai une fonction qui est appelé par un appareil branché sur un port USB. Dans cette fonction des infos sont remontées. Je dois donc afficher ces informations sur ma partie graphique.

    Ce qui serait intéressant, ce serait d'avoir une variable globale qui serait ma classe WinForm.

    En résumé, j'ai :

    • mon .cpp où je fais le gcnew de ma WinForm (Application::Run(gcnew Form1()); )
    • une fonction qui est appélée de l'extérieur:

              void remontéinfs(String^ s)

              {

                  Traitement .....

                  Et la il faut que je fasse mise a jour de ma WinForm

               }

    • Ma WinForm
    vendredi 20 août 2010 14:33
  • Bonjour,

    Pouvez-vous nous montrer la ligne où vous spécifiez d'appeller la méthode remontéinfs() ?

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    dimanche 22 août 2010 11:15
    Modérateur
  • Bonjour,

    J'ai fais un petit projet d'exemple

     

    Form1.h

    #pragma once
    
    #include "FonctionAppel.h"
    
    
    namespace AppliExemple {
    
    	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>
    	/// Summary for Form1
    	///
    	/// WARNING: If you change the name of this class, you will need to change the
    	///     'Resource File Name' property for the managed resource compiler tool
    	///     associated with all .resx files this class depends on. Otherwise,
    	///     the designers will not be able to interact properly with localized
    	///     resources associated with this form.
    	/// </summary>
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Add the constructor code here
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Clean up any resources being used.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	public: System::Windows::Forms::TextBox^ textBox1;
    	protected: 
    	private: System::Windows::Forms::Button^ button1;
    
    	private:
    		/// <summary>
    		/// Required designer variable.
    		/// </summary>
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Required method for Designer support - do not modify
    		/// the contents of this method with the code editor.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    			this->textBox1 = (gcnew System::Windows::Forms::TextBox());
    			this->button1 = (gcnew System::Windows::Forms::Button());
    			this->SuspendLayout();
    			// 
    			// textBox1
    			// 
    			this->textBox1->Location = System::Drawing::Point(12, 12);
    			this->textBox1->Name = L"textBox1";
    			this->textBox1->Size = System::Drawing::Size(260, 20);
    			this->textBox1->TabIndex = 0;
    			// 
    			// button1
    			// 
    			this->button1->Location = System::Drawing::Point(197, 50);
    			this->button1->Name = L"button1";
    			this->button1->Size = System::Drawing::Size(75, 23);
    			this->button1->TabIndex = 1;
    			this->button1->Text = L"button1";
    			this->button1->UseVisualStyleBackColor = true;
    			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(292, 100);
    			this->Controls->Add(this->button1);
    			this->Controls->Add(this->textBox1);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->ResumeLayout(false);
    			this->PerformLayout();
    
    		}
    #pragma endregion
    	private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
    				 
    				 // Utilisé pour simuler un appel asynchrone à ma fonction
    				 test();
    			 }
    	};
    }
    
    
    

    AppliExemple.cpp

    // AppliExemple.cpp : main project file.
    
    #include "stdafx.h"
    #include "Form1.h"
    
    using namespace AppliExemple;
    
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
    	// Enabling Windows XP visual effects before any controls are created
    	Application::EnableVisualStyles();
    	Application::SetCompatibleTextRenderingDefault(false); 
    
    	// Create the main window and run it
    	Application::Run(gcnew Form1());
    	return 0;
    }
    
    

    FonctionAppel.cpp

    #include "stdio.h"
    #include "FonctionAppel.h"
    
    void test(void)
    {	
    	char *maChaine = "toto";
    	// Ici je dois encoyer la chaine "toto" dans la TextBox1
    	// Les infos que je dois envoyer a mon UI m'arrive de façons asynchrone.
    }
    

    FonctionAppel.h comportant simplement le prototype de ma fonction test.

    Pour simplifier, mon besoin est donc de remonter la chaine de caractères maChaine dans ma TextBox1.

     

    Mon besoin devient très très urgent.

     

    mercredi 25 août 2010 08:42
  • Vous semblez avoir un penchant naturel vers les globals.

    Il faut un peu canaliser ce penchant. :-)

    Pensez à utiliser une implémentation du Design Pattern "Singleton" pour avoir accès à votre Formulaire principale depuis n'importe quel bout de code.

    Un simple membre static de classe Form1 devrait faire l'affaire.

    public ref class Form1 : public System::Windows::Forms::Form
    {

    ...

    public: static Form1^ Instance;

    ...

    }

    ...

    // Create the main window and run it

    Form1::Instance = gcnew Form1();
     Application::Run(Form1::Instance);
    ...

    Vous accédez à votre formulaire depuis n'importe quel bout de code par : "Form1::Instance"

    Attention, vous ne devez jamais accéder aux propriétés des controles depuis un autre thread que celui qui a créé ces controles.

    Vous ne devez donc pas modifier le texte de la textbox dans la callback mais dans une méthode du formulaire en n'oubliant pas de mettre en pratique la méthode Invoke de la classe Control depuis l'objet formulaire.

    http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx


    Paul Bacelar, Ex - MVP VC++
    • Marqué comme réponse Alex Petrescu mercredi 1 septembre 2010 09:50
    dimanche 29 août 2010 22:02
    Modérateur