Este ano (2020), a Delphi comemora seu 25º aniversário.Nesses 25 anos, uma enorme quantidade de código foi escrita. Muitos desses aplicativos ainda estão em pleno uso por empresas e indivíduos. Isso mostra o poder do Delphi; o código escrito há décadas ainda funciona, mesmo nas versões mais recentes do Delphi.
Ainda assim, há algumas observações a serem feitas sobre esse elogio. Infelizmente, vemos que também há muitos aplicativos que ainda estão sendo desenvolvidos em versões antigas do Delphi. Isso é uma pena, pois as novas versões do Delphi realmente têm muitas vantagens. Além de o IDE ser muito mais agradável de usar, os novos aprimoramentos da linguagem são uma verdadeira melhoria.
Há uma série de problemas recorrentes ao converter aplicativos Delphi antigos para a versão mais recente do Delphi. Por exemplo, a partir do Delphi 2009, é necessário levar em conta o Unicode. Além disso, pode haver componentes que não estão mais sendo desenvolvidos ou que foram significativamente modificados. Isso significa que ainda há empresas que trabalham com Delphi 5, Delphi 7 ou outras versões antigas. Agora, converter seu código-fonte nem sempre é fácil. Na GDK Software, tivemos muitos projetos e clientes que nos procuraram com softwares Delphi mais antigos. Como frequentemente nos deparamos com os mesmos problemas, desenvolvemos uma ferramenta que facilita muito a conversão: a ferramenta GDK Duster (Delphi Upgrade and Support). Neste post, explicarei brevemente como o GDK Duster nos ajuda com os projetos de conversão e como a GDK Software também pode ajudá-lo com a atualização do seu projeto Delphi.
O GDK Duster usa o compilador Delphi para compilar programas automaticamente, procurar erros e modificar o código para corrigir esses erros. Como todas as alterações são realizadas por meio de ações, você pode simplesmente pegar a base de código mais recente e reiniciar a conversão todas as vezes. Durante o desenvolvimento do Duster, sempre tivemos em mente automatizar a conversão o máximo possível.
Começarei com uma breve introdução à mecânica do Duster. Depois disso, darei alguns exemplos das diferentes ações que a ferramenta pode executar.
Executamos várias etapas automaticamente antes de iniciar o processo de compilação. Primeiro, realizamos uma ação de pré-compilação em todo o código-fonte. Isso consiste nas seguintes ações:
Para começar com o primeiro ponto: com o Delphi, é possível salvar arquivos de formulário como arquivos binários. Como é possível substituir componentes pelo Duster, os arquivos de formulário devem ser salvos como arquivos de texto legíveis.
Em seguida, executamos todas as ações de pré-processamento. Suponhamos que saibamos que em cada arquivo pascal certas modificações precisam ser feitas; podemos especificá-las na lista de ações. O Duster primeiro executará essas ações em todo o código-fonte, antes de iniciar a compilação propriamente dita.
Em seguida, usamos a ferramenta para compilar o projeto e corrigir erros.
Com a finalidade de corrigir erros, avisos e dicas, criamos um banco de dados de ações que o auxiliar de compilação usa para realizar automaticamente alterações no código e recompilar o código-fonte. Uma ação pode consistir em:
Como realizamos muitas conversões no software GDK, compilamos uma lista bastante extensa dessas ações. Com o Duster, podemos adicionar e editar facilmente essas ações:
Alguns exemplos de erros do compilador e as ações correspondentes são:
error E2003: Undeclared identifier: 'CurrencyString'
A solução é a ação AddPrefixToIdentifier
e o prefixo ou solução é FormatSetting.
. Aqui, a ferramenta atualiza automaticamente o código para FormatSettings.CurrencyString
. O mesmo ocorre com os erros a seguir:
error E2003: Undeclared identifier: 'CurrencyFormat'
error E2003: Undeclared identifier: 'CurrencyDecimals'
error E2003: Undeclared identifier: 'DateSeparator'
error E2003: Undeclared identifier: 'TimeSeparator'
[...enz]
Outro exemplo:
error E2003: Undeclared identifier: 'VarArrayOf'
Nesse caso, uma unidade deve ser adicionada à classe de usos. Isso é feito usando a ação AddUnitToInterface
onde a unidade System.Variants
is added.
Um exemplo de uma ação mais complexa é a solução do seguinte problema:
error E1050: WideChar reduced to byte char in set expressions. Consider using 'CharInSet' function in 'SysUtils' unit.
Neste exemplo, identificamos os avisos do Delphi para serem exibidos como erros. A solução para esse problema é o ReplaceByRegEx
ação. Para uma ação de substituição (tanto a ação regular quanto a ação de expressões regulares), precisamos especificar dois parâmetros: a string de pesquisa e o resultado. Nesse caso específico, a string de pesquisa era uma função de Expressões Regulares bastante complexa
([\w\^]+[[]?[\w\+\.\-\s]+[]]?)\s+[Ii][Nn]\s+([a-zA-Z0-9[\s]*[Cc][Hh][Rr][(][\d]+[)]*[a-zA-Z0-9'?,\s(\]]*[Cc][Hh][Rr][(][\d]+[)]*[]\)]?)
e o resultado
CharInSet(\1, \2)
O Duster aplicará essa solução à linha específica de código, após o que o processo de compilação continuará com o restante do código-fonte.
Ao trabalhar em uma conversão, você obviamente deseja adicionar novas ações da forma mais fácil possível. Embora o Duster possa resolver muitas coisas automaticamente, sempre há problemas específicos que precisam ser resolvidos em um projeto. É por isso que você pode adicionar facilmente suas próprias soluções e ações.
Como ilustração, mostrarei um exemplo de uma parte da conversão da biblioteca de coleções de áudio MPEG (de código aberto). Um dos projetos Delphi apresenta a seguinte mensagem de erro:
error E2003: Undeclared identifier: 'ReadLn'
A linha de código correspondente é
Str := TCP.ReadLn;
Ao analisar o código-fonte, sei que a função ReadLn das bibliotecas Indy está agora na unidade TCP.IOHandler em vez de na unidade TCP. Portanto, precisamos da ação ReplaceIdentifier e substituir TCP. por TCP.IOHandler. Adicionar essa ação agora é muito fácil.
A principal vantagem de modificar seu código-fonte dessa forma é que ele pode ser transferido. Se esse código específico ocorrer novamente em outro lugar, o Duster aplicará automaticamente essa solução nesse local e continuará compilando.
Como você viu, é incrivelmente fácil atualizar os projetos Delphi existentes para a versão mais recente do Delphi com a ferramenta. Você também pode continuar o desenvolvimento existente para a versão antiga do software durante o projeto de conversão. Como todas as alterações são armazenadas em ações, você pode simplesmente pegar a base de código mais recente e reiniciar a conversão todas as vezes.
Aa GDK Software, queremos compartilhar nosso conhecimento com outros desenvolvedores e ajudar as empresas a obter e manter seus Delphi software up to date. Portanto, temos opções interessantes para usar o Duster também em seu projeto de software.
Você tem interesse em uma demonstração pessoal do Duster ou está procurando ajuda para converter um projeto Delphi? Entre em contato comigo viainfo@gdksoftware.com
ou planeje uma sessão de estratégia on-line gratuita para ver o que é possível!
Contato