Целью данной работы является изучение простейших приемов поиска и визуализации полезной информации на примере текстового документа, а также закрепление навыков программирования в интегрированной среде Borland C++ Builder для операционных систем Windows 98, 2000, XP и NT.
Порядок выполнения лабораторной работы №6:
1. Выполнить запуск основного приложения Borland C++ Builder. Открыть новый проект для разработки, используя команду File|New Application. Сохранить новый проект в папке D:/VMSS/U41(U42)/<user>, используя команду File|Project As. Имена папки <user>, проекта и файла присваиваются самостоятельно.
2. С использованием Палитры компонентов и Инспектора объектов создать первоначальный образ окна разрабатываемого приложения. Примерный вид окна приложения приведен на Рисунок 6.1. Дизайн окна определяется самостоятельно. В процессе работы окно может дополняться другими компонентами.
Рисунок 6.1 - Вид окна приложения |
3. Разработать процедуру открытия текстового файла. Данная процедура должна вызываться по нажатию кнопки «Открыть…». Для реализации процедуры необходимо использовать стандартный диалоговый компонент «OpenDialog». Установить свойства Filter и FilterIndex для выбора текстовых файлов в списке файлов. По желанию можно установить первоначальный директорий для выбора файла. Метод Execute активизирует окно диалога во время выполнения программы. После нажатия кнопки «ОК» имя выбранного файла заносится в свойство FileName. Чтение файла в поле RichEdit производится методом RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName).
4. В окно приложения вывести имя файла FileName и размер текстового документа RichEdit1->Lines->Text.Length().
5. Отладить процедуру открытия файла.
6. При открытии текстового файла, подготовленного в редакторах DOS, русские символы не отображаются в поле RichEdit. Поэтому требуется перекодировка из OEM в Ansi, которая выполняется при помощи функции API OemToChar(txt,txt). Требуется написать процедуру перекодировки, которая должна выполнять три действия: запись содержимого поля RichEdit в промежуточный буфер txt с использованием функции strcpy(); вызов функции API OemToChar(txt,txt); перезапись содержимого буфера в поле RichEdit.
7. Отладить процедуру перекодировки.
8. Разработать процедуру поиска заданного в поле Edit1 ключевого слова и визуализации найденных слов в поле RichEdit. Для визуализации необходимо использовать RTF-формат, который позволяет выделять отдельные участки текста определенным цветом. RTF-формат содержит набор служебных последовательностей, которые называются команды управления настройки программы чтения файлов в RTF-формате. Для решения задачи визуализации потребуются следующие последовательности:
// константы RTF формата
#define TXTCOLOR "\\plain\\fs20\\cf1 " // начало подсветки
#define TXTNOCOLOR "\\plain\\fs20 " // конец подсветки
#define TXTSTART "{\\rtf1\\ansi\\deff0\\deftab720 {\\fonttbl {\\f0\\fmodern Courier} } \r\n {\\colortbl\\red0\\green0\\blue0;\\red255\\green0\\blue0;}\r\n" // начало текста
#define TXTEND "}\\par" // конец текста
#define TXTPAR "\\par " // конец абзаца
#define TXTCR "\r\n" // перевод строки.
9. Процедура поиска должна разрабатываться в несколько этапов:
1 этап - преобразование текстового файла в RTF-формат (установка констант начала и конца текста);
2 этап – замена символов перевода строки «\r\n» на конец абзаца «\par»;
3 этап – поиск ключевого слова и фиксация начала и конца слова константами TXTCOLOR и TXTNOCOLOR;
4 этап – подсчет количества найденных слов и вывод результата в окне приложения.
10. Для преобразования в RTF-формат необходимо разработать процедуру вставки заданной последовательности в указанное место в буфере. Пример данной процедуры приведен ниже:
//-------------------------------------------------------
void __fastcall TForm1::RtfIns(int n, char *txtbuf, char *str)
// вставка RTF строки
// n – место куда нужно вставить строку (смещение от начала буфера)
// txtbuf – указатель на исходный буфер
// str – указатель на строку которую нужно вставить
{
char buff[0xffff]; // буфер cохранения
memset(buff,0,strlen(txtbuf));
strcpy(buff,txtbuf); // сохраним
txtbuf[n]=0; // ограничим начало
strcat(txtbuf,str); //вставка строки RTF
strcat(txtbuf,&buff[n]); // добавим оставшийся текст
}
11. Для преобразования в RTF-формат необходимо разработать процедуру удаления в буфере строки из n символов (удаления последовательности «\r\n»). Пример данной процедуры приведен ниже:
//-------------------------------------------------------
void __fastcall TForm1::RtfDel(int n, char *txtbuf, int size)
// удаление RTF строки
// n – место с которого нужно удалять (смещение от начала буфера)
// txtbuf – указатель на исходный буфер
// size – длина удаляемой строки
{
char buff[0xffff]; // буфер cохранения
strcpy(buff,txtbuf);
txtbuf[n]=0;
strcat(txtbuf,&buff[n+size-1]);
}
12. Выполнить 1 этап разработки процедуры поиска и визуализации. Данная процедура должна вызываться при нажатии кнопки «Поиск». Последовательность выполняемых действий в процедуре:
чтение текста во внутренний буфер при помощи команды strcpy(buf,RichEdit1->Lines->Text.c_str());
вставка в буфер констант начала и конца RTF-файла с использованием следующей последовательности
RtfIns(0,buf,TXTSTART); // вставка заголовка RTF
RtfIns(sizeof(TXTSTART)-1,buf,TXTNOCOLOR); // установка исходного цвета
strcat(buf,TXTEND); // добавить концовку RTF
strcat(buf,"\0\0\0"); // добавить концовку
запись содержимого буфера во временный файл
char FileName[16]="123.rtf";
int handle = open(FileName, O_CREAT|O_TEXT|O_RDWR);
write(handle, buf, strlen(buf));
close(handle);
чтение файла в поле RichEdit при помощи команды
RichEdit1->Lines->LoadFromFile(FileName).
13. Отладить и проверить правильность выполнения задания RTF-формата. В тексте (поле RichEdit) не должно быть видно введенных констант, а сам текст должен быть не форматирован (отсутствие абзацев).
14. Выполнить 2 этап разработки процедуры поиска и визуализации. Для этого в тексте процедуры перед командами установки констант начала и конца RTF-формата требуется установить цикл замены в тексте последовательности «\r\n» на последовательность «\par». Пример данного цикла приведен ниже
// замена ВК и ПС
ptr=strstr(buf,TXTCR);
while(ptr!= NULL)
{// замена ВК и ПС на конец абзаца
RtfDel((int)(ptr-buf),buf,sizeof(TXTCR));
RtfIns((int)(ptr-buf),buf,TXTPAR);
ptr=strstr(buf,TXTCR);
}
15. Отладить и проверить правильность выполнения замены. После выполнения процедуры текст (поле RichEdit) должен принять первоначальный вид.
16. Выполнить 3 этап разработки процедуры поиска и визуализации. Для этого в тексте процедуры перед выше приведенном циклом требуется установить цикл поиска ключевых слов. Пример фрагмента данного цикла приведен ниже
strcpy(str,Edit1->Text.c_str()); // ключевое слово
ptr=strstr(buf,str); // поиск слова
// цикл поиска
while(ptr!= NULL) {
RtfIns((int)(ptr-buf),…,…..); // начало подсветки
RtfIns((int)(ptr-buf)+…+…-1,…,…); // конец подсветки
ptr=ptr+…+…+…; // смещение указателя
ptr=strstr(ptr,str); // поиск слова
}
17. Отладить и проверить правильность выполнения поиска ключевых слов. После выполнения процедуры найденные слова в тексте (поле RichEdit) должны быть выделены красным цветом.
18. Выполнить 4 этап разработки процедуры поиска и визуализации. Для этого в тексте процедуры в цикле поиска необходимо организовать счетчик. По окончанию поиска содержимое счетчика необходимо ввести в окно приложения
Edit2->Text=IntToStr(count); // вывод результата поиска
19. Отладить и проверить правильность работы всего приложения. На Рисунке 6.2 приведен пример окна после выполнения процедуры поиска.
Рисунок 6.2 - Вид окна приложения после выполнения процедуры поиска |
Контрольные задания и вопросы:
1. Каким образом можно изменить цвет выделяемого текста?
2. В процедурах RtfIns() и RtfDel() используется статический внутренний буфер char buff[0xffff]. Требуется изменить этот буфер на динамический, отладить процедуры (при выполнении программы необходимо многократно вызывать процедуры поиска) и привести листинги данных процедур.
3. Запись текста RTF-формата в поле RichEdit производится через файл. Предложить свой вариант решения, в котором перезапись выполнялась бы через память.
4. Предусмотреть активизацию кнопки «Преобразовать в Ansi» только в том случае, если русский текст не читаем.
5. Предусмотреть блокировки кнопок управления программой от неправильных действий оператора (защита от «дурака»).
Требования к отчету:
Отчет должен содержать:
титульный лист;
задание;
листинги основных процедур;
структуру приложения;
ответы на контрольные задания и вопросы.
Отчет должен быть выполнен чисто и аккуратно. При оформлении отчета рекомендуется использовать различные текстовые и графические редакторы. Студент, допустивший отклонения от требований, к защите работы не допускается.