Ir para conteúdo
Fórum Script Brasil

Douglas Soares

Veteranos
  • Total de itens

    864
  • Registro em

  • Última visita

Tudo que Douglas Soares postou

  1. Nossa, quantas vezes sofri com isso, pelo que eu sei não tem jeito, a não ser que exista algum componente que faça isto, de qualquer forma vou continuar procurando... abraços!
  2. Deu Problema em outras coisas?, expecifique, que erro deu agora?, o que aconteceu? Abraços!
  3. :blink: nem da, xD, to no serviço, meu pai (CHEFE) até concordaria, xD, mas não da pra instalar todos os componentes do D7 no Delphi 2009, huhuhuuh!!! vamos achar um outro jeito, :blush: huhauha! Vlws
  4. Deve ser isso, porem eu nunca fiz isso, ahuhauha, da pra me falar como faz?
  5. Infelizmente não deu certo, eu tento instalar o componente da uns par de erro!, olha só [Error] FtpConnection.pas(229): Undeclared identifier: 'Code' [Error] FtpConnection.pas(230): Undeclared identifier: 'Code' [Error] FtpConnection.pas(303): Too many actual parameters [Error] FtpConnection.pas(373): Too many actual parameters [Error] FtpConnection.pas(404): Undeclared identifier: 'SupportsVerification' [Error] FtpConnection.pas(413): Undeclared identifier: 'VerifyFile' [Fatal Error] FtpListView.pas(202): Could not compile used unit '..\..\..\..\Documents and Settings\Douglas Soares\Desktop\btvisualftp\source\FtpConnection.pas' Huauhshas, sem ideias, não sei como arrumar esse negocio de componente, mas vlw a tentativa galera, vocês são d+ Abraços!
  6. 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! 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 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! Este foi meu Primeiro Tutorial, não está muito bom!!!, Duvidas, é só Perguntar!!!!! Vlw Galera!!!
  7. Creio que você deve fazer isso: F_DMExpress.Cds_Pagamento.FieldByName('VLTOTAL').Value := FloatToStr(EditValor.Text); e para o outro erro: 'Unable to find record. No key specified' Você deve ter um primary key no seu banco de dados, no caso seria uma tabela chamada codigo por exemplo!, vá até ela atravez do Cds_Pagamento, então vá em Fields, e ache o seu campo "CODIGO", clique nele, e na propriedade provider flags, você precisa setar a opção 'pfInKey' para True. Abraços!
  8. No banco de dados está vindo caracteres no final de algumas linhas, é isso?, se for você pode aprender um pouco mais aqui http://pt.wikipedia.org/wiki/Codifica%C3%A...o_de_caracteres. se isso não te ajudar, veja este outro tópico aberto, pode ser o mesmo problema que o seu! http://scriptbrasil.com.br/forum/index.php?showtopic=106725 Abraços!
  9. Legal, já que resolveram seu problema, teria como colocar um (Resolvido) no começo do titulo do post? ehehe! Abraços!
  10. Não consegui usar esse componente, nem o de 30 dias, <_< , será que alguém ai tem um modelo pronto para me mandar as fontes?, pode ser com IdFTP mesmo! ou um componente q eu saiba usar, eheh! Abraços!
  11. Ae Galera, to tentando fazer um programa FTP no delphi 7, basicamente vou usar um ShellListView do lado esquerdo <<, que será as pastinhas e os arquivos, do lado direito >>> ficara as pastas remotas, nem sei q componente eu uso :wacko: , embaixo do comp. q vai fika na direita, vai ter os logs.... ou seja, tudo q ele for fazendo, q no caso é o status?, e por ultimo, um otro componente q vai ficar embaixo desse, q vai ser os arquivos a serem transferidos, ou seja, eu pego os arquivo da esquerda e arrasto para esse componente, e então ele manda para a pasta q ta aberta no site, tudo isso com gauge, tempo, taxa de transferencia, etc!!! queria no estilo do cuteftp, se alguém tiver um modelo já pronto, ou me ajudarem a começar esse negocio, ehehe!, desde já agradeço! Abraços!
  12. Legal, então mais um vez seguindo seu exemplo, para ajudar o cara vo fazer no modelo dele, huahua! procedure TfrmComAss.Button1Click(Sender: TObject); begin adqfiltro.Active := false; adqfiltro.SQL.Clear; adqfiltro.SQL.Append('SELECT * '+ 'FROM LANCAMENTO WHERE DATA BETWEEN ' + '''' + FormatDateTime('mm/dd/yyyy',calDI.Date) + ''''+' AND '+ ''''+ FormatDateTime('mm/dd/yyyy',calDF.Date) + ''''); showmessage(adqfiltro.SQL.Text); adqfiltro.Active := true; end; Dessa forma, creio que ele vai filtrar só por datas, creio que você não quer só assim.... Explica ai certinho, como você quer?, filtrar o que?, data?, nome?, hora? ahh... se não for pedir muito da pra você carrega sua fonte e posta o link aqui pra gente analisar? beleza... mais uma vez tentei ajudar com minha ignorancia... xD...
  13. Boa Resposta Jhonas, analisando o q você disse e adptando ao codigo do léo, creio que ficaria assim: SELECT * FROM LANCAMENTO WHERE DATA BETWEEN :DATEI AND :DATAF Adaptando ao seu problema ficaria assim: adqfiltro.close; adqfiltro.SQL.Clear; adqfiltro.SQL.Add('SELECT * ' + 'FROM ' + 'LANCAMENTO ' + 'WHERE ' + 'DATA BETWEEN :DATAI AND :DATAF ; adqfiltro.FetchParams; adqfiltro.Params.ParamByName('DATAI').AsDate := calDI.Date; adqfiltro.Params.ParamByName('DATAF').AsDate := calDF.Date; adqfiltro.Open; Ve se você consegue usar uma SQLQry, pois com AdoQry não tenho a minima ideia de como eu faria isso! Vlws!!!
  14. No caso usei uma SQLQry, que fica na paleta dbExpress, o cds, no caso é um ClientDataSet, que no caso fica na paleta Data Acess, no seu caso fico meio confuso. Você usou meu exemplo, e agora ele filtra só pela data, é isso?, ou não?, como seria então? explica melhor ai eu vo tenta te ajuda, falou!
  15. Ae garoto, não sei se resolveu o seu problema ainda, não entendo muito, porem o pouco que sei tentarei passar para você, pois tive a mesma dificuldade na hora de fazer uma pesquisa em SQL com datas!!! Veja o que eu tive que fazer! qryOcorre.SQL.Clear; qryOcorre.SQL.Add('SELECT CLIENTE, HISTORICO, ATENDENTE, DATA ' + 'FROM ' + 'OCORRE ' + 'WHERE ' + 'ATENDENTE = :USUARIO ' + 'AND (DATA >= :DATAI AND DATA <= :DATAF)'); //DATAI é a Data Inicial, e DATAF é a Data Final! cdsOcorre.FetchParams; cdsOcorre.Params.ParamByName('USUARIO').AsString := lkpAtendentes.Text; // Tenho um Campo Usuario, e seto o parametro para ser o valor que está no lkpAtendentes! cdsOcorre.Params.ParamByName('DATAI').AsDate := DataInicial.Date;// DataInicial é um DateTimePicker cdsOcorre.Params.ParamByName('DATAF').AsDate := DataFinal.Date;// DataFinal tambem é um DateTimePicker! cdsOcorre.Open;// agora eu abro e boa! Ve o que você pode fazer com esse codigo q eu fiz!!! Adapte ele! ehehehe Vlw! Ou seja, adaptando á seu codigo, creio que ficará assim: adqfiltro.close; adqfiltro.SQL.Clear; adqfiltro.SQL.Add('SELECT * ' + 'FROM ' + 'LANCAMENTO ' + 'WHERE ' + '(DATA >= :DATAI AND DATA <= :DATAF)'); //DATAI é a Data Inicial, e DATAF é a Data Final! adqfiltro.FetchParams; adqfiltro.Params.ParamByName('DATAI').AsDate := DataInicial.Date;// DataInicial é um DateTimePicker adqfiltro.Params.ParamByName('DATAF').AsDate := DataFinal.Date;// DataFinal tambem é um DateTimePicker! adqfiltro.Open;// agora eu abro e boa! Tenta fazer assim no seu botão?, ahh sei lá, tentei ajudar, se não estiver correto podem me corrigir por favor! ehehe! Abraços!!!!
  16. Cara, você é demais sabe tudo, pena q eu não sei nem 1/10 do seu conhecimento ehehehe, Puxa, mesmo com sua explicação detalhada e correta, eu tava sofrendo um pouquinho!, hauhauhaua, eu mudava umas coisas pensando q n tinha nada haver, mas tava certo, então eu revirei mechi, e funcionou!!!!, eu nem sabia q dava pra por o const como global depois das USES, eheheheheh, pro se ver como o cara manja aki, huahuahau, então cara, mt obrigado mais uma vez pela ajuda!!! Precisando estamos ai!!!!!!!!!! VLWWWWWWWWWWWWWW :lol: :lol: :lol:
  17. Ae manin, mt obrigado, tipo, não funcionou porque o meu programa as vezes vai para o tray, no entanto, eu preciso fazer o que você me disse e acrescentar mais esse código, porem não tenho ideia de onde por... Application.ShowMainForm := True; FrmPrincipal.TrayIcon1.ShowApp := True; Application.Restore; Application.BringToFront; FrmPrincipal.OcultarJanela1.Visible := True; FrmPrincipal.MostrarJanela1.Visible := False; VLW MAIS UMA VEZ
  18. Olá, esse é meu segundo tópico aqui no Script Brasil, fiquei muito contente, pois a agilidade do pessoal daqui do forum é muito boa, pois meu primeiro tópico, foi rapidamente respondido. Vamos lá: :lol: No DPR do programa eu verifico se o programa já está em execução, aqui vai um trecho do codigo! Var HprevHist : HWND; MutexHandle : THandle; function OneInstanceAndRunning: Boolean; begin result := false; if (MutexHandle <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then begin MessageDlg('O Programa já está em Execução nessa Maquina!', mtWarning, [mbOK], 0); result := true; end; end; begin MutexHandle := CreateMutex(nil, True, 'Administra'); if OneInstanceAndRunning then begin CloseHandle(MutexHandle); Halt; end; try Application.Initialize; Application.Title := 'Administra'; frmAbertura := TfrmAbertura.Create(Application); // Cria o form de abertura frmAbertura.Show; frmAbertura.Update; Application.CreateForm(TfrmPrincipal, frmPrincipal); Application.CreateForm(TdtmPrincipal, dtmPrincipal); frmAbertura.Hide; frmAbertura.Free; Application.Run; finally if LongBool(MutexHandle) then CloseHandle(MutexHandle); end; Ele verifica certinho, até me da a mensagem e depois fecha! Porem quero ir além disso.... Se ele já estiver em execução gostaria de Restaurar a janela dele e passar mais alguns comandos meus.... será que teria um jeito de fazer isso? Se tiver desde já agradeço... Obrigado!
  19. Cara, você é ninja mesmo :ninja: , eu fiz isso que me disse, e declarei szStatus como string, puxaa ficou até mais rapido, :rolleyes: , você teria um MSN para contato, tenhos algumas duvidas em relação ao mesmo programa...., se puder me passar beleza, o meu é douglas-soares@live.com, mt obrigado pela, ajuda........ PRECISANDO, estamos ai! VLW MESMO :lol:
  20. :wacko: UHUHU, por incrivel que parece eu consegui fazer!!!, CARA QUERO AGRADECER MUITO PELA AJUDA!!!!!!!!!!!!!!!!!! VLW CHURC!! você é d+....... vou postar o codigo para analise, agora está correto! toma ai :rolleyes: 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); procedure ClearMemos; procedure Principal; 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.ClearMemos; begin FrmPrincipal.Memo1.Clear; FrmPrincipal.Memo2.Clear; FrmPrincipal.ListBox1.Clear; end; procedure TDownloadThread.Principal; var local : string; f:TextFile; linha:String; ii:integer; nomedolog : string; begin local := ExtractFilePath(Application.ExeName) + '\logs\'; 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.site.com.br', 'usuario', 'senha', 'pastaremota', local); //local é uma variavel 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; procedure TDownloadThread.Execute; var local : string; f:TextFile; linha:String; ii:integer; nomedolog : string; begin local := ExtractFilePath(Application.ExeName) + '\logs\'; ApagaPasta(local); Synchronize(ClearMemos); Synchronize(PRINCIPAL); end; end.
  21. :blink: Vo tentar aqui, muito obrigado pelas dicas, em seguida respondo... vlw
  22. Obrigado pelo Dica, vou tentar aqui, depois edito pra falar o resultado. ______________________________________________________________ É o Seguinte, estou meio confuso em relação a sincronização de forms via thread, teria como me explicarem melhor como fazer? Não faz sentido o que eu tento fazer.... :wacko: , Por favor se puderem me ajudar novamente.... Obrigado!
  23. 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:
×
×
  • Criar Novo...