Base de Conhecimento

Atualização do software Delphi

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.

GDK Duster

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.

Pré-compilação

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:

  1. Converta todos os arquivos de formulário (arquivos .dfm) em arquivos de texto
  2. Executar todas as ações de pré-processamento definidas

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.

Compilação

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:

  • Adicionar uma unidade aos usos
  • Remover ou renomear unidades
  • Modificar o código usando uma substituição simples
  • Modificar o código usando expressões regulares
  • Adicionar um prefixo a um identificador ou variável
  • Alterar o tipo de uma variável
  • Substituir um componente (tempo de design)
  • Substituir todo o código executando uma substituição ou expressões regulares no arquivo pascal.

Exemplos de ações

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.

Adição de ações

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.

Como podemos ajudar

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!

Written by Marco Geuze
Diretor

Contato

Deixe-nos ajudá-lo a realizar seus sonhos.