语言: C ++
开发环境: Microsoft Visual C ++
使用的库: MFC
后台:所以我创建了一个基本上是大型首选项对话框的应用程序,用户可以在其中配置多个页面,每个页面都有一堆不同的设置。用户完成后,他/她有三个保存首选项的选项(如XML):保存当前 [页面],保存这些,全部保存即可。
我正在使用保存这些功能。当用户选择此选项时,会出现一个对话框,其中包含每个页面的复选框,允许他们选择要输出的页面。一旦他们选择了希望保存文件的目录,就会发生魔术并写入XML文件。
问题:我有一个函数( UpdatePageData ),它将检测正在显示的页面,并通过调用 UpdateData 来更新当前页面的数据。我已经设置了一个断点,以确保变量正在填充用户输入的值,并且一切都是花花公子并且正常工作。但是,当程序从复选框对话框(我称之为UpdatePageData)跳转到我正在保存的页面的类时,突然所有的值都是错误的。
下面我提供了一些代码,可以帮助你们了解程序流程。
注意:在SaveThese中,我目前正在努力保存单个页面...我会在找到我遇到的问题后更新所有选定的页面。
位置:主对话
void CSAPrefsDialog::OnSaveThese()
{
int msgboxID = ::MessageBox(
NULL,
(LPCSTR)"Are you sure you want to save?",
(LPCSTR)"Save These",
MB_ICONQUESTION | MB_OKCANCEL
);
switch (msgboxID)
{
case IDCANCEL:
break;
case IDOK:
UpdatePageData();
CSaveThese m_sT;
m_sT.DoModal();
break;
}
}
位置:主对话
void CSAPrefsDialog::UpdatePageData()
{
if ((m_iCurPage >= 0) && (m_iCurPage < m_pages.GetSize()))
{
pageStruct *pPS = (pageStruct *)m_pages.GetAt(m_iCurPage);
if (pPS)
{
ASSERT(pPS->pDlg);
if (pPS->pDlg)
{
if (!pPS->pDlg->UpdateData()) // THIS WORKS. THE DATA IS UPDATED.
{
AfxMessageBox("Did not update data.");
}
}
}
}
}
地点:SaveThese Class
void CSaveThese::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); // figures out which boxes are checked for saving
CDirDialog dir;
CSAPrefsDialog prefsDialog;
if(dir.DoBrowse())
{
prefsDialog.m_strDirectorySavePath = dir.m_strPath;
}
// [ other if-statements like the one below to check the check boxes ]
}
if(m_bST_FS)
{
FSC_Main m_FS;
m_FS.Save(prefsDialog.m_strDirectorySavePath);
}
OnOK();
}
位置:FSC_Main类
void FSC_Main::Save(CString dirPath)
{
if(Validate())
{
dirPath += "\\FS_Config.xml";
FILE *fp = fopen(dirPath, "w+");
WriteXML(fp);
fclose(fp);
}
}
当它到达 WriteXML 时,这些值要么还原为它们的初始化值(空字符串和所有组合框的-1),要么具有奇怪的值(对于字符串为空,并且组合框的大数字。)
我想我只是在错误的地方找到了一些东西。我只是不确定为什么会发生这种情况,这真的是我和真正让这个项目滚动的最大障碍。
答案 0 :(得分:0)
Jon,很难理解你的代码。我所理解的是你在CSAPrefsDialog对话框类中有一个成员变量m_pages,你通过调用UpdateData来更新它。然后你创建一个局部变量CSaveThese m_sT并调用DoModal。你期望CSaveThese类应该保持m_Pages的值吗?