Коллеги, доброго времени. Впервые решил отметиться на каком - либо форуме... Собственно, хочу предложить своё решение озвученной в заголовке проблемы, которую недавно решил. Кому поможет - буду рад, ибо сам ничего путнего не могу сваять без форумов.
Итак, на форме кнопка поиска, Эдит, Мемо и статусбар. Нечувствительно к регистру и выделяет все вхождения по очереди. Вот код:
Код:
//---------------------------------------------------------------------------
// Очень важно: Установить свойство в Мемо HideSelection в false !!!
// Код пришлось хорошо усложнить из-за Рад-Студии 2009. В 6-м всё много проще!
// Там какие-то глюки с функцией UpperCase(). Но на 6-м должно работать тоже.
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// Код поисковика по тексту (глобальные переменные)
AnsiString DubMemo1; // Меняющийся функцией дублёр текстов в меме.
AnsiString DubEdit1; // Дублёр текстов в Эдите.(пришлось добавить)
int pos; // Позиция курсора выделения
AnsiString s; // Неменяющийся функцией дублёр текста в меме (пришлось добавить)
//----------------------------------------------------------------------------
// Функция подсчёта количества вхождений подстроки в строку
int CntRecurrences(AnsiString substr,AnsiString str)
{
if (!substr.Length() || !str.Length() || !str.Pos(substr))
{
return 0;
}
else
{
return (str.Length() - (StringReplace(str,substr,"",TReplaceFlags()<<rfReplaceAll)).Length())/substr.Length();
}
}
//===========================================================================
void __fastcall TForm1::Edit1Change(TObject *Sender)
{ // На изменения в Эдите
DubEdit1 = Edit1->Text;
DubMemo1 = Memo1->Text;
s = Memo1->Text;
pos = s.UpperCase().Pos(DubEdit1.UpperCase())-1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1Change(TObject *Sender)
{ // на Изменения в Мемо
s = Memo1->Text;
DubEdit1 = Edit1->Text;
DubMemo1 = Memo1->Text;
pos = s.UpperCase().Pos(DubEdit1.UpperCase())-1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{ // Кнопка "Поиск"
s = Memo1->Text;
if( s.UpperCase().Pos(DubEdit1.UpperCase()))
{
StatusBar1->SimpleText = " Фрагментов в левом тексте: "+IntToStr(CntRecurrences(DubEdit1.UpperCase(),s.UpperCase()));
if( DubMemo1.UpperCase().Pos(DubEdit1.UpperCase()))
{
Memo1->SelStart = pos;
Memo1->SelLength = Edit1->Text.Length();
DubMemo1.Delete(1,DubMemo1.UpperCase().Pos(DubEdit1.UpperCase())-1 + Edit1->Text.Length());
pos = Memo1->SelStart + Edit1->Text.Length() + DubMemo1.UpperCase().Pos(DubEdit1.UpperCase())-1;
}
else
{
DubMemo1 = s;
pos = s.UpperCase().Pos(DubEdit1.UpperCase())-1;
StatusBar1->SimpleText = StatusBar1->SimpleText + " Это последний фрагмент!";
// Какой-то визуальный эффект привлечения внимания к статусбару ( не помешает! )
}
}
else
{
Memo1->SelLength = 0;
if(Edit1->Text!="")
StatusBar1->SimpleText = " Фрагмент в левом тексте не найден.";
else
StatusBar1->SimpleText = " Поле ввода искомого текста пустое!";
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{ // На показ формы ( инициализация глобальных переменных)
s = Memo1->Text;
DubEdit1 = Edit1->Text;
DubMemo1 = Memo1->Text;
pos = s.UpperCase().Pos(DubEdit1.UpperCase())-1;
}
//---------------------------------------------------------------------------
________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!
Модератор.