Ein Header in merere Forms einbinden ??
-
Mach nur eines von beidem,
#pragma once
oder dieifndef
-Methode. Außerdem hat das#pragma once
in deinen Form-Quelldateien nichts verloren. Dies zusammen mit deinem vorherigen Schreibfehler gesehen, macht es recht wahrscheinlich, dass das Problem irgendein anderer Schreib- oder Flüchtigkeitsfehler ist. Ist das wirklich 1:1 der Code, der bei dir nicht funktioniert? Copy&Paste? Kann ja irgendwie nicht sein, denn die Form1 und Form2 sind identisch. Also hast du wahrscheinlich die Fehlerursache hier für das Forum herausgekürzt. Reduziere deinen Code auf ein absolut minimales Beispiel, von dem du aber getestet hast, dass es gerade noch den Fehler zeigt. Dann zeig uns diesen Code. Wenn du Glück hast, kommst du aber bereits beim Erstellen des Minimalbeispiels auf die Lösung, wenn du irgendetwas wegkürzt und der Code dann plötzlich unerwarteterweise funktioniert.
-
Form1
#include "meinPaket.h" #include "pch.h" namespace Frm1 { private: System::Void btn_1_Click(System::Object^ sender, System::EventArgs^ e) { Paket::loadForm(); }
Form2
#include "meinPaket.h" #include "pch.h" namespace Frm2 { private: System::Void btn_2_Click(System::Object^ sender, System::EventArgs^ e) { Paket::loadForm2(); } }
meinPaket.h
#pragma once #include "pch.h" namespace Paket { using namespace std; using namespace System; using namespace System::Windows::Forms; extern void loadForm() { } extern void loadForm2() { } }
meinPaket.cpp
#include "meinPaket.h" #include "Form1.h" #include "Form2.h" #include "pch.h" using namespace std; using namespace System; using namespace System::Windows::Forms; using namespace Paket; void loadForm() { Frm2::Form2^ form = gcnew(Frm2::Form2); form->ShowDialog(); delete form; } void loadForm2() { Frm1::Form1^ form = gcnew(Frm1::Form1); form->ShowDialog(); delete form; }
Der einfach halber habe ich nur die Eventhändler Methoden hier eingefügt. Der Rest wurde mit dem Designer gemacht. Paket::loadForm2() funktioniert nicht, aber das Programm lässt dich ausführen. Ich komme nach wie vor nicht darauf :(.
-
@Gnaa77 sagte in [Ein Header in merere Forms einbinden ??](/forum
Paket::loadForm2() funktioniert nicht, aber das Programm lässt dich ausführen.
Woah, was? Was meinst du damit genau? Was funktioniert nicht und wie äußert sich das?
PS: Ich kenne mich mit den precompiled Headern von VS nicht so aus, aber irgendwie habe ich aus anderen Threads hier im Hinterkopf, dass das Include vom PCH Header immer ganz vorne stehen muss. Kann das jemand kommentieren, der sich damit auskennt?
-
Das passt zwar nicht zu deiner Fehlermeldung, aber dass du loadForm zwei mal definierst, ist schon mal falsch
(Im Header durch {} und im cpp wird die Funktion definiert). loadForm2 genauso.
Das extern brauchst du auch nicht.
-
Also erstmal zu SeppJ! Die Funktion kann irgendwie nicht funktionieren! Das war unlogisch. Da sie ja nicht geschlossen wurde, kann ich sie ja nicht öffnen. Ich habe sie durch diese ersetzt. Die Pch.h ist leer da ist nichts drin. Aber guter Tipp mit der pch.h, damit hab ich mich noch nicht beschäftigt :).
void test(TextBox^ a) { a->AppendText("Huhu"); }
funzt ebenfalls nicht.
Nun zu Jocklx, nein es sind zwei verschiedene. LoadForm und LoadForm2. Beide definiert in cpp und deklariert mit {} in der Header.
-
Die Fehlerliste ist ziemlich lang und es handelt sich um Fehler wie ; fehlt, obwohl es da ist usw.
Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
Fehler C2059 Syntaxfehler: ";" Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 15
Fehler C2059 Syntaxfehler: ";" Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 22
Fehler C2871 "Paket": Es ist kein Namespace mit diesem Namen vorhanden Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 10
Fehler C2653 "Frm2": Keine Klasse oder Namespace Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 15
Fehler C2653 "Frm2": Keine Klasse oder Namespace Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 15
Fehler C2653 "Frm1": Keine Klasse oder Namespace Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 22
Fehler C2653 "Frm1": Keine Klasse oder Namespace Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 22
Fehler C2065 "Form2": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 15
Fehler C2065 "Form2": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 15
Fehler C2065 "Form1": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 22
Fehler C2065 "Form1": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 22
Fehler C2065 "form": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 15
Fehler C2065 "form": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 16
Fehler C2065 "form": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 17
Fehler C2065 "form": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 22
Fehler C2065 "form": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 23
Fehler C2065 "form": nichtdeklarierter Bezeichner Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 24
Fehler C2541 "delete": Objekte, die keine Zeiger sind, können nicht gelöscht werden Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 17
Fehler C2541 "delete": Objekte, die keine Zeiger sind, können nicht gelöscht werden Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 24
-
Tue dir selbst einen Gefallen und verwende C#, falls du bei WinForms bleiben willst, s. Windows Forms und Visual C++ MACHT KEINEN SINN!!
Oder alternativ verwende natives C++ mit einem dazu passenden UI-Framework (wie z.B. Qt oder ImGui).
Du solltest zuerst aber die Basics der Sprache (egal ob C++ oder C#) anhand von Konsolenprogrammen lernen, bevor du dich mit GUI beschäftigst.
-
@Gnaa77 sagte in Ein Header in merere Forms einbinden ??:
Also erstmal zu SeppJ! Die Funktion kann irgendwie nicht funktionieren! Das war unlogisch. Da sie ja nicht geschlossen wurde, kann ich sie ja nicht öffnen. Ich habe sie durch diese ersetzt. Die Pch.h ist leer da ist nichts drin. Aber guter Tipp mit der pch.h, damit hab ich mich noch nicht beschäftigt :).
Es geht nicht darum, was da drin steht. Dieser Header dient als eine Art Markierung ab wo die Compilierung los gehen soll. Das soll meistens halt ganz vorne sein, außer man hat irgendwelche Sonderbedürfnisse und weiß was man da tut. Oder man schaltet Precompiled Header besser ab, wenn man überhaupt keine Ahnung hat, was man da tut. PCH ist sowieso nur für Projekte mit tausenden Dateien relevant.
@Gnaa77 sagte in Ein Header in merere Forms einbinden ??:
Nun zu Jocklx, nein es sind zwei verschiedene. LoadForm und LoadForm2. Beide definiert in cpp und deklariert mit {} in der Header.
Bitte tu unsere Ratschläge nicht einfach ab, ohne sie genau zu lesen und über sie nachzudenken! Was meinst du warum Jockelx im nächsten Satz "loadForm2 genauso." geschrieben hat? Wir wissen schon, was wir warum sagen (nun ja, meistens jedenfalls
). Dein Code:
extern void loadForm() { } extern void loadForm2() { } .... void loadForm() { Frm2::Form2^ form = gcnew(Frm2::Form2); form->ShowDialog(); delete form; } void loadForm2() { Frm1::Form1^ form = gcnew(Frm1::Form1); form->ShowDialog(); delete form; }
Bist du immer noch der Meinung, dass du da nichts doppelt definiert hast?
-
@Gnaa77 sagte in Ein Header in merere Forms einbinden ??:
Fehler C2059 Syntaxfehler: ";" Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 15
Fehler C2059 Syntaxfehler: ";" Test_Gui F:\C++Programmierer\C++_Projekte\Test_Gui\meinPaket.cpp 22Das wären oben im gezeigten Code
delete form;
und
}
.
Zweifel.
Ich verweise noch einmal auf die Notwendigkeit, uns den exakten Code zu zeigen, der den Fehler verursacht. Nicht das, was du denkst, was den Fehler verursacht. Denn wenn du das schon wüsstest, bräuchtest du ja nicht mehr fragen.
Anleitung aus dem C++-Forum, die auch auf C++/CLI übertragbar ist:
https://www.c-plusplus.net/forum/topic/200753/bitte-lesen-du-brauchst-hilfe
Besonders der zweite Teil, "Wie man Probleme nachstellbar und nachvollziehbar macht", denn da hakt es gerade.Die restlichen Fehlermeldungen kannst du erst einmal vergessen. Wenn der Compiler diese ominösen Zeilen 15 und 22 nicht verstehen konnte, dann ist er danach total durcheinander und gibt evtl. jede Menge Fehldiagnosen, z.B. wenn in diesen Zeilen wichtige Definitionen standen. Meistens ist daher nur der erste Fehler in so einer Liste relevant.
-
@SeppJ
Ich gebe dir recht! Ich Honk .
-
Dank eurer Denkanstöße habe ich es geschafft, das Problem zu lösen! Als Erstes habe ich die Vorkompilierten Header abgeschaltet und die Pch.h include entfernt. Dadurch waren die Fehlermeldungen verschwunden, aber die Methoden funktionierten noch nicht. Da habe ich die Incldudes in die Cpp Datei kopiert und völlig aus der Header entfernt! In den Form1 und Form 2 steht nur noch meineForm.h. Alles läuft jetzt wie geplant. Ich gebe dennoch den Quellcode bekannt für andere, die demselben Problem gegenüberstehen.
Form1
#include "meinPaket.h" namespace Frm1 { 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 { public: Form1(void) { InitializeComponent(); } protected: ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::Button^ btn_1; private: System::Windows::Forms::TextBox^ tb1; private: System::ComponentModel::Container^ components; #pragma region Windows Form Designer generated code void InitializeComponent(void) { this->btn_1 = (gcnew System::Windows::Forms::Button()); this->tb1 = (gcnew System::Windows::Forms::TextBox()); this->SuspendLayout(); // // btn_1 // this->btn_1->Location = System::Drawing::Point(89, 80); this->btn_1->Name = L"btn_1"; this->btn_1->Size = System::Drawing::Size(75, 23); this->btn_1->TabIndex = 0; this->btn_1->Text = L"button1"; this->btn_1->UseVisualStyleBackColor = true; this->btn_1->Click += gcnew System::EventHandler(this, &Form1::btn_1_Click); // // tb1 // this->tb1->Location = System::Drawing::Point(111, 171); this->tb1->Name = L"tb1"; this->tb1->Size = System::Drawing::Size(100, 20); this->tb1->TabIndex = 1; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(284, 261); this->Controls->Add(this->tb1); this->Controls->Add(this->btn_1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); this->PerformLayout(); } private: System::Void btn_1_Click(System::Object^ sender, System::EventArgs^ e) { Paket::loadForm(); Paket::test(tb1); } }; // end of class Form1 } // end of namespace Frm1
Form2
#include "meinPaket.h" namespace Frm2 { 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 Form2 : public System::Windows::Forms::Form { public: Form2(void) { InitializeComponent(); } protected: ~Form2() { if (components) { delete components; } } private: System::Windows::Forms::Button^ btn_2; private: System::Windows::Forms::TextBox^ tb2; private: System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code void InitializeComponent(void) { this->btn_2 = (gcnew System::Windows::Forms::Button()); this->tb2 = (gcnew System::Windows::Forms::TextBox()); this->SuspendLayout(); // // btn_2 // this->btn_2->Location = System::Drawing::Point(95, 120); this->btn_2->Name = L"btn_2"; this->btn_2->Size = System::Drawing::Size(75, 23); this->btn_2->TabIndex = 0; this->btn_2->Text = L"button1"; this->btn_2->UseVisualStyleBackColor = true; this->btn_2->Click += gcnew System::EventHandler(this, &Form2::btn_2_Click); // // tb2 // this->tb2->Location = System::Drawing::Point(104, 219); this->tb2->Name = L"tb2"; this->tb2->Size = System::Drawing::Size(100, 20); this->tb2->TabIndex = 1; // // Form2 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(284, 261); this->Controls->Add(this->tb2); this->Controls->Add(this->btn_2); this->Name = L"Form2"; this->Text = L"Form2"; this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion private: System::Void btn_2_Click(System::Object^ sender, System::EventArgs^ e) { tb2->AppendText(Paket::pForm(this).ToString() + "\r\n"); } }; }
meinPaket.h
#pragma once namespace Paket { using namespace std; using namespace System; using namespace System::Windows::Forms; void loadForm(); void loadForm2(); int pForm(Form^ form); void test(TextBox^ a); }
meinPaket.cpp
#include "meinPaket.h" #include "Form1.h" #include "Form2.h" using namespace std; using namespace System; using namespace System::Windows::Forms; using namespace Paket; void Paket::loadForm() { Frm2::Form2^ form = gcnew(Frm2::Form2); form->ShowDialog(); delete form; } //void Paket::loadForm2() //{ // Frm1::Form1^ form = gcnew(Frm1::Form1); // form->ShowDialog(); // delete form; //} void Paket::test(TextBox^ a) { a->AppendText("Huhu\r\n"); } int Paket::pForm(Form^ form) { int a = form->Width; return a; }
So, das ist alles :). Ich hoffe, das wird so gemacht! Es funzt auf jeden Fall :). Für Kritik und Erklärungen bin ich gerne dankbar.