| Поиск всех одинаковых слов в Memo |
| monstryuga | Дата: Воскресенье, 25.04.2010, 08:17 | Сообщение # 1 |
|
Ранг 1
Группа: Проверенные
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
| Доброго времени суток. Проблема такая, веду поиск по стандартной схеме : Code var Find:string; // Искомая строка i:integer; // Счетчик для цикла LineNum : LongInt;//номер строки CharNum : LongInt;//номер символа procedure TForm1.Button1Click(Sender: TObject); begin find:={переменная}; // Записываем в find текст из For i:=0 to Memo1.Lines.Count-1 do // Запускаем цикл поиска строки If Pos(FIND, Memo1.Lines.Text)<>0 Then Begin Memo1.SetFocus(); Memo1.SelStart:=Pos(FIND,Memo1.Lines.Text)-1; Дальне хочу вставить найденные одинаковые строки в другое поле Memo: {Получаем номер строки} LineNum := Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0); {Получаем позицию в строке} CharNum := Memo1.Perform(EM_LINEINDEX, LineNum, 0); {Выводим позицию на экран} Form1.Caption := IntToStr(LineNum)+' : '+IntToStr((Memo1.SelStart-CharNum));//это мне нужно для определения места положения курсора. Просто для себя. Memo2.Lines.Add(Memo1.Lines[LineNum]); Программа выдает именно ту строку, которая заданна в переменной find, но только именно столько раз, сколько содержится строк в Memo1. find изменять нельзя, нужны все строки с одинаковым словом(в строке могут присутствовать и другие слова). Необходимо изменить место старта поиска, вместо : Code For i:=0 to Memo1.Lines.Count-1 do надо прописать место остановки первого поиска +1, и новый старт. Не могу уже второй день добится . Помогите чем можете, пожалуйста.
|
| |
| | |
| Admin | Дата: Воскресенье, 25.04.2010, 12:02 | Сообщение # 2 |
Ранг 10
Группа: Администраторы
Сообщений: 1263
Награды: 16
Репутация: 2
Статус: Offline
| Quote (monstryuga) Программа выдает именно ту строку, которая заданна в переменной find, но только именно столько раз, сколько содержится строк в Memo1. Сначала не понял про че ты говориш. Вобщем если находится совпадение, то его выводит N раз, где N-количество строк в Memo1. На скоьлко я понял, нужно чтобы программа нашла все совпадения в тексте. Так? Ну во первых я бы цикл сделал с Begin, так сразу видно границы, хоть ничего и не изменится, но все же так мне удобнее. Ну и незнаю зачем ты получал номер строки, выделял, и т.д. Можно намного проще: Code var s:string; begin find:='sd'; For i:=0 to Memo1.Lines.Count-1 do begin s := Memo1.Lines[i]; If Pos(FIND, s)<>0 Then Memo2.Lines.Add(s); end;
Не оказываю помощь через личные сообщения и ICQ
|
| |
| | |
| monstryuga | Дата: Воскресенье, 25.04.2010, 22:14 | Сообщение # 3 |
|
Ранг 1
Группа: Проверенные
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
| Quote (Admin) find:='sd'; For i:=0 to Memo1.Lines.Count-1 do begin s := Memo1.Lines[i]; If Pos(FIND, s)<>0 Then Memo2.Lines.Add(s); end; Все гениальное просто!!! Спасибо огромное за такой быстрый и отличный ответ! все упростилось в разы! Прошлый код я использовал потому, что не знал как реализовать поиск слова в Memo. Вот и изворачивался потом из этого . А теперь все работает как часы. Как прогу закончу, обязательно тебя включу в благодарности, и сайт упомяну. Еще раз огромное спасибо! А эту фразу я потом удалю, скажи пожалуйста, как ты код вставляешь?
Сообщение отредактировал monstryuga - Воскресенье, 25.04.2010, 22:23 |
| |
| | |
| Admin | Дата: Воскресенье, 25.04.2010, 22:25 | Сообщение # 4 |
Ранг 10
Группа: Администраторы
Сообщений: 1263
Награды: 16
Репутация: 2
Статус: Offline
| Ну вот и хорошо, обращайтесь еще. Да у вас просто прав не хватает. Вы же только зарегистрировались, вот и в группе пользователи находитесь.
Не оказываю помощь через личные сообщения и ICQ
|
| |
| | |
| monstryuga | Дата: Воскресенье, 25.04.2010, 22:31 | Сообщение # 5 |
|
Ранг 1
Группа: Проверенные
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
| Quote (Admin) Да у вас просто прав не хватает. Вы же только зарегистрировались, вот и в группе пользователи находитесь. Понятненько
|
| |
| |
|