Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Методические наказания к первой части работы




Шаг 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...