Windows Form beim aufruf der 2ten Form beenden



  • Guten Abend zusammen,

    leider ist mein erster Post schon ein Hilfe gesuche.

    Ich habe eine Windows Form,(Form1),welche eine zweite Windows Form mithilfe von MainView(dies ist die aufzurufende Form)->Show(); aufruft.Jedoch sollte sich Form1 selber beenden.

    Der aktuelle Code in der button_Click Funktion sieht folgender maßen aus

    Main^ MainView = gcnew Main();                
          MainView->Show();
    

    Mit dem aufruf des Members Close() der Form1, wird logischerweise die komplette Applikation beendet.Hide() ist hier leider keine Lösung,da nach dem schließen der MainView die EXE weiter läuft,was logisch ist,da die Form1 ja nur versteckt,aber nicht beendet ist.

    Welche möglichkeiten gibt es hierfür noch ?

    Vielen Dank im Voraus!

    Ps: Ich bin mir bewusst ,dass ihr von C++ und .net nicht viel haltet.Ich bitte euch dennoch davon abzusehen, mich überzeugen zu wollen.



  • Ps: Ich bin mir bewusst ,dass ihr von C++ und .net nicht viel haltet.

    Kann man generel so nicht sagen. 🕶

    Warum ist es keine Lösung die Form1 zu verstecken?
    Was möchtest Du erreichen (nicht wie, sondern was)?



  • theta schrieb:

    Ps: Ich bin mir bewusst ,dass ihr von C++ und .net nicht viel haltet.

    Kann man generel so nicht sagen. 🕶

    Warum ist es keine Lösung die Form1 zu verstecken?
    Was möchtest Du erreichen (nicht wie, sondern was)?

    Form1 ist ein Login Feld. Wenn man dieses "nur" mit Hide() versteckt und die MainView beendet,läuft die EXE noch weiter (wie oben beschrieben). daher ist dies keine Lösung.

    Sprich, benötige eine Lösung, wie man die Form1 schließt und den "Process Focus" auf die Mainview übergibt.



  • Verstehe ich nicht.

    Du hast eine Login Form welche als erstes gezeigt wird und nach erfolgreicher Anmeldung wird das Hauptfenster gezeigt? Bei nicht erfolgreicher Anmeldung wird die Applikation einfach wieder beendet?



  • Nein. Bei Erfolgreicher anmeldung ,wird auf die Mainview weitergeleitet(bzw sollte zumindest) und die Login Form sollte sich beenden. Bei erfolglose Anmeldung, popt eine Messagebox auf mit entsprechendem Hinweis,dass die Login Daten falsch sind.

    Dies wird mit einer entsprechenden If-Abfrage gemacht.



  • Also das ist doch dasselbe:

    theta schrieb:

    Du hast eine Login Form welche als erstes gezeigt wird und nach erfolgreicher Anmeldung wird das Hauptfenster gezeigt?

    ^bnL schrieb:

    Bei Erfolgreicher anmeldung ,wird auf die Mainview weitergeleitet(bzw sollte zumindest) und die Login Form sollte sich beenden.



  • theta schrieb:

    Also das ist doch dasselbe:

    theta schrieb:

    Du hast eine Login Form welche als erstes gezeigt wird und nach erfolgreicher Anmeldung wird das Hauptfenster gezeigt?

    ^bnL schrieb:

    Bei Erfolgreicher anmeldung ,wird auf die Mainview weitergeleitet(bzw sollte zumindest) und die Login Form sollte sich beenden.

    Das "Nein" war auf deinen 2ten Satz bezogen.



  • Aha...



  • Beende Deine Anwendung aus der MainView mit...

    Application::Exit();
    


  • Doug_HH schrieb:

    Beende Deine Anwendung aus der MainView mit...

    Application::Exit();
    

    Danke! Werde mich bei bedarf nochmals melden.



  • Wie wäre es das Login-Form aus dem Hauptformular aufzurufen? Das wäre zumindest der korrekte Weg.



  • inflames2k schrieb:

    Wie wäre es das Login-Form aus dem Hauptformular aufzurufen? Das wäre zumindest der korrekte Weg.

    Darauf habe ich es inzwischen auch umgebaut.

    Login Hide usw Funktioniert auch ohne Probleme.Allerdings bisher bei der Main nicht. Jedoch war des gestern auch nur auf die schneller noch gemacht. Muss da Heute mal genauer schauen.Denke,dass ich da einfach vor lauter Schlafmangel nicht richtig aufgepasst habe und dadurch einen Layer 8 Fehler eingebaut habe 😃



  • Leider kein Erfolg. Ich kann alles(Login Form,menustrip,button usw) Hiden bis auf die von main() aufgerufene Form (in diesem Fall MainView).

    Ich versuche nochmals es passend zu beschreiben was ich vorhabe.

    Gegeben:

    - MainView Form (wird direkt von Main aufgerufen)
    - Login Form( wird durch eine Form_Load Funktion aufgerufen)

    Der aufruf der beiden Formen funktioniert ohne Probleme. Nun möchte ich jedoch die MainView erst einblenden lassen,wenn der Login Erfolgreich war ( abfrage steht hierfür statisch bisher). Sprich "Login Erfolgreich, weiterleitung zu -> MainView).

    Jedoch lässt sich leider MainView aus welchen Gründen auch immer nicht verstecken/ausblenden, wahtever...

    Hat einer noch eine Idee bzw kann die Vermutung von mir bestätigen, dass man eine von Main() aufgerufene Form nicht verstecken kann ?!

    Vielen Dank!



  • Du brauchst nur die Login-Form mittels ShowDialog(this) aufzurufen, dann blockiert dieser Aufruf solange, bis der User diesen Dialog schließt und danach geht es dann im Ablauf weiter und die MainForm wird angezeigt.

    Besser finde ich jedoch, wenn in der Main zuerst der Aufruf des Login-Dialogs erfolgt und danach dann erst die Main-Form mittels Application.Run aufgerufen wird.



  • ^bnL schrieb:

    Hat einer noch eine Idee bzw kann die Vermutung von mir bestätigen, dass man eine von Main() aufgerufene Form nicht verstecken kann ?!

    Eine aus Main mittels Application.Run aufgerufene Form kann ausgeblendet werden!

    Beispiel:

    public partial class MyForm : Form
    {
        protected overwrite void OnShown()
        {
            this.Visible = false;
            DialogResult result = DialogResult.Cancel;
            do
            {
                result = MyLoginForm.ShowDialog();
            }while(result != DialogResult.OK);
            this.Visible = true;
        }
    }
    


  • Vielen Dank zuallererst an euch Beide !

    Th69 schrieb:

    Du brauchst nur die Login-Form mittels ShowDialog(this) aufzurufen, dann blockiert dieser Aufruf solange, bis der User diesen Dialog schließt und danach geht es dann im Ablauf weiter und die MainForm wird angezeigt.

    Besser finde ich jedoch, wenn in der Main zuerst der Aufruf des Login-Dialogs erfolgt und danach dann erst die Main-Form mittels Application.Run aufgerufen wird.

    Wenn der User jedoch abbricht, wird ihm die MainView angezeigt. Jedoch müsste man diese Aktion mittels einer if abfrage abfangen können,oder ?

    @inflames2k :

    Mit den anpassungen an meine Form, spruckt der Compilier mir jede Menge Meldungen aus. (werde diese alle weiter unten Posten). Jedoch ist aus meiner Sicht momentan das Problem,dass Hide bzw visable = flase nicht greift.

    this.viable = false
    

    Spruckt folgendes aus

    All outputs are up-to-date.
    1> Login.cpp
    1>c:\users\marcus\documents\ipx\zentraldockma\client\client\Main.h(22): error C2228: left of '.Visible' must have class/struct/union
    1> type is 'Client::Main ^const '
    1> did you intend to use '->' instead?

    Wenn ich dieser Anweisung folge und den Punkt auswechsel kommt keine Meldung mehr,aber die Anweisung wird auch nicht umgesetzt.

    Wie oben angesprochen die Meldungen des Compiliers mit der Methoden deklaration der Class.

    1>c:\users\marcus\documents\ipx\zentraldockma\client\client\Main.h(27): error C2144: syntax error : 'void' should be preceded by ';'
    1>c:\users\marcus\documents\ipx\zentraldockma\client\client\Main.h(27): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\users\marcus\documents\ipx\zentraldockma\client\client\Main.h(29): error C2228: left of '.Visible' must have class/struct/union
    1> type is 'Client::Main ^const '
    1> did you intend to use '->' instead?
    1>c:\users\marcus\documents\ipx\zentraldockma\client\client\Main.h(30): error C2146: syntax error : missing ';' before identifier 'result'
    1>c:\users\marcus\documents\ipx\zentraldockma\client\client\Main.h(30): error C2065: 'result' : undeclared identifier
    1>c:\users\marcus\documents\ipx\zentraldockma\client\client\Main.h(30): error C2039: 'Cancel' : is not a member of 'System::Enum'
    1> c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : see declaration of 'System::Enum'
    1>c:\users\marcus\documents\ipx\zentraldockma\client\client\Main.h(34): error C2065: 'result' : undeclared identifier
    1>c:\users\marcus\documents\ipx\zentraldockma\client\client\Main.h(34): error C2228: left of '.ShowDialog' must have class/struct/union
    1> type is 'Client::Login ^'
    1>c:\users\marcus\documents\ipx\zentraldockma\client\client\Main.h(36): error C2065: 'result' : undeclared identifier
    1>c:\users\marcus\documents\ipx\zentraldockma\client\client\Main.h(36): error C2039: 'OK' : is not a member of 'System::Enum'
    1>c:\users\marcus\documents\ipx\zentraldockma\client\client\Main.h(37): error C2228: left of '.Visible' must have class/struct/union
    1> Generating Code...
    1>
    1>Build FAILED.

    Wo muss ich denn overwrite void OnShown() initialisieren( dies ist die erwähnte zeile)? Sorry, bin noch nicht solange an OOP dran bzw allgemein C++.

    Danke für eure Hilfe !



  • Der gezeigte Code kommt nicht ins Main, sondern in die Form!
    Zweitens ist der geziegte Code C# und muss noch nach C++/CLI portiert werden, was aber kein Kopfzerbrechen verursachen sollte.



  • Daher auch mein Vorschlag mit dem sparaten Aufruf der Login-Form vor der MainView (so daß du mittels einer if-Anweisung den Aufruf steuern kannst).

    Und inflames2k hat C#-Code gepostet, daher unter C++/CLI einfach Punkt "." durch Pfeil "->" (bzw. "::" bei Namensbereichen und statischen Methoden 😉 ersetzen...
    Und die restlichen Syntaxfehler wirst du wohl alleine lösen können...



  • Sorry, beim Code hatte ich nicht mitgedacht, dass du ja in C++/CLI bist. Sollte jedoch kein Problem darstellen, den Code anzupassen.

    Zu Th69's Vorschlag:
    Geh doch einfach wie folgt vor:
    - Anzeigen des Loginformulars
    -> Zeige an solange keine erfolgreiche Anmeldung erfolgt ist (Ausnahme Abbruch)
    - War der Login erfolgreich?
    -> Schließe Loginformular und öffne Hauptformular
    - Wurde der Login abgebrochen?
    -> Beende Applikation



  • sorry,dass ich mich erst so spät melde. Momentan nur zu viel um die Ohren...

    inflames2k schrieb:

    Sorry, beim Code hatte ich nicht mitgedacht, dass du ja in C++/CLI bist. Sollte jedoch kein Problem darstellen, den Code anzupassen.

    Zu Th69's Vorschlag:
    Geh doch einfach wie folgt vor:
    - Anzeigen des Loginformulars
    -> Zeige an solange keine erfolgreiche Anmeldung erfolgt ist (Ausnahme Abbruch)
    - War der Login erfolgreich?
    -> Schließe Loginformular und öffne Hauptformular
    - Wurde der Login abgebrochen?
    -> Beende Applikation

    Ansich hatte ich es mir ja auch so gedacht. Nur dass Problem ist bei mir nur dass entsprechende schließen der Form wieder...

    theta schrieb:

    Der gezeigte Code kommt nicht ins Main, sondern in die Form!
    Zweitens ist der geziegte Code C# und muss noch nach C++/CLI portiert werden, was aber kein Kopfzerbrechen verursachen sollte.

    Der Code war aus der Header File (Main.h)der Form und nicht der Main Function.

    Den rest des Abends werde ich noch eure Vorschläge versuchen. Vielen Dank!


Anmelden zum Antworten