quarta-feira, 16 de março de 2011

Atualizando a biblioteca de componentes Indy no Delphi 7

Antes de explicar como fazer a atualização, vou contar a história que me levou a esta aventura =)

Depois de muito tempo afastado do desenvolvimento utilizando Delphi (atualmente desenvolvo apenas em J2EE), apareceu uma oportunidade para um freelancer nesta ferramenta. 
Enquanto o cliente não me informava a versão que eles utilizam em seu ambiente de desenvolvimento, fui atrás de uma para eu ir "brincando"... Foi então que descobri como o Delphi está diferente, atualmente na versão XE, ele está repleto de componentes muito úteis e com um editor mais prático e inteligente. Confesso que bateu uma saudade da minha época do "Delphão" hehehehe
Não resisti, baixei a versão XE para demonstração e descobri que estava um pouco "enferrujado" mas logo já estava me sentindo a vontade com o novo ambiente. Desenvolvi meu protótipo e era tudo felicidade, funcionando que era uma maravilha nos meus testes, mas foi então que recebi a notícia de que o cliente utilizava a versão 7...
Pensei comigo: "Tranquilo, uns poucos ajustes e tudo está resolvido!", doce ilusão...
Iniciei o processo e com uns pequenos ajustes já estava compilando, eu feliz da vida fui testar e para minha surpresa a funcionalidade de envio de e-mails que eu precisava não estava funcionando mais... revirei o código de ponta cabeça, procurei diferenças entre atributos e métodos, mas não obtive sucesso... apelei para o oráculo do Google e nada de uma solução...
Quando já estava perdendo as esperanças encontrei no site do projeto da Indy a seguinte frase: "Unfortunately, Indy 9 does not handle the plaintext+html+images scenerio as well as it should. Indy 10 handles it better..." Maldito Murphy! Não preciso nem dizer que o Delphi 7 utiliza a versão 9 e o XE a 10...

Menos mal, agora é só atualizar os pacotes e então deu-se início a uma nova aventura! E para ajudar quem precisa fazer essa atualização, segue abaixo uma "receitinha de bolo":

Execute o Delphi e acesse o menu Components > Install Packages e no diálogo que é apresentado procure pelo pacote Internet Direct (Indy) for Property and Component Editors, agora clique em remover.
Isto irá remover os componentes Indy do ambiente de desenvolvimento e eles não estarão mais disponíveis na paleta de componentes.

Agora feche o Delphi e acesse diretório onde ele está instalado. Na pasta Bin procure pelo arquivo dclindy70.bpl e remova-o, caso ele exista.

Existe a recomendação para remover também todos os arquivos binários e de código fonte da Indy antes da nova instalação, mas isto é complicado e um pouco arriscado. Por isso sugiro usar um macete para contornar esta questão, conforme explicarei mais abaixo.

Agora que já estamos com os componentes da versão antiga removidos, podemos efetivamente dar início a instalação dos novos componentes.

Primeiramente obtenha o pacote com a última versão diretamente no repositório do projeto: http://indy.fulgan.com/ZIP/ 
(No momento em que escrevo este guia, o pacote era Indy10_4599.zip)

Para facilitar os próximos passos vá até o diretório onde está instalado o Delphi, acesse a pasta Lib e crie dentro dela uma pasta com o nome Indy10. Agora descompacte dentro desta pasta o contéudo do pacote que você acabou de baixar.

Em Indy10\Lib execute o arquivo de lote Fulld7.bat para remover arquivos binários que não são referentes a versão 7 do Delphi.

Agora execute novamente o Delphi e abra individualmente os .dpk, compilando-os na seguinte ordem:
         1. IndySystem70.dpk (em Indy10\Lib\System)
         2. IndyCore70.dpk (em Indy10\Lib\Core)
         3. IndyProtocols70.dpk (em Indy10\Lib\Protocols)
         4. dclIndyCore70.dpk (em Indy10\Lib\Core)
         5. dclIndyProtocols70.dpk (em Indy10\Lib\Protocols)

Após compilar com sucesso os pacotes, você poderá conferir que foram gerados vários arquivos binários no diretório Indy10\D7 e agora será preciso apenas ajustar a Library path e já estaremos prontos para instalar os novos componentes!

Acesse o menu Tools > Environment options e selecione a aba Library. Agora adicione o caminho para Indy10\D7 em sua Library path

Aqui vai o macete que comentei anteriormente, para não ser necessário remover todos os binários e fontes da versão anterior, basta apenas colocar esta nova entrada antes de $(DELPHI)\Lib.


Através do menu Components > Install Packages, finalmente adicione os novos componentes disponíveis em Indy10\D7, na seguinte ordem:
    1. dclIndyCore70.bpl
    2. dclIndyProtocols70.bpl
Pronto, agora você está liberado para sair desenvolvendo seus aplicativos utilizando a última versão da biblioteca de componentes Indy!
Era isso pessoal, espero ter ajudado com este guia que explica os procedimentos para atualizar a Indy no Delphi 7. Mas não se desespere caso possua outra versão de Delphi, os passos serão muito semelhantes. Confira os detalhes em Indy 10 Installation Instructions, que é justamente a fonte onde aprendi as instruções descritas neste post.

Abraços e até a próxima!

20 comentários:

  1. Obrigado pela dica! Me resolveu um problemão porque a versão 9 da indy estava bugada.

    ResponderExcluir
  2. gostaria de saber se tem como instalar o componente indy no delphi xe

    ResponderExcluir
  3. Muito obrigado amigo!! funcionou direitinho.

    ResponderExcluir
  4. Fico feliz que este guia tenha ajudado todos vocês a resolverem este problema e instalarem o Indy corretamente!

    Abraços,
    Marco

    ResponderExcluir
  5. Vixi aqui não da certo de jeito nenhum

    ResponderExcluir
  6. Pena que você não se identificou, senão podia tentar ajudar a resolver o teu problema... =/
    Abraços, Marco

    ResponderExcluir
  7. Prezado Marco, fui na pasta do QuickReport e modifiquei o arquivo qrprev.pas e qrprev.dfm
    Gostaria de saber como atualizar no delphi. Já apliquei o build all no projet mas não funcionou.

    ResponderExcluir
  8. Olá Nilton,

    Se você fez uma alteração no código fonte do componente, será preciso fazer o build all no package do QuickReport e reinstalar o pacote de componentes dele.
    Após isso, faça novamente o build all no teu projeto para que as alterações tenham efeito nele!

    Era isso, espero ter ajudado.
    Grande abraço,
    Marco

    ResponderExcluir
  9. Parabens pela Iniciativa...

    Mas... (sempre tem um mas)... não deu certo.
    Quando vou instalar os Packages da um erro:
    Cannot load package "IndySystem70". It contains unit 'IdWinsock2', which is also containet in package 'indy70'

    ResponderExcluir
    Respostas
    1. Olá André,

      Estranho não ter funcionado contigo o processo de atualização. Inclusive antes de fazer o post, eu refiz todos eles para ter certeza que funcionava hehehe

      Mas vamos tentar te ajudar, antes de iniciar o processo você desisntalou qualquer outra biblioteca da Indy que estava instalada no Delphi? Neste post eu assumi que havia apenas a padrão, sem nenhuma outra tentativa anterior de instalação/atualização.

      Faz o seguinte então:
      - Desinstala qualquer versão de Indy que esteja no teu Delphi;
      - Fecha o Delphi;
      - Vai na pasta bin e remove todos arquivos .bpl que tenham indy no nome;
      - Agora refaça os passos de instalação conforme o post.

      Era isso, espero ter ajudado!
      Grande abraço,
      Marco

      Excluir
  10. Marco...

    Muito grato pela pronta resposta.
    Exclui os arquivos Indy, id???, fechei o delphi.

    Abri novamente e ai funcionou.. vlw

    ResponderExcluir
  11. Olá, espero que possa me ajudar. Fiz todo o processo, quando chega na hora de Install Packages, dclIndyCore70.bpl, dclIndyProtocols70.bpl, dá o seguinte erro: Ponto de entrada não encontrado. Não foi possível localizar o ponto de entrada do procedimento @idglobal@IndyStrToInt$qqrx17System@AnsiStringi na biblioteca de vínculo dinâmico Indysystem70bpl.
    Você pode me ajudar;
    Obrigado por compartilhar seu conhecimento.
    Jeová

    ResponderExcluir
    Respostas
    1. RESOLVIDO - Bom, como todo inexperiente, postei antes de tentar tudo o que poderia. Resolvi a questão da seguinte forma: Coloquei o Cd do Delphi fui em repair e desmarquei a opção do Indy. Procurei na hd todas as referencias ao Indy em c:\ dir /s indy*.*, dir /s dlcindy*.* e excluí todas as referências encontradas. Aí foi seguir seu tutorial e deu certo. Obrigado mais uma vez.
      Jeová

      Excluir
  12. Olá. estou tentando fazer a instalação mais no meu caso não é criado o diretório D7 dentro de indy10, este diretório é criado ao executar o fulld7.bat ? estou fazendo em uma MV será que pode ser isso?

    Obrigado!

    ResponderExcluir
    Respostas
    1. Olá DarkDuke, respondendo as tuas perguntas: sim, o diretório D7 é criado após executar o fulld7.bat e caso não esteja sendo criado tente repetir o processo desde o início novamente (descompactar e executar o .bat).
      Sobre o fato de executar em uma MV não é motivo para dar problema.

      Por garantia, baixei novamente o pacote agora e segui os passos descritos e tudo funcionou corretamente.

      Espero que tenha sucesso em sua nova tentativa!

      Abraço,
      Marco

      Excluir
  13. Parabéns pela sua publicação, bem objetiva e funcional!
    O único procedimento que eu faço de diferente, é após compilar todos os pacotes eu clico em instalar e em seguida mais nada.

    ResponderExcluir
  14. Olá,

    Parabéns pelo artigo!

    Estou estudando um componente Delphi para acesso a DropBox. O componente usa essa nova versão do Indy. Após dominar os fontes do componente e entender como acessar a API do DropBox, farei uma implementação em Free Pascal, para adicionar como broker no projeto Brook framework:

    http://brookframework.org

    Abraços,

    Silvio Clécio.

    ResponderExcluir
    Respostas
    1. Muito interessante o projeto do brookframework, parabéns Silvio!

      Abraços,
      Marco.

      Excluir
  15. o MEU NOME É LUIZ
    ESTOU TENDO PROBLEMA DE COMPILAÇÃO DO MEU APLICATIVO
    MENSAGEM:
    Build
    [Fatal Error] UTESTEIP.pas(8): Unit IdContext was compiled with a different version of IdSocketHandle.TIdSocketHandle

    ResponderExcluir
    Respostas
    1. estou com o mesmo problema Luiz, so que assim:

      [Fatal Error] CadTerceirosModelos.pas(8): Unit Udf was compiled with a different version of IdSMTP.TIdSMTP

      Alguém pode nos ajudar?????

      Excluir