LastDeath 0 Denunciar post Postado Março 13, 2011 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
Delutto 0 Denunciar post Postado Abril 1, 2011 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