Schließen eines Formularfensters (System::Windows::Forms::Form)



  • Ich erzeuge eine Klassenreferenz "Startseite" auf die Klasse System::Windows::Forms::Form

    public ref class Startseite : public System::Windows::Forms::Form
    {
    	//Code
    }
    

    Sprich ich erhalte ein Formularfenster mit Buttons, Tables etc.

    In der Methode main() wird die Referenz (Startseite) über den Befehl

    Application::Run(gcnew Startseite());
    

    aufgerufen.

    Soweit so gut. Mein Problem ist es die Referenz (Startseite bzw. das Formularfenster) in Abhängigkeit einer Variable ("AufrufVariable") zu schließen. Falls "AufrufVariable" gleich 1 ist soll die Startseite geschlossen werden (das Formularfenster also nicht mehr sichtbar sein).

    if(AufrufVariable == 1)
    {
    	// mache noch andere Sachen …
    	// Schließe die Referenz Startseite
            … irgendwas mit Close …
    }
    

    Mein Problem ist, dass ich überhaupt keine Ahnung habe wie ich das bewerkstelligen könnte.
    Für Hilfe wäre ich sehr dankbar. Ich bin absoluter Anfänger was C++ Programmierung angeht, also bitte ein wenig Mitleid 😉



  • Falsches Forum: Korrekt wäre C++/CLI
    Übrigens ist C++/CLI nicht C++ sondern eine eigene Sprache, die das .NET Framework und die .NET Laufzeitumgebung benutzt.

    Dein Beitrag wird bestimmt bald verschoben.
    Gruss Simon



  • Zeige doch mal wie die Main Funktion bis jetzt aussieht.
    Wo "lebt" die AufrufVariable?
    Simon



  • meine main-Funktion:

    int main(array<System::String^> ^args)
    {
       Application::EnableVisualStyles();
       Application::SetCompatibleTextRenderingDefault(false);
    
       //Startfenster erzeugen
       Application::Run(gcnew Startseite());
    
      if (AufrufVariable == 1)
      {
         Application::Run(gcnew Eingabeseite());
    
         // hier sollte die close-Anweisung stehen ...
      }
    
      return 0;
    }
    


  • Application::Run(..) kehrt erst zurück, wenn die übergebene Form geschlossen wird. So wie der Code jetzt aussieht gehts nicht.

    Eine Möglichkeit wäre der Startseite via Konstruktor die AufrufVariable zu übergeben und aufgrund deren Wertes die Startseite mit Close(..) wieder zu schliessen.

    Ev. ist es besser die Startseite gar nicht zu zeigen, sondern gerade die Eingabeseite anzuzeigen.

    z.B. so:

    if (AufrufVariable != 1)
    {
      Application::Run(gcnew Startseite());
    }
    else
    {
      Application::Run(gcnew Eingabeseite());
      // hier sollte die close-Anweisung stehen ...
    }
    

    Simon



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • simon.gysi schrieb:

    Application::Run(..) kehrt erst zurück, wenn die übergebene Form geschlossen wird. So wie der Code jetzt aussieht gehts nicht.

    Eine Möglichkeit wäre der Startseite via Konstruktor die AufrufVariable zu übergeben und aufgrund deren Wertes die Startseite mit Close(..) wieder zu schliessen.

    Ev. ist es besser die Startseite gar nicht zu zeigen, sondern gerade die Eingabeseite anzuzeigen.

    z.B. so:

    if (AufrufVariable != 1)
    {
      Application::Run(gcnew Startseite());
    }
    else
    {
      Application::Run(gcnew Eingabeseite());
      // hier sollte die close-Anweisung stehen ...
    }
    

    Simon

    So jetzt habe ich mal wieder ein wenig Zeit für mein kleines Problem. Sorry Simon das bringt mich auch nicht weiter, da ich auf jeden Fall das Startfenster öffnen muss.

    Das Startfenster ist halt das Startfenster (ist das erste Fenster was erscheint, wenn ich mein Programm starte). Es enthält unteranderem den Button "Eingabe", wenn ich auf diesem Button drücke soll sich das Eingabefenster öffnen (TestVar wird auf 1 gesetzt und das Programm springt in die If-Verzweigung, siehe Code).

    Meine main-Funktion sieht grob wie folgt aus:

    ...
    int main()
    {
      Startfenster ^startSeite = gcnew Startfenster();
      Eingabefenster ^eingabeSeite = gcnew Eingabefenster();
    
      Application::Run(startSeite);
    
      if (TestVar == 1)
      {
        Application::Run(eingabeSeite);
        ...
      }
    

    Die Variable TestVar wird auf 1 gesetzt wenn ich den Button "Eingabe" drücke. Alles klappt soweit so gut, das einzige Problem ist nur das Startfenster. Wenn ich das ganze Laufen lasse wird das Startfenster aufgebaut. Denn Button "Eingabe" kann ich drücken, die Variable "TestVar" wird auf 1 gesetzt. Nur habe ich es bis jetzt nicht geschafft das Startfenster zu schließen.
    Wenn ich es per Mausklick schließe öffnet sich danach auch das Eingabefenster wie ich es gerne hätte.

    Application::Exit bzw. Application::ExitThread schließen zwar das Startfenster, sorgen aber auch dafür das das Eingabefenster nicht geöffnet wird.

    Hat irgendwer Erfahrung mit der DoEvents-Methode? Ich denke dies könnte helfen, habe es aber noch nicht zum Laufen gebracht.

    Gruß



  • einfach

    Form1->Close();



  • der_guenn schrieb:

    Sorry Simon das bringt mich auch nicht weiter, da ich auf jeden Fall das Startfenster öffnen muss.

    Du hast mein Post nicht richtig gelesen:

    Simon schrieb:

    Eine Möglichkeit wäre der Startseite via Konstruktor die AufrufVariable zu übergeben und aufgrund deren Wertes die Startseite mit Close(..) wieder zu schliessen.

    Simon



  • denjo303 schrieb:

    einfach

    Form1->Close();

    Die Sache mit close klappt, jedoch muss die Close-Anweisung in die Klasse Startseite und darf nicht in der main-Funktion stehen.
    Als kleines Beispiel für Leute die auch mal vor meinen Problem stehen sollten:
    Ich habe zwei Klassen "Startseite" und "Eingabeseite". In meiner main-Funktion werden Objekte erzeugt.

    //Klasse Startseite
    public ref class Startseite : public System::Windows:.Forms::Form
    {
      ...
      private System::Void Button_Click(...) //beim Mausklick wird TestVar auf 1 gesetzt und Startfenster über die Close-Methode geschlossen
      {
        *TestVar = 1;
        this->Close();   //entscheidend ist dieses Close hier, im main() würde es nichts bringen
      }
    };
    
    //Klasse Eingabeseite
    public ref class Eingabeseite : public system::Windows::Forms::Form
    {
      ...
    };
    
    //Funktion main
    int main()
    {
      Startfenster ^startSeite = gcnew Startfenster();
      Eingabefenster ^eingabeSeite = gcnew Eingabefenster();
    
      Application::Run(startSeite);
    
      if (*TestVar == 1)
      {
        Application::Run(eingabeSeite);
        ...
      } 
    }
    

    Hoffe es hilft den nächsten weiter.



  • Funktioniert, finde ich aber ganz und gar nicht "State of the Art"...
    Simon


Anmelden zum Antworten