[Delphi] Atualização Automática – Parte 2 – Projeto

Estavam ansiosos pela segunda parte dessa série de artigos, não é? 🙂
Em continuidade ao artigo anterior, prosseguiremos com o tutorial de implementação de atualização automática em um projeto Delphi. A primeira parte abordou apenas os recursos de apoio, como o registro em um serviço de hospedagem, instalação do FileZilla e criação dos arquivos INI. Hoje, partiremos para a codificação!

Projeto

Em primeiro lugar, um atualizador automático exige, claro, uma tela de atualização. Para exemplo, faremos uma tela simples. Crie um novo formulário e adicione os seguintes componentes:

Além disso, para acessar o diretório FTP, utilizaremos o componente TIdFTP, da paleta IndyClients. Arraste este componente para a tela de atualização e configure as seguintes propriedades:

  • Host: endereço do FTP, fornecido no FreeWHA (veja a parte 1 dessa série)
  • Username: login do FTP, geralmente o mesmo que o host
  • Password: senha do FTP
  • Passive: True
  • TransferType: ftBinary

Codificação

Declare também uma variável de classe chamada FTamanhoTotal. Ela será útil nos eventos do componente TIdFTP:

Para manter o código limpo, precisaremos também de uma função que irá nos retornar o diretório em que se encontra o executável:

Para ignorar as exceções de “Connection Closed Gracefully”, disparada por alguns servidores, inclua a unit IdException na uses. Ela será necessária no bloco except.

O próximo método a ser implementado é a conexão com o servidor FTP, envolvido em um bloco try/except para tratar possíveis exceções:

Leitura dos arquivos INI

Em seguida, implementaremos dois métodos: um para ler o número da versão instalada no cliente e outro para ler o número da versão mais recente da aplicação, disponível no FTP. Como essas informações estão armazenadas em arquivos INI, usaremos a classe TIniFile para abri-los e o método ReadString para retornar o valor da chave.

  • ObterNumeroVersaoLocal:

  • ObterNumeroVersaoFTP:

Download do pacote de atualização

Agora, segue a definição do método que irá baixar o arquivo de atualização (executável) do servidor FTP. Para isso, atente-se ao uso do Get do componente TIdFTP, que consiste em buscar o arquivo do servidor e gravá-lo em um diretório no disco. Repare que o Get também foi utilizado no método anterior para baixar o arquivo INI.

Quando a atualização é baixada, precisamos descompactá-la para substituir o executável existente pelo novo executável. Essa operação pode ser realizada através do método RenameFile, para renomear o executável desatualizado, e pelo ShellExecute, para descompactar a atualização utilizando a linha de comando do 7-Zip.

Por fim, é necessário atualizar o número da versão no arquivo INI local. Este procedimento mantém o usuário informado de que está com a versão mais recente da aplicação e garante que a mesma atualização não seja baixada novamente.

Barra de progresso

Opa, mas espere aí… lembram-se que adicionamos um componente TProgressBar na tela de atualização? Pois bem, para aprimorar a usabilidade da nossa tela de atualização, exibiremos o progresso do download nesse componente e um contador de porcentagem. Que chique, hein?

Para isso, no evento OnWorkBegin do componente TIdFTP, implemente o código abaixo, responsável por ajustar o preenchimento da progress bar conforme o tamanho da atualização:

E, no evento OnWork, atualizaremos a progress bar enquanto a transferência do arquivo estiver em andamento:

Agora, sim, estamos prontos! Hora de fazer toda essa mágica funcionar.
No evento de clique do botão, utilizaremos todos os métodos criados acima para processar a atualização:

Para fazer um teste, é simples: no FTP, faça o upload do arquivo “Atualizacao.rar” (executável compactado) e incremente o número da versão no arquivo “VersaoFTP.ini” (por exemplo, de “1.0.0” para “1.0.1”). Agora é só clicar no botão de atualização e aguardar o processo!

Houve algum problema ou dificuldade na implementação do código acima? Fique tranquilo! Clique neste link e baixe um exemplo dessa funcionalidade (com alguns aprimoramentos) desenvolvido em Delphi XE7. Mesmo assim, na terceira e última parte dessa série de artigos, apresentarei algumas ressalvas, dicas e observações que talvez possam esclarecer possíveis dúvidas sobre essa funcionalidade.

 

Espero vocês na próxima semana para fecharmos esse assunto com chave de ouro!
Grande abraço!


Confira as outras partes desse artigo:

[Delphi] Atualização Automática – Parte 1
[Delphi] Atualização Automática – Parte 2
[Delphi] Atualização Automática – Parte 3


 

André Celestino