Form ruft Form ruft Form ...



  • Hallo,

    Ich öffne Form2 aus Form1, die dann exklusiv in den Vordergrund kommt. Innerhalb von Form2 ist ein Button. Wenn der gedrückt wird, soll sich Form2 wieder schließen und eine andere Form3 öffnen.

    Ich habs auf mehrere Weisen probiert. Entweder schließt sich Form2 nicht oder Form3 lässt sich nicht mehr schließen. Es wird dann à la Endlosschleife immer und immer wieder aufgerufen.

    Hier die Variante, in der ich in Form2 eine Funktion aus Form1 rufe, die dann Form2 schließt und Form3 ruft.

    //Form1//
    Form2 ^FormZwei = gcnew Form2(this);
    FormZwei->ShowDialog();
    ...
    Void CallForm3(){
      FormZwei->Close();
      Form3 ^FormDrei = gcnew Form3();
      FormDrei->ShowDialog();
    }
    
    //Form2//
    //Im Konstruktor Form1 übergeben an frm, Vorwärtsdeklaration ...
    Void Form2::Button_Click(...){
      Form1 ^mainform = dynamic_cast<Form1^>(frm);
      mainform->CallForm3();
    }
    

    Das Ergebnis ist: Form2 schließt nicht. Form3 geht auf, lässt sich aber nicht schließen. Form3 wird immer wieder neu aufgerufen. Manchmal bleibt sie auch zu. Anscheinend zufällig.

    Ich könnte mir schon vorstellen wo das Problem liegt. Das Ereignis, aus dem der Aufruf kommt, soll sich selbst schließen. Aber wenn ich in der Funktion CallForm3 nur Form2->Close mache, geht das ja auch.

    Vielen Dank für Hilfe!

    LG



  • Form1.h

    #include "Form2.h"
    
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
    {
    	Form2^ _frm2 = gcnew Form2();
    	_frm2->ShowDialog();
    }
    

    Form2.h

    #include "Form3.h"
    
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
    {
    	this->Close();//Form2 schließen:
    	Form3^ _frm3 = gcnew Form3();
    	_frm3->TopMost::set(true);//Form3 immer im Vordergrund:
    	_frm3->Show();
    }
    

    Gruß,

    Renke



  • Hallo Renke,

    danke für deine Antwort. Wenn ich jetzt den Button betätige, kommt Form3 14 Mal ...

    In Form2.cpp steht ein

    #include stdafx.h
    

    und in der stdafx.h stehen sowohl Form1, Form2 als auch Form3.

    Wenn ich aus stdafx.h ein Form3.h mache, kommt eine Fehlermeldung, dass der vorkomilierte Header fehlt. Wenn ich Form3.h nochmal in Form2.h inkludiere, erscheint Form3 wieder 14 Mal.

    Vermutlich liegt es daran, dass er sich jetzt so selbst inkludiert? Wie kann ich das ändern?!

    Danke & LG



  • Ähm, ja. Also ich komm wohl mit diesen #include's noch nicht so ganz klar.

    Aber ich weiß jetzt auch nich so ganz, wie ein Profi mein Problem löst.

    Ich hab im Prinzip eine einzige Hauptform (Form1) von der aus immer andere Forms, nennen wir sie mal Subforms, aufgerufen werden. Die Subforms müssen auf Daten in der Hauptform zugreifen.

    Deshalb übergebe ich an jede Subform per Konstruktor die Hauptform und mache da dann einen dynamic_cast auf die Hauptform. Deshalb muss die Subform die Hauptform "kennen" und deshalb mach ich ein #include hauptform.h. In der sind ja wieder alle anderen Subforms angegeben, weshalb ich auch die inkludieren muss.

    Im Prinzip sind also in jeder Subform jede Subform inklusive Hauptform inkludiert - bloß in anderer Reihenfolge.

    Ist das richtig?

    Dann müsste ich ja jedesmal wenn ich eine neue Form hinzufüge, in jeder anderen Form diese inkludieren. Kommt mir jetzt etwas unpraktisch vor, weshalb ich eine andere Lösung vermute.



  • #include "stdafx.h"
    #include "form1.h"
    #include "form2.h"
    #include "form3.h"
    

    Wenn alle drei benötigt werden, ansonsten nur die, die man in der datei auch braucht

    Und zu deinem Problem mit den 14 dialogen. Es ist ganz einfach bei jedem call von dem event wird ein neuer dialog erzeugt.
    Wenn du anstatt dessen eine Membervariable m_form3 z.B. hast. dann kannst du überprüfen ob es schon erstellt wurde

    if( m_form3 != nullptr ){ 
        m_form3 = gcnew Form3(); 
        m_form3->TopMost = true; 
        m_form3->Show(); 
    }
    


  • Das mit dem nullptr verstehe ich, aber soweit komme ich garnicht. Deklariere ich den Member, heisst es "Form3 unbekannt".

    Ich denke, es hängt alles an den #includes. Ich verstehe auch nicht, wenn du schreibst:

    Wenn alle drei benötigt werden, ansonsten nur die, die man in der datei auch braucht

    Ich muss wie gesagt auf Form1 zugreifen und mach den dynamic_cast in Form2. Deshalb muss ich Form1 inkludieren. Sobald ich das mache, krieg ich wieder Fehlermeldungen, weil er Form3 nicht kennt. Denn in Form1 steckt ein Button der Form3 aufruft, deshalb muss er auch in Form2 Form3 kennen. Das Ende vom Lied ist, dass ich doch sowieso immer in allen Subforms, alle Forms inkludieren muss?!

    Und jetzt kommts noch dicker. In einer vierten Form krieg ich nun eine NullReferenceException, wenn ich versuche eine Variable aus der Hauptform zu verwenden. Obwohl ich in der Form4 nix anderes gemacht hab, als in Form3. Nur die #include Reihenfolge ist anders. Sogar das IntelliSense schlägt mir die Variable "mainform->test" vor.

    Form3.cpp

    #include "StdAfx.h"
    
    #include "Form2.h" //andere subform - eigentlich nicht benötigt, wird aber von Form1.h unten verlangt
    #include "Form4.h" //andere subform
    
    #include "Form3.h" //eigene form
    #include "Form1.h" //main form
    
    using namespace stringtest;
    
    System::Void Form3::button1_Click(System::Object^  sender, System::EventArgs^  e) {
    	Form1 ^mainform = dynamic_cast <Form1 ^>(frm);
    	this->label1->Text = mainform->test; //klappt
    }
    

    Form4.cpp

    #include "StdAfx.h"
    
    #include "Form2.h" //andere subform - eigentlich nicht benötigt, wird aber von Form1.h unten verlangt
    #include "Form3.h" //andere subform
    
    #include "Form4.h" //eigene form
    #include "Form1.h" //main form
    
    using namespace stringtest;
    
    System::Void Form4::button1_Click(System::Object^  sender, System::EventArgs^  e) {
    	Form1 ^mainform = dynamic_cast <Form1 ^>(frm);
    	this->label1->Text = mainform->test; //NullReferenceExcpetion
    }
    

    Ich werd gerade wahnsinnig ... 😡

    Danke für jede Hilfe!

    LG



  • Du solltest Deine Programmstruktur überdenken.
    Und Form1 zu casten ist Käse...



  • Ich weiß nicht, was ich an der Struktur überdenken soll. Das ist eine Hauptform aus der diverse andere Forms per Button_Click aufgerufen werden. Das empfinde ich als recht einfache Struktur.

    Ich hab mal ein Visual Studio 2008 Projekt hochgeladen, welche das Problem zeigt:

    http://rapidshare.com/files/358525664/stringtest.zip



  • Hallo Backi...

    Warum hast Du die Header von Form1 bis Form4 so Wahllos überall eingebunden?

    Warum bindest Du z.B. Form2 in Form4 ein, obwohl Du von Form4 nicht auf Form2 zugreifst?

    Oder habe ich Dich falsch verstanden?

    Naja nix für ungut...

    Ich würde das so machen, kannst Du nun auch Zahllos erweitern.

    Hier Dein Projekt umgebaut...

    http://www.rb-softarticle.com/stringtest.rar

    Gruß,

    Doug_HH



  • Yeah! Vielen Dank!

    Wahllos hab ich sie übrigens nicht eingebunden. Lösch doch mal in meinem Beispiel eine von den "Überflüssigen". Dann geht da garnix mehr!

    Nochmals Danke!

    LG



  • Hi!

    Freut mich, dass backi jetzt seine Lösung hat aber meint ihr nicht, das diese auch andere interressieren könnte? 😕

    Mich zum Beispiel! 😃

    Gruss
    Marcus


Anmelden zum Antworten