Methode vom Parent dialog aufrufen, aber wie?



  • Randfrage: Ist dir überhaupt klar, wer dein Hauptfenster ist? (das wird normalerweise in der C...App::InitInstance() festgelegt - und der Name "CMyTabCtrl" deutet nicht darauf hin, daß das ein eigenständiges Fenster ist)



  • Nochmal: was steht nach dem cast in pMainDlg? Und gibst Du Deinem Dialog den pParent Pointer auch mit? Wenn Du das nicht tust, dann sind das nämlich Nullpointer.

    siehe MSDN zu CDialog::CDialog:

    CDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );
    CDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL );
    


  • ich weis schon wast du genau meinst aber meine CMyTabCtrl managed die vielen dialoge und es reicht mir schon wenn ich in die klasse CMyTabCtrl zurück greifen kann.
    Muss es unbedingt mein Hauptfenster sein?

    Mein haupt dialog

    class CHauptdialogDlg:public CDialog
    {
        ...
        MyTabCtrl	m_tbCtrl;
    }
    
    BOOL CHauptdialogDlg::OnInitDialog()
    {
        m_tbCtrl.InitDialogs();
        m_tbCtrl.InsertItem(0,"Create");
        m_tbCtrl.ActivateTabDialogs();
    }
    
    void MyTabCtrl::InitDialogs()
    {
    	m_Dialog[0]->Create(m_DialogID[0],this); //hier sage ich dass this mein parent ist
    }
    

    dh. ich kann nicht zurück greien auf die MyTabCtrl.

    nach dem cast steht <MyTabCtrl*>(pParent); siehe mein 4. post in dem thema



  • Direkt nicht, aber indirekt - das Hauptfenster ist dein CHauptDialog, wenn du einen Zeiger darauf hast, kannst du natürlich auch dessen Member verwenden:

    CHauptDialog* pDlg = dynamic_cast<CHauptDialog*>(AfxGetMainWnd());
    MyTabCtrl& main_tab = pDlg->m_tbCtrl;
    main_tab.InitDialogs();
    

    (Anmerkungen: (1) Natürlich müssen die Zugriffsrecht so gesetzt sein, daß du von der aktuellen Stelle auf das Tab zugreifen darfst; (2) Wenn du dich bereits in der CHauptDialog-Klasse befindest, entfällt das Ganze - da kannst du direkt auf m_tbCtrl zugreifen)



  • Verstehe aber nun kann ich so wie du es geschrieben hast auch nicht zugreifen.
    Es stürzt ab sobald ich eine methode aufrufe oder eine public variable zugreifen will.

    main_tab.a=4; //a ist ein int, das ganze schmiert leider ab.

    woran könnte es denn überhaupt liegen dass es immer jedes mal abschmiert?



  • "Schmiert ab" ist eine sehr genaue Fehlerbeschreibung 😃 Zeig doch mal etwas mehr zusammenhängenden Code.

    (und im Zweifelsfall ist es auch hilfreich, den Rückgabewert von dynamic_cast auszuwerten)



  • nunja da ist kein zusammenhängender code

    Hier der genaue code:

    DIALOG2::DIALOG2(CWnd* pParent /*=NULL*/)
    	: CDialog(DIALOG2::IDD, pParent)
    	, m_port()
    	, m_recieveddata(_T(""))
    {
    	CServerDlg* pMainDlg = dynamic_cast<CServerDlg*>(AfxGetMainWnd());
    	//MyTabCtrl& main_tab = pMainDlg->m_tbCtrl;
    	//main_tab.m_nPageCount=0;
    	//{{AFX_DATA_INIT(DIALOG
    


  • Das ist doch mal ein Anfang 🙂

    Von wo aus wird denn dieser DIALOG2 erzeugt? Und welche der Dialog-Klassen stellt das Hauptfenster deiner Anwendung dar?

    (und zur Vollständigkeit: Starte mal den Debugger und schau dir an, was für einen Wert der dynamic_cast<> liefert)



  • Hmm pMainDlg hat vorhinein den Wert 0xcccccccc und nachhinein den Wert 0x0000000
    und meine attribute in pMainDlg haben ein rotes rufzeichen
    (error: expression cannot be evaluated)

    Also stimmt was beim Casten nicht, muss ich den irgend was beim DIALOG2(CWnd* pParent) übergeben?
    weil ich verwende ja nachhinein die fkt. AfxGetMainWnd() und nicht pParent!!



  • Für dynamic_cast muss RTTI eingeschaltet sein. Ist es das?



  • Akca schrieb:

    Hmm pMainDlg hat vorhinein den Wert 0xcccccccc und nachhinein den Wert 0x0000000

    Das sieht ganz danach aus, als ob das Haupt-Fenster nicht definiert worden ist. Was für eine Anwendung (SDI/MDI/Dialog) hast du denn angelegt? Und an welcher Stelle wird dein "Hauptdialog" angelegt?

    Zur Erklärung: AfxGetMainWnd() liefert theApp.m_pMainWnd und normalerweise ist die InitInstance()-Methode der Applikation dafür verantwortlich, dort einen vernünftigen Zeiger einzutragen. Bei einer Dialog-Anwendung sieht das z.B. so aus:

    BOOL CMyApp::InitInstance()
    {
      ...
      CMyDialog dlg;
      m_pMainWnd = &dlg;// <- Hauptfenster definiert
      int nResponse = dlg.DoModal();
      if (nResponse == IDOK)
      {
        // ZU ERLEDIGEN: Fügen Sie hier Code ein, um ein Schließen des
        //  Dialogfelds über OK zu steuern
      }
      else if (nResponse == IDCANCEL)
      {
        // ZU ERLEDIGEN: Fügen Sie hier Code ein, um ein Schließen des
        //  Dialogfelds über "Abbrechen" zu steuern
      }
    
      // Da das Dialogfeld geschlossen wurde, FALSE zurückliefern, so dass wir die
      //  Anwendung verlassen, anstatt das Nachrichtensystem der Anwendung zu starten.
      return FALSE;
    }
    

    (abgesehen von den Klassennamen ist der Code so von meinem Klassenassistenten angelegt worden)

    Aber die elegantere und flexiblere Lösung dürfte es sein, als pParent die Adresse des Hauptfensters zu übergeben und über diese auf deinen Hauptdialog zuzugreifen:

    DIALOG2::DIALOG2(CWnd* pParent /*=NULL*/)
        : CDialog(DIALOG2::IDD, pParent)
        , m_port()
        , m_recieveddata(_T(""))
    {
        CServerDlg* pMainDlg = dynamic_cast<CServerDlg*>(pParent);
        MyTabCtrl& main_tab = pMainDlg->m_tbCtrl;
        main_tab.m_nPageCount=0;
    }
    
    //Aufruf per
    CServerDlg::irgendwas()
    {
      ...
      DIALOG2 dlg(this);
      dlg.DoModal();
      ...
    }
    


  • Hallo!
    Es funktioniert zwar, nehme an dass es immer funktioniert hat, aber nur wenn ich NICHT im konstruktor der Dialog klasse das aufrufe.
    dh. Hab die ganze Zeile in einem Button reingeschrieben und siehe da, ich kann alle Methoden aufrufen und auf alle attribute ganz prima reinschreiben und lesen juhi ich bin so fro, echt


Anmelden zum Antworten