Реферат: Моделирование структуры книги
WORD Counter;
for(Counter=0;Counter<GetSize(); Counter++)
{
CRazdel* Razdel=(CRazdel*)GetAt(Counter);
Razdel->GetGlavas()->DeleteGlavas();
delete Razdel;
}
RemoveAll();
}
Использование наследования
Согласно концепции объектно-ориентированного программирования функция загрузки файла книги с диска должна быть инкапсулирована в самом классе CBookClass. Основные этапы создания класса, который может самостоятельно организовать сохранение-восстановление (в документации на MFC применяется термин serialize -сериализация ) собственных членов-переменных перечислены ниже:
1.Объявить класс как производный от CObject.
2.В объявление класса включить макрос DECLARE_SERIAL.
3.В реализацию класса включить макрос IMPLEMENT_SERIAL.
4.Перегрузить метод Serialize(), унаследованный от базового класса.
5.Перегрузить для нового класса среди прочих конструктор по умолчанию.
Т.о. в нашем случае неизбежно приходится применять механизм наследования классов. Как только мы объявили класс книги производным от CObject, нам разрешается использовать сериализацию данных.
Кроме выполнения вышеуказанных пяти пунктов необходимо также перегрузить метод Serialize() и для класса документа:
void CBookDoc::Serialize(CArchive& ar)
{
m_Book.Serialize(ar);
}
Также как и метод Serialize() класса документа перегруженный метод Serialize() класса книги не выполняет непосредственное чтение текста книги из файла. Этот метод извлекает из файла только лишь служебную информацию, определяя название книги и количество ее разделов. Далее в цикле создаются объекты класса раздела, им делегируется загрузка из файла разделов, затем происходит добавление разделов в коллекцию разделов книги. Аналогично раздел, загрузив служебную информацию раздела, делегирует загрузку глав классу главы; глава, в свою очередь, делегирует загрузку страниц классу страницы; а уже страница вызывает оператор загрузки из архива, определенный в MFC-классе CString.
Реализация зависимостей
Здесь подробно остановимся на механизме «перелистывания» страниц, т.е. на переходе к предыдущей и последующей страницам. При работе с определенными элементами меню, кнопками панели инструментов или при нажатии специальных виртуальных клавиш в программе осуществляется «перелистывание» одной страницы вперед или назад. При этом управление передается членам-функциям класса документа OnPagedown() и OnPageup(). Эти функции вызывают члены-функции класса книги SetNextActivePage() и SetPreviousActivePage(), которые после обновления номера активной страницы вызывают закрытую член-функцию класса книги RenewCtrls(). Эта функция вызывает глобальные функции RenewTree() и RenewList(), передавая им в качестве аргументов указатели на элементы управления, отвечающие за отображение книги на экране, и указатель на объект книги. Данные глобальные функции, получив доступ к активной странице через указатель на объект книги, обновляют отображения оглавления и страницы в соответствии с номером активной страницы.
Для реализации зависимости между элементом просмотрового окна дерева оглавления и класса книги в классе страницы определен атрибут – указатель на элемент дерева:
class CPage : public CObject
{
private: