Button Namen ändern aus externe Datei
-
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.
-
formularprojekt.cpp
#include "stdafx.h" #include <windows.h> #include "datenbank.h" #include <stdio.h> #include "Form1.h" #include "formbutton.h" #include <time.h> using namespace formularprojekt; using namespace buttonform; [STAThreadAttribute] int main(array<System::String ^> ^args) { Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); Form1^ formbutton; formbutton= gcnew Form1(); Application::Run(formbutton); return 0; }
form1.h
#pragma once namespace formularprojekt { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; //using namespace buttonform; public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // } protected: ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::TextBox^ textBox1; protected: private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::Button^ button2; private: System::Windows::Forms::Button^ button3; private: System::Windows::Forms::Button^ button4; private: System::Windows::Forms::Button^ button5; private: System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code void InitializeComponent(void) { this->textBox1 = (gcnew System::Windows::Forms::TextBox()); this->button1 = (gcnew System::Windows::Forms::Button()); this->button2 = (gcnew System::Windows::Forms::Button()); this->button3 = (gcnew System::Windows::Forms::Button()); this->button4 = (gcnew System::Windows::Forms::Button()); this->button5 = (gcnew System::Windows::Forms::Button()); this->SuspendLayout(); // // textBox1 // this->textBox1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 14.25F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->textBox1->Location = System::Drawing::Point(816, 12); this->textBox1->Name = L"textBox1"; this->textBox1->Size = System::Drawing::Size(180, 29); this->textBox1->TabIndex = 0; this->textBox1->Text = L"0"; // // button1 // this->button1->Location = System::Drawing::Point(817, 133); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(44, 36); this->button1->TabIndex = 1; this->button1->Text = L"Warengruppe 1"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); // // button2 // this->button2->Location = System::Drawing::Point(880, 133); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(44, 36); this->button2->TabIndex = 2; this->button2->Text = L"Warengruppe 2"; this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click); // // button3 // this->button3->Location = System::Drawing::Point(941, 133); this->button3->Name = L"button3"; this->button3->Size = System::Drawing::Size(44, 36); this->button3->TabIndex = 3; this->button3->UseVisualStyleBackColor = true; this->button3->Click += gcnew System::EventHandler(this, &Form1::button3_Click); // // button4 // this->button4->Location = System::Drawing::Point(817, 91); this->button4->Name = L"button4"; this->button4->Size = System::Drawing::Size(44, 36); this->button4->TabIndex = 6; this->button4->UseVisualStyleBackColor = true; this->button4->Click += gcnew System::EventHandler(this, &Form1::button4_Click); // // button5 // this->button5->Location = System::Drawing::Point(880, 91); this->button5->Name = L"button5"; this->button5->Size = System::Drawing::Size(44, 36); this->button5->TabIndex = 5; this->button5->UseVisualStyleBackColor = true; this->button5->Click += gcnew System::EventHandler(this, &Form1::button5_Click); // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(1008, 732); this->Controls->Add(this->button5); this->Controls->Add(this->button4); this->Controls->Add(this->button3); this->Controls->Add(this->button2); this->Controls->Add(this->button1); this->Controls->Add(this->textBox1); this->Name = L"Form1"; this->Text = L"Form11"; this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load); this->ResumeLayout(false); this->PerformLayout(); } public: void setzeButtonText(String ^text) { button1->Text = "test"; } #pragma endregion private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { formbutton^ bf = gcnew formbutton(fenster); bf->but(1); } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { formbutton^ bf = gcnew formbutton(fenster); bf->but(2); } private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { DB_Query(this->buttonItem3->Text); } private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) { DB_Query(this->buttonItem4->Text); } private: System::Void button5_Click(System::Object^ sender, System::EventArgs^ e) { DB_Query(this->buttonItem5->Text); } private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { } }; }
formbutton.h
#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; }; }
-
.cpp (main)
// Beispiel.cpp: Hauptprojektdatei. #include "stdafx.h" #include "Form1.h" using namespace Beispiel; [STAThreadAttribute] int main(array<System::String ^> ^args) { // Aktivieren visueller Effekte von Windows XP, bevor Steuerelemente erstellt werden Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // Hauptfenster erstellen und ausführen Form1 ^Form = gcnew Form1(); Form->treeView1->Name = "treeView1"; Form->button1->Text = "I life in Form1.h"; Form->Mister(); Application::Run(Form); Form->Mister(); return 0; }
Form1.h
#pragma once #include "Form2.h" 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 { Windows::Forms::Form ^form2; public: Form1(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // form2 = gcnew Form2(); } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Form1() { if (components) { delete components; } } public: System::Windows::Forms::TreeView^ treeView1; private: System::Windows::Forms::TextBox^ textBox1; public: System::Windows::Forms::Button^ button1; 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->textBox1 = (gcnew System::Windows::Forms::TextBox()); this->button1 = (gcnew System::Windows::Forms::Button()); 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(285, 275); this->treeView1->TabIndex = 0; this->treeView1->AfterSelect += gcnew System::Windows::Forms::TreeViewEventHandler(this, &Form1::treeView1_AfterSelect); // // textBox1 // this->textBox1->Location = System::Drawing::Point(425, 81); this->textBox1->Multiline = true; this->textBox1->Name = L"textBox1"; this->textBox1->Size = System::Drawing::Size(263, 271); this->textBox1->TabIndex = 1; // // button1 // this->button1->Location = System::Drawing::Point(350, 25); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 2; this->button1->Text = L"button1"; this->button1->UseVisualStyleBackColor = true; // // 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->button1); this->Controls->Add(this->textBox1); this->Controls->Add(this->treeView1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); this->PerformLayout(); } #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(e->Node->Text + " " + Convert::ToString(Zahl)); } } public: void Mister(void) { form2->Text = "I em title"; form2->ShowDialog(); } }; }
-
hmm.
Wozu ist #include "Form2.h" da? bzw. was ist da drin?
Wie änder ich da nun den Buttonnamen mit einem externen header(formbutton.h)
-
themonk schrieb:
hmm.
Wozu ist #include "Form2.h" da? bzw. was ist da drin?
Wie änder ich da nun den Buttonnamen mit einem externen header(formbutton.h)Wenn du einen Button ändern wilst, der in einer System::Windows::Forms::Form Klasse ist und du ihn nicht in der selbigen Klasse ändern wilst, sondern von auserhalb, dann geht es nur dort wo du die besagte Form instanziert hast. Ansonsten müsstest du einen Zeiger von der instanzierung übergeben.
Wenn du einen Button per Instanzierung der Form Klasse ändern wilst, dann würde alles neu gezeichnet werden, was in der Form ist und es ist nicht die selbe Form die durch Application::Run(...) zur anzeige gebracht wurde.
Daher wie bereits oben erwähnt du musst die instanzierung ansprechen die ja zur anzeige gebracht wurde. Am sinnfolsten ist es jedoch aber bei mehren Form Klassen und Klassen die Methoden enthalten, die .cpp (main) als Startplatz zu nutzen.
Dann kannst du z.b. dort wie in meinem Beispiel die, zur anzeige gebrachte Form, über den Instanznamen ansprechen.
-
Ich habe in meiner form Datei ja die Funktion
public: void setzeButtonText(String ^text) { button1->Text = "test"; }
Die dann intern in der Datei den Button Namen ändert.
Wenn ich diese dann in der cpp(main) aufrufe geht es sogar das ich den Button Namen änderformbutton->setzeButtonText("test"); Application::Run(formbutton);
wenn ich allerdigns das ganze nach Application::Run aufrufe geht es nicht mehr.
-
Kann ich vielleicht mit einer Vorwärtsdeklaration das ganze lösen?
-
themonk schrieb:
Ich habe in meiner form Datei ja die Funktion
public: void setzeButtonText(String ^text) { button1->Text = "test"; }
Die dann intern in der Datei den Button Namen ändert.
Wenn ich diese dann in der cpp(main) aufrufe geht es sogar das ich den Button Namen änderformbutton->setzeButtonText("test"); Application::Run(formbutton);
wenn ich allerdigns das ganze nach Application::Run aufrufe geht es nicht mehr.
Also du hast da ein fehler, nicht? button1->Text = text;
meinst du wohl.
-
Also du hast da ein fehler, nicht? button1->Text = text;
meinst du wohl.Ja klar aber zum testen kann ich da ja auch button1->Text = "test";stehen, am Ende soll natürlich text da stehen. Aber die Funktionen gehen ja alle soweit.
Nur da die beiden Header Datein gegenseitig Zugreifen funktioniert das ganze nicht. Ich habe gelesen das man dies mit Vorwärtsdeklaration lösen kann stimmt das und wenn ja wie muss das ungefär ausssehen.Das ganze muss ja so aussehen das form.h die Funktion but in formbutton.h aufruft. but ruft dann wieder in form.h setzeButtonText auf nur hier ist das Problem.
Ich habe bis jetzt geschafft but aus der cpp(main) aufzurufen aber nicht aus der form.h.
-
Wenn du formbutton.h in .cpp (main) instanziert hast, kannst du die diese Instanz nur über .cpp (main) ansprechen. Oder aber du übergibst einen Zeiger. Oder schreibst eine Funktion mit dem Rückgabetyp *(Zeiger) in die .cpp
Natürlich kannst du auch für jede Operation die mit der Klasse getätigt werden soll, diese Klasse jedes mal neu instanzieren. Solltest dann aber die voherigen Instanzen voher auflösen.
Eine weitere möglichkeit ist eine statische (static) Klasse. Diese kannst du dann immer mit Namespace und immer mit dem gleichen Namen aufrufen. Dies ist dann sinvoll wenn du, dass was in dieser Klasse ist immer nur single benötigt wird.
Du könntest aber u.a. auch wenn du von form.h Methode but() aufrufst, nur einen Rückgabewert erwarten. Also das sich Mehtode but() nicht um das Ziel kümmert. Diese Methode ist übrigens die gängigste!
Dazu tust du in form.h formbutton.h instanzieren, und tust an der Stelle wo ein neuer Wert zu gewiesen sol, nach dem = den Instanznammen hinzufügen und zeigst über -> auf die Funktion, die das Ergebnis zurückgibt.
Damit diese Funktion was zurückgibt musst du sie statt mit void, mit dem gewünschten Rückgabetyp deklarieren. Bei deinem Fall zur Button Text-Eigenschaft währe, dass String ^Die Funktion gibt das zurück was in der Funktion mit return angegeben wird. Eine Variable oder eine Konstante.
-
Du könntest aber u.a. auch wenn du von form.h Methode but() aufrufst, nur einen Rückgabewert erwarten. Also das sich Mehtode but() nicht um das Ziel kümmert. Diese Methode ist übrigens die gängigste!
Dazu tust du in form.h formbutton.h instanzieren, und tust an der Stelle wo ein neuer Wert zu gewiesen sol, nach dem = den Instanznammen hinzufügen und zeigst über -> auf die Funktion, die das Ergebnis zurückgibt.Dann würde das ganze so aussehen:
formbutton^test3= gcnew formbutton("12");button1->Text=test3->but("test");
Dann bekomme ich den Fehler:error C2065: 'formbutton': nichtdeklarierter Bezeichner
-
Die Klasse ist am Ort der instanzierung eingebunden (#include "...")?
formbutton ist der Name der Klasse?
Ist ein Namespace vorhanden, musst du diesen vohr formbutton mit :: setzten, Bsp. formbutton::formbutton ^FormButton = gcnew formbutton::formbutton();Wichtig: Wenn du inerhalb einer Funktion() instanziert, kann sie nur inerhalb der Funktion() angesprochen werden. Möchtest du es in mehren Funktionen() ansprechen musst du die instanzierung Global in der Klasse machen, dass heist unter dem Konstruktor.
Übrigens kannst du eine Klasse mit Parameter nur instanzieren, wenn du Übergabeparameter im Konstruktor dieser Klasse deklarierst.
-
Die Klasse ist am Ort der instanzierung eingebunden (#include "...")?
Das ist ja das Problem wenn ich formbutton.h vor form.h einbinde meckert der Compiler das er für das Namespace in formbutton.h nichts findet.
'formularprojekt ': Es ist kein Namespace mit diesem Namen vorhanden
Das ist ja das Problem mit der reihenfolge des Includens egal wie ich das mache es fehlt immer einer Datei der Bezug zur anderen.