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