Microsoft Visual C++ и MFC. Программирование для Win95 и WinNT

         

Сохранение и восстановление документа на диске


Построенное вами приложение можно использовать для рисования и печати документов, но оно не позволяет сохранять и загружать документ из файла на диске. Вы можете выбрать строку Save As (сохранить под именем) из меню File. На экране появится диалоговая панель Save As. В этой панели вы можете ввести имя файла, в котором надо сохранить документ. Однако несмотря на то, что файл создается, документ в него не записывается - файл остается пустым.

Вы можете попытаться его открыть, выбрав из меню File строку Open. Однако единственным результатом будет изменение заголовка окна. Чтобы приложение обрело возможность сохранения документов в файле и последующего чтения, надо изменить метод Serialize класса документа CSingleDoc.

Метод Serialize вызывается всякий раз когда надо сохранить документ в файле на диске или загрузить его из существующего файла. В частности, метод Serialize вызывается, когда пользователь выбирает из меню File строки Save, Save As и Open. Основные принципы работы метода Serialize были рассмотрены нами в разделе “Запись и восстановление объектов”.

MFC AppWizard подготавливает шаблон метода Serialize для класса CSingleDoc, представляющего документ приложения.

//////////////////////////////////////////////////////////////

// Метод Serialize класса CSingleDoc отвечает за сохранение и

// последующее восстановление документов приложения

void CSingleDoc::Serialize(CArchive& ar)

{

      if (ar.IsStoring())

      {

             // TODO: Здесь выполняется сохранение документа

      }

      else

      {

             // TODO: Здесь выполняется загрузка документа

      }

}

Вы должны определить в методе Serialize, как он должен сохранять и восстанавливать документы приложения. Так как документ, с которым работает наше приложение представлен классом CSingleDoc, то все что должен делать метод Serialize - это сохранять все элементы массива arrayFig.

//////////////////////////////////////////////////////////////

// Метод Serialize класса CSingleDoc


void CSingleDoc::Serialize(CArchive& ar)

{

      int i;            // временная переменная

      int num;      // количество фигур в документе

      // Сохранение документа

      if(ar.IsStoring())

      {    

             // Определяем количество элементов массива arrayFig

            num = arrayFig.GetSize();

             // Записываем полученное число в файл

             ar << num;

             // Записываем в файл координаты и тип фигур

             for(i=0; i<num; i++)

             {

                   // Сохраняем координаты центра фигуры

                   ar << arrayFig[i].xyFigCenter;

                   // Сохраняем тип фигуры

                   ar << arrayFig[i].cType;

             }

      }

     

      // Загрузка документа

      else

      {

             // Считываем количество элементов, составляющих документ

             ar >> num;

             // Восстанавливаем документ

             for(i=0; i<num; i++)

             {

                   CFigure OneFigure; // описание одной фигуры

                  

                   // Считываем координаты центра фигуры

                   ar >> OneFigure.xyFigCenter;

                   // Считываем тип фигуры

                   ar >> OneFigure.cType;

                   // Добавляем описание очередной фигуры в документ

                   arrayFig.Add(OneFigure);

             }

      }

}

Метод Serialize имеет единственный параметр ar, представляющий ссылку на объект класса CArchive. Этот объект, называемый архивом, представляет файл документа, расположенный на диске. Кроме того, архив несет в себе информацию о том, что делать с документом - записать его в файл или загрузить из файла.

После вызова, метод Serialize определяет, какую операцию надо выполнить - сохранить документ в файле или загрузить его из файла. Для этого используется метод IsStoring, определенный в классе CArchive. Если метод IsStoring возвращает ненулевое значение для объекта ar, переданного методу Serialize, значит надо сохранить документ в файле.

Чтобы сохранить все элементы массива, мы определяем количество элементов в нем с помощью метода GetSize. Этот метод определен в шаблоне CArray и возвращает количество элементов массива.

Мы сохраняем количество элементов массива в файле, представленном архивом ar. Это значение поможет нам при восстановлении документа с файла на диске. Затем в цикле в файл записываются все элементы массива arrayFig.

Загрузка документа из файла выполняется в том же порядке. Сначала из файла документа, представленного архивом ar считывается значение, определяющее количество фигур в документе. Потом из файла считываются по очереди все элементы документа. При этом они сразу заносятся в массив arrayFig, представляющий документ. Для этого используется метод Add шаблона CArray.

После того, как вы внесете изменения в метод Serialize, постройте проект. Запустите полученное приложение. Теперь вы сможете записать документ в файл на диске, а затем загрузить его снова.


Содержание раздела