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