• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Помогите начинающему программисту!

  • Автор темы Автор темы SSSS
  • Дата начала Дата начала
S

SSSS

Здравствуйте! Не могли бы вы подсказать начинающему программисту как выполнить следующую операцию в Delphi.

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

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

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

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

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

Заранее спасибо!!!
 
А что конкретно не понятно?
В обработчике OnChange Edit`a проводишь поиск по заранее загруженному файлу и готовишь информацию, которую затем выводишь в Memo.
Единственный момент, который надо продумать как следует это как быстро такой поиск будет работать с файлом хотябы в пару мегабайт, наверное заранее отсортировать информацию, чтобы пользователь затем не плевался от того факта что после ввода очередной буквы надо ждать полчаса отображения информации.
 
Мне кажется ему нужна сама реализация программы. То есть, он хочет дождаться самого кода поиска типа:
Код:
While NOT EoF(F) Do
Begin
ReadLn(f,st);
While Pos(Edit1.Text, st) Do
...
End.
Честно говоря написал бы, но лень, ведь код программы-то получится не маленький.
 
Ладно с поиском еще можно что-то придумать, а как быть чтоб он в Мемо1 вставлял строчку которая после пробела, причем именно строчку а не весь дальше идущий текст! Суть я понимаю какая но как это реализовать? Необходимо чтобы он при совпадении слова на 100% проверял какой сисвол после него и если там пробел а не очередной символ то он вставляет в Мемо последующий текст который идет до конца строки, а не до конца всего документа.
 
Все еще не понимаю в чем проблема.
Копировать часть строки - функция Copy(), обратиться к символу строки str по индексу так - str[index], найти подстроку в строке - функция Pos().
Этих инструментов вполне достаточно.
 
Видимо я не догоняю или ты меня не так понял. Насчет поиска тоже я щас подумал и понял что он не сработает т.к. он будет искать по всему файлу и это словоможет встретиться и далее но уже не как искомое а просто по тексту. Я еще раз приведу пример и если твое мнение не изменится, значиту меня туго с этим :)

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

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

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

Очевидно, поиск будет вестись по метка_1, метка_2 и т.д. (поиск совпадений с вводимым пользователем словом). Тогда лучше всего сначала считать метки всех строк файла и соорудить из них дерево, отсортировав метки по алфавиту (по бинарным деревьям литературы, как говорится "ВО!!!" или "дофига"), в каждом элементе дерева запомнить номер строки, из которой он был взят.
Поиск осуществлять по этому самому дереву (гемор, но, к сожалению, процессор работает гораздо быстрее с оперативной памятью, чем с дисками :P). Найдя подходящий элемент, определяете номер нужной строки и начинаете ее разбивать.
Как разбить?
Определяете первый пробел в строке (при условии, что поиск велся по одному слову), после этого начиная с той же позиции указателя, ищете первую попавшуюся цифру, и считываете все до следующего пробела (вернее, через 1 пробел.) в строковую переменную. Как только дошли до пробела, добавляете к строковой переменной перевод каретки и переход на новую строку. Продолжаете поиск в исследуемой строке до следующего пробела ... и т.д., пока не встретите символ Eoln. Как только попался Eoln, строка прочитана.
p.s. в принципе, жизнь будет гораздо проще, а программа "красивше и продвинутистей", если метки отделить от перечислимых элементов каким-нибудь заковыристым символом, типа двоеточия, решетки и т.п. Тогда можно вести поиск хоть по целым абзацам. :)
p.p.s. Как только встретите символ EoF, можно закрывать программу и идти курить. :D
 
Всем большое спасибо за помощь, но если еще кто надумает написать то пишите, я думаю заинтересованных людей хватает...
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab