Button Namen ändern aus externe Datei



  • Hallo,
    ich habe mehrer Buttons und habe eine Klasse welche eine Verbindung zur Datenbank herstellt und die eigendlichen Button Namen enthält.
    Nun kann ich in der form Datei, wo die Buttons erstellt werden den Namen mit "button->Text="Neuer Titel";" ändern aber ist es auch möglich den Button von einer anderen Datei heraus zu ändern?
    Und ist es möglich den Buttons versteckte Felder zu geben, sodass auf dem Button ein Titel steht aber wenn ich auf den Button draufklicke nur eine ID bzw. ein anderer Wert weitergegeben wird?

    Habe es so versucht:

    Form1 ^test= gcnew Form1(void);
    test->button1->text="test text";
    

    Dann kommen nur Fehlermeldungen

    'Form1': nichtdeklarierter Bezeichner....



  • Geht noch ungenauer?

    Aus welcher Form rufst Du...

    Form1 ^test= gcnew Form1(void);
    test->button1->text="test text";
    

    ...auf???

    Hast Du Form1 includet???

    Ich verstehe im Moment nur Bahnhof...

    Martin



  • Habe einmal die Datei form1.h welche die buttons und textfelder erstellt

    #pragma once
    
    namespace projekt{
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    
    		}
    
    	protected:
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    
    	private: System::Windows::Forms::Button^  button1;
    .
    .
    .
    

    Und dann habe ich noch eine Klasse erstellt:

    #include "stdafx.h"
    #include "buttonklasse.h"
    #include "Form1.h"
    
    using namespace System;
    
    formbutton::formbutton(String ^wtf)
    {
    	this->wtf=wtf;
    }
    
    String ^formbutton::but(String ^von, String ^bis)
    	{
    Form1 ^test= gcnew Form1(void);
    test->button1->text="Text test";
    return "hello";
    
    }
    


  • Hallo,

    da hast du ein paar fehlende Grundlagenkenntnisse. Wenn eine Klasse in einem Namespace liegt (Form1 liegt in projekt!), dann ist der Name Form1 nicht einfach so ansprechbar. Du musst den "vollen" Namen schreiben ( vergleiche mit System::Windows::Forms::Button), oder du nutzt using zur Abkürzung, wie es hier:

    using namespace System;
        using namespace System::ComponentModel;
        using namespace System::Collections;
        using namespace System::Windows::Forms;
        using namespace System::Data;
        using namespace System::Drawing;
    

    auch passiert.

    MfG,

    Probe-Nutzer



  • Probe-Nutzer schrieb:

    Hallo,

    da hast du ein paar fehlende Grundlagenkenntnisse. Wenn eine Klasse in einem Namespace liegt (Form1 liegt in projekt!), dann ist der Name Form1 nicht einfach so ansprechbar. Du musst den "vollen" Namen

    Blödsinn vor dem Herren.

    Guck Du nochmal in den Grundlagen...



  • Blödsinn vor dem Herren.

    Guck Du nochmal in den Grundlagen...

    schreib' was du meinst, und nicht so einen Unsinn, so hilft das weder mir (falls es da überhaupt etwas zu helfen gab) noch dem OP.

    MfG,

    Probe-Nutzer



  • Ich vermute stark, dass Dein Code, auch wenn Form1 in buttonform bekannt wäre nicht das tut, was Du erwartest.

    Ich vermute, Du möchtest den Text des button1 DER Instanz der Form1 ändern und nicht eine neue Instanz machen, die nicht mal angezeigt wird.

    Dazu musst Du in formbutton eine Referenz auf deine Form1 Instanz speicher.
    Das kannst Du z.B. im Konstruktor erledigen. Grob skizziert sieht das ungefähr so aus:

    ref class formbutton // ... blabla
    {
    public: formbutton(Form1^ form1)
            {
               // InitializeBlabla
    
               this->form1 = form1;          
            }
    
            but(String ^von, String ^bis)
            {
               // Tuwas mit form1!!
            }
    
    private: Form1^ form1;
    };
    
    ref class Form1 // ... blabla
    {
    
    private: void iregndeineFunktion()
             {
                buttonform^ bf = gcnew buttonform(this);
                // Tuwas mit bf...
             }
    
    private: Button^ button1;
    };
    


  • Probe-Nutzer schrieb:

    schreib' was du meinst, und nicht so einen Unsinn, so hilft das weder mir (falls es da überhaupt etwas zu helfen gab) noch dem OP.
    Probe-Nutzer

    Grundlagen mein Bester, Gruuuuuuundlagen.

    Darfst Du auch mal reingucken...

    🙄



  • Hier Probe-Nutzer:

    http://www.vhs-dillingen.de/edv/C-Progr.html

    Aber zackig...und schön aufpassen...



  • Hallo,
    irgendwie verstehe ich nicht wie und vorallem wo ich das Einbauen soll theta.
    Also ich habe die form1.h welche ich im letzten Beitrag schon gepostet habe und dann noch die Klasse wo ich einmal
    buttonklasse.cpp

    #include "stdafx.h"
    #include "buttonklasse.h"
    #include "Form1.h"
    
    using namespace System;
    
    formbutton::formbutton(String ^wtf)
    {
        this->wtf=wtf;
    }
    
    String ^formbutton::but(String ^von, String ^bis)
        {
    Form1 ^test= gcnew Form1(void);
    test->button1->text="Text test";
    return "hello";
    
    }
    

    und die buttonklasse.h

    #pragma once
    using namespace System;
    
    ref class formbutton
    {
    
    	String ^wtf;
    public:
    	formbutton(String ^wtf);
    String ^but(String ^von, String ^bis);
    };
    

    So wie ich es verstanden habe muss das in die buttonklasse.h

    #pragma once
    using namespace System;
    
    ref class formbutton
    {
    public:formbutton(Form1^ form1)
    	   {
    		   this->form1 = form1; 
    	   }
    
    but(String ^von, String ^bis)
            {
    
    //Datenbank verbindung und Namen ändern
    			this->button1->text="Text test";
    
    }
    };
    

    Aber ich denke mal das ist völliger Quatsch.
    Habe mir schon verschieden Beiträge zu Konstruktoren durchgelesen aber nicht das richtige gefunden was ich brauche.



  • Du kannst sowieso nicht in einer Methode einer anderen Klasse auf button1 direkt zugreifen, weil:

    private: Button^ button1;
    

    Was du machen kannst ist, um in etwa auf dem Vorschlag von theta aufzubauen, in Form1 eine Methode einzubauen, die die Buttontexte ändert (die hat Zugriff auf den privaten button1):

    // in der Klasse Form1:
    
    public: void setzeButtonText(String ^text)
             {
                this->button1->text = text;
             }
    

    und dann von der anderen Klasse aus diese Methode aufrufen:

    // in formbutton:
    ref class formbutton // ... blabla
    {
    public: formbutton(Form1^ form1)
            {
               // InitializeBlabla
    
               this->form1 = form1;          
            }
    
            but(String ^von, String ^bis)
            {
               // Tuwas mit form1!!
               // z.B.:
               form1->setzeButtonText(/* irgendein String-Objekt */);
            }
    
    private: Form1^ form1;
    }
    

    Aufruf dann von irgendwo (namespace beachten, wenn nötig ergänzen):

    formbutton^ bf = gcnew formbutton(/* das zu ändernde Form1-Objekt */);
    
                bf->but(....);
    

    MfG,

    Probe-Nutzer



  • Hallo,
    den Inhalt von formbutton verstehe ich nicht ganz

    // in formbutton:
    ref class formbutton // ... blabla
    {
    public: formbutton(Form1^ form1)
            {
               // InitializeBlabla
    
               this->form1 = form1;          
            }
    
          ....
    
    private: Form1^ form1;
    }
    

    Habe vergeblich nach Erklärungen gesucht. Wofür "public: formbutton(Form1^ form1)" steht.
    Auch "private: Form1^ form1;" verstehe ich nicht wofür steht das? Und bei diesen "blabla" muss da noch etwas rein?
    Bekomme immer den Fehler:
    error C2061: Syntaxfehler: Bezeichner 'Form1'
    und 24 weitere 😮



  • [Object] ^[Instanzierung][Name der neuen Instanzierung]

    Wobei [Object] bei der eine Klasse ist nämlich eine abgeleitete von System::Windows::Forms::Form

    Das ist eben Mangament C++ (Visual(!) C++), oder C++/CLI



  • Soweit geht jetzt alles
    Nur ich kann

    formbutton^ bf = gcnew formbutton(button1);
    
                bt->but("test");
    

    Nicht Anwenden.
    Ich würde das gern in den Form1.h packen, da ich dort schon eine Funktion habe das, wenn ich auf einen Button klicke(in dem falle z.B. Aktualisieren)die Funktion ausgeführt wird.
    Allerdings musste ich ja beim includen "formbutton.h" nach dem Form machen

    #include "Form1.h"
    #include "formbutton.h"

    Und somit kommt dann der Fehler
    error C2065: 'formbutton': nichtdeklarierter Bezeichner
    usw.



  • Sorry ich kann jetzt nicht ganz nach vollziehen was du da hast aber hast du, dass namespace { -Klassenquellcode- }; in den Header Dateien (.h) beachtet? Und weiß nicht, ob du, dass auch weist aber es gibt OnClick Events (Erreignisse) für Buttons.

    Meintest du mit bf bt? Die instanzierung dort ist auf bf benannt.



  • bf->but("test"); muss es richtig heißen war mein fehler.
    Das ist meine formbutton.h

    #pragma once
    
    namespace buttonform {
    using namespace System;
    using namespace projekt;  //namespace aus der form1.h
    ref class formbutton // ... blabla
    {
    
    public: formbutton (Form1^ form1)
            {
    
               // InitializeBlabla
    
               this->form1 = form1;          
            }
    
         int but(int von)
            {
               // Tuwas mit form1!!
               // z.B.:
               form1->setzeButtonText("test");
    		   return 0;
            }
    
    private: Form1^ form1;
    };
    }
    

    In der form1.h habe ich die OnClick Events du meinst doch diese:

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    // Tuwas 
    formbutton^ bf = gcnew formbutton(button1);
    
                bf->but(3);
    }
    


  • Ich kapier immer noch nicht was du da machst oder was du genau vorhast aber die class formbutton : blablabla ist die class die zu erst instanziert wird?

    Dann kommt da der Konstruktor, gleichnamig mit dem Klassennammen.

    Wo zum teufel hast du private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {...} stehen? Diese Funktion muss in der Header sein wo auch, dass Objekt, abgeleitet von ...::Button instanziert wird.

    Und der Text eines Button wird zugewiesen in dem du denn Namen der neuen Instanz von Button ansprichst. Etwa so: Button1->Text = "Abbrechen";



  • #pragma once
    
    namespace Button1 {
    
    	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>
    	/// Zusammenfassung für Form1
    	///
    	/// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch
    	///          die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern,
    	///          das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt.
    	///          Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen
    	///          arbeiten, die diesem Formular zugewiesen sind.
    	/// </summary>
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::Button^  button1;
    	private: System::Windows::Forms::Button^  button2;
    	protected: 
    
    	private:
    		/// <summary>
    		/// Erforderliche Designervariable.
    		/// </summary>
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Erforderliche Methode für die Designerunterstützung.
    		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    			this->button1 = (gcnew System::Windows::Forms::Button());
    			this->button2 = (gcnew System::Windows::Forms::Button());
    			this->SuspendLayout();
    			// 
    			// button1
    			// 
    			this->button1->Location = System::Drawing::Point(98, 105);
    			this->button1->Name = L"button1";
    			this->button1->Size = System::Drawing::Size(75, 23);
    			this->button1->TabIndex = 0;
    			this->button1->Text = L"button1";
    			this->button1->UseVisualStyleBackColor = true;
    			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
    			// 
    			// button2
    			// 
    			this->button2->Location = System::Drawing::Point(62, 55);
    			this->button2->Name = L"button2";
    			this->button2->Size = System::Drawing::Size(75, 23);
    			this->button2->TabIndex = 1;
    			this->button2->Text = L"button2";
    			this->button2->UseVisualStyleBackColor = true;
    			this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click);
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(292, 266);
    			this->Controls->Add(this->button2);
    			this->Controls->Add(this->button1);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->ResumeLayout(false);
    
    		}
    #pragma endregion
    	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    				 this->button2->Text = "Zweiter";
    			 }
    	private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
    				 this->button2->Text = "Ist nicht Wahr!";
    			 }
    	};
    }
    


  • Genau das habe ich auch schon.
    Aber ich möchte die Namen ja nicht festvergeben, sondern diese sollen aus einer Datenbank ausgelesen werden.



  • themonk schrieb:

    Genau das habe ich auch schon.
    Aber ich möchte die Namen ja nicht festvergeben, sondern diese sollen aus einer Datenbank ausgelesen werden.

    Das ist möglich. Aber mal so gefragt warum möchtest du so oft den Text eines Button ändern, dass es sich lohnt dazu eine Datenbank zu machen?

    Und nur ganz neben bei, dadurch das du die Text-Eigenschaft von dem Button änderst, ist er schon nicht mehr fest (konstant).

    Es kommt darauf an, wann und welcher Wert von welcher Quelle (Datenbank), welchem Button seine Text-Eigenschaft zu gewiesen werden soll.

    Du musst eben wissen wann eine Funktion ausgelöst werden sol. Du kannst vom prinzip schon die Event-Methode einer TextBox nehmen, wenn dort ein text eingegeben wurde, sol dieser Text an die Text-Eigenschaft von dem Button gehen.

    private: System::Void buttonButtonTextAendern_Click(System::Object^  sender, System::EventArgs^  e) {
                     this->buttonZiel->Text = textBox1->Text;
    }
    
    private: System::Void buttonZiel_Click(System::Object^  sender, System::EventArgs^  e) {
                     this->buttonButtonTextAendern->Text = textBox1->Text;
    }
    

    Genauso gut kannst du als Quelle auch eine Text-Datei nehmen stat der textBox.
    Aber dann musst du alles nötige tun um aus einer Text-Datei zu lesen. Dazu gibt es die Methoden aus System::IO::...



  • Also ich habe 2 Buttons die fest sind. Dadrunter habe ich dann so ca. 10 Buttons welche einen bestimmten Wert bekommen soll.
    Z.B. Button1:Abteilung 1; Button2:Abteilung 2
    Wenn ich nun auf Button 1 klicke möchte ich das er mir alle Mitarbeiter aus der Abteilung 1 auf die Button schreibt.
    So habe ich dann in der form1.h (also da wo das Formular erstellt wird) ganz unten

    public: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    					button3->Text= "Meyer";	 
    					button4->Text= "Mustermann";	 
    					  }
     public: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
    					button3->Text= "Max";	 
    					button4->Text= "Müller";	 
    					  }
    

    stehen und sobald z.B. jetzt ein Mitarbeiter eine Abteilung verlässt oder ein neuer hinzukommt müsste ich ja das Programm ändern. Einfacher wäre es in dem fall doch einfach in der Datenbank den Namen zu ändern.
    Wie müsste folgendes eigendlich richtig aussehen

    formbutton^ bf = gcnew formbutton(/* muss hier button1 stehen??*/ );
    
               bf->but(2);//ID der Abteilung
    

Anmelden zum Antworten