Сериализация стандартных объектов при работе с файлами (Лабораторная работа № 16 по VISUALC++ 2005), страница 2

Объект CArchive конструируется либо для сохранения объектов, либо для их извлечения. Функция IsStoring() возвращает TRUE, если объект  предназначен для записи в файл и FALSE, если для чтения.

 Пример 1    Создадим приложение с именем  serstandart.

1) Create project : serstandart,  MFC, MFC Application.

2) В класс CserstandartDoc  добавим элемент данных  public:  CString  str. Напомним, что для этого нужно выделить класс CserstandartDoc , вызвать контекстное меню, Add/ Add Variable. В появившемся окне ввести элемент данных.

3) Строку символов str нужно вводить с клавиатуры. Для этого необходимо создать обработчик события – ввода символа. Чтобы его создать, следует вызвать вкладку Class View, выделить класс CserstandartView, в контекстном меню выбрать properties и щелкнуть по пиктограмме Messages. В появившемся списке щелкнуть по WM_CHAR. Затем ещё раз щелкнуть по появившейся строке Add OnChar(). В результате мастер создаст обработчик

void CserstandartView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

    // TODO: Add your message handler code here and/or call default

    CView::OnChar(nChar, nRepCnt, nFlags);

}

В нем нужно обеспечить ввод с клавиатуры строки символов str  класса CserstandartDoc.Чтобы это реализовать, как всегда в этом случае, создается указатель pDoc   на класс Cserstandart . Адрес в него заносит функция GetDocument(). Ниже приведен полный текст обработчика.

void CserstandartView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

    CserstandartDoc*pDoc=GetDocument();

    ASSERT_VALID(pDoc);

    pDoc->str+=(char)nChar;//посимвольное заполнение //строки

Invalidate();//Обязательно! Иначе не будет //занесения

pDoc->SetModifiedFlag();

// TODO: Add your message handler code here and/or call default

    CView::OnChar(nChar, nRepCnt, nFlags);

}

Следует ещё раз вспомнить, что функция Invalidate() объявляет существующий вид недействительным(очищает окно вида). Следовательно, его можно обновить, что и происходит.

Чтобы сообщить приложению об изменении данных вызывается метод SetModifiedFlag(). Теперь при выходе  из програмы будет появляться вопрос следует ли сохранять изменения или нет.

4) Далее нужно обеспечить вывод строки символов  str на экран в клиентскую область. Как уже неоднократно сообщалось для этого существует функция OnDraw().Мастер создал следующую её заготовку.

void CserstandartView::OnDraw(CDC* /*pDC*/)

{

    CserstandartDoc* pDoc = GetDocument();

    ASSERT_VALID(pDoc);

    if (!pDoc)

        return;

    // TODO: add draw code for native data here

}

Следует обратить внимание, что здесь уже создан  указатель pDoc. Все, что нужно сделать, это в скобках указать имя указателя на класс CDC и вызвать функцию TextOut() для вывода на экран строки символов str. В результате функция принимает вид:

void CserstandartView::OnDraw(CDC* pDC/*pDC*/)

{

    CserstandartDoc* pDoc = GetDocument();

    ASSERT_VALID(pDoc);

    if (!pDoc)

        return;

    pDC->TextOutA(0,20,pDoc->str);//Вывод строки на //экран

// TODO: add draw code for native data here

}

5) Заполним функцию Serialize(). Для этого выбрать вкладку Class View, выделить класс CserstandartDoc, из методов этого класса выбрать Serialize() и добавить в неё коды вывода на диск и lчтения из него.Текст функции приведен ниже:

void CserstandartDoc::Serialize(CArchive& ar)

{

    if (ar.IsStoring())

    {

        ar<<str;//Вывод strв файл на диск

// TODO: add storing code here

    }

    else

    {

        ar>>str;//чтение str из файла

// TODO: add loading code here

    }

}

6) Следует обеспечить очистку экрана при создании нового документа.  Для этого выделить класс CserstandartDoc  метод OnNewDocument(). В него добавить обнуление строки символов str =””; а также функцию UpdateAllViews(NULL) . Она информирует все виды, связанные с документом, что этот документ был модифицирован и должно быть обновление всех видов программы новыми данными документа.

BOOL CserstandartDoc::OnNewDocument()

{

    if (!CDocument::OnNewDocument())

        return FALSE;

    stroka="";

UpdateAllViews(NULL);

    // TODO: add reinitialization code here

    // (SDI documents will reuse this document)

return TRUE;

}

Программа готовая.

3 Контрольные вопросы

1 Что такое сериализация и зачем она  нужна?

2 Зачем используется пустой конструктор при сериализации?

3 Какие макросы используются при сериализации и в каких файлах они находятся?

4 Что собой являет объект класса CArchive и зачем он нужен?

5 Какие классы могут быть сериализуемыми?

6 Перечислить типы объектов, для которых класс CArchive перегружает операции вставки и извлечения.

7 Какой вид имеет функция Serialize()?

8 Как создать обработчик OnChar()?

9 Что делает метод Invalidate()?

10 Зачем нужен метод SetModifiedFlag()?

11 Что происходит при выполнении функции  UpdateAllViews(NULL)?

Список литературы

1 Айвор Хортон  VISUAL C++ 2005 Базовый курс, «Диалектика», Москва*Санкт-Петербург*Киев , 2007г.

2 Сергеев А.П., Терен А.Н. Программирование в VISUAL C++ 2005 «Диалектика», Москва*Санкт-Петербург*Киев , 2006г.

3 С. Холзнер Visual C++ 6, «ПИТЕР», Санкт-Петербург* Москва*Харьков*Минск, 2001г.