Vom Dialogfenster ein Ereignis im ParentElement auslösen



  • Hallo,
    Mein Projekt ist Dialogfeldbasiert,ich wollte gerne von einem Dialogfenster ein Button_Klick Ereignis im Übergeordente Fenster auslösen. (als ob man im Parent-Fenster das Button klicken würde). Das Problem ist, dass im übergeordnete Fenster viele Elemente über GetDlgItem gesetzt werden und genau an diese Stellen stürzt mein Programm ab, wenn ich über ein Zeiger auf das Parentclass die entsprechende Methode aufrufe.
    Vielen DAnk im voraus



  • Vielleicht sollte ich mal bisschen "coden", um die Problematik besser zu schildern:
    Ich habe in meinem Projekt zwei Dialogfenster(DLG1 und DLG2).
    DLG1 verfügt über zwei Buttons (Ok, andere_Dlg ) und ein EditBox (IDC_EDIT1)
    DLG2 hat nur einen Button(Fire);

    CDLG1:: Ok()
    {
       SetDlgItemText(IDC_EDIT1,"Test geglückt");
    }
    CDLG1::andere_Dlg()
    {
    
      CDLG2 dlg2;
      dlg2.DoModal();
    
    }
    CDLG2::Fire()
    {
    
      CDLG1 *dlg1;
      dlg1->Ok();
      this->EndDialog();
    }
    

    Natürlich habe ich nicht vergessen die Klassen zu inkludieren. Beim debuggen sieht man, dass der Kompiler zwar richtig in der Klasse DLG1 springt, aber bei ausführen von SetDlgItemText stürzt das Programm ab. Und zwar an folgender Stelle :
    winocc.cpp

    void CWnd::SetDlgItemText(int nID, LPCTSTR lpszString)
    {
    ->>> ASSERT(::IsWindow(m_hWnd));
    ....
    }



  • asd671 schrieb:

    CDLG2::Fire()
    {
    
      CDLG1 *dlg1;
      dlg1->Ok();
      this->EndDialog();
    }
    

    Du hast da einen nicht initialisierten Zeiger - der hat zwar den richtigen Typ, verweist aber irgendwo in den Speicher (und mit ziemlicher Sicherheit nicht auf deinen DLG1). Die Adresse des Hauptdialogs mußt du schon selber herausfinden, um dessen Methode aufrufen zu können (oder vor dem DoModal()-Aufruf übergeben:

    CDLG1::andere_Dlg()
    {
    
      CDLG2 dlg2;
      dlg2.SetDlg1(this);
      dlg2.DoModal();
    
    }
    
    class CDLG2 : public CDialog
    {
    ...
      void SetDlg1(CDLG1* pDlg) { m_dlg1 = pDlg; }
    private:
      CDLG1* m_dlg1;
    ...
    }
    
    CDLG2::Fire()
    {
      m_dlg1->Ok();
      this->EndDialog();
    }
    


  • Hallo CStoll,
    Erst einmal vielen Dank für deine Mühe.
    Dein Lösungsvorschlag würde bei zwei Klassen (mit zwei Headerdateien) funktionieren. Dummerweise ist einer der Klassen ( wie OnAbout() ) im Implementationsdatei des anderen draufgepappt. D.h. dieser besitzt kein Headerdatei und daher kann SetDlg1(CDLG1* pDlg) nicht in der Headerdatei der CDLG2 deklariert werden (Ein DLG1.h existiert ja nicht). Ich versuche mal mit Templates das zu bewältigen.



  • Welche Klasse ist denn in der Quelldatei versteckt? Wenn Dialog1 (der Aufrufer) - wie schaffst du es dann, diesen Dialog zu öffnen?

    (ansonsten - im Notfall reicht eine Forward-Deklaration "class CDLG1;" aus ;))



  • Huiiii, supiii vielen Dank 👍


Anmelden zum Antworten