Button Namen ändern aus externe Datei
-
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.
-
themonk schrieb:
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.
Du hast also "using namespace formbutton;" eingetragen? Mach das mal ohne using namespace und verwende wirklich formbutton::formbutton
-
Also die anfänge beider Dateien sehen so aus:
formbutton.h#pragma once namespace buttonform { using namespace System; using namespace formularprojekt; ref class formbutton// ... blabla { public: formbutton(Form1^ form1) { ....
form.h
#pragma once #include "formbutton.h" 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; public ref class Form1 : public System::Windows::Forms::Form { ...
Und dann kommt:
formbutton.h(4) : error C2871: 'formularprojekt ': Es ist kein Namespace mit diesem Namen vorhanden
-
uuuuf also langsam...
von wo aus greifst du auf die Klasse mit dem namespace formularprojekt zu?
-
Aus der cpp(main)
#include "stdafx.h" #include <windows.h> #include <stdio.h> #include "Form1.h" #include <time.h> using namespace formularprojekt; ....
-
Naja mach doch einfach statt using namespace formularprojekt, formularprojekt::Form1()
-
gib der formbutton.h einen anderen namespace.
-
gib der formbutton.h einen anderen namespace.
Umbennnen?
Und in der formbutton.h habe ich den Fehler in dieser Zeile
public: formbutton(Form1^ form1)
soll ich da
public: formbutton(formularprojekt::Form1^ form1)
machen?