Nicht-modale KindDialoge



  • 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.


Anmelden zum Antworten