лабки / еще какието лабки разных вариантов / ооп19
.docx
19
СЕРІАЛІЗАЦІЯ СТАНДАРТНИХ ОБ’ЄКТІВ ПІД ЧАС РОБОТИ З
ФАЙЛАМИ
Постановка задачі
Створити однодокументну Windows-програму на C++ ISO|ANSI із
використанням бібліотеки MFC. Передбачити читання рядка символів, запис
його на диск і подальше читання з диска.
// serstandartDoc.cpp: реализация класса CserstandartDoc
//
#include "pch.h"
#include "framework.h"
// SHARED_HANDLERS можно определить в обработчиках фильтров просмотра реализации проекта ATL, эскизов
// и поиска; позволяет совместно использовать код документа в данным проекте.
#ifndef SHARED_HANDLERS
#include "serstandart.h"
#endif
#include "serstandartDoc.h"
#include <propkey.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CserstandartDoc
IMPLEMENT_DYNCREATE(CserstandartDoc, CDocument)
BEGIN_MESSAGE_MAP(CserstandartDoc, CDocument)
END_MESSAGE_MAP()
// Создание или уничтожение CserstandartDoc
CserstandartDoc::CserstandartDoc() noexcept
{
// TODO: добавьте код для одноразового вызова конструктора
}
CserstandartDoc::~CserstandartDoc()
{
}
BOOL CserstandartDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
str = "";
UpdateAllViews(NULL);
// TODO: добавьте код повторной инициализации
// (Документы SDI будут повторно использовать этот документ)
return TRUE;
}
// Сериализация CserstandartDoc
void CserstandartDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << str;
}
else
{
ar >> str;
}
}
#ifdef SHARED_HANDLERS
// Поддержка для эскизов
void CserstandartDoc::OnDrawThumbnail(CDC& dc, LPRECT lprcBounds)
{
// Измените этот код для отображения данных документа
dc.FillSolidRect(lprcBounds, RGB(255, 255, 255));
CString strText = _T("TODO: implement thumbnail drawing here");
LOGFONT lf;
CFont* pDefaultGUIFont = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));
pDefaultGUIFont->GetLogFont(&lf);
lf.lfHeight = 36;
CFont fontDraw;
fontDraw.CreateFontIndirect(&lf);
CFont* pOldFont = dc.SelectObject(&fontDraw);
dc.DrawText(strText, lprcBounds, DT_CENTER | DT_WORDBREAK);
dc.SelectObject(pOldFont);
}
// Поддержка обработчиков поиска
void CserstandartDoc::InitializeSearchContent()
{
CString strSearchContent;
// Задание содержимого поиска из данных документа.
// Части содержимого должны разделяться точкой с запятой ";"
// Например: strSearchContent = _T("точка;прямоугольник;круг;объект ole;");
SetSearchContent(strSearchContent);
}
void CserstandartDoc::SetSearchContent(const CString& value)
{
if (value.IsEmpty())
{
RemoveChunk(PKEY_Search_Contents.fmtid, PKEY_Search_Contents.pid);
}
else
{
CMFCFilterChunkValueImpl *pChunk = nullptr;
ATLTRY(pChunk = new CMFCFilterChunkValueImpl);
if (pChunk != nullptr)
{
pChunk->SetTextValue(PKEY_Search_Contents, value, CHUNK_TEXT);
SetChunkValue(pChunk);
}
}
}
#endif // SHARED_HANDLERS
// Диагностика CserstandartDoc
#ifdef _DEBUG
void CserstandartDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CserstandartDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
// Команды CserstandartDoc
Контрольні питання:
Документ програми на базі бібліотеки MFC – це об’єкт класу, який може
бути досить складним. Як правило, він містить велике різноманіття об’єктів,
кожен з яких містить інші об’єкти. І така структура може поширюватися на
декілька рівнів.
Об'єкти класу містять функції-члени та змінні-члени, кожен з яких має
специфікатори доступу. Щоб зберегти такі об'єкти у зовнішньому файлі,
інформація, що записується в цей файл, повинна містити повні специфікації
усіх структур класів. Процес читання з файла також повинен бути досить
інтелектуальним, щоб повністю синтезувати вихідні об'єкти на основі даних
файла.
Бібліотека MFC підтримує механізм, який називається серіалізацією.
Серіалізація – це процес запису на диск або читання з нього об’єктів класу. У
більшості програм на Visual C++ уся робота з даними відбувається з
документом.
Основна ідея, що лежить в основі серіалізації, полягає в тому, що
будь-який серіалізований клас сам піклується про збереження та відновлення
самого себе. Таким чином, щоб класи додатка стали серіалізованими, вони
повинні записуватися у файл.
Основна можливість серіалізації з самого початку вбудовується Мастером
приложения у програми. Обробники для пунктів меню Файл/Открыть,
Файл/Сохранить, Файл/Сохранить как... передба-чають, що буде серіалізація
документів, і уже містять код, необхідний для її підтримки. Конкретно
використовуються член-функція Serialize(), два макроси і порожній
конструктор для документа.
Якщо елементом даних серіалізованого класу (у нашому випадку класу
CserialstandartDoc) є об'єкт якого-небудь іншого класу, для якого не
перевантажені операції << і >>, то у функції Serialize() елементи даних цього
іншого класу включаються в списки нарівні з елементами даних
серіалізованого об'єкта.
Об'єкт CArchive конструюється або для збереження
об'єктів, або для їх прочитання. Функція IsStoring() повертає TRUE, якщо об'єкт
призначений для запису у файл, і FALSE, якщо для читання.
Необхідно забезпечити очищення екрана при створенні нового
документа. Для цього виділити клас CserstandartDoc, розкрити метод
OnNewDocument().
UpdateAllViews(NULL) - вона інформує всі види,
пов'язані з документом, про те, що цей документ був модифікований і
повинно бути оновлення всіх видів програми новими даними документа.