Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Как остановить поиск


Автор: Volkogriz 15.1.2009, 01:14
Доброе время суток!
Нашол код , пост http://forum.vingrad.ru/forum/topic-199609/kw-поиск-директории/0.html# .
Предложил уважаймый Данкинг.
Код

procedure FindFiles(StartFolder, Mask: string; List: TStrings;
  ScanSubFolders: Boolean = True);
var
  SearchRec: TSearchRec;
  FindResult: Integer;
begin
  List.BeginUpdate;
  try
    StartFolder := IncludeTrailingBackslash(StartFolder);
    FindResult := FindFirst(StartFolder + '*.*', faAnyFile, SearchRec);
    try
      while FindResult = 0 do
        with SearchRec do
        begin
          if (Attr and faDirectory) <> 0 then
          begin
            if ScanSubFolders and (Name <> '.') and (Name <> '..') then
              FindFiles(StartFolder + Name, Mask, List, ScanSubFolders);
          end
          else
          begin
            if MatchesMask(Name, Mask) then
              List.Add(StartFolder + Name);
            application.ProcessMessages;
              end;
          FindResult := FindNext(SearchRec);
        end;
    finally
      FindClose(SearchRec);
    end;
  finally
    List.EndUpdate;
  end;
end;


Как при нажатии кнопки отмена остановить поиск!?
С уважением,
Volkogriz!!!

Автор: Qu1nt 15.1.2009, 02:05
Попробуй добавить флаг в тело процедуры. Ну а по-хорошему - потоки, потоки... потоки!

Автор: Данкинг 15.1.2009, 02:31
Заводишь глобальную переменную и перед application.ProcessMessages проверяешь её значение. Если оно изменено, то exit - выход из процедуры. Значение же это меняется по нажатию на твою кнопку "стоп". 
Я объяснил сильно абстрактно, но суть должна быть ясна. smile 

Автор: Volkogriz 15.1.2009, 03:04
Всем спасибо!
)))
Поточьней мона? smile 
С уважением,
Volkogriz!!!

Автор: THandle 15.1.2009, 09:03
Volkogriz, а что тут, собственно говоря, точнее? smile

Заводишь глобальную переменную(пишешь там где у тебя var Form1: TForm1, или другие имена. Ну то есть где объявление переменной формы) и проверяешь в своей функции.
Типа:
Код

if MyVar then
  Exit;


А по нажатию какой то кнопки делаешь эту переменную равной true.

Что тут не ясно?smile
 честно говоря такой подход мне не нравится. ИМХО, лучше http://forum.vingrad.ru/forum/topic-60076.html. 

Автор: morpheyushka 15.1.2009, 13:03
Цитата(THandle @  15.1.2009,  09:03 Найти цитируемый пост)
ИМХО, лучше потоки. 

Согласен smile 

Автор: Frees 15.1.2009, 13:10
Цитата(THandle @  15.1.2009,  11:03 Найти цитируемый пост)
ИМХО, лучше потоки. 

чем лучше?

Автор: THandle 15.1.2009, 15:27
Frees, ну представим ситуацию. У нас на форме кнопка и мемо. И есть диск на котором до фига и больше файлов.
Запускаем код в одном потоке, со всеми Application.ProcessMessages. 
В этом коде все найденные файлы добавляются в Memo.
Что мы имеем?
При перетаскивании мемо уже не обновляется.
Закрыть приложение не реально. Какие-то другие действия делать?  smile 

теперь делаем еще одно такое же приложение, только поиск файлов осуществляем в потоке и при каждом найденном делаем Synchronize в Мемо, добавляя строчку.
Что имеет тут? Никаких проблем из первого варианта у нас нет smile
И хоть пример довольно корявый, но все равно при замере времени выполнения с GetThreadTimes оказалось что с отдельным потоком работает в среднем на ~15% быстрее.

Так что... smile 

Автор: bems 16.1.2009, 21:00
Цитата(THandle @  15.1.2009,  15:27 Найти цитируемый пост)
при каждом найденном делаем Synchronize в Мемо, добавляя строчку.
а еще лучше пачками, не чаще двух раз в секунду

Автор: Volkogriz 17.1.2009, 22:29
Доброго времени суток!
Всем огромное спасибо!
Цитата(bems @  16.1.2009,  21:00 Найти цитируемый пост)
а еще лучше пачками, не чаще двух раз в секунду

А уточнить мона!?  smile 

Автор: bems 18.1.2009, 12:21
Цитата(Volkogriz @  17.1.2009,  22:29 Найти цитируемый пост)
А уточнить мона!? 
можна, но не стоит. Сделай просто шоб работало. smile 

Автор: Volkogriz 18.1.2009, 17:49
Спасибо!!!
Я зделал, работает!!!)))
Просто и другие варианты хочеться понять!
В учебниках толком не понять!!!)))
С уважением,
Volkogriz!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)