Ir para conteúdo
Fórum Script Brasil
  • 0

Ler e Preencher DBGrid com Arquivo Texto de FTP com Thread!


Douglas Soares

Pergunta

Olá Pessoal, este é o meu primeiro post Tutorial aqui no Script Brasil, vou tentar passar para vocês, um jeito de ler um arquivo texto que foi baixado de um FTP, e Preencher um DBGrid com ele...

Primeiramente... Abra o Delphi ( :lol: ) EHEH! > Clique em File>New>Application

Adicione um Componente DBGrid, que fica na paleta DataControls, (é o primeiro icone da paleta), depois disso, adicione um componente ListBox emcima dele, (O ListBox para quem não sabe, fica na paleta Standar), e em seguida adicione um Memo, que fica na mesmo Paleta!

Acrescente um BitBtn em Baixo do DBGrid, e no Caption pode Colocar como Baixar, ou qualquer coisa.....

Adicione um ClientDataSet, e um DataSource (Paleta Data Acess.)

E por ultimo, adicione um IdFTP, na paleta Indy Clients!

Vai ficar mais ou menos assim!

dbgridftp.jpg

Salve o Projeto!

Clique em File>New>Other, e selecione uma Thread Object, e em ClassName coloque TDownloadThread

Vamos ao código da Thread!

unit unit1;

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 ApagaPasta(pasta: string);
procedure ClearMemos;
procedure Principal;
end;

implementation
uses ftp;

{ 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[i].ItemType of
     ditDirectory:
     begin
      Form1.Memo1.Lines.Add('Processando Diretório ' + IdFTPListItems[i].FileName);
      DownloadDirectory(idFTP, IdFTPListItems[i].FileName);
     end;

     ditFile:
     begin
      Form1.Memo1.Lines.Add('Baixando Arquivo ' + IdFTPListItems[i].FileName);
      idFTP.Get(IdFTPListItems[i].FileName, IdFTPListItems[i].FileName, true);
     end;
    end;
   end;

   if Directory <> '' then
   begin
    idFTP.ChangeDirUp();
    SetCurrentDir('..');
   end;
  finally
   DirListing.Free();
   IdFTPListItems.Free();
  end;
 end;

var idFTP: TIdFTP;
begin
 Form1.Memo1.Clear();

 idFTP := TIdFTP.Create(nil);
 try
  idFTP.Host := Host;
  idFTP.Username := Username;
  idFTP.Password := Password;
  idFTP.Connect();

  idFTP.ChangeDir(RemoteDir);
  ForceDirectories(LocalDir);
  SetCurrentDir(LocalDir);
  DownloadDirectory(idFTP);

  Form1.Memo1.Lines.Add('Concluido');

  idFTP.Quit();
 finally
  idFTP.Free();
 end;
end;

procedure TDownloadThread.ClearMemos;
begin
Form1.Memo1.Clear;
Form1.ListBox1.Clear;
end;

procedure TDownloadThread.Principal;
var
pastalocal : string;
f:TextFile;
linha:String;
ii:integer;
nomedolog : string;
begin
pastalocal := ExtractFilePath(Application.ExeName) + '\logs\';
if Form1.cdsIgrejas.Active then
while not Form1.cdsIgrejas.Eof do
Form1.cdsIgrejas.Delete
else
Form1.cdsIgrejas.CreateDataSet;
Form1.cdsIgrejas.Open;
if not DirectoryExists(pastalocal) then
ForceDirectories(pastalocal);
DownloadFTP('ftp.seusite.com.br', 'usuario', 'senha', 'pastaremota', pastalocal); //Pasta Remota é pasta q estão os arquivos TXT, por exemplo, se seu servidor quando é conectado no ftp, ele vem na pasta www, ai você cria uma pasta lá chamada LOGS, e então logs é o nome da sua pasta remota!
EnumFiles(pastalocal, '*.log', faanyfile - faDirectory, Form1.Listbox1.Items, False, False);
Form1.ListBox1.ItemHeight := 0;
for ii:=0 to Form1.ListBox1.Items.Count-1 do
begin
try
nomedolog := Form1.ListBox1.Items.Strings[ii];
AssignFile(f,pastalocal + nomedolog);
Reset(f);
   Readln(f,linha);
   Form1.cdsIgrejas.Append;
   Form1.cdsIgrejas.FieldByName('CODIGO').Value := StrToInt(linha);
   Readln(f,linha);
   Form1.cdsIgrejas.FieldByName('IGREJA').Text := linha;
   Readln(f,linha);
   Form1.cdsIgrejas.FieldByName('CIDADE').Text := linha;
   Readln(f,linha);
   Form1.cdsIgrejas.FieldByName('ESTADO').Text := linha;
   Readln(f,linha);
   Form1.cdsIgrejas.FieldByName('HORA').Text := linha;
   Readln(f,linha);
   Form1.cdsIgrejas.FieldByName('VERSAO').Text := linha;
   Readln(f,linha);
   Form1.cdsIgrejas.FieldByName('SISTEMA').Text := linha;
   Form1.cdsIgrejas.Post;
finally
Closefile(f);
end;
end;
Form1.Label21.Caption := 'No Momento Existem ' + IntToStr(Form1.ListBox1.Items.Count) + ' Igrejas Utilizando nossos Sistemas';
if Form1.cdsIgrejas.IsEmpty then
ShowMessage('No Momento ninguém está Utilizando Nossos Sistemas!');
end;

procedure TDownloadThread.Execute;
var
pastalocal : string;
begin
pastalocal := ExtractFilePath(Application.ExeName) + 'logs\';
ApagaPasta(pastalocal);
Synchronize(ClearMemos);
Synchronize(PRINCIPAL);
end;

end.
Agora, Votando ao Form1 Pego o ClientDataSet e o DataSource, e alterei o nome para, cdsIgrejas, e dtsIgrejas, respectivamente, va no DataSource e na propriedade DataSet, coloque o seu ClientDataSet. Agora, clique no seu ClientDataSet no objeto Fields, com o botão direito clique em New Field... Adicione um field chamado CODIGO do tipo INTEGER, agora adicione + 6 Fields do tipo String, na seguinte Ordem, IGREJA, tamanho 50, CIDADE, tamanho 30, ESTADO, tamanho 2, (HORA, tamanho 10, e tipo TIME), Versão, Tamanho 10, Sistema, tamanho 15. Campos Criados, vamos prosseguir! Salve todo o Projeto. Vá até a pasta do seu projeto, Copie o Arquivo ThreadDownload.pas, e coloque o na seguinte pasta: C:\Arquivos de Programas\Borland\Delphi7\Lib\ Depois de ter feito isso, abra o seu Form1 novamente, e e nas Uses Globais, declare DownloadThread, ou o nome da Thread que você colocou na pasta LIB. Após ter feito isso você terá que declarar isso em Private:
private
  download : TDownloadThread;
  public
    { Public declarations }
  end;

e no botão baixar coloque esse codigo no OnClick

download:=TDownloadThread.Create(false);

download.Priority:=tpNormal;

download.FreeOnTerminate:=true;

Falta uma coisa importante..

Vá até o DBGrid, na propriedade DataSource, selecione seu DataSource, logo após de 2 cliques no DBGrid, irá aparecer o editor de colunas, clique no botãozinho amarelo, escrito Add New, e adicione 7 Colunas!, vá na primeira coluna, e em FieldName, coloque Código, e nas outras colunas Siga esta Ordem...

IGREJA, CIDADE, ESTADO, HORA, VERSAO, SISTEMA.

Adicione um Label1, e renomeie ele para Label21.

e escreva no caption dele: No Momento ninguém está Utilizando Nossos Sistemas!

Agora vá no bloco de notas, e cole este texto

247

IGREJA DO SCRIPT BRASIL

SÃO PAULO

SP

12:28:58

6.5.1.6

FTP CLIENT

em seguida salve como 247.log

Carregue em seu Site! na pasta www, la você cria uma pasta chamada "logs", e em seguida coloque este arquivo la!

feito isso, vá ate a TDownloadThread, e altere essa linha conforme seus dados

DownloadFTP('ftp.seusite.com.br', 'usuario', 'senha', 'pastaremota', pastalocal); //Pasta remota altere para "logs", lembra que criou pasta logs la no seu ftp?! e em pasta local você decide o caminho local do seu computador!!!!

Aproveitem!!!

Vejam como Ficou!

ftpt.jpg

Este foi meu Primeiro Tutorial, não está muito bom!!!, Duvidas, é só Perguntar!!!!!

Vlw Galera!!!

Editado por Jonathan Queiroz
Adicionar tag's (Jonathan)
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...