Modalen Dialog auf dem Heap erzeugen??



  • Hallo,

    ich möchte/muss meinen modalen Dialog mit new erzeugen, weil ich den Pointer brauche:

    void showMyDialogModal(CMyDialog* pdlg)
    {
        CMyDialog* pnewDialog;
        if(pglg == NULL)
           pnewDialog = new CMyDialog; //Mach nen Neuen, falls keiner da
        else
           pnewDialog = pdlg; //ansonsten nimm den alten
    
        pnewDialog->DoModal();
    }
    

    Irgendwo hab ich gehört, dass es eine Microsoft Richtlinie gibt, einen (modalen) Dialog immer auf dem Stack zu erzeugen.
    Kann das einer von euch bestätigen??

    Oder habt ihr eine Idee, wie man obigen Code so umschreibt, dass beide Dialoge, pdlg und pnewDialog auf dem Stack erzeugt werden??



  • Warum sollte man ihn immer auf dem Stack erzeugen? Es ist halt wesentlich einfacher und Du brauchst Dich um Dinge wie Expections und Destruktoren nicht zu kümmern... Einen Vorschlag dazu mag es schon geben (wobei ich den noch nicht gesehen habe); aber man kann es natürlich auch anders machen.

    ==> Martin !?


  • Mod

    Es gibt solch eine Richtlinie nicht. Man muss sich nur klar sein, dass beim Zerstören des Fensters eben nicht eben auch ein delete this ausgeführt wird im PostNcDestroy wie bei View's und den Frame Klassen. D.h. Dialoge gehören zu den Klassen, die man selbst entsorgen muss, d.h. es ist nicht schlecht, sie auf dem Stack/global/static zu platzieren. Aber das ist eben auch die einzige Einschränkung.

    Ich nutze Dialoge gerne auf dem Heap, besonders wenn er Einstellungen beherbergt, die ich beim nächsten Aufruf wieder benötige...
    Man kann theoretisch sogar nicht modale Dialoge bauen, die sich selbst entsorgen, indem man PostNcDestroy überschreibt und Ihnen dadurch beibringt beim zerstören des Fensters auch die MFC Hülle zu entsorgen.

    HTH



  • Wie zerstört man dann korrekt einen Dialog??

    CMyDialog* pdlg = new CMyDialog;
    pdlg->DoModal();
    ...??
    delete(pdlg);
    

  • Mod

    Jo. Schon richtig. Nach DoModal einfach delete.
    Ist der Dialog nicht Modal dann zuerst DestroyWindow und dann delete!



  • @Martin

    Nur nochmal um unser Missverständnis komplett auszuräumen.
    Du schreibst oben:

    Martin Richter schrieb:

    ... D.h. Dialoge gehören zu den Klassen, die man selbst entsorgen muss, d.h. es ist nicht schlecht, sie auf dem Stack/global/static zu platzieren. Aber das ist eben auch die einzige Einschränkung.
    ...

    und unten:

    Martin Richter schrieb:

    Jo. Schon richtig. Nach DoModal einfach delete.
    Ist der Dialog nicht Modal dann zuerst DestroyWindow und dann delete!

    Ich erzeuge einen MODALEN Dialog mit new auf dem Heap. Ich mache kein Create. Reicht da nun ein delete(pdlg)??
    Muss ich bei einem modalen Dialog auf dem Heap DestroyWindow aufrufen?

    Danke


  • Mod

    Noch mal:
    Nur bei nicht modalen Dialogen ist DestroyWindow nötig, weil bei modalen Dialogen nach der Rückkehr aus DoModal das Diaog Fenster automatisch zerstört wird.

    Liegt der Dialog auf dem Heap ist in beiden Fällen delete nötig.

    Wo habe ich mich unklar ausgedrückt?


Anmelden zum Antworten