Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2015, 14:37   #1
roman_kalin
Новичок
Джуниор
 
Регистрация: 02.02.2011
Сообщений: 2
По умолчанию Поиск фрагмента текста в Memo

Коллеги, доброго времени. Впервые решил отметиться на каком - либо форуме... Собственно, хочу предложить своё решение озвученной в заголовке проблемы, которую недавно решил. Кому поможет - буду рад, ибо сам ничего путнего не могу сваять без форумов.

Итак, на форме кнопка поиска, Эдит, Мемо и статусбар. Нечувствительно к регистру и выделяет все вхождения по очереди. Вот код:


Код:
//---------------------------------------------------------------------------
  // Очень важно:  Установить свойство в Мемо 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]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.
Вложения
Тип файла: rar Memo_Poisk.rar (271.2 Кб, 32 просмотров)

Последний раз редактировалось Serge_Bliznykov; 11.01.2015 в 15:35.
roman_kalin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск и замена текста в Memo demiancz Общие вопросы Delphi 2 04.05.2013 21:10
Запись большого фрагмента текста в таблицу БД Esigns SQL, базы данных 4 22.07.2012 22:49
Поиск фрагмента текста kopnei C# (си шарп) 14 01.06.2012 23:08
Копирование фрагмента текста ramzes777 Общие вопросы Delphi 2 09.10.2011 18:41
Удаление фрагмента текста Шурик Общие вопросы Delphi 0 31.05.2009 16:11