(C++ CLI)Von Form2 zu Form1, wie?

#1

Hallo,

da das mein erster Beitrag im Forum ist, sollte ich mich vorstellen.Mit C++ CLI(Visual 2010) habe ich etwa fast vor einem Jahr begonnen,C++(Konsole) vor etwa 5Monaten und mit HTML4 habe ich schon vor 2 Jahren angefangen, dass programmieren macht mir Spaß :).Nun zu meiner Frage wie kann man von Form2 zu Form1 wechseln?

Ich weiß schon wie man von Form1 zu Form2 wechselt.

(Hier wird eine Instanz von Form1 generiert)Test.cpp Code:

#include "stdafx.h"

#include "Form1.h"

using namespace System;
using namespace Test;

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
	Form1^ f1 = gcnew Form1();
	Application::EnableVisualStyles();
	Application::Run(f1);

    return 0;
}

(Button Click-Event von Form1)Form1.h Code:

#pragma once //Das steht ganz oben
#include "Form2.h"


private: System::Void btnJa_Click(System::Object^  sender, System::EventArgs^  e) {
			 this->Hide();
			 Form2^ f2 = gcnew Form2();
			 f2->ShowDialog();
		 }

(Button Click-Event von Form2)Form2.h Code:

#pragma once //Das steht ganz oben
#include "Form1.h"


private: System::Void btnJa_Click(System::Object^  sender, System::EventArgs^  e) {
			 this->Hide();
			 Form1^ f1 = gcnew Form1();
			 f1->ShowDialog();
		 }


Wenn ich das bei Form2.h reinschreibe kommt ein Fehler:

[spoiler]------ Erstellen gestartet: Projekt: Installer, Konfiguration: Debug Win32 ------
stdafx.cpp
AssemblyInfo.cpp
Test.cpp
c:\users\USER\documents\visual studio 2010\projects est est\Form2.h(189): error C2065: ‘Form1’: nichtdeklarierter Bezeichner
c:\users\USER\documents\visual studio 2010\projects est est\Form2.h(189): error C2065: ‘f1’: nichtdeklarierter Bezeichner
c:\users\USER\documents\visual studio 2010\projects est est\Form2.h(189): error C2061: Syntaxfehler: Bezeichner ‘Form1’
c:\users\USER\documents\visual studio 2010\projects est est\Form2.h(190): error C2065: ‘f1’: nichtdeklarierter Bezeichner
c:\users\USER\documents\visual studio 2010\projects est est\Form2.h(190): error C2227: Links von “->ShowDialog” muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
Typ ist ‘‘unknown-type’’
Form1.cpp
Form2.cpp
Code wird generiert…
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========[/spoiler]

#2

Hallo,

deine Fehlermeldung ensteht durch das gegenseitige inkludieren der Form-Header. Um das aufzulösen, solltest du deinen Code in eine cpp-Datei schreiben und dort die Includes einfügen. In die h-Datei kommt dann lediglich die Deklaration:

// Form1.h

namespace XXX
{
    public ref class Form1 : public System::Windows::Forms::Form
    {
        // ...
        
        private:
            System::Void btnJa_Click(System::eek:bject^  sender, System::EventArgs^  e);
    
    };
}

// Form1.cpp

#include "StdAfx.h"
#include "Form2.h"
#include "Form1.h"

namespace XXX
{
    System::Void Form1::btnJa_Click(System::eek:bject^  sender, System::EventArgs^  e)
    {
        // ...
    }
}

// Form2.h/cpp dito

Bei deinem Code Du wechselst du allerdings nicht von einer Form zur anderen, sondern erzeugst jedes Mal eine neue Form. Ist das so gewollt? Für einen Wechsel müsstest du der jeweils anderen Form eine Referenz der eigenen Form übergeben, die dann diese Form nur mit Show() aktiviert. Zudem darfst du dann nicht ShowDialog() verwenden, weil damit ein modaler Dialog erzeugt wird, der erst beendet werden muss, bevor das andere Fenster aktiviert werden kann. Ein Wechsel wäre somit ausgeschlossen.

Gruß
albatros

#3

Erstmal Danke und ich programmiere grad ein P&C(Point And Click) Spiel, man sollte nur wechseln.Ich probiers aus und melde mich dann später.

EDIT:Sollte ich bei Form2.h #include “Form1.h” lassen und bei Form1 auch?Und wo soll ich das Button-Click Event reinschreiben?Da wo es eig. immer steht?

#4

Hallo,

das Include von Form1/2.h mus aus dem Header raus (das führte ja zu dem Fehler).
Die Implementation des Click-Events kommt in die cpp-Datei. In den Header kommt die Deklaration. Diese Struktur habe ich in meinem Codebeispiel schon so gezeigt.

Gruß
albatros

#5

Hallo,

meinst du mit “Die Implementation des Click-Events”

private: System::Void btnJa_Click(System::Object^  sender, System::EventArgs^  e) {
			 this->Hide();
			 Form2^ f2 = gcnew Form2();
			 f2->ShowDialog();
		 }

Und in welche .cpp muss es rein in die von Form1.cpp oder Test.cpp?Ich kann das grad nicht ausprobieren, deshalb frage ich und versuche das später.Wie sähe f2->ShowDialog(); mit Show() aus?

#6

Hallo,

du legst (falls noch nicht vorhanden) zu jeder Form eine .cpp an, also Form1.cpp und Form2.cpp. Da hinein gehört der zur jeweiligen Form gehörende Code für’s Click-Event.

Gruß
albatros

#7

In den 2 .cpp sieht es so aus:

(Für Form1.cpp) Code:

#include "StdAfx.h"
#include "Form2.h"
#include "Form1.h"

(Für Form2.cpp) Code:

#include "StdAfx.h"
#include "Form1.h"
#include "Form2.h"

Wenn ich das in Form1.cpp einfüge:

private: System::Void btnJa_Click(System::Object^  sender, System::EventArgs^  e) {
			 this->Hide();
			 Form2^ f2 = gcnew Form2();
			 f2->ShowDialog();
		 }

und das in Form2.cpp:

private: System::Void btnJa_Click(System::Object^  sender, System::EventArgs^  e) {
			 this->Hide();
			 Form1^ f5 = gcnew Form1();
			 f5->ShowDialog();
		 }

Kommt ein Fehler:
[spoiler]------ Erstellen gestartet: Projekt: Installer, Konfiguration: Debug Win32 ------
Form1.cpp
Form1.cpp(6): error C2059: Syntaxfehler: ‘private’
Form1.cpp(7): error C2355: ‘this’: Nur innerhalb nicht statischer Memberfunktionen verfügbar
Form1.cpp(7): error C2227: Links von “->Hide” muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
Form1.cpp(8): error C2065: ‘Form2’: nichtdeklarierter Bezeichner
Form1.cpp(8): error C2065: ‘f2’: nichtdeklarierter Bezeichner
Form1.cpp(8): error C2061: Syntaxfehler: Bezeichner ‘Form2’
Form1.cpp(9): error C2065: ‘f2’: nichtdeklarierter Bezeichner
Form1.cpp(9): error C2227: Links von “->ShowDialog” muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
Typ ist ‘‘unknown-type’’
Form2.cpp
Form2.cpp(5): error C2059: Syntaxfehler: ‘private’
Form2.cpp(6): error C2355: ‘this’: Nur innerhalb nicht statischer Memberfunktionen verfügbar
Form2.cpp(6): error C2227: Links von “->Hide” muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
Form2.cpp(7): error C2065: ‘Form1’: nichtdeklarierter Bezeichner
Form2.cpp(7): error C2065: ‘f5’: nichtdeklarierter Bezeichner
Form2.cpp(7): error C2061: Syntaxfehler: Bezeichner ‘Installer1’
Form2.cpp(8): error C2065: ‘f5’: nichtdeklarierter Bezeichner
Form2.cpp(8): error C2227: Links von “->ShowDialog” muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
Typ ist ‘‘unknown-type’’
Code wird generiert…
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========[/spoiler]

Und bei Form1.h steht:

	public ref class Form1 : public System::Windows::Forms::Form
	{
			private: System::Void btnJa_Click(System::Object^  sender, System::EventArgs^  e);
//... 

Bei Form2.h steht:

	public ref class Form2 : public System::Windows::Forms::Form
	{
		   private: System::Void btnBack_Click(System::Object^  sender, System::EventArgs^  e);
//... 
#8

Hallo,

wenn du die Methoden in die cpp einträgst müssen die KLassennamen mit dazu, also

System::Void Form1::btnJa_Click(…

und

System::Void Form2::btnJa_Click(…

Das “private:” muss weg. Das steht nur im Header.

Gruß
albatros

#9

da das mein erster Beitrag im Forum ist, sollte ich mich vorstellen

Hallo :slight_smile:

dass programmieren macht mir Spaß

Das ist toll :slight_smile:

So ok, nun sind die Nettigkeiten vorbei :slight_smile:

Sorry wenn ich das so sage, aber Dein Code sieht gar nicht nach c++ aus :slight_smile:
Dir fehlen Grundlagen, klar.

deswegen empfehle ich, das HTML und WEB und .Net generell mal wegzulassen, wenn du bei c++ bleiben willst.
Es gibt dafür einfach viel mehr geeignetere Sprachen !

fang mit kleineren DIngen an, so wenig wie möglich Fremdbiblios …
und nicht gleich mit GUI’s

Dann macht c++ lernen IMHO mehr Spass !

Klar, ist nur meine Meinung …

Ciao …

#10

das ist irgendwie die falsche Reihenfolge. C++/CLI ist von MS auch nicht für GUI gedacht. C++/CLI ist die praktischere Schnittstelle zwischen WinAPI und C# bzw. VB.NET. Alternative ist P/Invoke.

eindeutig - gerade Visual Studio macht bei C++/CLI verdammt viel falsch

naja - mit C# wirds einfacher, zumal VS da einiges schön Autovervollständigt

hand, mogel

#11

Wie kommst du darauf? Damit kann man zumindest WinForms-Anwendungen genauso entwickeln wir mit C# oder VB, da die darunterliegende Bibliothek ja die gleiche ist.
Allerdings macht C++/CLI wirklich nur Sinn, wenn in einem Projekt noch unmanaged C++ eingebunden werden muss. Ansonsten ist C# tatsächlich sinnvoller und man muss sich nicht mit den C++/CLI-Sprachmurks herumschlagen.

Gruß
albatros

#12

[ul]
[li]entsprechende Begründungen von MS wieso IntelliSense bei C++/CLI gekippt wurde[/li][li]weil Du Ordnungsgemäß und Richtig auf die Fresse fliegst, wenn Du nicht ganz genau weist was Du bei C++/CLI machst (C++ hat feste Pointer / CLI hat verschiebbare Pointer)[/li][/ul]

ich habe ja nicht gesagt das man es nicht kann - nur ist dies nie von MS so vorgesehen gewesen

#13

Hallo mogel,

diese Einschränkungen betreffen aber alle C++/CLI-Projekte und nicht nur solche mit GUI. Also sollte man eigentlich generell lieber auf C++/CLI verzichten, sofern nicht unbedingt noch unmanaged C++ da rein muss.

Gruß
albatros

#14

Ich guck mir dann C genauer ab.Und VB auch vllt.

#15

Ich weiß wie es geht!Die Anweisungen verfolgen und bei den Form1.cpp und Form2.cpp noch

using namespace PROJEKTNAME; //unter #include

eingeben.