Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Приложение, которое необходимо разработать в этой третьей части работы, мы будем получать путем доработки приложения из второй части работы, что потребует некоторых ухищрений. В известной степени было бы проще «начать жизнь сначала», но это потребует большего объема работы. Новый вариант приложения будет отличаться от старого тем, что будет содержать сериализацию вместе с функцией обновления командного интерфейса для File Save. Кроме того, мы научим наше приложение автоматически запускаться на выполнение при двойном щелчке ЛКМ по имени файла с тем расширением, которое мы закрепим за нашим приложением. И еще приложение будет открывать файл документа, «перетащенный» в его окно с помощью мыши, т.е. по технологии drag&drop.

Шаг 1. Создание копии проекта.

Для сохранения возможности «отката» я рекомендую создать резервную копию каталога с проектом из предыдущей – второй – части и начать доработку этой копии. Здесь как и прежде предполагается, что проект называется FRM. Папку с файлами проекта можно назвать, например, FRM_3.

Шаг 2. Доработка класса CStudent.

Макрос DECLARE_DYNAMIC(CStudent) в файле Student.h замените макросом DECLARE_SERIAL(CStudent) для поддержки сериализации. Соответственно, в файле Student.cpp замените макрос IMPLEMENT_DYNAMIC(CStudent, CObject) макросом IMPLEMENT_SERIAL(CStudent, CObject, 0).

С помощью мастера добавьте в класс CStudent заготовку перекрытой (override) функции Serialize и наполните ее таким очевидным кодом:

void CStudent::Serialize(CArchive& ar)

{

TRACE("Вступаем в CStudent::Serialize\n");

if (ar.IsStoring())

{

ar << m_strName << m_nGrade;

}

else

{

ar >> m_strName >> m_nGrade;

}

}

 

Обратите внимание: эта функция сохраняет в архиве (или загружает из него) данные только об одном объекте Студент, а не содержимое всего списка. Инициировать обработку всего списка студентов будет функция Serialize объекта «документ», которую мы напишем позже, но еще в этой жизни.

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

Шаг 3. Дрессируем приложение обработке «своих» файлов.

Вы хорошо знаете, что «настоящие» приложения присваивают своим файлам, содержащим данные, вполне определенные расширения, умеют запускаться автоматически при двойном щелчке ЛКМ по файлу с данными и открывают файл, «перетащенный» в окно приложения с помощью мыши. Приложения с поддержкой MFC позволяют это сделать довольно просто. Для этого на этапе генерации каркаса приложения надо перейти на вкладку Document Template Strings (рис. 4) и в поле File extension задать расширение файла (без точки!). Естественно, здесь же Вы можете изменить и другие ресурсные строки приложения, например, задать заголовок главного окна приложения (Main frame caption).

 

Рис. 4. Задание расширения файла документа

 

Итак, если программист указал расширение файла документа, то ИС:

· сгенерирует файл FRM.reg;

· добавит необходимые операторы в функцию CFRMApp::InitInstance().

 

Вот содержимое файла FRM.reg (FRM, как и прежде, это имя проекта):

REGEDIT ; Этот.REG файл может быть использован Вашей SETUP-программой. ; Если SETUP-программа не используется, то указанные ниже ключи реестра ; будут созданы функциями CWinApp::RegisterShellFileTypes и ; COleObjectFactory::UpdateRegistryAll, вызов которых выполняет ; функция InitInstance.   HKEY_CLASSES_ROOT\.frm = FRM.Document HKEY_CLASSES_ROOT\FRM.Document\shell\open\command = FRM.EXE %1 HKEY_CLASSES_ROOT\FRM.Document\shell\open\ddeexec = [open("%1")] HKEY_CLASSES_ROOT\FRM.Document\shell\open\ddeexec\application = FRM HKEY_CLASSES_ROOT\FRM.Document = FRM.Document  

 

 

Естественно, никто не мешает один раз запустить этот файл на выполнение и он осуществит регистрацию программы в реестре Windows (если, конечно, у Вас есть права на внесение изменений в ветвь реестра HKEY_CLASSES_ROOT).

ИС добавит также в функцию InitInstance() операторы, выделенные полужирным шрифтом:

 
 

 

 

Вызов функции m_pMainWnd->DragAcceptFiles(), как Вы догадались, обеспечивает поддержку технологии drag&drop.

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

Во-первых, надо вручную добавить в функцию InitInstance() необходимые операторы.

Во-вторых, надо внести изменения в ресурсную строку IDR_MAINFRAME Вашего приложения. Для этого откройте окно Resource View, и сделайте двойной щелчок по строке String Table в одноименной ветви дерева ресурсов. В открывшемся окне с заголовком FRM.rc (String Table) найдите строку IDR_MAINFRAME и отредактируйте ее так, чтобы она приобрела следующий вид:

FRM\n\nFRM\nFRM Files (*.frm)\n.frm\nFRM.Document\nFRM.Document

 

Назначение отдельных элементов этой строки обсуждалось выше, в методических указаниях. Естественно, если имя Вашего проекта отличается от FRM, то Вам надо это учесть при редактировании строки.

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

Шаг 4. Доработка класса «документ».

В файле реализации класса документа FRMDoc.cpp найдите функцию сериализации и добавьте в нее макрос трассировки и сериализацию списка студентов:

void CFRMDoc::Serialize(CArchive& ar)

{

TRACE("Врываемся в CFRMDoc::Serialize\n");

if (ar.IsStoring())

{

// TODO: add storing code here

}

else

{

// TODO: add loading code here

}

m_studentList.Serialize(ar);

}

 

Убедитесь в том, что функция очистки содержимого списка студентов имеет следующий вид:

void CFRMDoc::DeleteContents()

{

TRACE(“Попали в CFRMDoc::DeleteContents()\n”);

while (m_studentList.GetHeadPosition())

{

delete m_studentList.RemoveHead();

}

}

 

Перекройте виртуальную функцию CFRMDoc::OnOpenDocument и добавьте в нее только макрос TRACE:

BOOL CFRMDoc::OnOpenDocument(LPCTSTR lpszPathName)

{

TRACE("Вляпались в CFRMDoc::OnOpenDocument()\n");

if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE;

return TRUE;

}

 

Сгенерируйте заготовку функции обновления командного интерфейса для кнопки File Save. Эта кнопка должна быть отключена, как и команда FileèSave, если флажок «документ изменен» не установлен:

void CFRMDoc::OnUpdateFileSave(CCmdUI *pCmdUI)

{

// отключить кнопку с изображением дискеты, если файл не изменен

pCmdUI->Enable(IsModified());

}

 

Код класса «вид» остается прежним.

Шаг 5. Тестируйте программу. Удостоверьтесь в том, что:

· введенные Вами данные можно сохранить в файле;

· если Вы изменяете содержимое списка студентов, то становится доступной кнопка File Save и соответствующая команда меню File;

· если Вы изменяете содержимое списка студентов и пытаетесь завершить работу с программой без сохранения данных в файл, то появляется окно с предложением сохранить данные документа в файле;

· если в окно приложения перетащить прежде созданный Вашим приложением файл документа, то этот файл будет автоматически открыт;

· закройте приложение и сделайте двойной щелчок мышью по файлу документа. Приложение должно запуститься на выполнение и открыть «щелкнутый» файл.

 

Попробуйте «затащить» в окно приложения какой-нибудь файл, не содержащий документ, или открыть такой файл с помощью команды меню FileèOpen. Проследите, в какой функции возникает ошибка, и наябедничайте об этом преподавателю.

 

 





Поделиться с друзьями:


Дата добавления: 2014-12-26; Просмотров: 375; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.018 сек.