Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: MFC (Visual C++) ::  DoModal Dialog aus main heraus schließen     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
sati
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.12.2011
Beiträge: 37
Beitrag sati Mitglied 08:56:02 03.02.2017   Titel:   DoModal Dialog aus main heraus schließen            Zitieren

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? :confused:
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 15229
Beitrag Martin Richter Moderator 10:15:44 03.02.2017   Titel:              Zitieren

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

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

_________________
Martin Richter (MVP für C++ von 2000 bis 2015) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
sati
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.12.2011
Beiträge: 37
Beitrag sati Mitglied 11:49:41 03.02.2017   Titel:              Zitieren

wie folgt öffne ich in einer Funktion der main den Dialog:
C++:
1
2
3
4
5
6
7
8
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.
EOP
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.09.2007
Beiträge: 1682
Beitrag EOP Mitglied 18:30:30 03.02.2017   Titel:              Zitieren

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

_________________
The notorious bit shifter.
sati
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.12.2011
Beiträge: 37
Beitrag sati Mitglied 10:53:02 04.02.2017   Titel:              Zitieren

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.
C++:
1
2
3
4
5
6
7
8
9
10
11
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 :eek: (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??? :confused:
EOP
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.09.2007
Beiträge: 1682
Beitrag EOP Mitglied 11:55:27 04.02.2017   Titel:              Zitieren

Zitat:
Avoiding GetDlgItem

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

_________________
The notorious bit shifter.
sati
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.12.2011
Beiträge: 37
Beitrag sati Mitglied 17:52:49 04.02.2017   Titel:              Zitieren

@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.
C++:
1
2
3
4
5
6
7
8
9
10
11
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?? :confused:
Im Prinzip bin ich ja noch immer im aktiven DoModal Dialog und habe diesen auch nie verlassen.
sati
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.12.2011
Beiträge: 37
Beitrag sati Mitglied 18:30:48 04.02.2017   Titel:              Zitieren

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

Benutzerprofil
Anmeldungsdatum: 14.09.2008
Beiträge: 951
Beitrag CTecS Mitglied 23:52:00 06.02.2017   Titel:              Zitieren

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.
EOP
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.09.2007
Beiträge: 1682
Beitrag EOP Mitglied 01:26:06 07.02.2017   Titel:              Zitieren

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
C++:
class CAnyThread : public CWinThread
).
Das mit einem Timer zu lösen ist m.E. Quatsch.

_________________
The notorious bit shifter.
C++ Forum :: MFC (Visual C++) ::  DoModal Dialog aus main heraus schließen   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.