Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 604

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
как в простейшем текстовом редакторе ( сделанным из элемента Memo) запрограммировать на кнопку удаление всего предложение,при введенние в поисковик фрагмента этого предложения

Щеколдин Иван Валерьевич Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Щеколдин Иван Валерьевич (статус: Посетитель)
Вопрос отправлен: 28 мая 2007, 22:43
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Щеколдин Иван Валерьевич!
Поисковик, это гугл???:):):)
Выражайтесь точнее.
Но телепаты вроде приехали и подсказали мне. Итак. Припустим, что предложение заканчивается точкой (в принципе это не так, и иногда даже умный человек в полном здравии не в состоянии определить, где конец предложения, а где начало.
Когда вы нашли текст, вы скорее всего его выделили. Или неверняка знаете положение его в тексте. Я предполагаю, что вы его выделили.
var ts,te:integer;
....
ts:=memo1.selstart;//Начало и конец выделеного текста.
te:=memo1.sellength+ts;
//теперь начинаем сканирование.
while (ts>0) and (memo1.lines.text[ts]<>'.') do dec(ts);
if ts<>1 then inc(i);//Если это не первое предложение, то пощадим точку:)
while (ts<=length(memo1.lines.text)) and (memo1.lines.text[te]<>'.') do inc(te);
Memo1.SelStart:=ts;
memo1.sellength:=te-ts;
memo1.seltext:='';

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 28 мая 2007, 22:58

Ответ #2. Отвечает эксперт: Сергей Устинов

Здравствуйте, Щеколдин Иван Валерьевич!

Например искомый фрагмент введен в Edit1
Тогда можно так:
var i:integer;
begin
For i:=Memo1.Lines.Count-1 downto 0 do if pos(edit1.text,memo1.Lines)>0 then memo1.Lines.Delete(i);
end;

Удачи!

Ответ отправил: Сергей Устинов (статус: 2-ой класс)
Время отправки: 28 мая 2007, 23:02

Ответ #3. Отвечает эксперт: Venom

Здравствуйте, Щеколдин Иван Валерьевич!
Сначала, по поводу предыдущего ответа. Ответ не совсем корректный, никто не сказал, что предложение занимает одну строку в Memo :)
Теперь по самому вопросу: я бы сделал следующим образом.

procedure TF_Main.FindStr;
var i,p1,p2,p,p0,L:integer;
rs,Frs:string;
begin
//определяем позицию подстроки в тексте
p0:=Pos(Edit1.Text,Memo1.Text);
//определяем конец предложения
if PosEx('.',Memo1.Text,p0)>0 then p1:=PosEx('.',Memo1.Text,p0)
else if PosEx('!',Memo1.Text,p0)>0 then p1:=PosEx('!',Memo1.Text,p0)
else if PosEx('?',Memo1.Text,p0)>0 then p1:=PosEx('?',Memo1.Text,p0);
//обращаем весь текст
rs:=AnsiReverseString(Memo1.Text);
//обращаем искомую строку
Frs:=AnsiReverseString(Edit1.Text);
//определяем позицию обращенной строки в обращенном тексте
p2:=Pos(Frs,rs);
//определяем конец обращенной строки, т.е. начало реального предложения
if PosEx('.',rs,p2)>0 then p:=PosEx('.',rs,p2)
else if PosEx('!',rs,p2)>0 then p:=PosEx('!',rs,p2)
else if PosEx('?',rs,p2)>0 then p:=PosEx('?',rs,p2);
//вычисляем реальную позицию начала предложения
L:=Length(Memo1.Text);
p2:=L-p+2;
//удаляем предложение из текста
Memo1.Text:=AnsiReplaceText(Memo1.Text,Copy(Memo1.Text,p2,p1-p2+1),'');
end;

Ответ отправил: Venom (статус: 1-ый класс)
Время отправки: 30 мая 2007, 14:17


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:52
Выполнено за 0.02 сек.