На этом шаге мы рассмотрим пример сериализации данных в приложении.
На 52 шаге мы создали в приложении МуАрр две переменные-члена:
CMyAppDoc::m_nLines и CMyAppDoc::m_string. Теперь напишем
дополнительный код, сериализующий их в файл документа.
- Сериализация данных приложения МуАрр.
- Найдите функцию Serialize(), созданную мастером AppWizard для Вашего
класса документа СМуАрр. Ниже приведен пример такого кода.void СМуАрр::Serialize(CArchive& ar) { if (ar. IsStoring()) { // TODO: add storing code here } else { // TODO: add loading code here } }
Рис.1. Код функции Serialize() - Замените строки, закомментированные // TODO, соответствующими фрагментами
кода, которые сохраняют и восстанавливают члены-данные документа. Готовый текст должен выглядеть так:void CMyAppDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { ar << m_nLines; ar << m_string; } else { аr >> m_nLines; аr >> m_string; } }
Рис.2. Код измененной функции Serialize() - Найдите функцию CMyAppDoc::OnDataEdit(). В конце нее, cpaзу после вызова
UpdateAllViews() добавьте такую строку:SetModifiedFlag();
Таким образом, вся функция будет выглядеть так:void CMyAppDoc::OnDataEdit() { CEditDataDialog aDlg; aDlg.m_nLines = m_nLines; aDlg.m_strLineText = m_string; if (aDlg.DoModal()) { m_nLines = aDlg.m_nLines; m_string = aDlg.m_strLineText; UpdateAllViews(NULL); SetModifiedFlag(); } }
Рис.3. Код измененной функции OnDataEdit()
Функция CDocument::SetModifiedFlag() вызывается для уведомления каркаса приложения о том,
что данные приложения были изменены. В дальнейшем перед закрытием документа это заставит каркас
запросить пользователя о сохранении изменений. - Воспользовавшись ClassWizard, перегрузите функцию CDocument::DeleteContents()
класса CMyAppDoc. Замените закомментированные строки в созданном мастером коде таким текстом:m_nLines = 0; m_string = "";
Рис.4. Перегруженная функция CDocument::DeleteContents()
Таким образом, вся функция будет выглядеть так:void CMyAppDoc::DeleteContents() { m_nLines = 0; m_string = ""; CDocument::DeleteContents(); }
В отличие от MDI-приложений, создающих отдельный объект документа для каждого создаваемого документа
или открываемого файла, SDI-приложения формируют только один объект и используют его для таких
операций многократно. Перед повторным применением объекта функция DeleteContents() удаляет из него данные.
Разрабатывая SDI-приложение, Вы обязаны реализовать DeleteContents() - функцию,
обнуляющую (или присваивающую значение NULL) все члены-данные. Иначе в текущем документе Вы
увидите данные, оставшиеся от предыдущих сеансов работы приложения.
- Проверка сериализации в МуАрр.
- Соберите и запустите приложение МуАрр.
- В меню Data выберите пункт Edit, введите строку и задайте,
сколько она будет выводиться. Щелкните ОК, чтобы закрыть диалоговое окно Edit Document Data. - В меню File выберите пункт New. Появится диалоговое окно с вопросом, хотите ли Вы перед
открытием нового документа сохранить изменения, сделанные в текущем (безымянном) документе приложения
МуАрр. Появление этого диалогового окна является результатом вызова функции SetModifiedFlag()
после изменения данных приложения. - Щелкните Yes (Да). Далее, воспользовавшись диалоговым окном Save As (Сохранить как),
сохраните свой документ в текущем каталоге под именем MyFile.mya. - На экране снова появится документ без имени. Функция DeleteContents(), которую Вы реализовали,
очистила данные, оставшиеся после MyFile.mya. - Откройте файл MyFile.mya, выбрав пункт Open из меню File или щелкнув в этом же меню
в списке недавно открываемых файлов MyFile.mya. - Данные Вашего приложения теперь восстановлены и отображены в точно таком виде, как
до записи, - как в окне приложения, так и в элементах управления в диалоговом окне Edit Document Data.
Текст измененного приложения можно взять здесь (144,7 Кб).
На следующем шаге мы рассмотрим поддержку сериализации.