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
