Button Namen ändern aus externe Datei
-
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-NutzerGrundlagen 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 kannformbutton^ 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 untenpublic: 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 aussehenformbutton^ bf = gcnew formbutton(/* muss hier button1 stehen??*/ ); bf->but(2);//ID der Abteilung
-
Lol, jetzt verstehe ich was du vohr hast.
Eine art Menü oder Vohrfahrenbaum. Dafür eignet sich am besten ListView.
Diese läst sich auch gut mit einer Datenbank verbinden.
Wenn du dass nur mit Buttons machen würdest, würde das unheimlich unübersichtlich, doppelt und dreifach werden. Nicht nur weil sich dann sehr oft der Text der Buttons ändert. Sondern weil dann auch die OnClick Events entsprechend je nach Text-Eigenschaft anders reagieren müssten. Weil wenn du ja einem Button einen neuen text zuweist soll er ja wohl auch eine andere Funktion auslösen beim draufklicken.
Allerdings währe es auch möglich die Buttons neben der ListView zu verwenden. Z.B. wenn auf einen Knotenpunkt geklickt wurde, sollen alle Einträge unter diesem Knoten über die Buttons aufgelistet werden. Wird dann auf den Entsprechenden Button geklickt, wird das selbe wie bei einem Klick auf einem Eintrag unter diesem Knoten, ausgeführt.
-