Nicht-modale KindDialoge
-
Wenn ich ein Button auf dem Hauptfenster drücke, ersheint das KindDialog. Dann schließe ich das KindDialog. Wenn ich dasselbe Button auf dem Hauptfenster nochmal drücke, erscheint das Kinddialog nicht mehr.
-
Da mußt du vermutlich das Schließen des Kind-Dialogs abfangen und den Zeiger wieder auf NULL setzen - das passiert nicht automatisch (sprich: Auch wenn der Dialog nicht mehr existiert, verweist dein m_pKindDialog weiterhin auf den Speicherblock, wo er mal lebte).
-
Ich habe das Bsp. aus dem Buch weggeschmiesen und so gemacht:
void MeineHauptKlasseDlg::OnBnClickedHinzu() { m_pKindDialog=new CKindDialog(this); m_pKindDialog->Create(); }Jetzt kann ich mein Kindfenster mehrmals bekommen, aber auch ein halbes Dutzend Ausgaben jedes Child-Dialogs auf dem Bildschirm verstreut!
Mein KindDialog wird in der Klasse des Hauptfensters erzeugt, beim Drücken des Buttons 'Hinzu'. Im Konstruktor des Hauptfensters wird der KindDialog-Zeiger auf NULL gesetzt. Gelöscht wird das KindDialog in eigener Klasse, mit OnCancel():
void MeinKindDlg:: OnCancel(){ delete MeinKindDlg(); DestroyWindow(); }Ich verstehe es so, dass ich dem Hauptfenster mitteilen soll, dass das Kinddialog geschloßen ist. Wie kann man das machen?
Oder verstehe ich falsch?
-
Ja, diese Funktion sollte dem Hauptfenster mitteilen, daß das Kindfenster gerade im Nirvana verschwindet - und das Hauptfenster kümmert sich dann um den delete-Aufruf (der an dieser Stelle übrigens unsinnig und falsch ist):
void HauptDialog::OnEndKindDlg() { delete m_pKind; m_pKind = NULL;//das hier ist wichtig, damit die Abfrage in deinem original-Code funktioniert } void KindDlg::OnCancel() { DestroyWindow(); m_pHaupt->OnEndKindDlg(); //entweder du trägst beim Anlegen der Dialoge einen Zeiger auf den Haupt-Dialog ein auf den du hier zugreifen kannst //oder du hangelst dich über die Applikation zum Hauptdialog durch }
-
CStoll schrieb:
//oder du hangelst dich über die Applikation zum Hauptdialog durch }Kanns du das bitte erklären?
-
Ich habe einen Zeiger auf meinen KindDialog im Haupt-Dialog. Kann ich auch einen Zeiger auf Haupt-Dialog im KindDialog haben? Dazu muss ich beide in einander includieren...
-
Kannst du - und damit der Compiler das schluckt, gibt es ein nettes Feature namens "Forward Deklaration" (sprich: im Header des Kind-Dialogs brauchst du keinen #include für den Haupt-Dialog, sondern nur ein "class MeineHauptKlasseDlg;").
-
Er will das nicht schlucken.

-
Was will er nicht schlucken? (im CPP des Kind-Dialogs brauchst du natürlich die volle Definition)
//Haupt.h #include "Kind.h" class HauptDlg : public CDialog { pblic: void OnButtonKind(); void InKindEnd(); ... KindDlg* m_pKind; } //Haupt.cpp #include "Haupt.h" void HauptDlg::OnButtonKind() { ... } ... //Kind.h class HauptDlg; class KindDlg : public CDialog { ... HauptDlg* m_pHaupt; }; //Kind.cpp #include "Kind.h" #include "Haupt.h" ...
-
Aha, er schluckt das. Bei der Ausführung, wenn der Button 'schließen' gedrückt wird (d.h. OnKindEnd() aufgerufen wird), bekomme ich eine Fehlermeldung:
Unbehandelte Ausnahme in Anwendung.exe: 0xC000005: Access Violation

-
Ja, wie ich oben schon geschrieben habe, mußt du beim Anlegen des Kind-Dialogs auch den Verweis zurück auf den Hauptdialog setzen.
(zum Weg über die Applikation kann ich leider nicht viel sagen - ich hab' bisher kaum nicht-modale Dialoge verwendet und brauchte da noch keinen Direktzugang zum Hauptfenster)
-
Also bekomme ich nichts gutes. Beim Drücken des Buttons OnButtonKind() kann ich gleichzeitig mehrere KindDialoge auf dem Bildschirm bekommen. Beim Drücken des Buttons ' KindDialog Schließen' bekomme ich eine Fehlermeldung...

-
Mit Verweis meinst du doch einen Zeiger? Das mache ich.