ЛАБОРАТОРНАЯ РАБОТА №6. ПОИСК И ВИЗУАЛИЗАЦИЯ НАЙДЕННЫХ СЛОВ В ТЕКСТОВЫХ ДОКУМЕНТАХ

Целью данной работы является изучение простейших приемов поиска и визуализации полезной информации на примере текстового документа, а также закрепление навыков программирования в интегрированной среде 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. Предусмотреть блокировки кнопок управления программой от неправильных действий оператора (защита от «дурака»).

 

Требования к отчету:

Отчет должен содержать:

титульный лист;

задание;

листинги основных процедур;

структуру приложения;

ответы на контрольные задания и вопросы.

Отчет должен быть выполнен чисто и аккуратно. При оформлении отчета рекомендуется использовать различные текстовые и графические редакторы. Студент, допустивший отклонения от требований, к защите работы не допускается.