Mfc Child-Dialog komplett beenden



  • Hey,

    ich habe das problem, dass ich den child dialog meiner mfc anwendung zwar unsichtbar machen kann (OnCancle();), doch dadurch "entlädt" er sich nicht.

    kurzes beispiel:

    ich habe einen child dialog, mit einem char array.

    1.ich öffne diesen child dialog, und schreibe bei dem OnInit() Event in das char array "Hallo" rein.

    2.nun schliesse ich den child dialog

    3.jetzt öffne ich ihn wieder

    und siehe da, in diesem char array steht nach wie vor "Hallo".

    so komme ich zu der frage -> wie entlade ich diesen dialog den komplett?

    probiert habe ich schon DestroyWindow();, nur antwortet dann mein main dialog nicht mehr.

    wäre für hilfe sehr dankbar.

    lg



  • Wie hast du denn die Klasse deine Child-Dialoges erstellt, als Member in deimen Main Dialog, oder aufn Stack. Etwas Mehr Infos würden sicher weiter helfen



  • CTecS schrieb:

    Wie hast du denn die Klasse deine Child-Dialoges erstellt, als Member in deimen Main Dialog, oder aufn Stack. Etwas Mehr Infos würden sicher weiter helfen

    Die Klasse habe ich wie folgt erstellt:
    -rechtsklick auf den dialog
    -generate class
    -Base class auf "cDialog" gestellt
    -Finish

    und so öffne ich den child-dialog:

    IDD_VOK_Training_C DlgTraining;
    DlgTraining.DoModal();
    


  • na dann erstellst du die klasse doch aufn Stack, und wenn du den Handler Beendet hast, wird auch komplette klasse zerstört, also sollte dein char Array auch weg sein, außer du hast es global irgendwo definiert. wobei ich nicht versteh warum du ein char-Array erstellst, wenn es klassen wie CString dafür gibt. Also müssteste mal schaun wo dein array rumliegt dann haste sicher auch den Fehler



  • hey,

    das mit dem char array war nur ein beispiel. - es bleiben alle werte erhalten.

    ich zitiere aus der msdn:

    When you implement a modeless dialog box, always override the OnCancel member function and call DestroyWindow from within it. Don't call the base class CDialog::OnCancel, because it calls EndDialog, which will make the dialog box invisible but will not destroy it. You should also override PostNcDestroy for modeless dialog boxes in order to delete this, since modeless dialog boxes are usually allocated with new. Modal dialog boxes are usually constructed on the frame and do not need PostNcDestroy cleanup.

    nur habe ich wie gesagt das problem, das nach der empfohlenen "DestroyWindow" funktion der main dialog nicht mehr antwortet.

    lg


  • Mod

    Hast Du nun DoModal aufgerufen? Das darfst Du nicht bei einem nicht modalen Dialog. Du darfst in keinem Fall DoModal verwenden und dann DestroyWindow!



  • Martin Richter schrieb:

    Hast Du nun DoModal aufgerufen? Das darfst Du nicht bei einem nicht modalen Dialog. Du darfst in keinem Fall DoModal verwenden und dann DestroyWindow!

    jo, ich habe den dialog mit DoModal "gestartet".

    welche alternative zu DoModal gäb es denn?

    danke

    lg



  • mit DoModal() wird ein Modaler Dialog erzeugt, also DoModal wird erst beendet wenn der Dialog geschlossen wird.
    mit Create(), kann man dagegen ein modless Dialog erstellen


  • Mod

    Modale Dialoge (mit DoModal gestartet) müssen mit EndDialog, OnOK, OnCancel beendet werden.



  • Martin Richter schrieb:

    Modale Dialoge (mit DoModal gestartet) müssen mit EndDialog, OnOK, OnCancel beendet werden.

    Ok, ich glaube ich sollte noch einmal probieren mein problem zu erklären.

    nehmen wir zum beispiel dieses int:

    int icntFragen = 0;
    

    während der dialog offen ist, änder sich der wert von diesem int zum z.b. 25.
    wenn ich nun den dialog schliesse, und erneut öffne, ist der wert immer noch 25.
    wie kann das sein? - ich möchte das der wert beim erneuten öffnen wieder 0 ist.

    Um es von der praktischen seite zu sehen, habe ich mit camtasia ein kurzes video gemacht. auf dem video sieht man, das die statistik, trotz schliessen des dialoges erhalten bleibt. - was ja eigentlich nicht seien kann, falls der dialog entladen worden wäre.
    http://bobi.d4rc.net/MFCProb/index.html

    Nun starte ich den dialog mit DoModal, beende ihn dafür aber mit OnCancel:

    starten:

    void CVokabelTrainerGUIDlg::OnBnClickedButtonStarttraining()
    {
    	IDD_VOK_Training_C DlgTraining;
    	DlgTraining.DoModal();
    }
    

    beenden:

    void IDD_VOK_Training_C::OnBnClickedCancel()
    {
    	OnCancel();
    }
    

    sorry für die umstände

    lg



  • so lange die klasse nicht zerstört wurde, warum sollen sich die daten ändern, wenn du die Daten deiner klasse "reseten" willst, dann mach das doch in OnInitDialog() und geb jeder Variable einen Initialisierungswert, die klasse hat doch nichts damit zu tun ob der dialog offen oder geschlossen ist, sonnst würden viele sachen schier unmöglich sein. Ich seh da Variablen an einen Dialog uübergeben udn nach beendigung wieder auszulesen


Anmelden zum Antworten