Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

LastDeath

Problema Com Threads

Recommended Posts

Ola, sou novo aqui, e novo em programaçao, programo por diversão, estou criando um programa que realiza buscas no hd por arquivos com nomes ou extensões que estarão listadas em ums listbox.

 

bom, o fato é que eu consegui criar uma rotina que faça isso, porem quando realizada o programa trava, foi quando me sugeriram usar o recurso das threads, bom, pesquisei e comeceia transferir o codigo para uma thread, mas ae tropecei em um problema que nao consigo resolver, ja modifiquei o codigo varias vezes e ja encontrei diversos erros, agora o erro que persist é o conhecido "List index out of Bounds(0)", que é encontrado na seguinte unit.

 

unit Unit7;

interface

uses
 Classes, Sysutils;

type
 MinhaThread = class(TThread)
 private
   { Private declarations }
 protected
   procedure Execute; override;
   procedure FindFiles(FilesList: TStringList; StartDir, Mascara: string;
     IncludeRoot: boolean);
     procedure continuarproc;
   procedure AtualizaBusca;
   procedure AtualizaResult;
   procedure copiar;
 end;

var
 startdir, mascara: string;
 includeroot : boolean;
 ListaDir, LComparar, FilesList: TStringList;
 SR: TSearchRec;
 IsFound: boolean;
 i, l: integer;

implementation

uses unit5;

procedure MinhaThread.Execute;
begin
 Fileslist := TStringList.Create;
 LComparar := TStringList.Create;
 synchronize(copiar);
 FindFiles(FilesList, 'c:', '*.*', True);
 { Place thread code here }
end;

procedure MinhaThread.FindFiles(FilesList: TStringList; StartDir, Mascara: string; IncludeRoot: boolean);
begin
 if length(StartDir) <> 0 then
   if StartDir[length(StartDir)] <> '\' then
   begin
     StartDir := StartDir + '\';
   end;
   for l := 0 to LComparar.Count - 1 do
   begin
     Mascara := LComparar[l];
     IsFound := FindFirst(StartDir + Mascara, faAnyFile - faDirectory, SR) = 0;
     while IsFound do begin
       FilesList.Add(StartDir + SR.Name);
       synchronize(AtualizaResult);
       IsFound := FindNext(SR) = 0;
     end;
     FindClose(SR);
   end;

  if IncludeRoot = true then
  begin
 // Cria lista de subdirectorio
  ListaDir := TStringList.Create;
  IsFound := FindFirst(StartDir + '*.*', faAnyFile, SR) = 0;
   while IsFound do begin
     if ((SR.Attr and faDirectory) <> 0) and (SR.Name <> '.') and (SR.Name <> '..') and (SR.Name[1] <> 'Windows') then
     ListaDir.Add(StartDir + SR.Name);
     synchronize(AtualizaBusca);
     IsFound := FindNext(SR) = 0;
   end;
   FindClose(SR);
   // Procura dentro da lista
   try
   for i := 0 to ListaDir.Count-1 do
   FindFiles(FilesList, ListaDir[i], Mascara, IncludeRoot);
   finally
   ListaDir.free;
   end;
end;
end;

procedure MinhaThread.copiar;
begin
 LComparar.Assign(form5.LComparar.Items);
end;

procedure MinhaThread.AtualizaBusca;
begin
form5.LProcurando.Items.Assign(ListaDir);
end;

procedure Minhathread.continuarProc;
begin

end;

procedure MinhaThread.AtualizaResult;
begin
 form5.LEncontrado.Items.Assign(FilesList);
end;

end.

 

Olhe, a finalidade do programa é realizar buscas no hd inteiro, pastas e sub-pastas, atras de arquivos listados em uma listbox, ou em algum arquivo.. algo assim, o fato é, eu preciso de uma unit, uma thread, que faça isso, Se alguem souber um rotina que faça isso em menos tempo, ou de forma mais simples do que a minha, por favor me passe, preciso para continuar com meu programa, ou então se alguem conseguir consertar minha rotina ficarei muito grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa! Beleza?!

 

Cara essa tua função para encontrar arquivos tá muito confusa, não entendi direito, em qual StringList que está dando o erro?

Para procura de arquivos sempre uso o componente TJvFindFiles do JEDI, é sem dúvida nenhuma o melhor método para procura de arquivos. Fica a dica.

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.