Button Namen ändern aus externe Datei
-
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.
-
-
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.
Beim draufklicken sollen die Buttons lediglich ihren Wert weiter geben z.B. wenn ich auf Meyer klicke soll in einem Feld alles über Meyer aus der Datenbank stehen (Name,Telefonnummer,Ort usw.)
Also wenn es irgendwie möglich wäre würde ich schon gern Buttons haben oder etwas ähnliches wo ich nur einmal draufklicekn muss
-
Brobier mal TreeView aus:
#pragma once namespace Beispiel { 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::TreeView^ treeView1; 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) { System::Windows::Forms::TreeNode^ treeNode1 = (gcnew System::Windows::Forms::TreeNode(L"Knoten0")); System::Windows::Forms::TreeNode^ treeNode2 = (gcnew System::Windows::Forms::TreeNode(L"Knoten1")); System::Windows::Forms::TreeNode^ treeNode3 = (gcnew System::Windows::Forms::TreeNode(L"Knoten2")); System::Windows::Forms::TreeNode^ treeNode4 = (gcnew System::Windows::Forms::TreeNode(L"Knoten3")); System::Windows::Forms::TreeNode^ treeNode5 = (gcnew System::Windows::Forms::TreeNode(L"Knoten4")); this->treeView1 = (gcnew System::Windows::Forms::TreeView()); this->SuspendLayout(); // // treeView1 // this->treeView1->Location = System::Drawing::Point(33, 48); this->treeView1->Name = L"treeView1"; treeNode1->Name = L"Knoten0"; treeNode1->Text = L"Knoten0"; treeNode2->Name = L"Knoten1"; treeNode2->Text = L"Knoten1"; treeNode3->Name = L"Knoten2"; treeNode3->Text = L"Knoten2"; treeNode4->Name = L"Knoten3"; treeNode4->Text = L"Knoten3"; treeNode5->Name = L"Knoten4"; treeNode5->Text = L"Knoten4"; this->treeView1->Nodes->AddRange(gcnew cli::array< System::Windows::Forms::TreeNode^ >(5) {treeNode1, treeNode2, treeNode3, treeNode4, treeNode5}); this->treeView1->Size = System::Drawing::Size(417, 275); this->treeView1->TabIndex = 0; this->treeView1->AfterSelect += gcnew System::Windows::Forms::TreeViewEventHandler(this, &Form1::treeView1_AfterSelect); // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(731, 427); this->Controls->Add(this->treeView1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); } #pragma endregion private: System::Void treeView1_AfterSelect(System::Object^ sender, System::Windows::Forms::TreeViewEventArgs^ e) { for(int Zahl = 0; Zahl < 10; Zahl++) { e->Node->Nodes->Add(Convert::ToString(Zahl)); } } }; }
Natürlich kannst du jedes Item einem Button zu weisen. Aber wenn es nur als eine art auflistung da stehen sol, ohne das eine Methode ausgelöst werden soll wenn man dann auf so einem Button klickt, dann sind Button die falsche wahl.
-
private: System::Void treeView1_AfterSelect(System::Object^ sender, System::Windows::Forms::TreeViewEventArgs^ e) { for(int Zahl = 0; Zahl < 10; Zahl++) { e->Node->Nodes->Add(e->Node->Text + " " + Convert::ToString(Zahl)); } }
-
Ich hätte es mir eher so gedacht wie z.B. bei einer Kasse.
Wo man ja auch meist oben die Warengruppen hat und dann die einzelene Waren drunter und wenn man auf einen Button klickt das dieser dann irgendwo in einer Auflistung incl. Preis erscheint.
-
Das ist das!
Ein Knoten währe eine Gruppe.
Du könntest es zum Beispiel so machen, dass wenn du auf einem Knoten klickst, dass alle Nachnamen die zu dieser Gruppe gehöhren aufgelistet werden. Klickst du dann auf einen Namen, so kannst du dann zum Beispiel veranlassen das in der TextBox (MultiLine = true;) neben an die persöhnlichen Daten von dieser angeklickten Person angezeigt werden.
-
Ich glaub das war mein Fehler mit dem Beispiel. Also das oben mit den Abteilungen war nur ein Beispiel um zu erklären was ich genau mit den Buttons machen wollte.
Ich habe ein Touchscreen und benötige hierfür Buttons die ich anklicken kann.
Ist für eine kleine Kasse, deshalb sollten die Namen auch möglichst aus einer Datenbank sein damit man die Preise einfacher ändern kann.
-
Okay also
du wilst für jeden folgendem Item ein Button instanzieren?
Dann musst du aber nicht eine Form instanzieren sondern ein Button!Dass musst du in die Methode reinschreiben wo die Datenbank gelesen wird.
Dazu dann eine Methode die, die Buttons einigermaßen anordnet oder du machst ein Panel und weist die Buttons dem Panel, über Panel->Controls zu, ist warscheinlich einfacher.Dann wenn auf ein Button geklickt wurde der bereits einen Text aus der Datenbank besitzt, muss dieser Text als anfrage wieder an die Datenbank zurückgehen und dass prozedure geht von vorne los.
Verstehst du es nicht kannst du leider wohl nicht Algoritmisch denken.