#include-Konfussion
-
Hallo,
ich programmiere jetzt seit einem halben Jahr in Visual C++ und nutze die .net-Umgebung und die Windows Forms (dürfte wohl nebensächlich sein, da es ja unter MFC ähnlich läuft). Dabei tritt immer wieder mal ein Problem auf, wo ich noch nicht ganz dahinter gestiegen bin, was es eigentlich bedeutet:
Ich habe also ein MDI-Projekt mit 3 Formen:
Form1 ist die Startform und Parent für alle anderen,
Form2 und Form3 sind jeweils Childs zu Form1,
Form3 wird nur von Form2 aus aufgerufen.Um jetzt von Form1 die Form2 aufrufen zu können, muss an den Anfang der header-Datei der Form1 das entsprechende include:
#include "Form2.h"der Aufruf:
Form2* myForm = new Form2();Jetzt kann ich zum Beispiel aus Form1 das dataGrid-Steuerelement in Form2 über
myForm->dataGrid1->...
ansprechen und bearbeiten. Elemente aus Form3 aber nicht.Um von Form2 die Form3 aufzurufen, nehm ich das gleiche Prinzip:
#include "Form3.h"und der entsprechende Aufruf:
Form3* myForm = new Form3();So weit, so gut.
Jetzt habe ich aber in Form3 eine Interaktion mit dem Benutzer, dessen Ergebnis ich aber an gerade dieses dataGrid1 in Form2 schicken muss.
Sobald ich wie in der Form1 ein #include "Form2.h" in den Header von Form3 reinbastle, bekomm ich unzählige Fehlermeldungen.Kann mir jetzt mal einer erklären wieso und am günstigsten noch, wie ich dieses Problem löse. An manchen Stellen lässt es sich ja umgehen, aber ich bin es von VB so gewöhnt und finde es daher ziemlich kompliziert, jedes Mal über 3 Ecken auf das Element zuzugreifen. Bei VB ging das schön direkt. Wieso kann ich jetzt nicht mehr "rückwärts" gehen und muss immer versuchen, den Kreis zu schließen?
Wie bekomm ich also die aufrufende Instanz in meine gerufene Form rein? Die Übergabe mittels "this" geht ja, nur habe ich dann eine Instanz vom Typ Form und nicht vom Typ Form2 übergeben (die Form2-Klasse kann ich ja nicht einbinden) und kann somit nicht auf das DataGrid zugreifen, weil es nur in der Form2-Klasse drin steht.Kleine Anmerkung: ich will nicht auf C# umsteigen, obwohl dieses eigentlich für die Windows Forms gedacht ist. Mein Chef schreibt C++ vor.
Besten Dank für eure Hilfe
Gruß
physici
-
Stichwort forward-Deklaration: die Header deklarieren nur die Namen der benötigten Klassen (danach können sie mit diesem Namen arbeiten, solange sie weder die Größe noch einzelne Elemente der Klasse benötigen), die CPP-Files binden alle benötigten Header ein:
//Form1.h: class Form2; class Form1 { public: Form1(); private: Form2* m_f2; }; //Form1.cpp: #include "Form1.h" #include "Form2.h" Form1::Form1() { m_f2 = new Form2(this); } //Form2.h: class Form1; class Form2 { public: Form2(Form1* owner); private: Form1* m_own; } //Form2.cpp: #include "Form1.h" #include "Form2.h" Form2::Form2(Form1* owner) : m_own(owner) {}
-
Generell gilt aber (diese Diskussion gab's auch schon oft im VCL-Forum), daß Dialoge sich nicht gegenseitig kennen sollten, bzw. nicht gegenseitig in ihren Daten rumpfuschen, dafür geht man besser über Eck, ansonsten ist das objektorientierter Spaghetti-Code.
Btw: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39242.html
-
naja, zum einen arbeite ich nicht mit Dialogen, sondern mit Formularen (Forms), aber es läuft wohl aufs selbe hinaus und ich gebe dir ja auch recht. Manchmal ist es aber nötig oder wie machst du das?
das Beispiel klappt bei mir nicht, Konvertierung von verwaltet in nicht verwaltet will er beispielsweise nicht.