![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Good Man |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 13.6.2002 Репутация: нет Всего: нет |
Допустим в определенном каталоге производится поиск. В каком-то из подкаталогов (на определенном файле) поиск был прерван. Как продолжить поиск с определенного места.
Поиск реализую функциями FindFirst и FindNext. Ищу текст в HTML-страницах.
|
|||
|
||||
| Song |
|
|||
![]() Sysman.ru ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1095 Регистрация: 2.6.2002 Репутация: 2 Всего: 4 |
Сохраните содержимое переменной TSearchRec и потом передавайте её снова на FindNext() это теория, не вижу причины почему не должно получиться.
-------------------- Прежде чем сказать "Невозможно", подумай, прав ли ты |
|||
|
||||
| TwoK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 259 Регистрация: 25.3.2002 Репутация: нет Всего: нет |
Могу предложить решение "в лоб" - сделать SearchRec : TSearchRec; глобальным, и по надобности делать FindNext по этой самой переменной.
Если ты нашел что-то (текст в html), а потом что-то с этим текстом делаешь (грузишь в StringList), то это не есть "прерывание поиска", и даже если ты выйдешь из этой функции (поиска файла), не сделав FindClose, эта самая глобальная SearchRec у тебя останется на том самом месте, где он остановился. Только потом не забудь FindClose гле-нибудь сделать, а то винды ругаться будут. При выходе из программы. Вот. -------------------- Говорят, что население в стране все меньше и меньше. А народу по утрам в метро почему-то все больше и больше... |
|||
|
||||
| TwoK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 259 Регистрация: 25.3.2002 Репутация: нет Всего: нет |
Гы... пока набивал уже того... опередили
-------------------- Говорят, что население в стране все меньше и меньше. А народу по утрам в метро почему-то все больше и больше... |
|||
|
||||
| TwoK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 259 Регистрация: 25.3.2002 Репутация: нет Всего: нет |
Admin, предлагаю внести в "Историю форума VINGRAD.RU" как два ответа, отправленые одновременно:-)
-------------------- Говорят, что население в стране все меньше и меньше. А народу по утрам в метро почему-то все больше и больше... |
|||
|
||||
| Good Man |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 13.6.2002 Репутация: нет Всего: нет |
Разъяснения: 1. Пользователь вводит искомый текст и нажимает "Поиск". 2. Процедура "SearchText" производит поиск HTML-файлов в заданной директории. 3. Если такой файл найден - загружаем его в TwebBrowser (процедура "FindAddress") и показываем найденный текст (функция "SearchInHtml"). 4. Если пользователь нажимает повторно "Поиск", то вышеперечисленные действия повторяются. |
|||
|
||||
| TwoK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 259 Регистрация: 25.3.2002 Репутация: нет Всего: нет |
1. Делаешь глобальный Boolean, который будет показывать факт "запустили поиск / не запустили поиск". Допустим, по умолчанию он false.
2. Соответственно на обработчике кнопки делаешь if / else на этот Boolean, и если этот Boolean = false, запускаешь FindFirst / FindNext пока не нашел и ставишь этот boolean в true 3. Соответственно если true, то делаешь _только_ FindNext (без FindFirst). Ну и дальше по обстоятельствам. Могу еще предложить динамическое переназначение обработчиков, но это, я так понимаю, как-нибудь потом... -------------------- Говорят, что население в стране все меньше и меньше. А народу по утрам в метро почему-то все больше и больше... |
|||
|
||||
| Good Man |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 13.6.2002 Репутация: нет Всего: нет |
А как же рекурсивный поиск!
Есть каталог, у него есть подкаталоги. Допустим поиск будет перерван в каком-то подкаталоге. Чтобы продолжить поиск нужно «досканировать» этот подкаталог и начать поиск в других подкаталогах. Так вот, прерывание поисковой функции вырубит всю рекурсию. И если затем опять вызвать функцию «SearchText», поиск будет произведен только в этом подкаталоге. Когда HTML-страница найдена и загружена в TWebBrowser, нужно как-то приостановить работу по поиску, а потом возобновить его. |
|||
|
||||
| TwoK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 259 Регистрация: 25.3.2002 Репутация: нет Всего: нет |
Мдя, сморозил я
-------------------- Говорят, что население в стране все меньше и меньше. А народу по утрам в метро почему-то все больше и больше... |
|||
|
||||
| TwoK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 259 Регистрация: 25.3.2002 Репутация: нет Всего: нет |
Ха, сообразил. Потоки и события!
Итак, основная идея. Делаешь отдельный поток. Делаешь событие какое-нибудь. Поиск файлов организовываешь в этом самом отдельном потоке, и как только текст найден, передаешь управление в основной поток, а там (в поиске) ставишь WaitForSingleObject на это событие. Ка только чел нажал "поиск" опять, выставляешь событие, и поиск продолжается. И вся твоя рекурсия останется. Если надо поподробнее, рубани еще разок, просто зря клавиши нажимать не хочется, вдруг ты с потоками работать умеешь, а я тут пораспишу дофига всего... -------------------- Говорят, что население в стране все меньше и меньше. А народу по утрам в метро почему-то все больше и больше... |
|||
|
||||
| Good Man |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 13.6.2002 Репутация: нет Всего: нет |
Посмотрел я примеры по синхронизации:
C:\Program Files\Borland\Delphi5\Demos\Threads\ C:\Program Files\Borland\Delphi5\Help\Examples\Prgrsbar\ В этих примерах особых аналогий, я не увидел.
1. Делаешь отдельный поток – Понятно. 2. Делаешь событие какое-нибудь – Не понятно. 3. Поиск файлов организовываешь в этом самом отдельном потоке – Как? 4. Передаешь управление в основной поток – Как передавать? 5. Cтавишь WaitForSingleObject на это событие – Как? Eсли можно TwoK, покажи наглядный пример. |
|||
|
||||
| Good Man |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 13.6.2002 Репутация: нет Всего: нет |
TwoK вот кое-что нашел из FAQ "Королевство Delphi":
ВОПРОС: Как сделать так, чтобы следующая рекурсивная функция (для поиска файлов) выполнялась в отдельном потоке:
ОТВЕТ:
Можно не использовать метод Synchronize, а создать еще одну компоненту TempList: TListBox, заполнить ее, а затем сделать List.Assign(TempList) (в основном потоке). Да, и не нужно менять текущий каталог, указывай путь к нему в функциях FindXXX |
||||
|
|||||
| Good Man |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 13.6.2002 Репутация: нет Всего: нет |
Если кто желает, могу сбросить полностью проект поиска файлов (размер - 36.5 КБ). Пишите: [email protected]
Вот пример использования потока, при поиске нужных файлов:
|
|||
|
||||
| новичок |
|
|||
|
Unregistered |
>Если кто желает, могу сбросить полностью проект поиска файлов (размер - >36.5 КБ). Пишите: [email protected]
А лучше выложить в инете. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |