CDialog



  • Hallo!
    Wie kann ich an ein CDialog Parameter übergeben, damit ich nach dem Schließen des Dialogs den gedrückten Button ermitteln kann.
    Normal geht das so:
    CMyDialog dlg;
    dlg.DoModal();

    Ich würde aber gerne eine Instanz der Klasse erstellen und dem Konstruktor Parameter übergeben

    CMyDialog dlg = new CMyDialog(bla, bla);
    if(dlg.DoModal() == IDOK)
    => Das brigng mit leider Speicherzugrifffehler

    Mit Create(...) und Show(...) geht es ohne Probleme, aber ich weiß hier nicht wie ich hier den gedrückten Button ermitteln kann.
    Kann mir jemand helfen?

    Danke im voraus.
    Krys



  • du kannst natürlich z.B 2 bool Klassen-Variablen anlegen die du beim Druck auf den Button auf true setzt (müssen nat. public sein).
    Dann hast du nach Beenden des Dlg noch Gelegenheit da ranzukommen

    dlg.DoModal();

    if (dlg.m_OKButton)
    {
    // mach watt
    }

    Aber eigentlich sollte das mit
    if (dlg.DoModal() == IDOK)
    funktionieren 🙄
    Habe das schon öfters gemacht



  • ... das habe ich mir auch gedacht. Ich übergebe an das Dialog 2 Instanzen und im Dialog greife ich auf die Variablen der übergebenen Instanze zu. Und da kommt es zum Fehler.



  • vielleicht solltest auch den -> Operator anstatt Punktoperator benutzen?

    CMyDialog dlg = new CDialog;
    
    if (dlg->DoModal() == IDOK)
    	//...
    
    delete dlg;
    


  • Diese Möglichkeit habe ich auch schon ausprobiert. In diesem Fall stürzt mein Programm eher ab, und genau an dieser Stelle

    int CDialog::Domodal()
    {
      ASSERT(m_lpszTemplateName != NULL || m_hDialogTemplate != NULL ||
    		m_lpDialogTemplate != NULL);
      ...
    }
    

    ich weiß nicht was ich falsch mache!



  • dann liegt der Fehler igendwo anders



  • Hallo.

    AFAIK hat CDialog ne Methode namens EndDialog(). Mit der kannst du den Dialog beenden und - je nach Button zum Beispiel unterscheidlieche - Codes zrückliefern lassen.

    //Klick auf Button "Abbrechen":
    {
       EndDialog(0);
    }
    //Klick auf "Wasweißich":
    {
       EndDialog(-56);
    }
    //etc...
    

    Hier nochmal der MSDN-Beitrag dazu:

    Call this member function to terminate a modal dialog box. This member function returns nResult as the return value of DoModal. You must use the EndDialog function to complete processing whenever a modal dialog box is created.

    You can call EndDialog at any time, even in OnInitDialog, in which case you should close the dialog box before it is shown or before the input focus is set.

    EndDialog does not close the dialog box immediately. Instead, it sets a flag that directs the dialog box to close as soon as the current message handler returns.

    Codetechnisch könnte das dann so aussehen:

    CMyDlg* dlg = new CMyDlg;
    int nReturn = dlg->DoModal();
    delete dlg;
    
    switch(nReturn)
    {
    case 1:
       //Aha, OK wurde geklickt
    case 2:
       //Aha, XXX wurde geklickt
    case -45:
       //Aha, YYY wunrde gklickt
    //usw...
    }
    

    Wichtig ist nur, dass du den Dialog statt über CDialog::OnOK() bzw. CDialog::OnCancel() nun über CDialog::EndDialog(int) "beendest" (wie man dem Zitat entnehmen kann wird der Dialog ja nicht direkt geschlossen).

    Bye.


Anmelden zum Antworten