Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикл_программир_ч1.doc
Скачиваний:
6
Добавлен:
18.09.2019
Размер:
11.05 Mб
Скачать

7.4Диалоги поиска и замены текста(компоненты FindDialog и ReplaceDialog )

Эти компоненты вызывают диалоги поиска и замены фрагментов текста..Обладают следующими основными свойствами:

FindText – определяет текст , заданный пользователем для поиска и замены .

ReplaceText – определяет в компоненте ReplaceDialog текст,который должен заменять FindText.

Optionsмножество опций , которые определяют особенности окон диалогов поиска и замены.

Сами по себе компоненты FindDialog и ReplaceDialog не осуществляют ни поиска, ни замены. Они только обеспечивают интерфейс с пользователем. А поиск и замену надо осуществлять программно. Для этого можно пользоваться событием OnFind, происходящим, когда пользователь нажал в диалоге кнопку Найти далее, и событием OnReplace, возникающим, если пользователь нажал кнопку Заменить или Заменить все. В событии OnReplace узнать, какую именно кнопку нажал пользователь, можно по значениям флагов frReplace и frReplaceAll.

Пример1. Разработать программу поиска заданного фрагмента текста в компоненте Memo, с использованием диалога поиска. Интерфейс этой программы кроме формы будет содержать только кнопку с именем Button1 и многострочный редактор с именем Memo1. Программный код приложения, решающего поставленную задачу показан на рисунке 7.2 .

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

#include <vcl.h>

#pragma hdrstop

#include "P1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

//Задание начального текста поиска в Memo

FindDialog1->FindText=Memo1->SelText; //Выделение текста

FindDialog1->Execute(); //Вызов диалога поиска

ShowMessage("Выделен текст"+FindDialog1->FindText);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FindDialog1Find (TObject *Sender)

{

/*S - адрес первого символа выделенного текста от началоа тексата

E - количество символов от первой позиции поиска доконца текста

F =S+ "кол. символов выдел. фрагмента"+"индекс первого символа выделенного

фрагмента при очередном поиске"*/

int F,S,E;

S=Memo1->SelStart;//Присвоение начального адреса

if(Memo1->SelLength)

/*Если фрагмент выделен (его длина SeelLength>0) начальный адрес наращивается

на величину символов выделенного фрагмента текста*/

ShowMessage("Длина="+IntToStr(Memo1->SelLength));

S+=Memo1->SelLength;//Наращивание S на кол. символов выделенного фрагмента

E=Memo1->Text.Length()-S;

/*SubString(S+1,E) - Функция возвращает часть текста, начинающегося с S+1

символа и до конца текста,

LowerCase() - Функция возвращает строку в которой все символы приведены

к нижнему регистру,

Pos(FindDialog->FindTextA.LowerCase()) - Функция, которая возвращает индекс

Если фрагмент не найден, возвращается 0*/

F=S+Memo1->Text.SubString(S+1,E).LowerCase().

Pos(FindDialog1->FindTextA.LowerCase());

if(F!=S)//Если фрагмент найдена

{

Memo1->SetFocus();

Memo1->SelStart=F-1;//Присвоение нового начального адреса

Memo1->SelLength=FindDialog1->FindTextA.Length();//Выделение фрагмента

//найденного текста

}

else ShowMessage("текст '"+FindDialog1->FindTextA+"' более не найден");

}

//---------------------------------------------------------------------------

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

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

Функция LowerCase( ) – возвращает строку в которой все символы приведены к нижнему регистру.

Функция SabString( ) – используется для получения фрагментов строки Memo1. Эта функция возвращает подстроку , начинающуюся с символа в позиции, заданной первым параметром функции, и содержащую число символов , не превышающее значение , заданное вторым параметром функции. Таким образом, выражение Memo1->Text.SubString(S+1,E) возвращает часть текста , начинающегося с S+1 символа и до конца текста.

Функция Pos( ) – ищет в строке , к которой она применима ( в нашем случае Memo1->Text.SubString(S+1,E)) первое вхождение подстроки , заданное ее параметром ( в нашем случае FindTextA) . Если поиск успешный , функция возвращает индекс первого символа найденного вхождения подстроки. Счет индексов начинается с единицы, если же подстрока не найдена , возвращается 0.

Пример2. Разработать программу поиска и замены найденного фрагмента текста в компоненте Memo, с использованием диалога замены- ReplaceDialog. Интерфейс этой программы будет содержать те же элементы ,что и в примере1. Программный код приложения, решающего поставленную задачу, показан на рисунке 7.3. .

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

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Memo1->SelStart=0;//Перевод курсора в начало текста

//Задание начального текста поиска в Memo

ReplaceDialog1->FindText=Memo1->SelText;//Выделение текста

ReplaceDialog1->Execute();//Вызов диалога замены

}

//---------------------------------------------------------------------------

void __fastcall TForm1::ReplaceDialog1Find(TObject *Sender)

{ /*S - адрес первого символа выделенного текста от началоа тексата

E - количество символов от первой позиции поиска доконца текста

F =S+ "кол. символов выдел. фрагмента"+"индекс первого символа выделенного

фрагмента при очередном поиске"*/

int F,S,E;

S=Memo1->SelStart;//Присвоение начального адреса

if(Memo1->SelLength)

/*Если фрагмент выделен (его длина SeelLength>0) начальный адрес наращивается

на величину символов выделенного фрагмента текста*/

//ShowMessage("Длина="+IntToStr(Memo1->SelLength));

S+=Memo1->SelLength;//Наращивание S на кол. символов выделенного фрагмента

E=Memo1->Text.Length()-S;

/*SubString(S+1,E) - Функция возвращает часть текста, начинающегося с S+1

символа и до конца текста,

LowerCase() - Функция возвращает строку в которой все символы приведены

к нижнему регистру,

Pos(FindDialog->FindTextA.LowerCase()) - Функция, которая возвращает индекс

Если фрагмент не найден, возвращается 0*/

F=S+Memo1->Text.SubString(S+1,E).LowerCase().

Pos(ReplaceDialog1->FindTextA.LowerCase());

if(F!=S)//Если фрагмент найден

{

Memo1->SetFocus();

Memo1->SelStart=F-1;//Присвоение нового начального адреса

Memo1->SelLength=ReplaceDialog1->FindTextA.Length();//Выделение фрагмента

//найденного текста

}

else ShowMessage("текст '"+ReplaceDialog1->FindTextA+"' более не найден");

}

//---------------------------------------------------------------------------

void __fastcall TForm1::ReplaceDialog1Replace(TObject *Sender)

{

if(Memo1->SelText!="") //Если в Memo1 не пустая строка

//Замена найденного фрагмента текста

Memo1->SelText=ReplaceDialog1->ReplaceTextA;

//Замена фрагментов по всему тексту

if(ReplaceDialog1->Options.Contains(frReplaceAll))

{

Memo1->SelStart+=ReplaceDialog1->ReplaceTextA.Length();

ReplaceDialog1Find(Sender);

}

else

{

ShowMessage("фрагмент" + ReplaceDialog1->FindTextA+" искать далее");

return;

}

}

//---------------------------------------------------------------------------

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

8. Файлы, используемые в проектах C++Builder

Проект (project) — это набор файлов, которые используются при создании автономного исполняемого файла или динамически компо­нуемой библиотеки (DLL).C++Builder управляет проектами с помощью нескольких вспомогатель­ных файлов. Для нового проекта C++Builder создает следующие основные файлы:

  1. Головной файл проекта.

  2. Информационный файл проекта.

  3. Файл реализации модуля.

  4. Заголовочный файл модуля.

  5. Файл формы.

  6. Файл ресурсов приложения.

Головной файл проекта содержит функцию Win-Main( ), которая инициирует приложение и запускает его на выполнение. Имеет расширение (.срр).

Информационный файл проекта представляет собой текстовый файл, содержащий установленные опции компилятора, имена исходных файлов и форм, входящих в про­ект, а также имена необходимых библиотечных файлов Имеет расширение (.bpr).

Файл реализации модуля и Заголовочный файл модуля представляют собой текстовые файлы, содержащие программный код реализации модуля и заголовочный файл с описанием класса формы. Имеют расширения соответственно (.срр) и (.h). Среда C++Builder создает дополнительные файлы реализации и заго­ловочные файлы для каждой новой формы данного проекта.

Файл формы содержит информацию о формах приложения. Имеет расширение(.dfm).Каждому файлу формы соответствует файл реализации модуля .

Файл ресурсов приложения представляет собой двоичный файл, содержащий ресурсы проекта. Имеет расширение (.res).

Следующая группа файлов создается компилятором :

Исполняемый файл является автономным исполняемым файлом приложения. Имеет расширение (.exe) .

Объектный файл модуля представляет собой откомпилированный файл модуля, который компонуется в исполняемый файл. Имеет расширение (.obj) .

Файл таблицы символов представляет собой двоичный файл , используемый отладчиком в процессе отладки приложения. Имеет расширение (.tds) .

Файлы, создаваемые C++Builder, можно разделить на две категории: файлы, на основе которых строится проект, и файлы, создаваемые при ком­пиляции и компоновке проекта. Если необходимо перенести все исходные файлы на другой компьютер, нужно будет переписать только те из них, которые C++Builder использует для построения приложе­ния. Обычно исходные файлы имеют наименьший размер по сравнению с другими файлами проекта и не требуют много места при резервном копиро­вании.

Файлы с расширениями .cpp, .h, .dfm и .bpr составляют минималь­ный набор. Все остальные файлы C++Builder создаст заново при построении программы. Информация о формах хранится в трех файлах : .dfm, cpp, и .h. В файле с расширением .dfm хранится информация о внешнем виде формы , ее размерах, местоположение на экране и т.п. Файл реализации модуля .cpp является основным файлом ,с которым работает проектировщик, так как в нем хранится программный код, соответствующий данной форме. В текстовом заголовочном файле с расширением .h хранится объявление класса формы. Весь основной текст этого файла C++Builder формирует автоматически по мере проектирования приложения.

Поскольку в любое приложение C++Builder включает несколько файлов, то при создании нового проекта рекомендуется :

  • Для каждого нового проекта создавать новый каталог.

  • Создавать новый проект командой File\New Application.

  • Сразу сохранять проект и файл модуля командой File\Save All.