| Предыдущая тема :: Следующая тема | 
	
	
		| Автор | Сообщение | 
	
		| qwerty1 Гость
 
 
 
 
 
 
 | 
			
				|  Добавлено: Вт Апр 13 2004 10:48    Заголовок сообщения: FindFirst |   |  
				| 
 |  
				| У меня в программе необходимо выполнять поиск файлов. При использовании FinFirst и т.д. функций прога (если поиск долгий) полностью "виснет", не отрисовывается и т.д. Можете что-нибудь посоветовать как лучше всего производить поиск на жесткои диске?
 Программа на Дельфи (или Билдере, что одинаково).
 |  | 
	
		| Вернуться к началу |  | 
	
		|  | 
	
		| JibSkeart 
 
 
 Зарегистрирован: 13.04.2004
 Сообщения: 12
 Откуда: Из далекой галактики
 
 | 
			
				|  Добавлено: Вт Апр 13 2004 16:37    Заголовок сообщения: Re: FindFirst |   |  
				| 
 |  
				| выполнить процедуру в новом процессе/нити есть примеры в exemples
 
 ну а я могу вам предложить только
 свой вариант на BCB++
 
 
 class TFindFile : public TThread
 {
 private:
 AnsiString FFindFile;
 public:
 __fastcall TFindFile(AnsiString FileName):TThread(true)
 {
 FFileName = FileName;
 }
 
 void __fastcall FindFiles()
 {
 // сдесь ищем файл название его допустим в переменной FFileName
 };
 virtual void __fastcall Execute(void)
 {
 try
 {
 Synchronize(FindFiles);
 }
 catch(Exception &e)
 {
 ShowMessage("Ошибка "+ e.Message);
 }
 }
 };
 
 Юзаем
 
 TFindFile * FFiles new = TFindFile("test.txt");
 все, как обьект FFiles создался метод Execute автоматически выролняется,
 за дополнениеми читайте хелп, смотрие примеры.
 _________________
 -=JS=-
 |  | 
	
		| Вернуться к началу |  | 
	
		|  | 
	
		| SilverBlood Гость
 
 
 
 
 
 
 | 
			
				|  Добавлено: Вт Апр 13 2004 21:10    Заголовок сообщения: |   |  
				| 
 |  
				| для поиска файлов в директории dir по маске mask: 
 procedure SearchInDir(Mask, Dir: string; Subdir: Boolean; list: tstrings);
 var
 r: integer;
 f: TSearchRec;
 begin
 if Dir = '' then Exit;
 if Dir[Length(Dir)] <> '\' then Dir := Dir + '\';
 {$I-}
 ChDir(Dir);
 {$I+}
 if IOResult <> 0 then Exit;
 r := FindFirst('*.*', faAnyFile, f);
 while r = 0 do
 begin
 if MatchesMask(f.Name, Mask) then
 if (f.Name <> '.') and (f.Name <> '..') then
 list.add(ExpandFileName(f.Name));
 if (f.Attr and faDirectory) = faDirectory then
 if SubDir = True then
 begin
 if (f.Name <> '.') and (f.Name <> '..') then
 begin
 SearchInDir(Mask, ExpandFileName(f.Name), SubDir; list );
 ChDir(Dir);
 end;
 end;
 r := FindNext(f);
 end;
 FindClose(f);
 end;
 |  | 
	
		| Вернуться к началу |  | 
	
		|  | 
	
		| GREA 
 
 
 Зарегистрирован: 14.05.2003
 Сообщения: 758
 Откуда: Новосибирск
 
 | 
			
				|  Добавлено: Пт Апр 16 2004 19:59    Заголовок сообщения: |   |  
				| 
 |  
				| Возможно, поможет application.processmessages, вставленная внутрь цикла. |  | 
	
		| Вернуться к началу |  | 
	
		|  | 
	
		|  |