Modaler Dialog stürzt ab bei DoModal()
-
Folgende Situation:
Ich arbeite eine Datenmenge ab und wenn ein Fehler auftritt, muss ich entsprechend reagieren und möchte dem Anwender die Möglichkeit geben, dise Fehler in einem Dialog zu korrigieren.
Die Datenverarbeitung läuft in einer separaten Klasse ab, diese wurde von keiner MFC Klasse abgeleitet. Nun schlägt der Befehl des Nachbearbeitungsdialoges fehl.
fault_dlg.fault_code = fehler; fault_dlg.set_data = &data[i]; // Daten, die korrigiert werden sollen fault_dlg.SetParent((CWnd *)this->p_PDialog); // p_PDialog = Pointer zum Hauptdialog fault_dlg.DoModal();Warum klappt das nicht, er läasst mich den Pointer nicht setzten. LAsse ich diese Zeile weg, dann schlägt Do Modal fehl, weil kein Parent Dialog eingetragen ist.
Habe ich was übersehen, oder geht das so gar nicht??
Ranger
-
Ich habe ein ähnliches Problem.
Wenn man ein Fenster öffnet das Daten anzeigt die vorher eingegeben worden sind, dann klappt es nur wenn man z.B. einen RadioButton 'int'-Werte zu weist. Nun möchte ich aber elemente je nachdem ob sie bereits gesetzt worden sind oder nicht, sichtbar oder unsichtbar machen beim aufruf. Daher habe ich diese Elemente nicht auf Wert gesetzt. Wenn man nun das Fenster aufruft schlägt es fehl. Warum weiß ich auch nicht. Klingt aber nach dem gleichen Problem wie bei Glasgow_Ranger.
Ich benutzt MS Visual 6.0 und den ZusammklickWizard (ich nenn das jetzt mal einfach so!).
-
@von: Control-Elemente sind nur gültig, während der Dialog aktiv ist - d.h. du kannst sie nur im laufenden Betrieb verwenden. Aber du kannst auch mehrere Member mit dem selben Element verknüpfen (eine int, die du vor dem Aufruf belegst, UND ein CEdit (oder ähnliches), das während der Arbeit das Erscheinungsbild anpasst - afaik kümmert sich UpdateDate() auch darum, daß beide Elemente synchron miteinander sind).
@Ranger: Wie genau lautet denn der Fehler? und welchen Typ hat p_PDialog?
-
Also p_PDialog ist eigentlich vom Typ CMainDlg (eine Ableitung von CDialog). Ich habe mir inzwischen überlegt, folgendes zu schreiben:
fault_dlg.fault_code = fehler; fault_dlg.set_data = &data[i]; // Daten, die korrigiert werden sollen fault_dlg.SetParent(AfxGetMainWnd()); // An Hauptfenster koppeln fault_dlg.DoModal();Ich kam aber noch nicht dazu das zu testen. Melde mich, wenn es so funktioniert.
Danke, Ranger
-
Das war der Versuch, den ich meinte. Die Debug Assertions entstehen dann in den jeweiligen MFC Dateien, also dlgcore.cpp oder so. Also kann ich damit nix anfangen.
if(fehler != 0) { fault_dlg.fault_code = fehler; fault_dlg.set_data = &data[i]; fault_dlg.SetParent(AfxGetMainWnd()); // Debug Assertion Nr. 1 fault_dlg.DoModal(); // Debug Assertion 2, wenn Zeile Vorher weggelassen wird }Wäre schön, wenn jemand ne lösung hätte, ich möchte an der Stelle einen Modalen Dialog haben, damit der Rest ausgeblendet (inaktiv) ist. Hat noch jemand eine Idee?
Was vielleicht noch interessant ist, dass an den Hauptdialog schon ein Nichtmodaler Dialog gekoppelt ist. Geht es überhaup, dass zwei Dialoge an den Hauptdialog gekoppelt werden?Danke, Ranger