UpdateData работает, тогда данные меняются? - PullRequest
0 голосов
/ 06 июля 2011

Язык: 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 для всех полей со списком), либо имеют странные значения (пустые для строк и большие номера для полей со списком).

Полагаю, у меня просто что-то не в том месте. Я просто не уверен, почему это происходит, и это действительно самое большое препятствие между мной и тем, как этот проект действительно разворачивается.

1 Ответ

0 голосов
/ 08 июля 2011

Джон, Очень сложно понять твой код.Я понял, что у вас есть переменная-член m_pages в классе диалога CSAPrefsDialog, который вы обновляете, вызывая UpdateData.А затем вы создаете локальную переменную CSaveThese m_sT и вызываете DoModal.Ожидаете ли вы, что класс CSaveThese должен содержать значения m_Pages?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...