Var in mehreren Dialogen nutzen



  • Ich weiß, es ist eine absolute Newbie-Frage, aber ich konnte keine Antwort finden (weder hier mit der Suchfunktion, noch unter Google und der FAQ).

    Ich möchte gerne Arrays, die ich in meinem Hauptdialog angelegt habe in einem anderen Dialogfenster auslesen/bearbeiten können. Ich habe es wie folgt versucht, aber leider ohne Erfolg.

    #include HauptDlg.h
    
    void CZweitDlg::CountKategories(void)
    {
      CHauptDlg HauptDlg;
      int i = HauptDlg.m_StrAr_Kategorien.GetCount(); // HauptDlg.h:  CStringArray m_StrAr_Kategorien;
      Buffer.Format("Anzahl: %i",i);
      MessageBox(Buffer);
    }
    

    Im Hauptdialog habe ich den Array mit 2 Werten gefüllt und erfolgreich ausgelesen. Öffne ich aber den zweiten Dialog erhalte ich immer den Wert 0.

    Danke für Eure Hilfe!

    Viele Grüße,

    Marc



  • Das liegt daran, dass du ja immer ein neues Objekt/neue Instanz deines Hauptdialogs kreirst. Die haben aber nichts mit deinem Hauptdialog zu tun, wodrin du schon die Werte gesetzt hast.
    Gib beim Erstellen der Dialoge einen Zeiger auf deinen Hauptdialog weiter (this-Zeiger), ändere notfalls die Konstruktoren der Dialog ein wenig und du kannst mit Hilfe des Zeigers auf die Members und Methoden deines Hauptdialogs zugreifen. 🙂



  • Du legst ja auch ein neues CHauptDlg-Objekt an und versuchst dessen Daten einzulesen. Stattdessen benötigst du eine Referenz auf den bereits vorhandenen Dialog (und die solltest du am besten direkt beim Erzeugen und Starten des Zweitdialogs übergeben).



  • Bsp.: CHaupt == Hauptdialog, CMyDialog == anderer Dialog:
    auf Knopfdruck CMyDialog öffnen:

    void CHaupt::OnBnClickedButton1()
    {
        m_iWert = 5; // Membervariable von CHaupt
        CMyDialog dlg(this);
        dlg.DoModal();
    }
    
    CMyDialog ::CMyDialog (CWnd* pParent)
            :CDialog(CMyDialog::IDD, pParent)
    {
        m_pParent = static_cast<CHaupt*>(pParent);   // m_pParent ist vom Typ CHaupt*
    }
    
    void CMyDialog::SetParentData(int Zahl)
    {
        m_pParent->m_iWert = Zahl;
    }
    
    //*********** in Headerdatei *************************
    #include "MyDialog.h"  
    // oder extern class CMyDialog;
    //...
    CMyDialog(CWnd* pParent);
    
    void SetParentData(int); // nur als Beispiel
    CHaupt* m_pParent;      // Zeiger auf Hauptdialog
    

    Sollte klappen.



  • Hallo Paul,

    es hat geklappt! Vielen Dank für Deine schnelle Hilfe!

    Viele Grüße,

    Marc



  • Hallo,

    das Auslesen klapp super. Jetzt wollte ich aber über den Zeiger ein Element dem Array hinzufügen. Leider meldet mir dabei der Kompiler eine kryptische Fehlermeldung ("Debug Assertion Failed"), die wohl soviel heißen soll, dass ich keine Element hinzufügen kann.

    Mein Code sieht wie folgt aus:

    void CNewKategoryDlg::OnBnClickedBtnHinzufuegen()
    {
    	UpdateData(TRUE);
    	int i = m_pHauptDlg->m_StrAr_Kategorien.GetCount();
    	m_pHauptDlg->m_StrAr_Kategorien.InsertAt(i,FF_Kategory); // Fehler wird in dieser Zeile verursacht! // CString FF_Kategory
    }
    

    Danke für Eure Hilfe!

    Viele Grüße,

    Marc



  • Die Position i liegt ausserhalb der Liste, dass heisst, das an der Position i nichts eingefügt werden kann! Nimm doch statt InsertAt() lieber Add().



  • Also "Debug Assertion failed" kommt bestimmt nicht vom Compiler, sondern aus dem laufenden Programm heraus 😉 Was steht denn in FF_Kategorie drin?

    (Und wenn der Fehler das nächste Mal kommt, starte mal den Debugger und schau dir an, worüber dein Programm da eigentlich gestolpert ist)



  • CStoll schrieb:

    (Und wenn der Fehler das nächste Mal kommt, starte mal den Debugger und schau dir an, worüber dein Programm da eigentlich gestolpert ist)

    Also "Wiederholen" drücken und bei akuter Ratlosigkeit vielleicht mal da reingucken. 🙂


Anmelden zum Antworten