UpdateData工作,然后数据更改

UpdateData works, then data changes?

本文关键字:数据 然后 工作 UpdateData      更新时间:2023-10-16

语言: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.");
              }
          }
      }
  }
}

位置:保存这些类

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(,要么具有奇怪的值(字符串为空,组合框为大数字(。

我想我只是把东西放错地方了。我只是不确定为什么会发生这种情况,这真的是我和真正开始这个项目之间最大的障碍。

Jon,很难理解您的代码。我所理解的是,CSAPrefsDialog对话框类中有一个成员变量m_pages,您正在通过调用UpdateData来更新它。然后创建一个局部变量CSaveThese m_sT并调用DoModal。您希望CSaveThese类应该包含m_Pages的值吗?

相关文章: