Сериализация результатов табуляции функции при использовании диалога (Лабораторная работа № 17 по VISUALC++ 2005), страница 2

    if(rezult==IDOK)

    {

        Cser_dia_tabulDoc*pDoc=GetDocument();

        ASSERT_VALID(pDoc);

        if(!pDoc)

             return;

        pDoc->m_stroka=dlg1.str;

        Invalidate();

    }

    // TODO: Add your command handler code here

}

     В нем происходит копирование информации из элемента данных str класса Dlg в элемент данных m_stroka класса Cser_dia_tabul. Как уже было сказано, это нужно для того, чтобы осуществить сериализацию полученных результатов. Метод Serialize() класса Cser_dia_tabul не может непосредственно работать с элементом данных класса Dlg. Копирование происходит при нажатии кнопки Ok. О том, что она нажата, известно по результату работы метода DoModal() диалогового класса. Для работы с ней и с элементом данных str создан локальный объект dlg1 типа Dlg.

     Чтобы вызвать элемент данных m_stroka класса Cser_dia_tabul, создан указатель pDoc.

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

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

{

    Cser_dia_tabulDoc* pDoc = GetDocument();

    ASSERT_VALID(pDoc);

    if (!pDoc)

        return;

    // TODO: add draw code for native data here

}

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

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

{

    Cser_dia_tabulDoc* pDoc = GetDocument();

    ASSERT_VALID(pDoc);

    if (!pDoc)

        return;

    pDC->TextOutA(0,0,pDoc->m_stroka);

    // TODO: add draw code for native data here

}

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

void Cser_dia_tabulDoc::Serialize(CArchive& ar)

{

    if (ar.IsStoring())

    {

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

// TODO: add storing code here

    }

    else

    {

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

// TODO: add loading code here

    }

}

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

BOOL Cser_dia_tabulDoc::OnNewDocument()

{

    if (!CDocument::OnNewDocument())

        return FALSE;

m_stroka="";

UpdateAllViews(NULL);

    // TODO: add reinitialization code here

    // (SDI documents will reuse this document)

    return TRUE;

}

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

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

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

2Как в приложении обеспечить табуляцию функции?

3 Как формируется строка результатов?

4 Как осуществляется сериализация результатов?

5 Как распознается выбор кнопки Ok?

6 Зачем используется локальный объект диалогового типа?

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

8 В каких случаях создается локальный указатель на класс «Документ»?

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

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

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

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

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