Лабораторная работа №14. MDI - приложение. Работа с данными в архитектуре "Документ/представление" ("Document/view") - Технология разработки программного обеспечения систем управления

Цель Работы - использовать принципы архитектуры "Документ-Представление" для выборки и сохранения данных в файлах, а также взаимодействия элементов меню, панели инструментов и строки состояния в приложении.

- Теоретические сведения

Архитектура "Документ-Представление"

В основе этой архитектуры лежат три глобальных понятия - фрейм, документ и представление. Под документом понимается те данные, с которыми работает приложение. Это может быть все, что угодно, - "простой текст", картинка и т. п. Отображение этих данных на экране осуществляется во фрейме документа. Фрейм содержит специальные окна - представления (Views), в которых отображают данные документа, и осуществляет координацию между документом и различными типами их представления, направляя им команды и получая от них извещения. Представлений документа в приложении может быть несколько. Пользователь взаимодействует с документом посредством его представления.

Фрейм и представление реализованы в виде двух различных оконных классов - класса фрейма и класса представления, при этом окно представления является дочерним по отношению к фрейму, т. е. размещается в его рабочей области. Сам фрейм может быть окном SDI - приложения или дочерним окном MDI-приложения. За взаимодействие пользователя непосредственно с фреймом (изменение размеров, перемещение и т. п.) полностью отвечает сама система Windows. Управление же представлениями ложится на программиста.

Документ представлен в виде объекта, который обеспечивает пространство для хранения данных в памяти и отвечает за такие операции, как запись и чтение документа с файла. Большая часть операций с данными выполняется самим приложением, а не классами библиотеки MFC.

Таким образом, архитектура "документ/представление" охватывает следующие основные классы:

CWinApp - класс для создания единственного объекта - приложения;

CFrameWnd - класс для создания главного окна однодокументного приложения и базовый для классов CMDIFrameWnd и CMDIChildWnd, которые отвечают за работу многодокументного приложения;

СDocTemplate - базовый абстрактный класс для создания шаблонов документов;

CDocument - класс для создания собственно документа;

СView - базовый класс, который совместно со своими производными классами - CCtrlView, CEditView, CListView, CTreeView, CScrollView - отвечает за отображение данных документа и за взаимодействие с пользователем.

При создании MFC AppWizard каркаса приложения архитектуры "Документ/представление" создастся типовой набор классов, производных от вышеназванных классов (если на шаге 1 установить флажок использования архитектуры "Document/View") (рисунок 1)

классы каркаса приложения архитектуры

Рисунок 1. Классы каркаса приложения архитектуры "Документ/представление"

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

Рассмотрим принципы реализации данных в классе документа. Для реализации документа в типичном приложении необходимо проделать следующие действия.

    - Для каждого документа образовать класс на базе CDocument. - Добавить в него переменные для хранения всех данных документа. - Реализовать функции для чтения и модификации этих данных. - Переопределить функцию Cobject::Serialize() в новом классе документа для организации чтения/записи данных документа с диска.

Если используется один класс документа, то он уже создан MFC AppWizard (рисунок 1). Добавление переменных для хранения данных документа рассмотрим для следующего примера. Данными, с которыми работает приложение, будут фамилия, имя, отчество абитуриента и оценки по 3-м дисциплинам - математике, физике и русскому языку. Описать эти данные можно следующей структурой:

Typedef struct

{

CString name1;

CString name2;

CString name3;

Int mark1;

Int mark2;

Int mark3;

}

SRTUCTRECORD;

В классе документа эти данные опишем в виде массива, используя шаблон для класса CArray:

Class CLb7Doc : public CDocument

{

Protected: // create from serialization only

CLb7Doc();

DECLARE_DYNCREATE(CLb7Doc)

// Attributes

Public:

CArray <SRTUCTRECORD, SRTUCTRECORD> m_data;

Для занесения и извлечения данных из массива используются методы класса CArray, поэтому здесь не будем использовать собственные методы, тем более, что член класса m_data является открытым.

Для сохранения и чтения из файла данных в документ, а также для создания документа MFC AppWizard реализованы команды ID_FILE_OPEN и ID_FILE_SAVE, ID_FILE_SAVE_AS и ID_FILE_NEW (рисунок 2).

команды для работы с документом, созданные mfc appwizard для каркаса приложения архитектуры

Рисунок 2.- Команды для работы с документом, созданные MFC AppWizard для каркаса приложения архитектуры "Документ/представление"

Для выполнения этих команд библиотекой MFC вызываются соответствующие методы, реализация которых скрыта от программиста. Только два метода могут быть изменены:

- OnNewDocument() - здесь можно произвести инициализацию данных документа для MDI - приложения или очистку данных для SDI-приложения, т. е. уничтожение старых данных. Например, для нашего случая это может быть следующий код

BOOL CLab7Doc::OnNewDocument()

{

// Всю стандартную обработку по созданию документа возлагаем

// на библиотеку MFC

If (!CDocument::OnNewDocument())

Return FALSE;

//После успешного создания проводим очистку массива сданными

M_data. RemoveAll();

Return TRUE;

}

Метод Serialize() - здесь выполняется, собственно, сохранение данных в файл или чтение из файла данных в структуры документа. Этот метод вызывается при выполнении команд Open, Save или Save As после выбора блоком диалога имени файла.

Метод Serialize называется сериализацией - преобразование в последовательную форму и наоборот, позволяет сохранять и восстанавливать объекты классов, созданных на базе класса CObject. В нашем случае, нужно дополнить этот метод кодом по сохранению и восстановлению данных из файлового бинарного потока (данные записываются в файл без преобразования), который называют архивом. В качестве параметра в этот метод передается указатель на созданный экземпляр класса CArchiv, с которым ассоциирован объект класса CFile. Имя файла подставляется после выполнения кода диалогового окна по выбору имени файла. В классе CArchiv реализованы несколько вариантов перегружаемых операторов >> и << , которые, собственно, загружают объекты (или простые типы) из архива или сохраняют их в архиве. Они имеют следующие однотипные формы:

Fried CArchive&; operator << (CArchive &;ar, CObject *&;pOb)

Fried CArchive&; operator >> (CArchive &;ar, CObject *&;pOb)

Или для простых типов

Fried CArchive&; operator << (Data_Type&; data)

Fried CArchive&; operator >> (Data_Type&; data),

Где через Data_Type обозначены примитивные типы данных BYTE, WORD, int, DWORD, float double.

Метод CArchive::IsStoring возвращает направление потока

Void CLb7Doc::Serialize(CArchive&; ar)

{

If (ar. IsStoring())

{

// TODO: add storing code here

// Работа с потоком выполняется с простыми типами

Ar << m_data. GetSize();

For (int i=0; i < m_data. GetSize(); i++)

{

Ar << m_data. GetAt(i).name1;

Ar << m_data. GetAt(i).name2;

Ar << m_data. GetAt(i).name3;

Ar << m_data. GetAt(i).mark1;

Ar << m_data. GetAt(i).mark2;

Ar << m_data. GetAt(i).mark3;

}

}

Else

{

// TODO: add loading code here

Int size;

SRTUCTRECORD rec;

Ar >> size;

M_data. SetSize(size, 1);

For (int i=0; i < size; i++)

{

Ar >> rec. name1;

Ar >> rec. name2;

Ar >> rec. name3;

Ar >> rec. mark1;

Ar >> rec. mark2;

Ar >> rec. mark3;

M_data. SetAt(i, rec);

}

}}

- Задание К Лабораторной Работе

Создать SDI-приложение для формирования и просмотра данных из файла в соответствии с индивидуальным заданием.

Требования для создаваемого приложения.

Управление заданием имени файла, его открытием или созданием и т. п. выполняется через команды меню или кнопки панели инструментов.

Просмотр загруженных данных из файла, а также формируемых в приложении, данных выполняется в диалоговом окне с использованием элемента управления Listbox. В этом списке отображается либо все данные, либо данные, формируемые в соответствии с функцией, определенной в индивидуальном задании. Порядок вывода управляется с помощью кнопок. Исходно выводится полный список.

Формирование данных в приложении осуществляется в другом диалоговом окне с использованием элементов управления Combobox и Edit.

До задания имени файла элементы меню и соответствующие кнопки управления открытием и сохранением данных в файл должны быть не доступны.

После задания имени файла все команды работы с файлом должны иметь место только для этого файла.

Имя заданного файла должно отображаться в строке статуса.

Похожие статьи




Лабораторная работа №14. MDI - приложение. Работа с данными в архитектуре "Документ/представление" ("Document/view") - Технология разработки программного обеспечения систем управления

Предыдущая | Следующая