Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите начинающему программисту!
Форум программистов > Системное программирование > Delphi и Pascal > Delphi - FAQ
SSSS
Здравствуйте! Не могли бы вы подсказать начинающему программисту как выполнить следующую операцию в Delphi.

Мне необходимо чтобы при вводе определенного слова в строку Edit производился поиск в текстовом файле этого слова и выводилось в Memo после определенного символа т.е. приведу пример.

Допустим в текстовом файле имеется запись:

«Цвет 1. Красный 2. Черный 3. Белый»

После ввода в строку Edit слова «Цвет», в Мемо1 выведется строка после этого слова:
1. Красный
2. Черный
3. Белый
Получается он выводит значения после первого пробела и переносит слово вниз встречая цифру. И если не затруднит, чтоб при этом еще в Мемо2 выводились все слова которые совпадают по вбитым буквам пока не будет 100% совпадения т.е.

В файле есть строки: Цвет 1. Красный …
Цветок 1. Роза…
Если написать в Edit "Цвет", то будут отображаться оба слова в Мемо2, а если "Цветок", то "Цвет" сразу скроется и останется только "Цветок" (это чтоб был выбор если человек точно не знает что ищет). Программа очень похожа на переводчик или глоссарий.

Заранее спасибо!!!
Silver Wind
А что конкретно не понятно?
В обработчике OnChange Edit`a проводишь поиск по заранее загруженному файлу и готовишь информацию, которую затем выводишь в Memo.
Единственный момент, который надо продумать как следует это как быстро такой поиск будет работать с файлом хотябы в пару мегабайт, наверное заранее отсортировать информацию, чтобы пользователь затем не плевался от того факта что после ввода очередной буквы надо ждать полчаса отображения информации.
Vadik(R)
Мне кажется ему нужна сама реализация программы. То есть, он хочет дождаться самого кода поиска типа:
While NOT EoF(F) Do
Begin
  ReadLn(f,st);
  While Pos(Edit1.Text, st) Do
  ...
End.

Честно говоря написал бы, но лень, ведь код программы-то получится не маленький.
SSSS
Ладно с поиском еще можно что-то придумать, а как быть чтоб он в Мемо1 вставлял строчку которая после пробела, причем именно строчку а не весь дальше идущий текст! Суть я понимаю какая но как это реализовать? Необходимо чтобы он при совпадении слова на 100% проверял какой сисвол после него и если там пробел а не очередной символ то он вставляет в Мемо последующий текст который идет до конца строки, а не до конца всего документа.
Silver Wind
Все еще не понимаю в чем проблема.
Копировать часть строки - функция Copy(), обратиться к символу строки str по индексу так - str[index], найти подстроку в строке - функция Pos().
Этих инструментов вполне достаточно.
SSSS
Видимо я не догоняю или ты меня не так понял. Насчет поиска тоже я щас подумал и понял что он не сработает т.к. он будет искать по всему файлу и это словоможет встретиться и далее но уже не как искомое а просто по тексту. Я еще раз приведу пример и если твое мнение не изменится, значиту меня туго с этим smile.gif

Есть допустим файл со следующей информацией:

Роза 1. Цвет 2. Запах
Цвет 1. Красный 2. Синий
и т.д.

Мне необходимо чтоб производился поиск именно по первым словам т.е. по Розе и Цвету, а если искать везде то он найдет и слово Цвет в Розе, а мне нужны только слова до пробела чтоб сравнивалось, а то что после пробела выводилось в Мемо.
Silver Wind
Ну и замечательно что в файле много строк, еще замечательнее будет, если они по алфавиту отсортированы, тогда двоичный поиск можно использовать, чтобы найти нужную строку.
А так в общем виде - грузим наш файл в TStringList и работаем с отдельными строками.
astronom
Эту программу лучше сразу на Ассемблере писать ... хотя бы есть шанс, что она хоть когда-нибудь закончится в случае работы с файликом в пару мегабайт. biggrin.gif
Если я правильно понял, то файл можно описать так:
метка_1 1 элемент1 2 элемент2 3 элемент3 ...
метка_2 1 элемент1 2 элемент2 3 элемент3 ...
метка_3 1 элемент1 2 элемент2 3 элемент3 ...

Очевидно, поиск будет вестись по метка_1, метка_2 и т.д. (поиск совпадений с вводимым пользователем словом). Тогда лучше всего сначала считать метки всех строк файла и соорудить из них дерево, отсортировав метки по алфавиту (по бинарным деревьям литературы, как говорится "ВО!!!" или "дофига"), в каждом элементе дерева запомнить номер строки, из которой он был взят.
Поиск осуществлять по этому самому дереву (гемор, но, к сожалению, процессор работает гораздо быстрее с оперативной памятью, чем с дисками tongue.gif). Найдя подходящий элемент, определяете номер нужной строки и начинаете ее разбивать.
Как разбить?
Определяете первый пробел в строке (при условии, что поиск велся по одному слову), после этого начиная с той же позиции указателя, ищете первую попавшуюся цифру, и считываете все до следующего пробела (вернее, через 1 пробел.) в строковую переменную. Как только дошли до пробела, добавляете к строковой переменной перевод каретки и переход на новую строку. Продолжаете поиск в исследуемой строке до следующего пробела ... и т.д., пока не встретите символ Eoln. Как только попался Eoln, строка прочитана.
p.s. в принципе, жизнь будет гораздо проще, а программа "красивше и продвинутистей", если метки отделить от перечислимых элементов каким-нибудь заковыристым символом, типа двоеточия, решетки и т.п. Тогда можно вести поиск хоть по целым абзацам. ph34r.gif
p.p.s. Как только встретите символ EoF, можно закрывать программу и идти курить. biggrin.gif
SSSS
Всем большое спасибо за помощь, но если еще кто надумает написать то пишите, я думаю заинтересованных людей хватает...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.