Você está na página 1de 9

65

Delphi2Java-II: ferramenta para conversão de formulários


Delphi em código Java
Mauro Marcelo Mattos, Joyce Martins, Israel Damásio Medeiros, Janira Silveira

Departamento de Sistemas e Computação


Universidade Regional de Blumenal (FURB) – Blumenau, SC – Brasil
Caixa Postal 15.064 – 91.501-970 – Porto Alegre – RS – Brazil
{mattos,joyce,messiah}@inf.furb.br, janira.silveira@gmail.com

Resumo. Este artigo apresenta uma solução desenvolvida em forma de


ferramenta, para realizar a conversão de formulários elaborados no ambiente
de programação Delphi para aplicações na linguagem Java. A ferramenta
Delphi2Java-II é capaz de converter componentes de visualização, de
visualização de dados e de acesso ao banco de dados. A aplicação convertida
segue o padrão Model-View-Controller.

1. Introdução
O processo de desenvolvimento de aplicações via de regra está inserido em um ciclo
evolutivo e requer constantes modificações, seja para corrigir erros, melhorar
desempenho ou adicionar novas funcionalidades. No entanto, segundo DMSNet (2004),
para muitas empresas produtoras de software e sistemas corporativos, a grande
limitação de seus produtos não se encontra na evolução das regras de negócio do
mesmo, mas sim, na plataforma de desenvolvimento e no banco de dados para os quais
o produto foi originalmente projetado. Tal limitação afeta seu posicionamento
estratégico e mercadológico, pois inviabiliza a comercialização para clientes com outras
plataformas ou sistemas operacionais. Mas “existem tantos sistemas, que a completa
substituição ou a reestruturação radical é financeiramente impensável para a maioria das
organizações” (SOMMERVILLE, 2003, p. 533). Para solucionar esse problema, foram
desenvolvidas várias ferramentas visando apoiar a migração de aplicações para
plataformas distintas (FONSECA, 2005; DMSNET, 2004).
Atualmente o mercado está polarizado entre duas principais plataformas de
desenvolvimento: Java 2 Enterprise Edition (J2EE) e Microsoft .NET. Segundo Gartner
(2003 apud CESAR, 2003), juntas, essas tecnologias terão 80% ou mais do mercado de
desenvolvimento de aplicações de e-business até 2008. Ainda, uma recente pesquisa,
“que mede o percentual de adoção de tecnologias nas empresas de software, indica que
Java cresceu de 72,2% em 2003 para 77,4% hoje. Ou seja, 77,4% das empresas de
software usam Java. A pesquisa ainda mostra que 6,3% esperam usar Java até o
próximo ano” (PAMPLONA, 2006).
Considerando esta demanda pela adoção da tecnologia Java, muitas empresas
estão reestruturando seu processo de desenvolvimento ou até mesmo migrando os
sistemas desenvolvidos. Para realizar a migração de aplicações Delphi para Java, por
exemplo, além da necessidade de conversão da interface gráfica, deve-se também
converter o código fonte para que seus componentes visuais mantenham a
funcionalidade original, incluindo conexão com banco de dados.

Grahl, E. A; Hübner, J. F. (Eds.). Anais do XV Seminário de


Computação, Blumenau, 20-22 de Novembro, 2006. p 65-73.
66

Dentre as ferramentas que podem auxiliar no processo de migração de


aplicações Delphi para a plataforma Java, cita-se Delphi2Java (ROBINSON, 2004).
Trata-se de uma ferramenta comercial que se propõe a converter interfaces gráficas,
conexões com banco de dados e código fonte de aplicações Delphi. No entanto,
Delphi2Java teve seu desenvolvimento e comercialização descontinuados. Com o
mesmo objetivo, em 2005 iniciou-se o desenvolvimento da ferramenta Delphi2Java-II
(FONSECA, 2005). A partir da análise de formulários Delphi contendo os componentes
de interface, são geradas classes Java. Em 2006 a ferramenta foi estendida incluindo a
conversão de componentes de visualização de dados, componentes de acesso e conexão
ao banco de dados (SILVEIRA, 2006).
Assim, neste artigo é apresentada a ferramenta Delphi2Java-II, estando o texto
organizado da seguinte forma: a seção 2 trata de migração de código e geradores de
código, descrevendo aplicações e etapas de desenvolvimento; a seção 3 apresenta as
principais funcionalidades da ferramenta, bem como as técnicas utilizadas na
implementação. Por fim, na última seção são apresentados os resultados obtidos e as
limitações da ferramenta proposta.

2. Migração de código
Uma das dificuldades enfrentadas pelas empresas de tecnologia é a manutenção e a
migração de sistemas para as novas plataformas de desenvolvimento. Para reduzir
custos na evolução de sistemas, usa-se a reengenharia de software através da tradução
dos mesmos, quando um código fonte em uma linguagem de programação é traduzido
para um código fonte em uma outra linguagem. A tradução do código fonte só é
economicamente viável se um tradutor automatizado estiver disponível para fazer a
maior parte da tradução (SOMMERVILLE, 2003). Assim, como recurso para a
migração de software, encontram-se os geradores de código.
A geração de código é uma técnica de construção de código que utiliza
determinadas ferramentas para gerar programas. Estas ferramentas podem variar de
scripts de ajuda muito pequenos a aplicações que transformam modelos abstratos de
lógica de negócio em sistemas completos, incluindo os geradores de interface com o
usuário e os de acesso ao banco de dados. Não há nenhum estilo específico para as
ferramentas de geração de código (DALGARNO, 2006): podem trabalhar na linha de
comando ou possuir uma Graphical User Interface (GUI); podem gerar código para uma
ou mais linguagens; podem gerar código uma vez ou múltiplas vezes; podem ter um
número ilimitado de entradas e saídas.
Para a construção de um gerador de código, segundo Herrington (2003), podem
ser seguidas as seguintes etapas de desenvolvimento: (1º) determinar qual deve ser a
saída do gerador, identificando quais informações devem ser recuperadas da entrada;
(2º) definir qual será a entrada e como a mesma será analisada; (3º) analisar a entrada,
extraindo as informações necessárias para gerar a saída; (4º) gerar a saída a partir das
informações extraídas da entrada.

3. A ferramenta Delphi2Java-II
Neste contexto, Delphi2Java-II foi desenvolvida como um gerador de interface e de
código para acesso ao banco de dados. Em termos de funcionalidades, a ferramenta
implementa:
67

a) a conversão de formulários Delphi (arquivos com extensão DFM) para classes Java;
b) a conversão de 22 componentes de visualização (TButton, TChebckBox,
TComboBox, TCoolBar, TEdit, TForm, TLabel, TListBox, TMainMenu, TMemo,
TMenuItem, TPageControl, TPanel, TProgressBar, TRadioButton, TRadioGroup,
TScrollBar, TSpinEdit, TStatusBar, TStringGrid, TTabSheet, TToolBar);
c) a conversão de 7 componentes de visualização de dados (TDBCheckBox,
TDBComboBox, TDBEdit, TDBGrid, TDBMemo, TDBRadioGroup, TDBText);
d) a conversão de 4 componentes de acesso ao banco de dados (TTable, TQuery,
TDatabase, TDataSource), implementando suas principais funcionalidades;
e) a interligação dos componentes de acesso ao banco de dados com os componentes de
visualização de dados, implementada em Delphi através do componente
TDataSource;
f) a geração de uma classe contendo a assinatura dos métodos para os principais
eventos (onCreate, onDestroy, onClick, onChange, onEnter, onExit, onCloseUp,
onKeyPress) habilitados na aplicação Delphi, permitindo que o código seja
futuramente inserido.
O diagrama de caso de uso representa a interação do usuário com a ferramenta,
destacando as ações que podem ser realizadas. A Figura 1 mostra o diagrama de caso de
uso da ferramenta e no Quadro 1 é apresentado o detalhamento deste caso de uso.

Figura 1 – Diagrama de caso de uso UC01


UC01 - Converter código
Pré-condição: O(s) arquivo(s) .DFM não pode(m) estar corrompido(s).
Cenário principal:
1. A ferramenta apresenta as opções para carregar o(s) arquivo(s) e o diretório para salvar
os arquivos gerados.
2. O usuário seleciona o(s) arquivo(s) que deseja carregar e o diretório onde deseja salvar
os arquivos gerados.
3. A ferramenta apresenta a relação de arquivos carregados.
4. O usuário seleciona o(s) arquivo(s) que deseja converter.
5. A ferramenta apresenta as opções para gerar código para arquivo(s) selecionado(s) e
para gerar código para todos os arquivos carregados.
6. O usuário seleciona a opção desejada.
7. A ferramenta faz a conversão do código.
Pós-condição: Dois ou mais arquivos com a extensão .java gerados para cada arquivo
selecionado.
Quadro 1 – Detalhamento do caso de uso.

3.1. Especificando a saída


Como saída da ferramenta são geradas classes Java, usando componentes da biblioteca
68

Swing similares aos componentes Delphi de visualização e de visualização de dados, e


fazendo a conexão com o banco de dados através da API JDBC. Para padronizar e
dividir em camadas a saída gerada, é utilizado o padrão Model-View-Controller (MVC).
Assim, deve-se criar um projeto e dispor as classes geradas em pacotes (Quadro 2).
CLASSE DESCRIÇÃO PACOTE
Classe com os componentes de
visualização e visualização de dados
xxxxxxFRM.java view
(layout da interface), sendo xxxxxx o
nome do arquivo DFM convertido.
Classe de eventos de interface, sendo
xxxxxxEvent.java xxxxxx o nome do arquivo DFM controller
convertido.
Classe de conexão com o banco de
ConnectionManager.Java model
dados.
Classe que representa os campos das
tabelas acessadas, incluindo os
métodos de inclusão, alteração e
BeanTByyyyyy.java model/bean
exclusão, sendo yyyyyy o nome da
tabela. É gerada uma classe Bean para
cada tabela acessada.
Classe que contém as consultas a
serem executadas, sendo yyyyyy o nome
do componente de acesso ao banco de
CursorTByyyyyy.java model/cursor
dados. É gerada uma classe desse tipo
para cada componente de acesso ao
banco de dados.

Quadro 2. Estrutura das classes geradas pela ferramenta Delphi2Java-II

Tendo em vista que a versão atual do Delphi2Java-II foi desenvolvida para


acesso ao banco de dados Oracle8i, deverão ser adicionadas, nas propriedades do
projeto, as bibliotecas da API JDBC (classes12.jar, classes12dms.jar,
nls_charset12.jar) para acesso ao banco de dados.

3.2. Analisando formulários Delphi


A entrada da ferramenta são formulários Delphi. Para cada formulário de uma aplicação
desenvolvida em Delphi tem-se um arquivo com extensão DFM, contendo todas as
informações dos componentes da interface.
object Form1: TForm1
Left = 192 nome do objeto
Top = 114
Width = 213 lista de propriedades
Height = 169
...
object Button1: TButton
Left = 64
Top = 48
Width = 75 objeto componente
Height = 25
Caption = 'Abrir'
TabOrder = 0
end
end
Quadro 3. Exemplo de um arquivo DFM Figura 2. Formulário
Cada componente tem uma identificação, uma lista de propriedades com valores
associados e outros possíveis objetos componentes (SASSE, 2005). O Quadro 3 mostra
um arquivo DFM e a Figura 2 mostra o formulário correspondente.
Como um arquivo DFM é organizado de uma maneira hierárquica, sua estrutura
69

pode ser descrita usando a notação Extended Backus-Naur-Form (EBNF), conforme o


Quadro 4, onde os símbolos entre chaves podem ocorrer zero ou mais vezes e os
símbolos entre colchetes são opcionais.
Para analisar os arquivos DFM e extrair as informações necessárias para gerar a
saída foram utilizados os analisadores léxico, sintático e semântico, módulos
componentes de um compilador, implementados na solução proposta por Souza (2005).
No modelo implementado, o analisador léxico identifica as palavras reservadas
(OBJECT, END, FALSE, TRUE), os identificadores, as constantes (integer, real,
string) e os símbolos especiais (: . , < > [ ] ( )). O analisador sintático verifica se as
unidades léxicas estão dispostas de acordo com estrutura gramatical definida no Quadro
4. E o analisador semântico extrai e armazena as informações do arquivo DFM
necessárias para gerar a saída.
<dfm>::= <object>
<object>::= OBJECT identifier ":" identifier { <property> } { <object> } END
<property>::= identifier ["." identifier] "=" <value>
<value>::= ["+" | "-"] (integer | real)
| string
| FALSE
| TRUE
| identifier ["." identifier]
| "<" { <collectionItem> } ">"
| "[" [ <value> { "," <value> } ] "]"
| "(" <value> { <value> } ")"
| "{" <value> { <value> } "}"
<collectionItem>::= identifier { <property> } END

Fonte: adaptado de Souza (2005).


Quadro 4. Gramática

3.3. Gerando classes Java


Depois de extraídas as informações do formulário principal da aplicação, inicia o
processo de conversão. Buscando simplicidade e flexibilidade na construção da
ferramenta, optou-se pelo uso de templates, de forma a manter a formatação do código
separada da lógica que determina o que deve ser construído. No Quadro 5 tem-se o
código gerado pela ferramenta para o objeto Button1 do Quadro 3, usando o template
do Quadro 6.
...
Button1.setBackground(new java.awt.Color(199,199,199));
Button1.setBounds(64, 48, 75, 25);
Button1.setFont(new java.awt.Font("MS Sans Serif", 0,12));
Button1.setForeground(new java.awt.Color(0, 0, 0));
Button1.setText("Abrir");
Button1.setFocusable(false);
Button1.setVisible(true);
...

Quadro 5. Código gerado para o componente TButton

Com a Velocity Template Language (VTL), linguagem do motor de templates


Velocity (MOURA; CRUZ, 2002), foram definidos 10 templates que possuem, além do
conteúdo estático, um código dinâmico composto por variáveis e comandos
estruturados que são substituídos quando do seu processamento. Assim, para a
implementação de Delphi2Java-II foi necessário: criar uma instância do VelocityEngine;
criar um esquema de mapeamento entre os objetos Java que contêm as informações
extraídas do arquivo DFM e os elementos dos conteúdos dinâmicos definidos nos
70

templates; carregar os templates; substituir adequadamente as referências definidas nos


templates pelos valores dos objetos Java de acordo com o contexto; e, gerar o arquivo
de saída.
...
#foreach ($TButton in $arrayButton) código dinâmico
...
${TButton.getName()}.setBackground(new java.awt.Color(${TButton.setarBackground()}));
${TButton.getName()}.setBounds(${TButton.getLeft()},
${TButton.getTop()},
${TButton.getWidth()},
${TButton.getHeight()});
${TButton.getName()}.setFont(new java.awt.Font(${TButton.getFontJava()}));
${TButton.getName()}.setForeground(new java.awt.Color(${TButton.getForeground()}));
${TButton.getName()}.setText("${TButton.getCaption()}");
${TButton.getName()}.setFocusable(${TButton.isFocusable()});
${TButton.getName()}.setVisible(${TButton.getVisible()});
#if ($TButton.getEnabled())
${TButton.getName()}.setEnabled(${TButton.getEnabled()});
#end código estático
#end
...

Quadro 6. Template com definição do componente TButton

3.4. usando o Delphi2Java-II


A Figura 3 apresenta uma seqüência de telas que permitem a visualização do
funcionamento da ferramenta.

passo 01: selecionar arquivos para conversão

passo 02: selecionar diretório para salvar arquivos gerados

passo 03: selecionar opção de conversão

Figura 3. Delphi2Java-II
71

O primeiro passo para realizar a conversão dos formulários é identificar a sua


localização num diretório qualquer. Todos os arquivos com extensão DFM são listados
para que o usuário faça a seleção daqueles que deseja converter. Em Arquivos .DFM é
apresentada a relação de arquivos selecionados para a conversão. O próximo passo é
identificar o diretório onde os arquivos gerados serão armazenados.
Para realizar a conversão de formulários existem duas opções: gerar código Para
arquivo(s) selecionado(s) e gerar código Para todos os arquivos carregados (em
Arquivos .DFM). Os componentes que a ferramenta não reconhece e cuja conversão
para Java ainda não foi contemplada, são listados em Componentes não convertidos.
Delphi2Java-II foi implementada na linguagem Java, utilizando o ambiente de
desenvolvimento Eclipse 3.0, a biblioteca gráfica Swing e o JDK na versão 1.4.2. O
motor de templates Velocity foi utilizado através da biblioteca velocity-dep-
1.3.jar.

3.5. Validando a ferramenta


Para validar a ferramenta, foram desenvolvidos vários formulários utilizando o
ambiente Delphi 7.0. Nos testes foi utilizado o banco de dados Oracle8i. Como exemplo
de utilização de Delphi2Java-II, a Figura 4(a) mostra um arquivo DFM contendo vários
componentes possíveis de serem convertidos e a Figura 4(b) mostra a interface
correspondente em Java.

Figura 4. Formulários Delphi e Swing com componentes de banco de dados.

4. Resultados e limitações
O presente trabalho descreveu as principais características da versão atual da ferramenta
Delphi2Java-II. Esta versão faz parte de um projeto iniciado em 2005 (FONSECA,
2005) e expandido para produzir interfaces web - projeto DelphiToWeb (SOUZA,
2005).
As interfaces geradas pelas três ferramentas apresentam muita semelhança no
que se refere à conversão dos componentes de visualização. No entanto, a 1a versão de
Delphi2Java-II (FONSECA, 2005) e DelphiToWeb (SOUZA, 2005) não convertem
formulários que contenham componentes de visualização de dados e componentes de
acesso ao banco de dados.
72

Quanto aos eventos encontrados no arquivo DFM, as duas versões de


Delphi2Java-II geram código para manipulá-los. A 1a versão de Delphi2Java-II
disponibiliza uma classe de eventos contendo apenas as assinaturas dos métodos que
estão habilitados na aplicação original em Delphi. A versão atual, além de gerar as
assinaturas desses métodos, inclui outros para carregar valores para os componentes de
visualização de dados. Cabe ressaltar que, devido ao fato de apenas a versão de
Delphi2Java-II descrita nesse trabalho efetuar a geração de mais de dois arquivos de
saída, é a única que padroniza e divide o código gerado em camadas, utilizando o
padrão MVC.
No que se refere às técnicas utilizadas no desenvolvimento das ferramentas,
DelphiToWeb lê e recupera as informações dos formulários Delphi a partir de
analisadores léxico, sintático e semântico. Essa solução, descrita em Souza (2005), foi
reutilizada para implementar a ferramenta proposta nesse trabalho. Por fim, foram
especificados templates, modelos que servem como guia para a geração de código de
saída. No Quadro 7 é apresentada uma comparação entre as ferramentas levando em
consideração suas principais características.

Delphi2Java-II DelphiToWeb Delphi2Java-II


CARACTERÍSTICAS
(FONSECA,2005) (SOUZA,2005) (SILVEIRA,2006)
conversão de componentes de
27 22 22
visualização
conversão de componentes de
- - 7
visualização de dados
conversão de componentes de
- - 4
acesso ao banco de dados
tratamento de eventos sim - sim
geração de código de saída no
- - sim
padrão MVC
uso de analisadores (léxico,
sintático e semântico) para - sim sim
leitura do arquivo DFM
uso de templates para geração de
- - sim
código

Quadro 7. Comparação entre ferramentas

Atualmente, através de um projeto do PIBIC/CNPq, está sendo desenvolvida


uma nova versão que envolve a conversão de código fonte object pascal dos tratadores
de evento de componentes de interface já convertidos. Posteriormente pretende-se
explorar o projeto para conversão do código fonte Pascal (incluindo código de acesso ao
banco de dados).
Como extensões da ferramenta estão sendo consideradas as seguintes
possibilidades: efetuar a conversão de outros componentes de acesso ao banco de dados;
e gerar código utilizando outros drivers JDBC ou em outras linguagens, como HTML
ou JavaScript, bastando definir o template que servirá de modelo para o código a ser
gerado.

Agradecimentos
Parte deste trabalho foi financiada com bolsas de iniciação científica do PIBIC/CNPq.
73

Referências
CESAR, R. Java X .NET: disputa acirrada no mercado nacional. ComputerWorld, São Paulo,
n. 387, jun. 2003. Disponível em: <http://computerworld.uol.com.br/AdPortalv5/
adCmsDocumentShow.aspx?DocumentID=75187>. Acesso em: 26 mar. 2005.
DALGARNO, M. Frequently asked questions about code generations. [S.l.], 2006.
Disponível em: <http://www.codegeneration.net>. Acesso em: 29 abr. 2006.
DMSNET. Migração / conversão de sistemas para Java (J2EE). [S.l.], 2004. Disponível em:
<http://www.dmsnet.com.br/conversor.htm>. Acesso em: 15 mar. 2005.
FONSECA, F. Ferramenta conversora de interfaces gráficas: Delphi2Java-II. 2005. 59 f.
Trabalho de Conclusão de Curso (Bacharelado em Ciências da Computação) – Centro de
Ciências Exatas e Naturais, Universidade Regional de Blumenau, Blumenau.
HERRINGTON, J. Code generation in action. California: Manning, 2003.
MOURA, M.F.; CRUZ, S.A.B. Formatação de dados usando a ferramenta Velocity.
Campinas, 2002. Disponível em: <http://www.cnptia.embrapa.br>. Acesso em: 9 abr. 2006.
PAMPLONA, V. F. Continua aumentando o índice de adoção do Java nas empresas. [S.l.],
2006. Disponível em: <http://www.javafree.org/news/ >. Acesso em: 02 fev. 2006.
ROBINSON, S. L. Delphi to Java conversions. [S.l.], [2004?]. Disponível em:
<http://spritemaster.com/delphi_to_java_conversions.html>. Acesso em: 31 maio 2006.
SASSE, E. Convertendo arquivos DFM binários para texto. [S.l.], [2005?]. Disponível em:
<http://www.clubedelphi.net/Novo/Colunistas/Erick_Sasse/02.asp>. Acesso em: 8 maio
2005.
SOMMERVILLE, I. Engenharia de software. 6. ed. Tradução André Maurício de Andrade.
São Paulo: Addison Wesley, 2003.
SILVEIRA, J. Extensão da ferramenta Delphi2Java-II para suportar componentes de
banco de dados. 2006. 81 f. Trabalho de Conclusão de Curso (Bacharelado em Sistemas de
Informação) – Centro de Ciências Exatas e Naturais, Universidade Regional de Blumenau,
Blumenau.
SOUZA, A. Ferramenta para conversão de formulários Delphi em páginas HTML. 2005.
67 f. Trabalho de Conclusão de Curso (Bacharelado em Sistemas de Informação) – Centro de
Ciências Exatas e Naturais, Universidade Regional de Blumenau, Blumenau.

Você também pode gostar