Schließen von modalen Dialogfeldern



  • Hallo Leute,

    ich habe ein Programm, in dem mehrere Modale Dialogfelder (Dialogfeldklassen) nacheinander in der jew. nächsten Klasse geöffnet werden:

    Klasse1 -> Klasse2 -> Klasse3 -> Klasse4

    Ist es möglich, von Klasse 4 aus direkt wieder zu Klasse 1 zu wechseln. Mit OnOK() schließt sich ja leider nur das letzte Fenster. Gibt es keine Möglichkeit, die Anderen bei einer Buttonbetätigung automatisch zu veranlassen, sich zu schließen.

    Gruß und Danke,
    Krommi



  • Doch klar.

    z.B. so:

    // In Dlg1
    CDeinDlg2 dlg;
    if (IDOK == dlg.DoModal())
    {
    // Hier nicht, sonst ist der auch zu.
    // CDialog::OnOK();
    }
    
    // In Dlg2
    CDeinDlg3 dlg;
    if (IDOK == dlg.DoModal())
    {
    CDialog::OnOK();
    }
    
    // In Dlg3
    CDeinDlg4 dlg;
    if (IDOK == dlg.DoModal())
    {
    CDialog::OnOK();
    }
    

    Schließt du nun Dlg4 mit OK, gehen alle bis auf den ersten zu.



  • Das sieht an sich schon ganz gut aus...habe es gerade mal ausprobiert.

    Mich stört da allerdings eine Kleinigkeit:
    Der Schließvorgang ist sehr langsam, man sieht also jedes einzelne Fenster, bevor das letzte übrig bleibt. Hmm...wie wäre denn die Möglichkeit, das erste Fenster "nicht modal" zu öffnen und alle Restlichen im Hintergrund zu schließen?

    Hab allerdings keine Ahnung, wie ich ein Fenster "nicht modal" öffne:-)

    Gruß,
    Krommi



  • Warum lässt du die Dialoge überhaupt offen? 😉

    CDeinDlg2 dlg;
    if (IDOK == dlg.DoModal())
    {
        CDialog::OnOK();
        CDeinDlg3 dlg3;
        if (IDOK == dlg3.DoModal())
        {
            // Kannst du dir sicher denken. ;)
        }
    }
    


  • Habe es versucht, aber das funktioniert nicht.

    Ich kann kein Fenster schließen, von dem aus ein modales Fenster geöffnet wurde. Wenn ich z.B. in Dialog2 die Funktion Dialog3.DoModal() aufrufe, kann ich danach nicht den Dialog2 mit OnOK() schließen, weil diese Funktion erst abgearbeitet wird, wenn man aus DoModal() zurückkehrt (also das immer das letzte Fenster schließt).

    Falls ich etwas falsch verstanden habe, korrigiere mich bitte.

    Ansonsten sehe ich als einzige Möglichkeit, das Fenster "nicht modal" zu öffnen und dann die ganzen Modalen zu schließen. Aber wie öffnen ich denn nun ein Fenster "nicht modal" ???

    Gruß



  • Ah, dann müssen wir doch zurück zur ersten Version...

    // In Dlg1
    CDeinDlg2 dlg;
    if (IDOK == dlg.DoModal())
    {
    // Hier nicht, sonst ist der auch zu.
    // CDialog::OnOK();
    }
    
    // In Dlg2
    CDeinDlg3 dlg;
    CDialog::OnOK();
    dlg.DoModal();
    
    // In Dlg3
    CDeinDlg4 dlg;
    CDialog::OnOK();
    dlg.DoModal();
    

    Du musst halt immer erst den aktuellen zumachen, dann erst den neuen auf.

    Dies hier müsste auch gehen:

    // In Dlg1
    CDeinDlg2 dlg;
    dlg.DoModal();
    CDeinDlg3 dlg3;
    dlg3.DoModal();
    CDeinDlg4 dlg4;
    dlg4.DoModal();
    

Log in to reply