Migração de aplicações
Aprenda a processar units adaptando seu código para compilar em versões mais recentes do Delphi
Na maioria das vezes, a migração de aplicações escritas em uma versão anterior do Delphi para uma versão mais recente é tranqüila e quase sempre totalmente transparente, sem a necessidade de alterar ou adaptar qualquer tipo de código, bastando apenas recompilar o projeto.
No entanto, com o lançamento do Delphi 6, a Borland efetuou diversas modificações no que diz respeito ao tratamento de variants, com o principal objetivo de viabilizar a compatibilidade com aplicações escritas em Kylix (Linux). Todas as rotinas para o tratamento desse tipo de variável passaram a integrar uma nova unit, chamada variants. Obviamente as versões 7 e 2005 seguem o mesmo padrão, mantendo a compatibilidade com projetos feitos no Delphi 6 e 7.
Se você é como eu, ainda tem alguns projetos feitos em Delphi 5. Particularmente considero essa umas das melhores versões do Delphi. No entanto, alguns desenvolvedores de componentes estão deixando o suporte ao Delphi 5 de lado,o que força a migração para versões mais recentes do Delphi,quando for feito o upgrade desses componentes de terceiros.
A fim de facilitar a vida do desenvolvedor, criei um pequeno utilitário que varre as units em um diretório à procura de sinais de utilização de variants e, caso encontre, modifique a cláusula uses das units, incluindo a unit Variants,resolvendo assim o problema de quebra de compilação em novas versões do Delphi.
Dica:Você pode facilmente adaptar a lógica dessa aplicação para os mais variados fins,por exemplo, para adaptar units da VCL para VCL.NET, Win 32 para .NETetc., quando for migrar seus aplicativos.
Por que todo esse trabalho?
Alguns devem estar se perguntando: Por que escrever um utilitário como esse, se podemos simplesmente usar um GReplace ou outro utilitário de substituição e trocar todas as referências de uma unit comum, como por exemplo a unit SysUtils, substituindo-a por "SysUtils, Variants”.
Vou citar algumas razões:
.Limpeza de código: é de boa prática não ter na cláusula uses units desnecessárias;
.Podemos ter units que não tenham a SysUtils declarada e conseqüentemente não seriam modificadas;
. Podemos ter no código a referência completa (incluindo o nome da unit) a um identificado r ou rotina, como no exemplo SysUtils.Abort. Os utilitários genéricos de substituição trocariam essas chamadas por SysUtils, Variants.Abort, o que obviamente é inválido.
O aplicativo
A aplicação que demonstrarei neste artigo é relativamente simples. Basicamente, ela permite que o usuário escolha uma unidade de disco, um diretório e os arquivos .PAS que devem ser pesquisados em busca de referências do uso de Variants. As units detectadas são listadas em um segundo ListBox,onde o usuário terá a chance de "marcar" somente as units que deverão ser modificadas pelo programa.
Após executar o processo de "patch” clicando no botão Alterar Units, o utilitário modificará a cláusula uses das units, inserindo a referência à unit Variants.
Por padrão, o Delphi inclui a unit Variants sempre na frente da unit SysUtils, quando um novo formulário é criado. Para os que quiserem manter esse padrão, criei um Checkbox com o título ForçarSysUtils, que força o utilitário a fazer a troca mencionada anteriormente, ou seja, troca SysUtils por SysUtils, Variants.