Методические наказания к первой части работы
Шаг 1. Создайте приложение SDI по сценарию, изложенному в начале описания этой работы.
Шаг 2. Создайте обработчик команды меню ФайлèОткрыть. Он может выглядеть, например, так:
По аналогии с приведенным кодом добавьте в обработчик запрос имени файла CPPFileName с реализацией класса. Переменные HFileName и CPPFileName в соответствии с архитектурой документ-вид опишите в классе документ как имеющие тип CString по аналогии с тем, как вы это делали в работе «Разработка графического редактора».
Дальнейший план действий может быть, например, таким. Шаг 3. Читаем файлы. Опишем в классе документа два массива строк CString: один для заголовочного файла и второй – для файла реализации методов класса. Можно описать эти массивы как «обычные», с заведомо достаточным числом элементов, например, так: CString HVec[1024], CPPVec[1024];
Этот подход, как и описание указателей на CString, страдает существенными недостатками, в частности, вставка или удаление элементов массива является трудоемкой процедурой и потребует немалых усилий и времени от программиста. Рациональнее использовать для этой цели контейнеры vector или list из библиотеки STL: vector <CString> HVec, CPPVec; list <CString> HVec, CPPVec;
Вектор удобнее тем, что в нем есть перегруженная операция [] и, следовательно, можно обращаться к любому элементу массива по его индексу. Кроме того, в классе vector имеются функции для вставки и удаления элементов вектора. Чтобы их использовать, добавьте в заголовочный файл документа директивы #include <vector> #include <list> using namespace std;
Куда поместить код чтения файлов в массивы HVec и CPPVec? Если в обработчик события OnFileOpen, то это плохая идея: нельзя разрабатывать большие по объему кода функции и помещать в них несвойственный их назначению код. Посему лучше создать еще одну команду меню, например, ФайлèОбработка и создать обработчикэтой команды CGenView::OnProcess(). Далее целесообразно создать в классе вида функции чтения заголовочного файла (ReadHeaderFile()) и файла реализации (ReadCPPFile()) и поместить их вызов в обработчик CGenView::OnProcess(). В этих функциях нужно прочесть содержимое указанных текстовых файлов в массивы.
Когда вы будете передавать вектор или список в качестве параметра функции, не забудьте объявить их ссылками, так как в противном случае функция будет работать с копией такого параметра: bool CGenView::ReadHeaderFile(vector <CString> &HVec, CString HFName)
Для чтения содержимого файлов можно использовать хорошо знакомый вам класс ifstream и функцию этого класса getline(), позволяющую прочесть запись файла целиком. В качестве параметра этой функции надо использовать тип char *, так как параметр типа CString не подходит: char Buf[1024]; do { MyFile.getline(Buf,sizeof(Buf),'\n'); HVec.push_back(CString(Buf)); ... Шаг 4. Сохранение файлов. Прежде чем вы начнете усовершенствовать определение класса, научитесь корректно сохранять результаты. Для этого просто запишите содержимое массивов (или списков, если вы выбрали их) в файлы. Для этого создайте обработчик команды ФайлèСохранить и в нем просто запишите массивы в соответствующие файлы, т.е. в файлы с теми же именами, которые вы открывали. Рекомендую предварительно сделать копии этих файлов (с помощью проводника). В классе CString данные хранятся в кодировке Unicode, а в файле они записаны в кодировке Windows 1251. По этой причине, если вы просто будете записывать данные в файл с помощью оператора вида MyFile<<HVec[i].GetBuffer()<<'\n';
то в файле обнаружите только целые числа. Учитывая сказанное, вот вам текст корректной функции записи в файл:
С описанием функции WideCharToMultiByte() ознакомьтесь в разделах «Работа со строками» и «Русификация приложений» [3].
Подобным чином создайте обработчик команды ФайлèСохранить как, в котором вы добавите диалоги по выбору новых имен файлов для записи массивов.
Убедитесь в том, что вы научили программу сохранять файлы, и возгордитесь собой, но не очень сильно.
Шаг 5. Использование управляющего элемента RichEdit2 для отображения текста в формате RTF (Rich Text Format – расширенный текстовый формат). Было бы неплохо иметь возможность просмотра текстов обрабатываемых файлов в программе. Для этого можно использовать элемент RichEdit2, который, в частности, позволяет отображать многострочный текст с использованием такого форматирования, которое предоставляет хорошо известный вам редактор Word. Начать можно с добавления в функцию InitInstance() класса приложения метода AfxInitRichEdit2():
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|