|
Вопрос # 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
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|