- •Министерство образования российской федерации
- •Северо-западный государственный заочный технический университет
- •В. Л. Макаров
- •Прикладное программирование
- •Конспект лекций с. Петербург 2003г
- •Окно формы. Форма является основой большинства приложений , так как на ней размещаются другие управляющие компоненты. Внешний вид окна формы показан на рисунке 1.3.
- •3.Основные свойства, методы и события формы
- •Компоненты vcl
- •5.1. Кнопки управления
- •5.2. Окно редактирования Edit
- •5.3 Многострочные окна редактирования Memo и RichEdit
- •5.4 Компоненты выбора из списков – ListBox, CheckListBox, ComboBox
- •5.5 Элемент управления Label (надпись или метка)
- •5.6 Элемент управления RadioButton (Радиокнопка)
- •5.7 Полосы прокрутки (ScrollBar)
- •5.9 Компонент Timer(Таймер)
- •5.10 Компонент StringGrid ( таблица строк)
- •5.11 Компонент Chart – графики и диаграммы
- •5.12 Компонент f1Book
- •6. Создание меню
- •7. Системные диалоги
- •7.1 Диалоги открытия и сохранения файлов
- •7.2 Диалог выбора шрифта(компонент FontDialog )
- •7.3 Диалог выбора цвета(компонент ColorDialog )
- •7.4Диалоги поиска и замены текста(компоненты FindDialog и ReplaceDialog )
- •8.1 Структура головного файла проекта
- •8.2 Структура файлов модулей форм
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 создает следующие основные файлы:
Головной файл проекта.
Информационный файл проекта.
Файл реализации модуля.
Заголовочный файл модуля.
Файл формы.
Файл ресурсов приложения.
Головной файл проекта содержит функцию 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.