Button Namen ändern aus externe Datei
-
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.
-
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.
Ich habe mir gedacht das ich die Buttons schon vorher da stehen habe mit genauer Position und alles, nur halt ohne Namen.
Klickt man auf ein leeren Button führt er zwar eine Funktion aus aber hier merkt er(die Funktion) dann das kein Name in der Datenbank ist und es passiert nichts.
Klicke ich dann auf einen der Oberbegriffe. Soll eine Funktion ausgeführt werden die aus der Datenbank die Namen der Button ausließt und diese dann auch den Buttons zu weißt.
Sodasss wenn ich nun auf einen der Buttons klicke, er den dazugehörigen Eintrag auch in der Datenbank findet und weiter arbeiten kann.
Daher wollte ich auch "nur" wissen ob ich den Buttons Namen aus der Datenbank zuweisen kann.Buttons aus einer anderen Funktion heraus zu erstellen möchte ich garnicht.
Daher habe ich in meiner form1.h die Funktion
formbutton^ bf = gcnew formbutton(/*was muss hier rein */); bf->but(2); public: void setzeButtonText(String ^text) { button1->Text = "Test"; }
Nur diese kann ich nicht ausführen.
Ich denke mal es liegt daran das ich form1 nach formbutton.h include#include "Form1.h"
#include "kassebutton.h"Aber dies muss ja da ich sonst nicht mit formbutton auf form1.h zugreifen kann.
#pragma once namespace buttonform { using namespace System; using namespace formularprojekt; 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; }; }
-
mhhh wo hast du denn deine Methode stehen die, die Datenbankabfrage macht?
Tatsache ist halt, dass form1 gleich beim Process start instanziert wird. Per Application::Run(gcnew form1) Oder so ähnlich. An diesem ort kannst du dieses instanzierte Form Objekt nur ansprechen in dem du denn neuen instanzen nammen nimmst.
Also instanziere form1 vor Application: System::Windows::Forms::Form ^form1 = gcnew formbutton();
und füge dann formbutton ohne gcnew in Application::Run(ein).Ansonsten kommst nur per Namespace drann. Besser ist formbutton->
Das mit den Buttons hat einen enormen nachteil:
Der instanzierungsnahme ist konstant! Also alle Buttons haben dann einen festen Namen, somit kannst du dann als Identifizierung wirklich nur den Button Text nehmen und das wird dann ne ziemliche String Schneid Dreh sauerei!Es sei denn wie bereits erwähnt du nimmst dann den Button Text als Filterwort bei der Datenbankanfrage. Dann würden alle Listen-Buttons nur auf die Methode der Datenbankanfrage verweisen und du müsstest seinen Button Text mit übergeben. Und dann eben in dieser Datenbankabfrage-Methode diesen String mit einStringen. Na brost
Tschuldigung für meine sausprache!
-
System::Void buttonItem1_Click(System::Object^ sender, System::EventArgs^ e) { DB_Query(this->buttonItem1->Text); } System::Void buttonItem2_Click(System::Object^ sender, System::EventArgs^ e) { DB_Query(this->buttonItem1->Text); } System::Void buttonItem3_Click(System::Object^ sender, System::EventArgs^ e) { DB_Query(this->buttonItem1->Text); } System::Void buttonItem4_Click(System::Object^ sender, System::EventArgs^ e) { DB_Query(this->buttonItem1->Text); } System::Void buttonItem5_Click(System::Object^ sender, System::EventArgs^ e) { DB_Query(this->buttonItem1->Text); } System::Void buttonItem6_Click(System::Object^ sender, System::EventArgs^ e) { DB_Query(this->buttonItem1->Text); } System::Void buttonItem7_Click(System::Object^ sender, System::EventArgs^ e) { DB_Query(this->buttonItem1->Text); }
void DB_Query(String ^By) { Deinne DatenbankMethode("Datenbank Syntax Anfrage Command + Operator " + By); ... }
-
ubs... die (buttonItem)Nummern hintern den this sind falsch.
-
Ansonsten kommst nur per Namespace drann. Besser ist formbutton->
Du meinst hier dran?
formbutton^ bf = gcnew formbutton(fenster); bf->but(2); /*in der main habe ich nun:*/ Form1^ fenster; fenster= gcnew Form1();
Ich habe ja eigendlich "namespace buttonform {" erstellt doch, wenn ich nun in form1.h
using namespace buttonform; mache kommt da'buttonform': Es ist kein Namespace mit diesem Namen vorhanden
'formbutton': nichtdeklarierter BezeichnerDas liegt doch sicher an der reihenfolge des includens oder nicht?
-
Sorry hier wird langsam der faden Verloren.
Ich kann mir nicht entgeistern wie deine Projektmappe aus sieht.
Tu einfach mal alle Files hier posten und schreibe über jedem
den filename. Damit ich überhaupt deine Frage verstehe.