Пример сериализации данных приложения

   
На этом шаге мы рассмотрим пример сериализации данных в приложении.

   
На 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 Кб).

   
На следующем шаге мы рассмотрим поддержку сериализации.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий