DoModal Dialog aus main heraus schließen



  • wie kann man aus der main hieraus einen zuvor mit DoModal geöffneten Dialog schließen?
    Normalerweise wird dieser DoModal Dialog mit ONOK(), OnCancel(), OnDestroy() usw. aus diesem heraus geschlossen.
    Jetzt muss ich aber aus der main heraus diesen "vorzeitig" schließen - aber wie? 😕


  • Mod

    Vorzeitig? Was heißt das?
    Die MessageLoop läuft ja.

    Letzten Endes ist es eigentlich immer EndDialog, das einen modalen Dialog beendet.



  • wie folgt öffne ich in einer Funktion der main den Dialog:

    void CMainDlg::OnClickedButtonNeu()
    {
       CInputDlg dlgInput;
       if (IDOK == dlgInput.DoModal()) { 
       ...
       ...
       }
    }
    

    Im Hintergrund läuft in der main eine Kommunikation mit anderen Programmen weiter.
    Kommt von einem dieser Programme eine bestimmte Zustandsmeldung, soll die hier DoModal geöffnete "dlgInput" geschossen werden.



  • Ich würde einen eigenen thread für den Dialog machen und dem dann mittels PostThreadMessage + PostQuitMessage sagen, daß er sich bitte verabschieden soll.



  • Dies mit dem eigenen thread werde ich versuchen.
    Trotzdem habe ich die Frage, warum mein versuchter "workaround" nicht funktioniert:

    1. Im parent (main) wird mit einem timer (clock) zyklisch der Zustand diverser Programme abgefragt. Wenn jetzt eines der Programme eine Aktion erfordert wird jetzt zusätzlich im timer für diesen workaround eine static oder globale Variable A17_Close gesetzt.
    2. Ist in diesem Moment der mit DoModal geöffneter Dialog CA17Dlg geöffnet, soll dieser unmittelbar geschlossen werden. Hierzu habe ich in diesem Dialog ebenso einen timer (clock) aktiviert, der wiederum zyklisch auf die "neue" Variable wie folgt regieren sollte.
    void CA17Dlg::TimerHappened(int id)	
    {
    	if (Global::A17_Close) {
    		Global::A17_Close = false;
    
    // Ab hier sind die Probleme
                GetDlgItem(IDC_BUTTON_Start_A17)->EnableWindow(FALSE);
                heat = 12;
                OnClickedButtonExit();
    	}
    }
    

    Die if Abfrage wird richtig verarbeitet, jedoch bricht das Programm danach mit dem Fehler "Ausgelöster Ausnahmefehler: Schreibzugriffsverletzung 'this" war '0xCCCCCCC' " ab.
    Dies sowohl bei "GetDlgItem", "heat = 12" wie auch bei allen nachfolgenden Zeilen 😮 (In diesem Programmschnipsel sind nicht alle aufgelistet).
    Lösche ich in der IF Schleife alle Zeilen und mache per Hand den click auf den Button für OnClickedButtonExit() funktioniert es ohne Fehlermeldung.
    Wo liegt hier das Problem??? 😕



  • Avoiding GetDlgItem

    http://www.flounder.com/getdlgitem.htm
    Martin Richter kennt ihn sogar persönlich, den MFC-Guru.



  • @EOP
    mit dem GetDlgItem hattest du sicher recht - habe dies wie folgt geändert - jedoch die Fehlermeldung "Ausgelöster Ausnahmefehler: Schreibzugriffsverletzung 'this" war '0xCCCCCCC' " bleibt exakt so bestehen.

    void CA17Dlg::TimerHappened(int id) 
    {
        if (Global::A17_Close) {
            Global::A17_Close = false;
    
    // Ab hier sind die Probleme
                m_BUTTON_Start_A17.EnableWindow(FALSE);
                heat = 12;
                OnClickedButtonExit();
        }
    }
    

    Wenn ich die "m_BUTTON_Start_A17.EnableWindow(FALSE);" auf // setze folgt diese Fehlermeldung in der nächsten Zeile.
    Ich habe die Vermutung das der handle des Dialogs verlorengegangen ist - aber warum sollte dies so sein?? 😕
    Im Prinzip bin ich ja noch immer im aktiven DoModal Dialog und habe diesen auch nie verlassen.



  • Gelöst!
    der Fehler lag in der Konfig der Clock! 🙄
    Danke für die Unterstützung - auf alle Fälle lässt sich so ein DoModal Dialog von der main (parent) aus schließen.



  • Und warum Definierst du dir keine User_Message und sendest diese per PostMessage an deinen Dialog und lässt im Handler der Message den Dialog schließen?

    Aber na ja man kann es auch sehr umständlich über Timer umd Variablen machen geb ich zu, aberr aufpassen das dir dein Workaround net früher oder später auf die Füsse fällt und dann unbeabsichtigte Effekte entstehen.



  • CTecS schrieb:

    Und warum Definierst du dir keine User_Message und sendest diese per PostMessage an deinen Dialog und lässt im Handler der Message den Dialog schließen?

    Sagte ich ja auch so in Etwa, daß das meine bevorzugte Methode wäre. Nur, daß ein eigener thread den Rest nicht blockiert (kein working thread sondern

    class CAnyThread : public CWinThread
    

    ).
    Das mit einem Timer zu lösen ist m.E. Quatsch.


Log in to reply