Olá galera, nesta Quick Tips, irei mostra como podemos atualizar o executável usando um FTP, ficando assim mais fácil incluir novas rotinas, corrigis bugs, sem ter que mandar para o e-mail do cliente, ou colocar em um link e o mesmo ter que atualizar manualmente.

Inicialmente iremos criar um arquivo no Bloco de Notas(NotePad), e salvar o arquivo como AtualizarExe.bat, feito isso vamos copiar o código abaixo :

@echo off
del "C:\Sistema JMS\JMS.exe"
copy "C:\JMS.exe" "C:\Sistema JMS\"
del "C:\JMS.exe"
echo ###################################
echo ###################################
echo ### ###
echo ### ###
echo ### Sistema foi atualizado com sucesso ###
echo ### ###
echo ### ###
echo ###################################
echo ###################################
pause
cd "C:\Sistema JMS"
start JMS.exe
exit 

Salve o arquivo, obviamente você deve fazer as adaptações necessárias para atualizar, como por exemplo mudar o diretório(C:\Sistema JMS) e o nome do executável(JMS.exe) desejado.

Vamos criar um formulário e salvar o mesmo como uFrmAtualizarFTP, agora iremos renomear o nome do formulário para FrmAtualizarFTP.

No uFrmAtualizarFTP, vamos adicionar agora :

  • IdFTP1: TIdFTP;
  • Panel1: TPanel;
  • SpeedButton1: TSpeedButton;
  • Panel2: TPanel;
  • Gauge1: TGauge;

Seu formulário ficará mais ou menos assim :

Formulário
type
TFrmAtualizarFTP = class(TForm)
IdFTP1: TIdFTP;
Panel1: TPanel;
SpeedButton1: TSpeedButton;
Panel2: TPanel;
Gauge1: TGauge;
private
{ Private declarations }
xTamanhoArquivo : Integer;
public
{ Public declarations }
end;
Neste momento vamos configurar o componente IdFTP1, no evento onCreate do Formulário vamos implementar o seguinte :
procedure TFrmAtualizarFTP.FormCreate(Sender: TObject);
begin
IdFTP1.AutoLogin := True;
IdFTP1.Host := 'ftp.empresa.com.br';

Vamos agora implementar dois eventos no componente IdFTP1, selecione o mesmo e localize o evento onWork, implemente o seguinte neste evento :

procedure TFrmAtualizarFTP.IdFTP1Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
begin
Gauge1.Progress := AWorkCount;
Application.ProcessMessages;
end;

Agora com o IdFTP1 ainda selecionado vamos localizar o evento onWorkBegin e nele vamos implementar o seguinte:

procedure TFrmAtualizarFTP.IdFTP1WorkBegin(ASender: TObject;
AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
Gauge1.Progress := 0;
if AWorkCountMax > 0 then
Gauge1.MaxValue := AWorkCountMax
else
Gauge1.MaxValue := xTamanhoArquivo;
Application.ProcessMessages;
end;
procedure TFrmAtualizarFTP.SpeedButton1Click(Sender: TObject);
begin
Try
Try
IdFTP1.Connect;
xTamanhoArquivo := IdFTP1.Size('public_html/JMS.exe');
IdFTP1.Get('public_html/JMS.exe', 'C:\JMS.exe',True, False);
WinExec('AtualizarExe.bat',SW_NORMAL);
Application.Terminate;
Finally
IdFTP1.Disconnect;
end;
Except
on E : exception do
begin
raise Exception.Create('Erro ao conectar FTP' + #13 +
'Mensagem : ' + E.Message + #13 +
'Classe ' + E.ClassName );
end;
end;
end;

Com isso poderemos, colocar o exe dentro de um FTP particular e dizer qual é o caminho que ele se encontra no meu caso estou usando 'public_html/JMS.exe', faça aqui também suas adaptações.

Fico por aqui ate à próxima Quick Tips. Baixe o exemplo completo neste post.

Um abraço.