Stehe im Moment auf dem Schlauch
-
Hallo
Ich möchte, das meine Form2(einstellungenDialog.h) auf meine Form1 zugreifen kann um mir eine Funktion von dort in meinem panelVorschau anzeigt. Ich bin nun nach einigen Versuchen soweit gekommen, dass er meine Form1 in der Form2 findet, aber irgendwie will mir nicht der richtige Gedanke kommen.
Der Zugriff in der Form1 zur Form2 funktioniert genau so und an der Stelle wo sie aufgerufen wird.
#pragma once namespace pong2 { 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 einstellungenDialog /// </summary> public ref class einstellungenDialog : public System::Windows::Forms::Form { private: //ref class Form1^ form; // ein Objekt von form1 etstellen mein Zusatz public: einstellungenDialog(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~einstellungenDialog() { if (components) { delete components; } } public: // die Methode liefert die ausgewählten Werte zurück Point liefereWert() { Point rueckgabe; if (radioButton320 -> Checked == true) rueckgabe = Point(320,200); if (radioButton640 -> Checked == true) rueckgabe = Point(640,480); if (radioButton1024 -> Checked == true) rueckgabe = Point(1024,760); if (radioButtonMaximal -> Checked == true) // bitte in einer Zeile eingeben rueckgabe = Point(Screen::PrimaryScreen -> Bounds.Width, Screen::PrimaryScreen -> Bounds.Height); return rueckgabe; } private: System::Windows::Forms::GroupBox^ groupBox1; private: System::Windows::Forms::Button^ buttonUebernehmen; private: System::Windows::Forms::Button^ buttonAbbrechen; private: System::Windows::Forms::RadioButton^ radioButtonMaximal; private: System::Windows::Forms::RadioButton^ radioButton1024; private: System::Windows::Forms::RadioButton^ radioButton640; private: System::Windows::Forms::RadioButton^ radioButton320; private: System::Windows::Forms::GroupBox^ groupBox2; private: System::Windows::Forms::Button^ buttonSpielfeld; private: System::Windows::Forms::Button^ buttonRahmen; private: System::Windows::Forms::Label^ label2; private: System::Windows::Forms::Label^ label1; private: System::Windows::Forms::Panel^ panelVorschau; private: System::Windows::Forms::Label^ label3; private: System::Windows::Forms::ColorDialog^ colorDialog1; 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) { this->groupBox1 = (gcnew System::Windows::Forms::GroupBox()); this->radioButtonMaximal = (gcnew System::Windows::Forms::RadioButton()); this->radioButton1024 = (gcnew System::Windows::Forms::RadioButton()); this->radioButton640 = (gcnew System::Windows::Forms::RadioButton()); this->radioButton320 = (gcnew System::Windows::Forms::RadioButton()); this->buttonUebernehmen = (gcnew System::Windows::Forms::Button()); this->buttonAbbrechen = (gcnew System::Windows::Forms::Button()); this->groupBox2 = (gcnew System::Windows::Forms::GroupBox()); this->buttonSpielfeld = (gcnew System::Windows::Forms::Button()); this->buttonRahmen = (gcnew System::Windows::Forms::Button()); this->label2 = (gcnew System::Windows::Forms::Label()); this->label1 = (gcnew System::Windows::Forms::Label()); this->panelVorschau = (gcnew System::Windows::Forms::Panel()); this->label3 = (gcnew System::Windows::Forms::Label()); this->colorDialog1 = (gcnew System::Windows::Forms::ColorDialog()); this->groupBox1->SuspendLayout(); this->groupBox2->SuspendLayout(); this->SuspendLayout(); // // groupBox1 // this->groupBox1->Controls->Add(this->radioButtonMaximal); this->groupBox1->Controls->Add(this->radioButton1024); this->groupBox1->Controls->Add(this->radioButton640); this->groupBox1->Controls->Add(this->radioButton320); this->groupBox1->Location = System::Drawing::Point(12, 12); this->groupBox1->Name = L"groupBox1"; this->groupBox1->Size = System::Drawing::Size(323, 80); this->groupBox1->TabIndex = 0; this->groupBox1->TabStop = false; this->groupBox1->Text = L"Größe"; // // radioButtonMaximal // this->radioButtonMaximal->AutoSize = true; this->radioButtonMaximal->Location = System::Drawing::Point(253, 32); this->radioButtonMaximal->Name = L"radioButtonMaximal"; this->radioButtonMaximal->Size = System::Drawing::Size(63, 17); this->radioButtonMaximal->TabIndex = 3; this->radioButtonMaximal->TabStop = true; this->radioButtonMaximal->Text = L"Maximal"; this->radioButtonMaximal->UseVisualStyleBackColor = true; // // radioButton1024 // this->radioButton1024->AutoSize = true; this->radioButton1024->Location = System::Drawing::Point(170, 32); this->radioButton1024->Name = L"radioButton1024"; this->radioButton1024->Size = System::Drawing::Size(77, 17); this->radioButton1024->TabIndex = 2; this->radioButton1024->Text = L"1024 * 768"; this->radioButton1024->UseVisualStyleBackColor = true; // // radioButton640 // this->radioButton640->AutoSize = true; this->radioButton640->Checked = true; this->radioButton640->Location = System::Drawing::Point(93, 32); this->radioButton640->Name = L"radioButton640"; this->radioButton640->Size = System::Drawing::Size(71, 17); this->radioButton640->TabIndex = 1; this->radioButton640->TabStop = true; this->radioButton640->Text = L"640 * 480"; this->radioButton640->UseVisualStyleBackColor = true; // // radioButton320 // this->radioButton320->AutoSize = true; this->radioButton320->Location = System::Drawing::Point(16, 32); this->radioButton320->Name = L"radioButton320"; this->radioButton320->Size = System::Drawing::Size(71, 17); this->radioButton320->TabIndex = 0; this->radioButton320->Text = L"320 * 200"; this->radioButton320->UseVisualStyleBackColor = true; // // buttonUebernehmen // this->buttonUebernehmen->DialogResult = System::Windows::Forms::DialogResult::OK; this->buttonUebernehmen->Location = System::Drawing::Point(15, 354); this->buttonUebernehmen->Name = L"buttonUebernehmen"; this->buttonUebernehmen->Size = System::Drawing::Size(75, 23); this->buttonUebernehmen->TabIndex = 1; this->buttonUebernehmen->Text = L"Übernehmen"; this->buttonUebernehmen->UseVisualStyleBackColor = true; // // buttonAbbrechen // this->buttonAbbrechen->Location = System::Drawing::Point(266, 354); this->buttonAbbrechen->Name = L"buttonAbbrechen"; this->buttonAbbrechen->Size = System::Drawing::Size(75, 23); this->buttonAbbrechen->TabIndex = 2; this->buttonAbbrechen->Text = L"Abbrechen"; this->buttonAbbrechen->UseVisualStyleBackColor = true; this->buttonAbbrechen->Click += gcnew System::EventHandler(this, &einstellungenDialog::buttonAbbrechen_Click); // // groupBox2 // this->groupBox2->Controls->Add(this->buttonSpielfeld); this->groupBox2->Controls->Add(this->buttonRahmen); this->groupBox2->Controls->Add(this->label2); this->groupBox2->Controls->Add(this->label1); this->groupBox2->Location = System::Drawing::Point(12, 98); this->groupBox2->Name = L"groupBox2"; this->groupBox2->Size = System::Drawing::Size(323, 100); this->groupBox2->TabIndex = 3; this->groupBox2->TabStop = false; this->groupBox2->Text = L"Farben"; // // buttonSpielfeld // this->buttonSpielfeld->Location = System::Drawing::Point(77, 50); this->buttonSpielfeld->Name = L"buttonSpielfeld"; this->buttonSpielfeld->Size = System::Drawing::Size(30, 30); this->buttonSpielfeld->TabIndex = 3; this->buttonSpielfeld->Text = L". . ."; this->buttonSpielfeld->UseVisualStyleBackColor = true; this->buttonSpielfeld->Click += gcnew System::EventHandler(this, &einstellungenDialog::buttonSpielfeld_Click); // // buttonRahmen // this->buttonRahmen->Location = System::Drawing::Point(77, 14); this->buttonRahmen->Name = L"buttonRahmen"; this->buttonRahmen->Size = System::Drawing::Size(30, 30); this->buttonRahmen->TabIndex = 2; this->buttonRahmen->Text = L". . ."; this->buttonRahmen->UseVisualStyleBackColor = true; this->buttonRahmen->Click += gcnew System::EventHandler(this, &einstellungenDialog::buttonRahmen_Click); // // label2 // this->label2->AutoSize = true; this->label2->Location = System::Drawing::Point(13, 67); this->label2->Name = L"label2"; this->label2->Size = System::Drawing::Size(50, 13); this->label2->TabIndex = 1; this->label2->Text = L"Spielfeld:"; // // label1 // this->label1->AutoSize = true; this->label1->Location = System::Drawing::Point(13, 31); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(50, 13); this->label1->TabIndex = 0; this->label1->Text = L"Rahmen:"; // // panelVorschau // this->panelVorschau->BackColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(224)), static_cast<System::Int32>(static_cast<System::Byte>(224)), static_cast<System::Int32>(static_cast<System::Byte>(224))); this->panelVorschau->BorderStyle = System::Windows::Forms::BorderStyle::FixedSingle; this->panelVorschau->Location = System::Drawing::Point(12, 234); this->panelVorschau->Name = L"panelVorschau"; this->panelVorschau->Size = System::Drawing::Size(323, 100); this->panelVorschau->TabIndex = 4; this->panelVorschau->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &einstellungenDialog::panelVorschau_Paint); // // label3 // this->label3->AutoSize = true; this->label3->Location = System::Drawing::Point(12, 218); this->label3->Name = L"label3"; this->label3->Size = System::Drawing::Size(52, 13); this->label3->TabIndex = 5; this->label3->Text = L"Vorschau"; // // einstellungenDialog // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(353, 400); this->Controls->Add(this->label3); this->Controls->Add(this->panelVorschau); this->Controls->Add(this->groupBox2); this->Controls->Add(this->buttonAbbrechen); this->Controls->Add(this->buttonUebernehmen); this->Controls->Add(this->groupBox1); this->Name = L"einstellungenDialog"; this->StartPosition = System::Windows::Forms::FormStartPosition::CenterParent; this->Text = L"Einstellungen"; this->TopMost = true; this->groupBox1->ResumeLayout(false); this->groupBox1->PerformLayout(); this->groupBox2->ResumeLayout(false); this->groupBox2->PerformLayout(); this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion private: System::Void buttonAbbrechen_Click(System::Object^ sender, System::EventArgs^ e) { Close(); } private: System::Void buttonRahmen_Click(System::Object^ sender, System::EventArgs^ e) { // den Dialog zur Farbauswahl anzeigen // bitte jeweils in einer Zeile eingeben if (colorDialog1 -> ShowDialog() == Windows::Forms::DialogResult::OK) { // Farbe für die Begrunzungsbalken setzen } } private: System::Void buttonSpielfeld_Click(System::Object^ sender, System::EventArgs^ e) { // Point farbe; //Graphics ^zeichenflaeche; // den Dialog zur Farbauswahl anzeigen // bitte jeweils in einer Zeile eingeben if (colorDialog1 -> ShowDialog() == Windows::Forms::DialogResult::OK) { // Farbe für den Hintergrund setzen // panelVorschau -> BackColor = colorDialog1 -> Color; // return; } } private: System::Void panelVorschau_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { Form1::zeichneSpielfeld(); } }; }
Hier die Fehlermeldung dazu.
pong2, Konfiguration: Debug Win32 ------
1> stdafx.cpp
1>c:\users\lehwald\desktop\c++_cli\cpbs 14c\pong2\pong2\einstellungenDialog.h(332): error C2027: Verwendung des undefinierten Typs "pong2::Form1"
1> c:\users\lehwald\desktop\c++_cli\cpbs 14c\pong2\pong2\einstellungenDialog.h(21): Siehe Deklaration von 'pong2::Form1'
1>c:\users\lehwald\desktop\c++_cli\cpbs 14c\pong2\pong2\einstellungenDialog.h(332): error C3861: "zeichneSpielfeld": Bezeichner wurde nicht gefunden.
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Einige Versuche sind noch ausdokumentiert vorhanden allerdings. Vielleicht ist ja ein richtiger Ansatz dabei.
Die eigentliche Frage ist, wie kann ich auf eine Funktion (Methode) der Form1 aus der Form2 zugreifen?
Schon etliche Beiträge durchgesehen, aber der Knoten ist noch nicht geplatzt.
Bin für Euro Hilfe recht dankbar.
Lieber Gruß
champmann
-
#include "Form1.h"
?
-
Vielleicht hilft dir die Anleitung in folgendem Post:
http://www.c-plusplus.net/forum/301631
-
Das führt jetzt zu euinem Problemchen wegen zyklischem Inkludieren.
Die Lösung ist, die jeweils andere Form erst unterhalb der ganzen eigenen Form-Klasse zu inkludieren. Und Funktionen, die die andere Form brauchen, noch unterhalb des includes. In der Klasse nur deklarieren, drunter erst definieren.
Da dir Forms sich gegenseitig wohl kennen sollen, Zeiger auf die andere Form sich merken, Zeiger kann man forward-Deklarieren, ohne daß man dazu was inkludieren müßte.edit: Oder wie theta angibt, mit einer cpp-Datei arbeiten.
-
"#include Form1.h in der Form2 oder in der .cpp? Wenn in Form2, dann kennt der Compiler zwar die Form1, aber er meckert dann auch rum, weil er die nicht benötigten Funktionen, Variablen usw. in Form2 nicht kennt. Logischerweise, denn ich will ja nur auf die eine Funktion zugreifen.
Liebe/r theta, dass habe ich mir schon angesehen, hat mir aber nicht weiter geholfen, weil ich ja auf die Form2 zugreifen kann von der Form1 aus. Die Form1 ist ja meine Hauptform und von der möchte ich eine Methode(Funktion) in Form2 aufrufen.
Gebe ich #include Form1.h in der stdafx.h ein, dann gibt mir die selben Meldungen, wie bei der Includeanweisung direkt in der Form2 aus.
Selbst wenn ich die Funktion in einer Variablen in Form speichern oder übergeben würde, so muss ich diese in der Form rüber bekommen, aber wie, wenn diese die Form nicht kennt?
Lieben Dank
champmann
-
Ich habe nochmals eine alte Diskussion herausgesucht:
http://www.c-plusplus.net/forum/p2252552#2252552
-
Hallo noch mal
Da ist mir eben ein Gedanke gekommen, aber ich weiß nicht ob das so richtig ist.
Also:
In meiner Form1 habe ich einen Toolstrip eingebaut, über den ich meine Form2 aufrufe. Dort setze ich ja schon die Spielfeldgröße in verschiedene Abmessungen, die in der Form1 dann übernommen werden. Hier die Methode für das ToolStrip.
private: System::Void spielfeldToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { Point neueGroesse; // bitte jeweils in einer Zeile eingeben einstellungenDialog ^neueWerte = gcnew einstellungenDialog(); // wenn der Dialog über OK beendet wird if (neueWerte -> ShowDialog() == Windows::Forms::DialogResult::OK) { // die neue Größe holen neueGroesse = neueWerte -> liefereWert(); // den Dialog wieder schließen neueWerte -> Close(); // das Formular ändern this -> Width = neueGroesse.X; this -> Height = neueGroesse.Y; // neu ausrichten // bitte jeweils in einer Zeile eingeben this -> Left = (Screen::PrimaryScreen -> Bounds.Width - this -> Width) / 2; this -> Top = (Screen::PrimaryScreen -> Bounds.Height - this -> Height) / 2; // die Zeichenfläche neu beschaffen zeichenflaeche = spielfeld -> CreateGraphics(); // das Spielfeld neu setzen setzeSpielfeld(); // Spielfeld löschen zeichenflaeche -> Clear(spielfeld -> BackColor); // und einen neuen Ball und Schläger zeichnen neuerBall(); } }; }; }
Würde die Form2 von der Form1 etwas übernehmen, wenn ich es aus dieser Methode aufrufen würde? z. B. mein Spielfeld?
Irgendwie muss ich das ja in das Panel der Form2 bekommen, damit ich die Farbvorschau dann in Form1 übernehmen kann.
lieben Dank
champmann
-
1. Bitte benutze genau die Namen der Klassen (anstatt Form2 einfach einstellungenDialog). Es ist schon so genug schwierig herauszufinden, auf was du eigentlich hinaus willst.
2. Egal ob Form, Panel oder sonst was - die Prinzipien wie zwei Objekte miteinander Daten austauschen können ist gleich. Hier ein Bsp. Ev. kannst du deine Fragen danach auf dieses Beispiel beziehen?EinstellungsDialog.h
ref class EinstellungsDialog { public: property Color^ SpielfeldFarbe { Color^ get(); } private: void OnOkKnopfGedrueckt(); private: Color^ m_spielfeldFarbe; };
EinstellungsDialog.cpp
Color^ EinstellungsDialog::SpielfeldFarbe::get() { return m_spielfeldFarbe; } void EinstellungsDialog::OnOkKnopfGedrueckt() { // m_spielfeldFarbe = z.B. aus einem Farbauswahl-Control }
Hauptfenster.h
ref class Hauptfenster { public: private: void OnZeigeEinstellungen(); };
Hauptfenster.cpp
#include "EinstellungsDialog.h" void Hauptfenster::OnZeigeEinstellungen() { EinstellungsDialog^ einstellungsDialog = gcnew EinstellungsDialog(); // .. Dialog zeigen und warten bis Ok oder Abbrechen gedrückt wurde // .. wenn Ok gedrückt worden ist: meinspielFeld->Color = einstellungsDialog->SpielfeldFarbe; }
In diesem Bsp. greift das Hauptfenster auf den EinstellungsDialog zu. Mehr, bzw. umgekehrt, nicht. Brauchst du mehr, bzw. etwas anderes?
-
Titel etwas ungünstig, hm?!
Das könnte so ziemlich alles mögliche sein.. XD