Daten werden beim schließen des Dialoges nicht gespeichert



  • Ich habe einen Dialog CTestDlg, welcher für jedes Element eine Variable hat um
    den Wert zu speichern (hab ich im Ressourceneditor über Membervariable hinzufügen
    hinzugefügt). Wenn ich jedoch nach schließen des Dialoges die Werte in einer
    MessageBox ausgebe sind die Werte alle nicht initialisiert. Nun stellt sich mir
    die Frage woran das liegt, da laut meinem Buch die Funktio DoDataExchange von
    der MFC automatisch beim schließen des Dialoges aufgerufen wird.

    Ich weiß nicht was ihr so an Code braucht, ich gebe euch mal ein paar Auszüge:

    // Die Deklaration von CTestDlg
    #pragma once
    #include "resource.h"
    
    // CTestDlg-Dialogfeld
    
    class CTestDlg : public CDialog
    {
    	DECLARE_DYNAMIC(CTestDlg)
    
    public:
    	CTestDlg(CWnd* pParent = NULL);   // Standardkonstruktor
    	virtual ~CTestDlg();
    
    // Dialogfelddaten
    	enum { IDD = IDD_DIALOG1 };
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    
    	DECLARE_MESSAGE_MAP()
    public:
    	virtual BOOL OnInitDialog();
    	afx_msg void OnEnChangeEdit1();
    	CString m_Edit1;
    	afx_msg void OnBnClickedCheck1();
    	afx_msg void OnBnClickedRadio1();
    	afx_msg void OnBnClickedRadio2();
    	afx_msg void OnBnClickedRadio3();
    	BOOL m_Check1;
    	int m_Radio1;
    	afx_msg void OnLbnSelchangeList1();
    	afx_msg void OnCbnSelchangeCombo1();
    	afx_msg void OnCbnEditchangeCombo1();
    	CString m_Combo1;
    	CString m_List1;
    	afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    	afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    	int m_Scrollbar1;
    	int m_Scrollbar2;
    	afx_msg void OnBnClickedButton1();
    };
    
    // Definition von DoDataExchange
    oid CTestDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Text(pDX, IDC_EDIT1, m_Edit1);
    	DDX_Check(pDX, IDC_CHECK1, m_Check1);
    	DDX_Radio(pDX, IDC_RADIO1, m_Radio1);
    	DDX_CBString(pDX, IDC_COMBO1, m_Combo1);
    	DDX_LBString(pDX, IDC_LIST1, m_List1);
    	DDX_Scroll(pDX, IDC_SCROLLBAR1, m_Scrollbar1);
    	DDX_Scroll(pDX, IDC_SCROLLBAR2, m_Scrollbar2);
    }
    
    // Der Aufrufende Code des Dialoges, aus CChildView
    void CChildView::OnEigeneTestdialoganzeigen()
    {
    	CTestDlg dlg;
    	dlg.DoModal ();
    
    	CString strMsg;
    	strMsg.Format (
    		"Kontrollkästchen: %d\n"
    		"Kombinationsfeld: %s\n"
    		"Listenfeld: %s\n"
    		"Eingabefeld: %s\n"
    		"Optionsgruppe: %d\n"
    		"Horizontale Bildlaufleiste: %d\n"
    		"Vertikale Bildlaufleiste: %d\n",
    		dlg.m_Check1, dlg.m_Combo1, dlg.m_List1,
    		dlg.m_Edit1, dlg.m_Radio1,
    		dlg.m_Scrollbar1, dlg.m_Scrollbar2);
    
    	AfxMessageBox (strMsg);
    }
    

    Hoffe ihr könnt mir helfen 🙂



  • Du kannst in der CTestDlg::OnInitDialog() (oder Konstruktor) einfach die Werte zuweisen (z.B.: m_Combo="bla"; ) und dann UpdateData(FALSE); aufrufen, dann sind sie initialisiert. Alternativ kannst du auch Control-Variabeln verwenden, da hast du sowieso mehr Zugriffsmöglichkeiten.
    Die DoDataExchange() dient nur zum Datenaustausch, kann aber keine Werte initialisieren.



  • (sorry, hab gerade nochmal nachgedacht) Ruf doch einfach beim Schließen ( WM_DESTROY ) die UpdateData(); auf, dann bekommst du auch die Werte



  • Die Werte initialisieren tu ich bereits, ich möchte aber die Werte speichern beim
    schließen des Dialoges und genau das passiert nicht. Ich habe in der zwischenzeit
    mit dem Buch weitergemacht und die Werte initialisiert und beim schließen des
    Dialoges werden die Startwerte angezeigt, folgedessen werden die eingetragenen
    Werte nie gespeichert.
    Wie kann ich die denn nun speichern lassen? Und so wie ich das verstanden habe,
    ist DoDataExchange für den Austausch von Variable->Dialog und Dialog->Variable
    zuständig, also genau das was ich doch möchte.

    Edit:

    Habe meiner Dialogklasse nun ein

    void CTestDlg::OnDestroy()
    {
    	UpdateData (false);
    }
    

    hinzugefügt, aber dies ändert auch nichts. Auch ein UpdateData (false) im Desktruktor
    bringt nichts, außer einer ExcessViolation



  • musst ja auch
    UpdateData(TRUE);
    nehmen, weil das flag angibt, ob die Werte gespeichert werden sollen
    😉



  • Danke jetzt klappts 🙂


Anmelden zum Antworten