Aufbau einer Dialogstruktur für zu Laufzeitfehler
-
Hi Zusammen,
ich hab mal wieder ein Problem mit dem Anzeigen einer Reihe von Dialogen.
Ich würde gerne einen Hauptdialog anzeigen, aus welchem der Benutzer entweder
den Log-In-Dialog oder den Optionen Dialog aufrufen kann.
Der Log-In-Dialog soll dann zum eigentlichen Hauptdialog führen und der
Optionen-Dialog soll wieder zurück zum Hauptdialog führen.Mein bisheriger Code (in der CMeinDialog.cpp-Datei):
CMORK_BEWEGUNGDlg dlgSpiel; CMenueDialog dlgMenue; CLoginDialog dlgLogin; COptionenDialog dlgOptionen; m_pMainWnd = &dlgSpiel; int auswahlMenue = 0; int auswahlLogin = 0; int auswahlOptionen = 0; int auswahlSpiel = 0; auswahlMenue = dlgMenue.DoModal(); if (auswahlMenue == 1) // LOGIN { auswahlLogin = dlgLogin.DoModal(); if (auswahlLogin == 1) // WEITER { auswahlSpiel = dlgSpiel.DoModal(); } else if (auswahlLogin == 2) // ABBRECHEN { } } else if (auswahlMenue == 2) // OPTIONEN { auswahlOptionen = dlgOptionen.DoModal(); if (auswahlOptionen == 1) // SPEICHERN { } else if (auswahlOptionen == 2) // ABBRECHEN { } }Schmiert mit dem Laufzeitfehler "Debug Assertion Failed" ab..
Hat jemand eine Idee woran das liegen könnte?
Ich vermute am m_pMainWnd-Zeiger, bin mir aber nicht sicher und wüßte auch
nicht wie ich diees Problem umgehen soll, da ich, wenn ich den Zeiger auf den
Menue-Dialog zeigen lasse, den Dialog noch vor der IF-Schleife terminieren
lasse
Danke im Voraus,
Khadgar
-
Also wenn ich so einen Style hätte wäre ich froh wenn mein Compiler mir nen Elektoschock verpassen könnte
.m_pMainWnd = &dlgSpiel; int auswahlMenue = 0; int auswahlLogin = 0; int auswahlOptionen = 0; int auswahlSpiel = 0; auswahlMenue = dlgMenue.DoModal();Du schreibst keinen uralt C-Code. Man erstellt Objekte etc. erst wenn man sie benötigt. Und das vorinitialisieren mit 0 ist hier Schwachsinn. Warum nicht so?
int auswahlMenue = dlgMenue.DoModal();Oder noch einfacher statt deiner if-else Konstruktionen einfach:
switch(dlgMenue.DoModal()) { case IDOK: //... break; //... }Wenn du nicht zeigst wo du m_pMainWnd verwendest kann ich dir auch nicht helfen.
Mal es dir am besten auf einem Schmierzettel mal auf und überlege eine Sekunde.
-
MaSTaH schrieb:
Also wenn ich so einen Style hätte wäre ich froh wenn mein Compiler mir nen Elektoschock verpassen könnte
.
Du schreibst keinen uralt C-Code. Man erstellt Objekte etc. erst wenn man sie benötigt. Und das vorinitialisieren mit 0 ist hier Schwachsinn. Warum nicht so?Sicher hätte ich das noch ensprechend umformen können, aber der Code, so wie
ich ihn hier präsentiert habe entstand im Rahmen der Fehlersuche (ich habe halt
erstmal alles auseinander genommen und dachte so eher den Fehler zu finden).
Ansonsten hast du natürlich recht
MaSTaH schrieb:
Wenn du nicht zeigst wo du m_pMainWnd verwendest kann ich dir auch nicht helfen.
Der Zeiger 'm_pMainWnd' ist Teil der CWinApp-Basisklasse CWinThread und zeigt
auf das Hauptfenster meine Applikation. Wird diese geschlossen wird die
gesamte Anwendung terminiert (MSDN).
Deswegen habe ich diese Zeiger ja auch nicht auf dlgSpiel sondern auf dlgSpiel
zeigen lassen.[edit] Musste dlgSpiel heissen [/edit]
Trotzdem helfen mir die Angaben aus der MSDN nicht wirklich weiter

Hast du nicht doch 'ne Idee MaSTaH?
Oder hat sonst jemand eine Vermutung weshalb dieses Konstrukt so nicht
lauffähig ist?Danke im Voraus,
Khadgar
-
dlgcore.cpp, Zeile 675
// in case of modeless dialogs, last chance route through main // window's accelerator table if (pMainWnd != NULL) { CWnd* pWnd = CWnd::FromHandle(pMsg->hwnd); if (pWnd->GetTopLevelParent() != pMainWnd) return pMainWnd->PreTranslateMessage(pMsg); }Hier wird überprüft ob pMainWnd != 0 (TopLevelParent kann der Dialog ja nicht sein). Wenn ja dann wird pMainWnd->PreTranslateMessage(pMsg) ausgeführt.
In PreTranslateMessage ist ein ASSERT(m_hWnd != 0) was aber in deinem Fall 0 ist.Also entweder bei jedem Dialog den du erstellst zeigt m_pMainWnd auf ein gültiges Fenster oder lasse m_pMainWnd bei 0.
Für ersteres nimm den ganzen Code aus der InitInstance und packe ihn in deinen HauptDialog. Statt den HauptDialog zu beenden kann man ihn auch verstecken. In der InitInstance musst du natürlich via CDialog::DoModal noch deinen HauptDialog anzeigen.
/E: m_pMainWnd == 0 könnte eventuell unerwünschte Nebeneffekte mit sich bringen.
-
[quote="Nemesyzz"]dlgcore.cpp, Zeile 675
Für ersteres nimm den ganzen Code aus der InitInstance und packe ihn in deinen HauptDialog. Statt den HauptDialog zu beenden kann man ihn auch verstecken. In der InitInstance musst du natürlich via CDialog::DoModal noch deinen HauptDialog anzeigen.
quote]Vielen Dank Nemesyzz!
Ich habs jetzt so wie oben beschrieben gemacht und es läuft endlich
Vielen auch dir MaSTaH!
Ich bastel dann mal weiter

Gruß,
Khadgar