Boa Tarde Pessoal, sou novo nesse ramo, gostaria de pedir uma ajuda para vocês. Tenho um formulario e um DBGrid, Quando e aperto um botão, ele baixa todos os arquivos de uma pasta do meu FTP e em seguida associa um a um e coloca as informações no DBGrid, coluna por coluna, linha por linha....., porem esse processo trava o resto do programa, então resolvi fazer uma Thread.
Fiz a Thread, acho que corretamente =D, eu testo o botão, até funciona corretamente, o problema é que quando eu fecho o programa, ele da esse Erro, "O Identificador da Janela é Invalido", e então se puderem me ajudar, fico grato.
Pergunta
Douglas Soares
Boa Tarde Pessoal, sou novo nesse ramo, gostaria de pedir uma ajuda para vocês. Tenho um formulario e um DBGrid, Quando e aperto um botão, ele baixa todos os arquivos de uma pasta do meu FTP e em seguida associa um a um e coloca as informações no DBGrid, coluna por coluna, linha por linha....., porem esse processo trava o resto do programa, então resolvi fazer uma Thread.
Fiz a Thread, acho que corretamente =D, eu testo o botão, até funciona corretamente, o problema é que quando eu fecho o programa, ele da esse Erro, "O Identificador da Janela é Invalido", e então se puderem me ajudar, fico grato.
Segue o Codigo da Thread:
unit DownloadThread;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, jpeg, ExtCtrls, Gauges, ShellApi, WinSock, registry,
Grids, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdFTP, WinInet,
ComCtrls, IdFTPList, DB, DBClient, DBGrids;
type
TDownloadThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure EnumFiles(szPath, szAllowedExt: String; iAttributes: Integer;
Buffer: TStrings; bClear, bIncludePath: Boolean); StdCall;
procedure DownloadFTP(Host, Username, Password, RemoteDir, LocalDir: string);
procedure OnFTPStatus(ASender: TObject; const AStatus: TIdStatus; const AStatusText: string);
procedure ApagaPasta(pasta: string);
end;
implementation
uses PaineldeControle;
{ TDownloadThread }
procedure TDownloadThread.ApagaPasta(pasta: string);
var
Arquivo: TSearchRec;
begin
if FindFirst(pasta+'*.*', 0, Arquivo) = 0 then
begin
repeat
DeleteFile(pasta+Arquivo.Name);
until FindNext(Arquivo) <> 0;
FindClose(Arquivo);
end;
end;
procedure TDownloadThread.EnumFiles(szPath, szAllowedExt: String; iAttributes: Integer;
Buffer: TStrings; bClear, bIncludePath: Boolean); StdCall;
var
res: TSearchRec;
szBuff: String;
begin
if (bClear) then Buffer.Clear;
szPath := IncludeTrailingBackslash(szPath);
if (FindFirst(szPath + szAllowedExt, iAttributes, res) = 0) then
begin
repeat
szBuff := res.Name;
if ((szBuff <> '.') and (szBuff <> '..')) then
if (bIncludePath) then
Buffer.Add(szPath + szBuff) else
Buffer.Add(szBuff);
until FindNext(res) <> 0;
FindClose(res);
end;
end;
procedure TDownloadThread.DownloadFTP(Host, Username, Password, RemoteDir, LocalDir: string);
procedure DownloadDirectory(idFTP: TidFTP; Directory: string = '');
var i: integer;
DirListing: TStringList;
IdFTPListItems: TIdFTPListItems;
begin
// update the GUI
Application.ProcessMessages();
// avoid trying to move to and copy current or parent dir
if (Directory = '.') or (Directory = '..') then
exit;
if Directory <> '' then
try
// change to directory remotely
idFTP.ChangeDir(Directory);
// create and change to directory locally
CreateDir(Directory);
SetCurrentDir(Directory);
Directory := IncludeTrailingPathDelimiter(Directory);
except
exit;
end;
DirListing := TStringList.Create();
IdFTPListItems := TIdFTPListItems.Create();
try
idFTP.List(DirListing);
IdFTPListItems.LoadList(DirListing);
for i := 0 to IdFTPListItems.Count - 1 do
begin
case IdFTPListItems.ItemType of
ditDirectory:
begin
FrmPrincipal.Memo2.Lines.Add('Processando Diretório ' + IdFTPListItems.FileName);
DownloadDirectory(idFTP, IdFTPListItems.FileName);
end;
ditFile:
begin
FrmPrincipal.Memo2.Lines.Add('Baixando Arquivo ' + IdFTPListItems.FileName);
idFTP.Get(IdFTPListItems.FileName, IdFTPListItems.FileName, true);
end;
end;
end;
if Directory <> '' then
begin
idFTP.ChangeDirUp();
SetCurrentDir('..');
end;
finally
DirListing.Free();
IdFTPListItems.Free();
end;
end;
var idFTP: TIdFTP;
begin
FrmPrincipal.Memo1.Clear();
FrmPrincipal.Memo2.Clear();
idFTP := TIdFTP.Create(nil);
try
idFTP.OnStatus := OnFTPStatus;
idFTP.Host := Host;
idFTP.Username := Username;
idFTP.Password := Password;
idFTP.Connect();
idFTP.ChangeDir(RemoteDir);
ForceDirectories(LocalDir);
SetCurrentDir(LocalDir);
DownloadDirectory(idFTP);
FrmPrincipal.Memo2.Lines.Add('Concluido');
idFTP.Quit();
finally
idFTP.Free();
end;
end;
procedure TDownloadThread.OnFTPStatus(ASender: TObject; const AStatus: TIdStatus; const AStatusText: string);
begin
FrmPrincipal.Memo1.Lines.Add(AStatusText);
end;
procedure TDownloadThread.Execute;
var
local : string;
f:TextFile;
linha:String;
ii:integer;
nomedolog : string;
begin
local := ExtractFilePath(Application.ExeName) + '\logs\';
ApagaPasta(local);
FrmPrincipal.Memo1.Clear;
FrmPrincipal.Memo2.Clear;
FrmPrincipal.ListBox1.Clear;
if FrmPrincipal.cdsIgrejas.Active then
while not FrmPrincipal.cdsIgrejas.Eof do
FrmPrincipal.cdsIgrejas.Delete
else
FrmPrincipal.cdsIgrejas.CreateDataSet;
FrmPrincipal.cdsIgrejas.Open;
if not DirectoryExists(local) then
ForceDirectories(local);
DownloadFTP('ftp.dominio.com.br', 'usuario', 'senha', 'pastaremotaquevaibaixar', 'localquevaibaixar');
EnumFiles(local, '*.log', faanyfile - faDirectory, FrmPrincipal.Listbox1.Items, False, False);
FrmPrincipal.ListBox1.ItemHeight := 0;
for ii:=0 to FrmPrincipal.ListBox1.Items.Count-1 do
begin
try
nomedolog := FrmPrincipal.ListBox1.Items.Strings[ii];
AssignFile(f,local + nomedolog);
Reset(f);
Readln(f,linha);
FrmPrincipal.cdsIgrejas.Append;
FrmPrincipal.cdsIgrejas.FieldByName('CODIGO').Value := StrToInt(linha);
Readln(f,linha);
FrmPrincipal.cdsIgrejas.FieldByName('IGREJA').Text := linha;
Readln(f,linha);
FrmPrincipal.cdsIgrejas.FieldByName('CIDADE').Text := linha;
Readln(f,linha);
FrmPrincipal.cdsIgrejas.FieldByName('ESTADO').Text := linha;
Readln(f,linha);
FrmPrincipal.cdsIgrejas.FieldByName('HORA').Text := linha;
Readln(f,linha);
FrmPrincipal.cdsIgrejas.FieldByName('VERSAO').Text := linha;
Readln(f,linha);
FrmPrincipal.cdsIgrejas.FieldByName('SISTEMA').Text := linha;
FrmPrincipal.cdsIgrejas.Post;
finally
Closefile(f);
end;
end;
FrmPrincipal.Label21.Caption := 'No Momento Existem ' + IntToStr(FrmPrincipal.ListBox1.Items.Count) + ' Igrejas Utilizando nossos Sistemas';
if FrmPrincipal.cdsIgrejas.IsEmpty then
ShowMessage('No Momento ninguém está Utilizando Nossos Sistemas!');
end;
end.
DESDE JÁ AGRADEÇO!!! :lol: :lol: :lol:
Editado por Douglas_SoaresLink para o comentário
Compartilhar em outros sites
13 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.