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

Тема в разделе "Delphi - FAQ", создана пользователем SSSS, 3 авг 2008.

  1. SSSS

    SSSS Гость

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

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

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

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

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

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

    Заранее спасибо!!!
     
  2. Silver Wind

    Silver Wind Гость

    А что конкретно не понятно?
    В обработчике OnChange Edit`a проводишь поиск по заранее загруженному файлу и готовишь информацию, которую затем выводишь в Memo.
    Единственный момент, который надо продумать как следует это как быстро такой поиск будет работать с файлом хотябы в пару мегабайт, наверное заранее отсортировать информацию, чтобы пользователь затем не плевался от того факта что после ввода очередной буквы надо ждать полчаса отображения информации.
     
  3. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Мне кажется ему нужна сама реализация программы. То есть, он хочет дождаться самого кода поиска типа:
    Код (Text):
    While NOT EoF(F) Do
    Begin
    ReadLn(f,st);
    While Pos(Edit1.Text, st) Do
    ...
    End.
    Честно говоря написал бы, но лень, ведь код программы-то получится не маленький.
     
  4. SSSS

    SSSS Гость

    Ладно с поиском еще можно что-то придумать, а как быть чтоб он в Мемо1 вставлял строчку которая после пробела, причем именно строчку а не весь дальше идущий текст! Суть я понимаю какая но как это реализовать? Необходимо чтобы он при совпадении слова на 100% проверял какой сисвол после него и если там пробел а не очередной символ то он вставляет в Мемо последующий текст который идет до конца строки, а не до конца всего документа.
     
  5. Silver Wind

    Silver Wind Гость

    Все еще не понимаю в чем проблема.
    Копировать часть строки - функция Copy(), обратиться к символу строки str по индексу так - str[index], найти подстроку в строке - функция Pos().
    Этих инструментов вполне достаточно.
     
  6. SSSS

    SSSS Гость

    Видимо я не догоняю или ты меня не так понял. Насчет поиска тоже я щас подумал и понял что он не сработает т.к. он будет искать по всему файлу и это словоможет встретиться и далее но уже не как искомое а просто по тексту. Я еще раз приведу пример и если твое мнение не изменится, значиту меня туго с этим :)

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

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

    Мне необходимо чтоб производился поиск именно по первым словам т.е. по Розе и Цвету, а если искать везде то он найдет и слово Цвет в Розе, а мне нужны только слова до пробела чтоб сравнивалось, а то что после пробела выводилось в Мемо.
     
  7. Silver Wind

    Silver Wind Гость

    Ну и замечательно что в файле много строк, еще замечательнее будет, если они по алфавиту отсортированы, тогда двоичный поиск можно использовать, чтобы найти нужную строку.
    А так в общем виде - грузим наш файл в TStringList и работаем с отдельными строками.
     
  8. astronom

    astronom Гость

    Эту программу лучше сразу на Ассемблере писать ... хотя бы есть шанс, что она хоть когда-нибудь закончится в случае работы с файликом в пару мегабайт. :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
     
  9. SSSS

    SSSS Гость

    Всем большое спасибо за помощь, но если еще кто надумает написать то пишите, я думаю заинтересованных людей хватает...
     
Загрузка...

Поделиться этой страницей