Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: FAQ - C++/CLI ::  Zeiger auf Form1 an Form2 übergeben?  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
mrmiagi0101
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.06.2008
Beiträge: 6
Beitrag mrmiagi0101 Mitglied 12:10:11 26.06.2008   Titel:   Zeiger auf Form1 an Form2 übergeben?            Zitieren

Hallo Leute,
erstmal nettes Forum :live: . Jetzt zu meinem Problem: Hab zwei Forms, also zwei Klassen Form1 in Form1.h und Form2 in Form2.h. Estell jetzt in Form1.h mit:
Code:
Form2^ form2 = gcnew Form2(this);
form2->Show();

ein neues Objekt. Dazu habe ich die Form2.h in der Form1.h includet. Geht auch super! Möchte mit this einen Zeiger auf Form1 übergeben.
In Form2.h mein Konstruktor und die Deklaration von fm1:
Code:
1
2
3
4
5
6
7
8
9
10
public: Form2(Form1^ fm)
    {
      InitializeComponent();
      //
      //TODO: Konstruktorcode hier hinzufügen.
      //
      fm1 = fm;
    }
 
public: Form1^ fm1;


Jetzt meckert der Compiler das Form1 nicht definiert ist, ist mir schon klar, aber ein #include "Form1.h" bringt auch nichts. Was muss ich machen?
Hab auch schon die tuts hier gelesen, komm aber nicht weiter. Verwende VS 2005 PE
Danke
Werbeunterbrechung
Knuddlbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.12.2001
Beiträge: 5237
Beitrag Knuddlbaer Mitglied 12:22:39 26.06.2008   Titel:              Zitieren

=> FAQ
mrmiagi0101
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.06.2008
Beiträge: 6
Beitrag mrmiagi0101 Mitglied 12:38:42 26.06.2008   Titel:              Zitieren

Ja die hab ich mir schon angeschaut, aber hab nicht direkt gefunden was ich machen muss. Ausser das man den anderen Weg gehen kann:
Code:
Form2 ^f2 = gcnew Form2(this);
f2->ShowDialog();
this->label1->Text = f2->ErgebnisFuerLabel1;   

Mit vorwärtsdeklaration gehts auch nicht. Muss doch nur ne Kleinigkeit sein!
mrmiagi0101
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.06.2008
Beiträge: 6
Beitrag mrmiagi0101 Mitglied 13:57:50 26.06.2008   Titel:              Zitieren

So geht es auch nicht:
http://www.c-plusplus.de/ ....... light-is-form+zeiger.html

Er kennt einfach das Form1 in der Form2 nicht. Es kommt immer:
Fehler 1 error C2065: 'Form1': nichtdeklarierter Bezeichner

Kann denn keiner was dazu sagen. Probier schon seit mehreren Stunden das zu lösen
mrmiagi0101
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.06.2008
Beiträge: 6
Beitrag mrmiagi0101 Mitglied 14:53:40 26.06.2008   Titel:              Zitieren

Hab jetzt selber eine "Lösung" gefunden. Wenn man in der Form2.cpp die Form1.h includet kann man dort z.B. Form1^ fm ohne Probleme deklarieren.
Aber wieso geht das nicht einfach in der Form2.h?????????????? :rolleyes: :rolleyes: :rolleyes: :rolleyes:
Kommt immer:
Fehler 1 error C2065: 'Form1': nichtdeklarierter Bezeichner
Wo muss man die Form1.h includen damit ich auch in der Form2.h daraufzugreifen kann?
Knuddlbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.12.2001
Beiträge: 5237
Beitrag Knuddlbaer Mitglied 17:00:10 26.06.2008   Titel:              Zitieren

Die Lösung findest Du im Grundlagenbuch und bei der Suche nach dem Begriff Forwärtsdeklarationen. Lernarbeit nimmt Dir keiner ab. Es gab hier auch schon viele Beiträge zu diesem Thema.
mrmiagi0101
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.06.2008
Beiträge: 6
Beitrag mrmiagi0101 Mitglied 20:06:57 26.06.2008   Titel:              Zitieren

Hab zwaz voher schon geschrieben, dass es mit einer Vortwärtsdeklaration auch nicht geht, aber hier mal der Code mit Vorwärtsdeklaration:
Form1.h.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#pragma once
 
#include "Form2.h"
 
namespace test {
 
    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
    {
    public:
        Form1(void)
        {
            InitializeComponent();
            //
            //TODO: Konstruktorcode hier hinzufügen.
            //
        }
 
    protected:
        /// <summary>
        /// Verwendete Ressourcen bereinigen.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
    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)
        {
            this->button1 = (gcnew System::Windows::Forms::Button());
            this->SuspendLayout();
            //
            // button1
            //
            this->button1->Location = System::Drawing::Point(128, 114);
            this->button1->Name = L"button1";
            this->button1->Size = System::Drawing::Size(78, 50);
            this->button1->TabIndex = 0;
            this->button1->Text = L"button1";
            this->button1->UseVisualStyleBackColor = true;
            this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
            //
            // Form1
            //
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(284, 264);
            this->Controls->Add(this->button1);
            this->Name = L"Form1";
            this->Text = L"Form1";
            this->ResumeLayout(false);
 
        }
#pragma endregion
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 Form2^ fm2 = gcnew Form2;
                 fm2->Show(this);
             }
    };
}


Und Form2.h:

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#pragma once
 
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
 
 
 
 
 
 
namespace test {
 
    /// <summary>
    /// Zusammenfassung für Form2
    ///
    /// 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>
 
 
 
    ref class Form1;
 
 
    public ref class Form2 : public System::Windows::Forms::Form
    {
    public:
        Form2(Form1^ fm)
        {
            InitializeComponent();
            //
            //TODO: Konstruktorcode hier hinzufügen.
            //
            fmzeiger = fm;
        }
 
    protected:
        /// <summary>
        /// Verwendete Ressourcen bereinigen.
        /// </summary>
        ~Form2()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::Button^  button1;
    public: Form1^ fmzeiger;
    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->button1 = (gcnew System::Windows::Forms::Button());
            this->SuspendLayout();
            //
            // button1
            //
            this->button1->Location = System::Drawing::Point(131, 120);
            this->button1->Name = L"button1";
            this->button1->Size = System::Drawing::Size(74, 48);
            this->button1->TabIndex = 0;
            this->button1->Text = L"button1";
            this->button1->UseVisualStyleBackColor = true;
            this->button1->Click += gcnew System::EventHandler(this, &Form2::button1_Click);
            //
            // Form2
            //
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(284, 264);
            this->Controls->Add(this->button1);
            this->Name = L"Form2";
            this->Text = L"Form2";
            this->ResumeLayout(false);
 
        }
#pragma endregion
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
             {
                 fmzeiger->Button1->Text = ""; //Hier der Fehler
             }
    };
}


Fehler: error C2027: Verwendung des undefinierten Typs "test::Form1"

Also mit einer Vorwärtdeklaration kann man doch nicht auf die Methoden einer Klasse zugreifen, oder doch? :mad:
Knuddlbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.12.2001
Beiträge: 5237
Beitrag Knuddlbaer Mitglied 20:55:20 26.06.2008   Titel:              Zitieren

Wie gesagt, beschäftige Dich mal ernsthaft mit Vorwärtsdeklaration, such mal im Forum und beschäftige Dich mal mit der Trennung von Definition und Deklaration.

Es ist zwar ein wenig Arbeit, aber das Wissen ist unumgänglich und selbst erarbeitet Wertvoll. Die Frage von Dir zeigt aber zumindest, das Du Dich noch nicht wirklich damit beschäftigt hast.
mrmiagi0101
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.06.2008
Beiträge: 6
Beitrag mrmiagi0101 Mitglied 21:54:15 26.06.2008   Titel:              Zitieren

Also hab keine Ahnung was du meinst wie es gehen könnte. Vielleicht geht es ja so nicht wie ich mir es vorstelle. Kenne zwar die drei anderen Möglichkeiten um auf das gleiche Ergebniss zu kommen, aber so gehts wohl nicht!

Falls du mit Trennung von Definition und Deklaration meinst das ich die Definition des Button Click Ereignisses in der h datei mach und die Deklaration in der cpp, das kenn ich schon. Da kann ich dann auf meinen Form1 Pointer zugreifen. Aber ich möchte ja nur wissen ob das auch alles nur im Header geht, also ohne etwas in die cpp Datei zu schreiben?

Danke


Zuletzt bearbeitet von mrmiagi0101 am 22:12:44 26.06.2008, insgesamt 1-mal bearbeitet
swexel
Unregistrierter




Beitrag swexel Unregistrierter 11:15:26 03.07.2008   Titel:   Ich habe das selbe Problem            Zitieren

Hi,

ich suche jetzt schon seit 2 Tagen etliche Stunden, habe aber noch keine Lösung gefunden.

Man kann eigentlich als beispiel den Quelltext von mrmiagi0101 nehmen.
Ich habe es jetzt endlich hinbekommen, dass keine Compiler-Fehler mehr kommen, indem ich:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "stdafx.h"
#include "Form2.h"
#include "Form1.h"
using namespace test9;
 
 
System::Void test9::Form2::button1_Click(System::Object^  sender, System::EventArgs^  e)
         {
             Form1^ f = (Form1^)this->Owner; /* CForm1-Objekt*/
             f->label1->Text = this->textBox1->Text;
}
 
System::Void test9::Form2::button2_Click(System::Object ^  sender, System::EventArgs ^  e)
{
    Form1^ f = (Form1^)this->Owner; /* CForm1-Objekt*/
    f->label2->Text = this->textBox1->Text;
}

in die Cpp des Form2 gesteckt habe.

Mein momentanes Problem besteht aber dadrin, dass jetzt Linker error kommen. Ich kann keine Cpps benutzen und bin gezwungen den kompletten Code in der .h zu schreiben.
Ich wäre sehr dankbar wenn mir jemand einen Tipp geben könnte, wie ich das in der .h zum laufen bekomme.

Danke
C++ Forum :: FAQ - C++/CLI ::  Zeiger auf Form1 an Form2 übergeben?  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum nicht antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.