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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 587

/ вопрос решён /

Здравствуйте, уважаемые эксперты! Мне нужна "имитация поиска по базе". Есть .txt файл, со строками. Надо чтобы при вводе какого-ть текста или слова программа осуществляла поиск в каждой строке, если успешно, то выдавала строку полностью, в которой нашла слово. Заранее спасибо.

Phoenix Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Phoenix (статус: Посетитель)
Вопрос отправлен: 21 мая 2007, 13:34
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Косолапов Дмитрий Юрьевич

Здравствуйте, Phoenix!
Удобно использовать класс TStringList. Примерный код процедуры - в приложении (результат выводится в Memo1)

Приложение:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var sl:TStringList;
  3. i:integer;
  4. begin
  5. sl:=TStringList.Create;
  6. Memo1.Clear;
  7. sl.LoadFromFile('yourfile.txt');
  8. for i:=0 to sl.Count-1 do
  9.  
  10. Memo1.Lines.Add(sl[i]);
  11. sl.Free;
  12. end;


Ответ отправил: Косолапов Дмитрий Юрьевич (статус: 8-ой класс)
Время отправки: 21 мая 2007, 14:11
Оценка за ответ: 5

Комментарий к оценке: отлично

Ответ #2. Отвечает эксперт: min@y™

Хочу дополнить предыдущий ответ функцией поиска БЕЗ учёта регистра символов, возвращающей количество найденных строк.

Приложение:
  1. function FindText(const Text, FileName: string): Integer;
  2. var
  3. List: TStringList;
  4. Index: Integer;
  5. LowerText: string;
  6. begin
  7. Result:= 0;
  8. Memo.Lines.Clear;
  9. LowerText:= AnsiLowerCase(Text);
  10. List: TStringList.Create;
  11.  
  12. try
  13. try
  14. List.LoadFromFile(FileName);
  15.  
  16. for Index:= 0 to List.Count - 1 do
  17. begin
  18. if Pos(LowerText, AnsiLowerText(List[Index])) <> 0
  19. then begin
  20. Memo.Lines.Add(List[Index]);
  21. Inc(Result);
  22. end;
  23.  
  24.  
  25.  
  26.  
  27. ProgressBar.Position:= Round(100 * (Index + 1) / List.Count);
  28. Application.ProcessMessages;}
  29. end;
  30. except
  31. Result:= -1;
  32.  
  33.  
  34. mb_Ok + mb_IconError);
  35. end;
  36. finally
  37. List.Free;
  38. end;
  39. end;


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 21 мая 2007, 16:55
Оценка за ответ: 5


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

Всего сообщений: 4; последнее сообщение — 21 мая 2007, 15:30; участников в обсуждении: 3.
Phoenix

Phoenix (статус: Посетитель), 21 мая 2007, 14:06 [#1]:

да и еще чуть не забыл, надо еще при успешном поиске выдавало все строки с совпадениями (или ограничено первые 10) ищо раз спасибо.
Venom

Venom (статус: 1-ый класс), 21 мая 2007, 14:45 [#2]:

Добрый день, Phoenix.
Можно и вот так, по старинке:
var F:Text;
s:string;
begin
AssignFile(F,'путь к файлу');
Reset(F);
Memo1.Clear;
While not Eof(F)do
begin
ReadLn(F,s);
if Pos('искомая строка',s)>0 then
Memo1.Add(s);
end;
CloseFile(F);
end;
Косолапов Дмитрий Юрьевич

Косолапов Дмитрий Юрьевич (статус: 8-ой класс), 21 мая 2007, 15:24 [#3]:

Ну, чтобы ограничить первыми 10-ю, можно простую проверку в цикле сделать...
Phoenix

Phoenix (статус: Посетитель), 21 мая 2007, 15:30 [#4]:

спасибо большое, сразу же догадался

31 января 2011, 19:27: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

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

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