Ferramenta para desenvolvimento de aplicações comerciais baseada em ambiente RAD



Documentos relacionados
Display de 7. PdP. Autor: Tiago Lone Nível: Básico Criação: 16/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0

Conteúdo. Disciplina: INF Engenharia de Software. Monalessa Perini Barcellos. Centro Tecnológico. Universidade Federal do Espírito Santo

AMBIENTE. FORMULÁRIO: é a janela do aplicativo apresentada ao usuário. Considere o formulário como a sua prancheta de trabalho.

CONTRA CONTROLE DE ACESSOS E MODULARIZADOR DE SISTEMAS

Status. Barra de Título. Barra de Menu. Barra de. Ferramentas Padrão. Caixa de nomes. Barra de. Ferramentas de Formatação. Indicadores de Coluna

02 - Usando o SiteMaster - Informações importantes

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

Orientação a Objetos

Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL.

Persistência de Classes em Tabelas de Banco de Dados

Manual SAGe Versão 1.2 (a partir da versão )

Noções de. Microsoft SQL Server. Microsoft SQL Server

Revisão: Introdução. - Integração com o AutoManager; 1 Atualização de versão do banco de dados PostgreSQL

AP_ Conta Aplicativo para digitação e envio de contas médicas no padrão TISS

ECD1200 Equipamento de Consulta de Dados KIT DE DESENVOLVIMENTO

Anexo III Funcionamento detalhado do Sistema Montador de Autoria

Manual do Publicador. Wordpress FATEA Sistema de Gerenciamento de Conteúdo Web

GUIA INTEGRA SERVICES E STATUS MONITOR

Prevayler. Perola. André Luís Sales de Moraes Juliana Keiko Yamaguchi Tatiana Yuka Takaki

NetEye Guia de Instalação

4 O Workflow e a Máquina de Regras

ArpPrintServer. Sistema de Gerenciamento de Impressão By Netsource Rev: 02

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE ESCOLA AGRÍCOLA DE JUNDIAÍ EAJ - PRONATEC / REDE etec MÓDULO III DESENVOLVIMENTO PROFESSOR ADDSON COSTA

Inserindo Dados no Banco de Dados Paradox.

FCT Faculdade de Ciências e Tecnologia Serviço Técnico de Informática STI SGCD Sistema Gerenciador de Conteúdos Dinâmicos

Iniciação à Informática

Modelagemde Software Orientadaa Objetos com UML

Algoritmos e Programação Estruturada

Auxiliar de instalação (Português Brasileiro) Primeiros passos

Universidade Federal de Santa Maria Curso de Arquivologia. Disciplina de Banco de Dados Aplicados à Arquivística. Versao 1.

Manual do Visualizador NF e KEY BEST

ETEC DR. EMÍLIO HENRNANDEZ AGUILAR PROGRAMAÇÃO DE COMPUTADORES II PROFESSOR RAFAEL BARRETO DELPHI FORMULÁRIO COM ABAS E BUSCAS DE REGISTROS

Data Transformation Services (DTS) por Anderson Ferreira Souza

[RÓTULO:] MNEMÔNICO [OPERANDOS] [;COMENTÁRIO]

Índice: Nitgen do Brasil

Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS -HTML 5: ARMAZENAMENTO DE DADOS (CLIENTE) Prof. Angelo Augusto Frozza, M.Sc.

PROJECT 1 Delphi Project (Extensão. DPR)

AULA 5 Sistemas Operacionais

Framework.NET, Microsoft Visual C# 2010 Express e Elementos da Linguagem C#

Upload e Download de Arquivos. Ao programador Morfik, cabe implementar em sua aplicação os mecanismos gerenciem todo o processo acima.

MANUAL DO USUÁRIO SORE Sistema Online de Reservas de Equipamento. Toledo PR. Versão Atualização 26/01/2009 Depto de TI - FASUL Página 1

Este tutorial está publicado originalmente em

Totvs RMI - Gerador de Relatórios

O Software Face Match

Universidade Federal de Santa Maria UFSM Centro de Tecnologia CT. Power Point. Básico

Android e Bancos de Dados

Delphi 7 Aula 01 Área do Triângulo

O Primeiro Programa em Visual Studio.net

Análise de Dados do Financeiro

Manual de Administração DPS Printer 2.1 NDDigital S/A - Software

PdP. Autor: Luís Fernando Patsko e Tiago Lone Nível: Intermediário Criação: 26/12/2005 Última versão: 18/12/2006

Santa Cruz do Sul, outubro de 2015.

Capacidade = 512 x 300 x x 2 x 5 = ,72 GB

Despachante Express - Software para o despachante documentalista veicular DESPACHANTE EXPRESS MANUAL DO USUÁRIO VERSÃO 1.1

Introdução a Banco de Dados

Manual de Instalação. SafeSign Standard (Para MAC OS 10.7)

Software de segurança em redes para monitoração de pacotes em uma conexão TCP/IP

Sistema de Controle de Solicitação de Desenvolvimento

Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas

MANUAL DE UTILIZAÇÃO SISTEMA DE CADASTRO INTRANET

SUMÁRIO Acesso ao sistema... 2 Atendente... 3

Menu Utilitários. Atualização do Banco de Dados Atualização e organização dos arquivos existentes

O programa Mysql acompanha o pacote de instalação padrão e será instalado juntamente com a execução do instalador.

DESENVOLVENDO APLICAÇÕES WEB UTILIZANDO A FERRAMENTA WEBSCHARTS

Aprenda como instalar o plugin EclipseUML no Eclipse e como utilizá-lo para fazer engenharia reversa de seu código-fonte.

Aula 01 - Formatações prontas e condicionais. Aula 01 - Formatações prontas e condicionais. Sumário. Formatar como Tabela

Operações de Caixa. Versão 2.0. Manual destinado à implantadores, técnicos do suporte e usuários finais

Prof. Marcelo Machado Cunha

5 Mecanismo de seleção de componentes

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Manual de Atualização Versão

Procedimentos para Reinstalação do Sisloc

Serviço Público Federal Universidade Federal do Pará - UFPA Centro de Tecnologia da Informação e Comunicação - CTIC S I E

Persistência de Dados

Manual de utilização do sistema OTRS (Atendimento) Cliente Externo

Manual de operação. BS Ponto Versão 5.1

Engenharia de Software III

Introdução. Servidor de Tempo (SNTP) com opção de horário de verão automático; 1 Cadastro do novo modelo de equipamento Urano Topmax SS

Vamos criar uma nova Página chamada Serviços. Clique em Adicionar Nova.

Nota de Aula: Utilização da IDE Code::Blocks

Trabalhando com conexão ao banco de dados MySQL no Lazarus. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011

8VDQGR5HSRUW0DQDJHUFRP&ODULRQH3RVWJUH64/ -XOLR&HVDU3HGURVR 8VDQGRSDUkPHWURV

Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza

Microsoft Access XP Módulo Um

Manual de Instalação do Agente Citsmart

CONFIGURAÇÃO Cobian Backup Programa gratuito e de qualidade para realizar seus backups automáticos

Lógica de Programação

Veja abaixo um exemplo de como os dados são mostrados quando usamos o

FACULDADE DE ENGENHARIA DE COMPUTAÇÃO. PROJETO FINAL I e II PLANO DE TRABALHO <NOME DO TRABALHO> <Nome do Aluno> <Nome do Orientador>

ROTEIRO DE INSTALAÇÃO TEF DISCADO Módulo American Express

CRIANDO BANCOS DE DADOS NO SQL SERVER 2008 R2 COM O SQL SERVER MANAGEMENT STUDIO

Ajuda On-line - Sistema de Portaria. Versão 4.8.J

MANUAL DE NAVEGAÇÃO DO MILLENNIUM BUSINESS

Curva ABC. Tecinco Informática Ltda. Av. Brasil, º Andar Centro Cascavel PR

Gerencie a sala de espera e garanta a satisfação dos pacientes

A memória é um recurso fundamental e de extrema importância para a operação de qualquer Sistema Computacional; A memória trata-se de uma grande

Transcrição:

FACULDADE DE INFORMÁTICA DE PRESIDENTE PRUDENTE BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO Ferramenta para desenvolvimento de aplicações comerciais baseada em ambiente RAD EDUARDO AUGUSTO BOTELHO Presidente Prudente SP 2006

FACULDADE DE INFORMÁTICA DE PRESIDENTE PRUDENTE BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO Ferramenta para desenvolvimento de aplicações comerciais baseada em ambiente RAD EDUARDO AUGUSTO BOTELHO Trabalho de Conclusão de Curso apresentado ao curso de Bacharelado em Ciência da Computação como requisito parcial para a sua conclusão. Orientadores: MSc. Francisco Assis da Silva MSc. Leandro Luiz de Almeida Presidente Prudente SP 2006

0004 Botelho, Eduardo Augusto. Ferramenta para desenvolvimento de aplicações comerciais baseada em ambiente RAD / Eduardo Augusto Botelho. Presidente Prudente : Unoeste, 2006. 105f : Il Trabalho de Conclusão de Curso (Graduação em Ciência da Computação) Universidade do Oeste Paulista UNOESTE: Presidente Prudente SP, 2006. Bibliografia 1. Ferramenta para geração de código-fonte. I. Autor. II. Título.

DEDICATÓRIA Dedico este trabalho a minha mãe Eloísa e meu pai Carlos, que nunca mediram esforços e estiveram sempre presente em todos os momentos de sua realização. A minha irmã Angela, pelo carinho, confiança e seu exemplo de perseverança, e ao meu irmão Maikel por seu apoio e ajuda. A minha família que, em todos os momentos de realização desta pesquisa, esteve presente.

AGRADECIMENTOS Ao professor orientador, MSc. Francisco Assis da Silva que, na rigidez de seus ensinamentos e orientação, fez aprimorar tanto meus conhecimentos técnicos como pessoais. Ao professor orientador, MSc. Leandro Luiz de Almeida por seu apoio e dedicação a orientação deste trabalho.

[...] Só sei que nada sei [...] Sócrates

RESUMO Analizando-se aplicações comerciais desenvolvidas no ambiente Borland Delphi 5 ao nível de código-fonte verificou-se que há uma grande repetição em operações simples de cadastros, movimentações e relatórios. Com a identificação destas redundâncias, verificou-se a possibilidade de se desenvolver uma ferramenta que gere automaticamente as partes semelhantes dos módulos de uma aplicação comercial e possibilite ao usuário realizar ajustes de telas que cada módulo necessite. O público alvo desta ferramenta são programadores experientes ou até mesmo usuários com conhecimento básico em informática, mas que tenham conhecimento do domínio de problema da aplicação a ser desenvolvida. O objetivo desta ferramenta é aumentar a produtividade para os programadores experientes por meio da aceleração do processo de produção das partes repetitivas da aplicação comercial, além de propiciar aos usuários com conhecimentos limitados a construção de pequenas aplicações comerciais em um ambiente de certa forma complexo como o Borland Delphi 5. Desta forma idealizou-se o desenvolvimento de uma ferramenta baseada em ambiente RAD (Rapid Application Development) que possibilita o desenvolvimento de aplicações comercias no Borland Deplhi 5. Esta ferramenta deve permitir que por meio de uma interface gráfica o usuário monte as telas de cadastros, movimentações e relatórios. Com as telas montadas a ferramenta construirá um projeto para o Borland Deplhi 5 com todo o código-fonte necessário ao funcionamento da aplicação desenvolvida. A ferramenta também tem como função gerar o banco de dados para a aplicação em questão, tendo o Interbase como banco disponível. Palavras-Chave: Desenvolvimento de Aplicações Comerciais. Geração de códigofonte. Banco de Dados. Deplhi.

ABSTRACT Analyzing the commercial applications source-code developed in the Delphi 5 environment, it was verified that a great repetition exists in simple operations of forms and reports. With the identification of these redundancies, it was verified the possibility of developing a tool to generate the similar parts of the commercial application modules automatically and make possible the user to make adjustments of screens that each module needs. The public of this tool are senior s programmers or even users with basic knowledge in informatics, but that have knowledge of the application problem domain to be developed. The objective of this tool is to increase the productivity for the senior s programmers through the acceleration of the repetitive parts production process of the commercial application, besides propitiating the users with limited knowledge the construction of small commercial applications in a complex environment like Borland Delphi 5. This way, it was idealized the development of a tool based in RAD environment (Rapid Application Development) that makes possible the commercial applications development in Borland Delphi 5. This tool should to allow through a graphic interface the user to construct the screens of forms and reports. With the screens constructed, the tool will build a project in Borland Delphi 5 with the whole necessary source-code to the working of the developed application. The tool also has as function to generate the database Interbase for the generated application. Key-Words: Commercial Applications Development. Source-code generation. Database. Delphi.

LISTA DE FIGURAS FIGURA 1 TELAS DO VISUAL KIT 5... 12 FIGURA 2 EXEMPLO DE XML... 15 FIGURA 3 PASTAS INCLUDE E LIB DO INTERBASE.... 19 FIGURA 4 MENU PROJECT DO C++ BUILDER.... 19 FIGURA 5 TELA DE CONFIGURAÇÃO DE PROJETO DO C++ BUILDER.... 20 FIGURA 6 TELA DE INSERÇÃO DE DIRETÓRIOS... 21 FIGURA 7 EXEMPLO DE CHAMADA DA API ISC_DSQL_EXECUTE_IMMEDIATE.... 22 FIGURA 8 ESTRUTURAS DE DADOS PRÉ-DEFINIDAS DO INTERBASE... 22 FIGURA 9 EXEMPLO DE CHAMADA DA ISC_DETACH_DATABASE.... 24 FIGURA 10 API COM OS PARÂMETROS.... 25 FIGURA 11 PROGRAMA EXEMPLO DE GERAÇÃO DE BANCO DE DADOS EM TEMPO DE EXECUÇÃO.... 26 FIGURA 12 ARQUIVO DO BANCO DE DADOS INTERBASE (NOME_DO_BANCO.GDB) GERADO COM SUCESSO.... 26 FIGURA 13 CRIAÇÃO DO ARQUIVO NOME_DO_BANCO.GDB REALIZADO COM SUCESSO... 27 FIGURA 14 ERRO NA CRIAÇÃO DO ARQUIVO NOME_DO_BANCO.GDB... 27 FIGURA 15 EXEMPLO DO MÉTODO DE SERIALIZAÇÃO BINÁRIA... 30 FIGURA 16 MÉTODO DE SERIALIZAÇÃO VIA XML.... 31 FIGURA 17 EXEMPLO DE CRIAÇÃO DE OBJETO.... 33 FIGURA 18 EXEMPLO DE CHAMADA DO MÉTODO DE SERIALIZAÇÃO DA FORMA BINÁRIA.... 34 FIGURA 19 EXEMPLO DE CHAMADA DO MÉTODO DE SERIALIZAÇÃO PARA XML.... 34 FIGURA 20 EXEMPLO DE SERIALIZAÇÃO PELA CLASSE OBJETO.... 35 FIGURA 21 EXEMPLO DA ESTRUTURA XML DE PARÂMETROS DE UMA QUERY.... 39 FIGURA 22 EXEMPLO DE UMA DECLARAÇÃO DE UM CAMPO DE UMA MEMORYDATA..40 FIGURA 23 LINHA DE CÓDIGO EXEMPLIFICANDO A PASSAGEM DE PARÂMETROS DE UMA MEMORYDATA PARA UMA QUERY.... 43 FIGURA 24 OBJETO TMENUITEM NO FORMATO DE STRING... 44 FIGURA 25 EXEMPLO DE DECLARAÇÃO DE UM OBJETO TMAINMENU.... 44 FIGURA 26 EXEMPLO DE UMA DECLARAÇÃO DE UM EVENTO ONCLICK.... 45 FIGURA 27 SEQÜÊNCIA DE UNITS... 45 FIGURA 28 LINHA DE CÓDIGO DE VINCULO ENTRE AQUIVO E UNIT... 45 FIGURA 29 LINHA DE CÓDIGO DE INSTANCIAÇÃO DE FORM.... 46 FIGURA 30 DIAGRAMA DE COLABORAÇÃO DA LISTA GENERALIZADA DA FERRAMENTA.47 FIGURA 31 DIAGRAMA DE CLASSES DA CLASSE OBJETO.... 48 FIGURA 32 DIAGRAMA DE CLASSES DA CLASSE LISTA_PROJETO.... 48 FIGURA 33 DIAGRAMA DE CLASSES DA CLASSE BANCODEDADOS... 49 FIGURA 34 DIAGRAMA DE CLASSES DAS CLASSES TMEUOBJETOINICIOLISTA E TMEUOBJETOLISTA.... 49 FIGURA 35 DIAGRAMA DE CLASSES DA CLASSE CONF_BANCO_DE_DADOS.... 50 FIGURA 36 ESTRUTURA DA CLASSE OBJETO... 50 FIGURA 37 EXEMPLO DE XML DE UM OBJETO TEDIT DA VCL.... 53 FIGURA 38 ESTRUTURA DA CLASSE LISTA_PROJETO.... 55

FIGURA 39 ESTRUTURA DA CLASSE TMEUOBJETOLISTA.... 59 FIGURA 40 ESTRUTURA DA CLASSE TMEUOBJETOINICIOLISTA.... 65 FIGURA 41 ESTRUTURA DE CLASSE CONF_BANCO_DE_DADOS... 75 FIGURA 42 CÓDIGO DE INCIALIZAÇÃO DO CONTRUTOR DA CLASSE CONF_BANCO_DE_DADOS.... 77 FIGURA 43 CÓDIGO DE VERIFICAÇÃO DE TIPOS.... 77 FIGURA 44 EXEMPLO DE UMA LINHA DE CÓDIGO DE DEFINIÇÃO DE UM CAMPO... 79 FIGURA 45 EXEMPLO DE SQL PARA ALTERAÇÃO DE TABELAS.... 80 FIGURA 46 ESTRUTURA DA CLASSE BANCODEDADOS.... 81 FIGURA 47 TELA PRINCIPAL DA FERRAMENTA... 83 FIGURA 48 TELA DE ENTRADA DE DADOS... 84 FIGURA 49 EXEMPLO ILUSTRATIVO DO BOTÃO SALVAR TELA... 84 FIGURA 50 JANELA PARA SALVAR TELA DE CADASTRO.... 85 FIGURA 51 EXEMPLO ILUSTRATIVO DO BOTÃO SALVAR PROJETO.... 86 FIGURA 52 JANELA PARA SALVAR O PROJETO.... 86 FIGURA 53 GERENCIADOR DE TELAS... 87 FIGURA 54 CADASTRO1 COM O CAMPO CÓDIGO... 88 FIGURA 55 MENU POPUP DE OPÇÕES PARA SE CONFIGURAR UM LABEL... 89 FIGURA 56 TELA DE CONFIGURAÇÃO DAS PROPRIEDADES DE UM OBJETO, NESTE CASO DE UM LABEL.... 89 FIGURA 57 TELA DO CADASTRO1 COMPLETO... 90 FIGURA 58 MENU POPUP DE CONFIGURAÇÃO DE UM CAMPO... 91 FIGURA 59 TELA DE CONFIGURAÇÃO DE UM CAMPO EM RELAÇÃO A PROPRIEDADES DO BANCO DE DADOS... 92 FIGURA 60 TELA ILUSTRATIVA DAS CONFIGURAÇÃO DO BANCO PARA O CAMPO QUANTIDADE... 93 FIGURA 61 TELA ILUSTRATIVA DAS CONFIGURAÇÕES DO BANCO PARA O CAMPO NOME.... 94 FIGURA 62 CADASTRO2 COMPLETO... 95 FIGURA 63 CONFIGURAÇÃO DA TELA COMO SENDO UMA MOVIMENTAÇÃO.... 96 FIGURA 64 ETAPA 1 DA MOVIMENTAÇÃO.... 96 FIGURA 65 ETAPA 2 DA MOVIMENTAÇÃO.... 97 FIGURA 66 MOVIMENTAÇÃO AO FINAL DA ETAPA 2... 97 FIGURA 67 ETAPA 3 DA MOVIMENTAÇÃO.... 98 FIGURA 68 MOVIMENTAÇÃO AO FINAL DA ETAPA 3... 99 FIGURA 69 TELA DE ESCOLHA DO CAMPO DE CONSULTA.... 100 FIGURA 70 TELA INICIAL DA APLICAÇÃO GERADA.... 100 FIGURA 71 CADASTRO1 DA APLICAÇÃO GERADA... 101 FIGURA 72 CADASTRO2 DA APLICAÇÃO GERADA... 101 FIGURA 73 MOVIMENTAÇÃO DA APLICAÇÃO GERADA... 102 FIGURA 74 CONSULTA DO CADASTRO1.... 102 FIGURA 75 CONSULTA DO CADASTRO2.... 103 FIGURA 76 CONSULTA DA MOVIMENTAÇÃO.... 103

SUMÁRIO 1 INTRODUÇÃO... 11 1.1 Objetivos, Justificativas e Motivações do Projeto... 11 1.2 Trabalho Correlato... 11 1.3 A Estrutura desta monografia... 12 2 Conceitos Básicos... 14 2.1 Orientação a Objetos no C++ Builder 5... 14 2.2 XML... 15 2.3 RTTI... 16 2.4 Persistência... 16 2.4.1 Aplicações geradoras de aplicações... 16 2.4.2 Utilização em C++... 17 3 GERAÇÃO DO BANCO DE DADOS INTERBASE EM TEMPO DE EXECUÇÃO... 18 3.1 Pré-Requisitos de Instalação e Configuração... 18 3.2 APIs... 22 3.3 Especificação das Estruturas Envolvidas... 23 3.4 Modo de Inicialição das Estruturas... 24 3.5 Modo de Execução da API... 25 3.6 Exemplo de Execução... 25 4 SERIALIZAÇÃO DE OBJETOS NO C++ BUILDER 5.0... 28 4.1 Requisito Iniciais para a Serialização de Objetos... 28 4.2 Eternity... 28 4.2.1 Instalação do Framework... 29 4.2.2 Configurando o Projeto... 29 4.2.3 Habilitando os Objetos para serem Serializados... 30 4.2.4 Instanciando Objetos via o Framework... 32 4.2.5 Executando a Serialização... 33 4.3 Serialização no Builder... 34 4.3.1 Modo de Utilização... 34 5 GERAÇÃO DE PROGRAMAS... 37 5.1 Marcações... 37 5.1.1 Cadastro DFM... 37 5.1.2 Consulta DFM... 38 5.1.3 Movimentação DFM... 38 5.1.4 Consulta PAS... 39 5.1.5 Cadastro PAS... 40 5.1.6 Movimentação PAS... 41 5.1.7 Principal DFM... 44 5.1.8 Principal PAS... 44 5.1.9 Projeto DPR... 45 6 A FERRAMENTA... 47 6.1 Estrutura de Dados... 47 6.1.1 Classes Objeto... 50 6.1.2 Classe lista_projeto... 55

6.1.3 Classe TMeuObjetoLista... 59 6.1.4 Classe TmeuObjetoInicioLista... 65 6.1.5 Classe conf_banco_de_dados... 75 6.1.6 Classe BancoDeDados... 81 7 UM ESTUDO DE CASO... 83 8 CONCLUSÕES... 104 REFERÊNCIAS BIBLIOGRÁFICAS... 105

11 1 INTRODUÇÃO 1.1 Objetivos, Justificativas e Motivações do Projeto Grande parte dos sistemas desenvolvidos com a IDE Delphi apresentam redundâncias no seu código-fonte. Esta redundância aparece no desenvolvimento de cadastros e movimentações semelhantes, porém com funções distintas. Este projeto tem como proposta desenvolver uma ferramenta para automatizar este processo repetitivo, para isto a ferramenta constitui de uma IDE onde o usuário irá montar as telas e informar as regras de negócio da aplicação. A ferramenta tem por objetivo possibilitar o desenvolvimento de cadastros e movimentações básicas. 1.2 Trabalho Correlato O software Visual Kit 5 é um gerador de sistemas especialmente desenhado para o usuário leigo em programação. Para a operação dos sistema são dispostas 6 telas no formato de wizard para a configuração de projeto desenvolvimento e desenvolvimento da tela (cadastro por exemplo). A Figura 1 mostra as telas do Visual Kit 5.

12 FIGURA 1 Telas do Visual Kit 5. 1.3 A Estrutura desta monografia Após este capítulo introdutório, a presente monografia esta organizada conforme a estrutura que segue. No capítulo 2, são elucidados os aspectos relevantes aos conceitos básicos que servem de suporte para o texto deste trabalho. Um primeiro enfoque é dado à orientação a objeto. Após, são apresentados os conceitos e características do XML assim como do sistema RTTI. No capítulo 3, são descritos os aspectos referentes a geração de banco de dados Interbase em tempo de execução, sendo que estes aspectos são abordados por meio de exemplos de código-fonte e por meio de um aplicativoexemplo. No capítulo 4, são descritos os aspectos referentes a serialização de objetos. A abordagem se dá primeiramente à serialização por meio de um framework e em seguida é abordada a serialização nativa do Borland C++ Builder. No capítulo 5, são tratados os aspectos referentes a geração de código em tempo de execução. No capítulo 6, é demonstado o funcionamento da ferramenta resultante deste trabalho.

13 No capítulo 7, é abordado um exemplo de caso apresentando o funcionamento da ferramenta descrita neste trabalho (capítulo 6). No capítulo 8, são apresentadas as conclusões obtidas com este trabalho. No capítulo 9, são apresentadas as referências bibliográficas utilizadas neste trabalho.

14 2 CONCEITOS BÁSICOS 2.1 Orientação a Objetos no C++ Builder 5 Com a programação orientada a objetos busca-se representar os objetos do mundo real por meio de estruturas chamadas de classes. de variáveis de classe. que eles podem fazer. objetos. Estas classes possuem métodos e variáveis, as quais são chamadas Os métodos representam as funcionalidades dos objetos, ou seja, o As variáveis são responsáveis por representar as características dos De acordo com H. M. Deitel (2006, p. 8), orientação a objetos é: Um esquema de empacotamento que nos ajuda a criar unidades significativas de software. Estas podem ser grandes e fortemente focalizadas em áreas particulares de aplicativos. Há objeto data, cheque, pagamento, fatura, áudio, vídeo, arquivo, elevador e muito mais. A programação orientada a objeto se popularizou devido ao facilitar o reaproveitamento de código. Este reaproveitamento é necessário diante dos grandes desafios que se apresentam para os programadores (produzir cada vez mais rápido e melhor). Antes desta tecnologia era comum o programador ter de reinventar a roda, ou seja, ter de refazer a mesma rotina para várias aplicações diferentes.

15 2.2 XML De acordo com estudos realizados por Ramalho (2004, p. V),XML é: XML e a abreviatura de extencible Markup Language. Esta linguagem não pertence a nenhuma empresa, foi desenvolvida por um grupo de pessoas independentes de acordo com experiências anteriores como o SGML (Standard Generalized Markup Language) ou o HTML (HyperText Markup Language). Em termos mais formais, pode-se definir o XML como uma linguagem de anotação descritiva extensível, tendo, portanto, todas as características que tornam desejáveis este tipo de linguagem: independência relativamente às plataformas de software e de hardware utilizadas, longevidade, baixos custos de manutenção, facilidade na reutilização. O XML representa o formato ideal para a representação de informação estruturada (por exemplo, a que existe numa base de dados) ou semiestruturada (por exemplo, o texto de um livro). Um documento XML para além de texto contém algumas marcas especiais, chamadas anotações ou etiquetas, que normalmente identificam componentes estruturais do documento. tags: Na Figura 2, pode-se verificar um exemplo de XML com algumas <?xml version="1.0"?> <!-- eternity persistence framework --> <!-- Nicola Santi - www.winghands.it --> <archive version="4.0" sub="beta1"> <MinhaString>Teste</MinhaString> <MeuInteiro>100</MeuInteiro> <MeuFloat>10.3</MeuFloat> </archive> FIGURA 2 Exemplo de XML.

16 2.3 RTTI RTTI (Real Time Type Indentification) possui muitas aplicações, porém possui maior importância em aplicações que utilizam persistência e ferramentas que são geradoras de aplicações. RTTI é um mecanismo presente no C++ utilizado para se identificar qual o tipo do objeto. Palavras reservadas adicionais: typeid dynamic_cast static_cast const_cast 2.4 Persistência O principal problema na persistência aparece quando deseja-se fazê- -la para uma lista de objetos. Para se salvar objetos um meio persistente é necessário saber o tipo do objeto. O tipo do objeto é imprescindível para que no processo de recuperação este seja alocado como objeto correto. Uma forma de se saber o tipo do objeto é utilizar o sistema RTTI standard disponibilizado pela linguagem de programação C++. 2.4.1 Aplicações geradoras de aplicações Este modelo de aplicação possui basicamente o mesmo problema que a apresentada na persistência, porém há também o problema de manipulação de objetos diversos pela aplicação sendo que estes tendem a ser manipulados na forma mais genérica possível. Tendo a utilização de objetos genéricos é necessário que se possua um modo de saber que objeto esta sendo manipulado para a realização de operações específicas com o objeto.

17 2.4.2 Utilização em C++ O C++ dispõe do operador typeid() para disponibilizar informações de tipo. Os argumentos de tipo podem ser um ponteiro para um objeto ou um nome de um tipo. Esta função retorna uma referência para o objeto type_info o qual contém algumas informações sobre o tipo do objeto. O objeto type_info possui alguns métodos mostrados a seguir: const char *name() retorna o tipo do objeto no formato de string bool before(const tyoe_info &) para ordenação operador ==() e operador!=() para realizar comparações entre objetos type_info. Estas informações não ajudam a resolver problemas de relação entre objetos. Aplicações diversas possuem problemas diversos sendo que nem todos podem ser resolvidos com o objeto type_info. A classe type_info pode ser usada como chave em um mapa para armazenar mais detalhes sobre o tipo dos objetos. Com este caminho, aplicações podem definir e usar seus próprios sistemas RTTI possibilitando uma grande flexibilidade para solucionar problemas. O problema esta em definir a estrutura dos registros RTTI e construir o mapa com estas informações e este processo não é trivial e muitos códigos têm de ser escritos para toda aplicação que irá utilizar este sistema.

18 3 GERAÇÃO DO BANCO DE DADOS INTERBASE EM TEMPO DE EXECUÇÃO Este capítulo tem por objetivo demonstrar como gerar um banco de dados Interbase em tempo de execução. Para explicar como realizar este processo será utilizado um aplicativo exemplo desenvolvido em C++ Builder sendo que por meio deste exemplo será demonstrado também como inicializar todas as estruturas de dados necessária, como se utilizar as APIs (Application Programming Interface) necessárias assim como configurar o C++ Builder para o correto funcionamento do exemplo e execução da geração do Banco de Dados. A motivação para este capítulo ser escrito foi devido ao fato de ser necessário que o banco de dados fosse criado em tempo de execução. Para isto foram pesquisados meios de se realizar este processo de geração de banco de dados e verificou-se que é necessária a utilização das APIs do banco de dados utilizado (o Interbase). 3.1 Pré-Requisitos de Instalação e Configuração Para a correta execução das funcionalidades que serão descritas a seguir são necessárias algumas configurações de projeto do C++ Builder assim como do computador no qual o exemplo será desenvolvido. Inicialmente deve-se instalar o banco de dados Interbase, no exemplo utilizou-se a versão 6.X. Uma vez que o banco de dados for instalado, pode-se verificar no pasta onde este foi instalado as pastas include e lib. No exemplo será utilizado o caminho c:\arquivos de Programas\InterBase Corp\InterBase com sendo o caminho de instalação do Intebase. Na Figura 3 pode-se verificar as duas pastas include e lib na pasta de instalação do InterBase.

19 FIGURA 3 Pastas include e lib do Interbase. As duas pastas (include e lib) devem ser incluídas na configuração de projeto do C++ Builder, isto deve ser realizado da seguinte forma: Na Figura 4, pode-se verificar o menu Project do C++ Builder com o campo Options selecionado. FIGURA 4 Menu Project do C++ Builder. Uma vez no menu Project do C++ Builder deve-se escolher a opção Options, a qual aparece selecionada na Figura 4. A Figura 5 mostra a tela de configuração de projeto do C++ Builder.

20 FIGURA 5 Tela de configuração de projeto do C++ Builder. Na tela de configuração de opções de projeto deve-se escolher a palheta Diretórios/Condicionais. Uma vez a palheta Diretórios/Condicionais selecionada deve-se efetuar um click no botão com a sentença... da opção Include path. A Figura 6 mostra a tela de inserção de diretórios da opção Incude path.

21 FIGURA 6 Tela de inserção de diretórios. Na tela de inserção de diretórios deve-se incluir o endereço da pasta include do diretório de instalação do banco de dados, no exemplo este é c:\arquivos de Programas\InterBase Corp\InterBase\include. Uma vez que esta operação tenha sido completada, deve-se realizar a operação de include no código-fonte do programa-exemplo do arquivo ibase.h, no exemplo esta operação foi realizada por meio do comando #include ibase.h. A lib necessária ao funcionamento das APIs do banco de dados Interbase não esta no formato que o Borland C++ Builder reconhece, para isso deve-se converter os arquivos GDS32_MS.lib e IB_UTIL_MS.lib para o formato que o C++ Builder reconheça, estes arquivos estão na pasta lib de instalação do banco de dados, no exemplo c:\arquivos de Programas\InterBase Corp\InterBase\lib. Para solucionar este problema deve-se utilizar o utilitário COFF20MF do C++ Builder da seguinte forma:

22 COFF2OMF [nome do arquivo original] [novo arquivo] lib:ms COFF2OMF GDS32_MS.LIB GDS32.LIB lib:ms Por fim, deve-se colocar os arquivos resultantes na pasta do exemplo que esta sendo desenvolvido, não necessitando assim qualquer configuração de projeto do C++ Builder. 3.2 APIs API é um conjunto de rotinas e padrões estabelecidos por uma aplicação para a utilização de suas funcionalidades por uma outra aplicação. No Interbase todas as operações podem ser realizadas por meio das suas APIs. Para a execução da criação do banco de dados foi identificado a necessidade apenas de uma API, denominada de isc_dsql_execute_immediate. A Figura 7 exemplifica a chamada da API que foi utilizada na ferramenta. 01 isc_db_handle handle; 02 isc_tr_handle tr1; 03 ISC_STATUS status_vector[20]; 04 handle = 0L; 05 tr1 = 0L; 06 isc_dsql_execute_immediate(status_vector,&handle,&tr1,0, Edit1->Text.c_str(),1,NULL); 07 for(int i=0;i<20;i++) 08 { 09 StringGrid1->Cells[1][i+1]=status_vector[i]; 10 } FIGURA 7 Exemplo de chamada da API isc_dsql_execute_immediate. Para o funcionamento desta API é necessária a utilização de estruturas de dados pré-definidas pelo Interbase, estas são mostradas na Figura 8. 01 typedef void ISC_FAR *isc_db_handle; 02 typedef void ISC_FAR *isc_tr_handle; 03 ISC_STATUS status_vector[20]; FIGURA 8 Estruturas de dados pré-definidas do Interbase.

23 Todas estas estruturas são passadas por parâmetro para a API isc_dsql_execute_immediate. 3.3 Especificação das Estruturas Envolvidas A tabela 1 mostra as estruturas de dados utilizadas na seção 3.2 (Figura 7) para geração do Banco de Dados em tempo de execução, assim como a descrição e o tipo de cada uma delas. TABELA 1 Estruturas para a Geração de Banco de Dados InterBase. Parâmetro Tipo Descrição status_vector ISC_STATUS* Ponteiro para o vetor de erros db_handle Isc_db_handle* Ponteiro para o cabeçalho do banco de dados, o valor nulo para esta estrutura é 0L, para caso não exista um banco de dados (como no caso de se criar um) ou deve ser inicializada pela API isc_attach_database() trasn_handle Isc_tr_handle* Ponteiro para o cabeçalho de transação do banco de dados, o valor nulo para esta estrutura é 0L, a API de inicialização desta estrutura é a isc_start_transaction() length unigned short Nos programas em C deve ser inicializado como 0. Indica o tamanho do DSQL em bytes. statement char* DSQL a ser executada dialect unsigned short Indica a versão do dialeto SQL que esta sendo utilizado no DSQL, deve ser inicializado como 1 xsqlda XSQLDA* Ponteiro opcional

24 3.4 Modo de Inicialição das Estruturas de dados. Na Figura 9, pode-se verificar o código de inicialização das estruturas 01 AnsiString s; 02 isc_db_handle handle; 03 isc_tr_handle tr1; 04 ISC_STATUS status_vector[20]; 05 s = "create Database \"dados.gdb\""; 06 handle = 0L; 07 tr1 = 0L; 08 isc_detach_database(status_vector,&handle); FIGURA 9 Exemplo de chamada da isc_detach_database. O isc_db_handle (linha 06 da Figura 9) deve ser inicializado como 0L, apenas para a função de criar banco de dados, para todas as outras funções este deve ser inicializado com a API isc_attach_database(), a qual vincula um banco de dados a referida estrutura, esta API não foi utilizada no exemplo uma vez que para a geração do banco de dados em tempo de execução não deve-se inicializar o isc_db_handle. O isc_tr_handle (linha 07 da Figura 9) deve ser inicializado como 0L, devido a não existir um bando de dados não será possível criar um transação. Esta estrutura deve ser utilizada quando deseja-se criar transações para um devido banco de dados, sendo assim necessário a sua inicialização via a API isc_start_transaction(), esta API não foi utilizada no exemplo uma vez que para a geração do banco de dados em tempo de execução não é necessária a criação de transações. O ISC_STATUS (vetor de erros), não é necessário ser inicializado, mas pode ser inicializado sem nenhum prejuízo ao funcionamento da API isc_dsql_execute_immediate. Antes da execução da API isc_dsql_execute_immediate, deve-se definir o SQL a ser executado. O SQL é composto pelo comando create

25 database, o nome do banco de dados, uma \ de delimitação, o nome do arquivo do banco de dados com a extensão.gdb\ precedida de uma \ entre aspas, pode ser passado também o usuário default e a senha do mesmo, porém para o funcionamento os campos user e password não são obrigatórios. 3.5 Modo de Execução da API Para a execução da API isc_dsql_execute_immediate() (Figura 10 linha 06) deve-se passar os parâmetros necessário para o seu funcionamento como pode ser verificado na Figura 10. 06 isc_dsql_execute_immediate(status_vector,&handle,&tr1,0, Edit1->Text.c_str(),1,NULL); FIGURA 10 API com os parâmetros. Para verificar se houve sucesso na operação deve-se verificar o vetor de erros (status_vector), se o primeiro campo conter o valor 1 e o segundo o valor 0, a operação foi executada com sucesso, caso o primeiro campo esteja com 1 e o segundo campo com um valor diferente de 0, um erro ocorreu. O segundo campo indicará qual o número do erro, o qual é padronizado pelo Interbase. 3.6 Exemplo de Execução Este exemplo ilustra como é realizada a criação do banco de dados em tempo de execução, o banco de dados que será criado será o nome_do_banco.gdb. Inicialmente pode-se verificar na interface do programa exemplo (Figura 11) uma entrada de dados onde coloca-se o SQL create database c:\t\nome_do_banco.gdb USER SYSDBA PASSWORD masterkey a ser executado, uma matriz onde está exposto o vetor de erros ISC_STATUS e por fim pode-se verificar o botão de execução, como mostra a Figura 11.

26 FIGURA 11 Programa Exemplo de Geração de Banco de Dados em Tempo de Execução. Na entrada de dados SQL pode-se verificar o comando create database o qual é o comando correspondente para a criação do banco de dados, com pode-se verificar na Figura 11. Ainda na entrada de dados SQL (Figura 11) pode-se verificar o endereço do arquivo a ser criado entre aspas e com a extensão.gdb. Os comandos USER e PASSWORD não são obrigatórios, mas recomenda-se que se os utilize, como pode-se identificar na Figura 11. Para a execução do programa exemplo deve-se efetuar um click no botão Criar Banco de Dados, a rotina de criação do banco de dados será executada e no endereço especificado poderá ser encontrado o arquivo do banco de dados gerado, como pode ser visto na Figura 12. A Figura 12 mostra o arquivo gerado pelo exemplo. FIGURA 12 Arquivo do Banco de Dados Interbase (NOME_DO_BANCO.GDB) gerado com sucesso.

27 Caso a operação tenha sido realizada com sucesso pode-se verificar que o primeiro endereço do vetor de erros estará com o valor 1 e o segundo com o valor 0, como está exemplificado na Figura 13. FIGURA 13 Criação do arquivo NOME_DO_BANCO.GDB realizado com sucesso. Na Figura 14 pode-se verificar que ocorreu um erro, uma vez que o primeiro campo esta com valor 1 e o segundo com um valor diferente de 0, o valor representado no segundo campo é o número do erro padronizado pelo Interbase. FIGURA 14 Erro na criação do arquivo NOME_DO_BANCO.GDB.

28 4 SERIALIZAÇÃO DE OBJETOS NO C++ BUILDER 5.0 A serialização de objeto é um processo fundamental para o funcionamento da ferramenta descrita e desenvolvida nesta monografia uma vez que será por meio deste processo que esta irá salvar os projetos dos usuários em disco. Este processo tem por finalidade representar os objetos instanciados na memória em uma outra forma a qual possa ser transmitida pela rede ou salva em qualquer tipo de mídia. O processo de serialização é utilizado por ferramentas para enviar objetos por uma rede (usando sockets), ou também para salvar objetos em disco como será o caso desta ferramenta. 4.1 Requisito Iniciais para a Serialização de Objetos Para realizar a serialização verificou-se duas formas de se realizá-la, uma delas para os objetos criados especificamente para a ferramenta, ou seja, os objeto de controle e outra para os objetos que fazem parte da VCL 1 do C++ Builder, ou seja, os objetos visuais da ferramenta. 4.2 Eternity Eternity é um pequeno framework 2 compatível com as bibliotecas Standard do C++. Este framework é responsável pelo processo de serialização de objetos, ou seja, ele transforma os objetos em uma seqüência de bits e realiza a persistência dos mesmos. 1 Visual Component Library. 2 Conjunto de classes com objetivo de reutilização, provendo um guia para uma solução de arquitetura em um domínio específico de software. Se diferencia de uma simples biblioteca, pois a biblioteca se concentra apenas em oferecer implementação de funcionalidades, sem definir a reutilização de uma solução de arquitetura.

29 O processo de serialização pode ser realizado de duas formas distintas: uma na qual os objetos são transformados em uma seqüência de bits e esta é persistida em disco. Esta forma é chamada de serialização binária. A outra forma é via XML onde os objeto são salvos em um formato XML e este é persistido no disco. Na ferramenta será utilizado o processo de serialização via XML. O framework Eternity pode ser encontrado em <http://www.winghands.it/download/download_eng.html?id=2>. 4.2.1 Instalação do Framework Para se instalar o framework é necessário que se tenha o arquivo de instalação do framework Eternety. Uma vez com o arquivo do framework, deve-se descompactá-lo em qualquer diretório. Após a descompactação poderá ser verificado que o diretório conterá três sub-diretórios, sendo estes: src (contém os arquivos-fonte), include (contém os includes necessários às aplicações que utilizarão o framework) e examples (onde pode-se encontrar alguns exemplos de utilização do framework). 4.2.2 Configurando o Projeto A configuração do projeto ocorre da mesma forma como foi explicado na seção 3.1, com a diferença de que na tela de diretórios inclua o endereço do diretório include do framework. Após a realização desta etapa deve-se realizar o include do arquivo eternity.hpp, para que assim a aplicação esteja apta a utilizar o framework. #include "include/eternity.hpp"

30 4.2.3 Habilitando os Objetos para serem Serializados A serialização via o framework necessita que todos os objetos que serão serializados possuam um método definido pelo framework denominado de void serialize(eternity::bin_archive &stream); no caso do processo de serialização binária e void xml_serialize( eternity::xml_archive &xml); no caso de serialização via XML. Deve-se reescrever métodos apresentados anteriormente para poderem ser utilizados. Para a forma via arquivo binário deve-se passar para o stream a seqüência de variáveis do objeto e deve-se recuperar estes na mesma ordem, como no exemplo da Figura 15. 01 void TMeuObjeto::serialize(eternity::bin_archive &stream) 02 { 03 if (stream.is_loading()) 04 { int TamString=0; 05 stream >> this->meuinteiro; 06 stream >> this->meufloat; 07 stream >> TamString; 08 09 char *aux=null; 10 aux =(char *)malloc(sizeof(char)*(tamstring+1)); 11 int i=0; 12 while(i<tamstring) 13 { 14 stream >> *(aux+i); 15 i++; 16 } 17 *(aux+i)='\0'; 18 MinhaString = aux; 19 free(aux); 20 } 21 else 22 { 23 stream << this->meuinteiro; 24 stream << this->meufloat; 25 stream << this->minhastring.length(); 26 char *aux; FIGURA 15 Exemplo do Método de serialização binária.

31 27 aux = this->minhastring.c_str(); 28 int final=minhastring.length(); 29 int inicio=0; 30 while(inicio!=final) 31 { 32 stream << *(aux+inicio); 33 inicio++; 34 } 35 free(aux); 36 } 37 } FIGURA 15 Exemplo do Método de serialização binária (continuação). No exemplo da Figura 15 pode-se verificar que as variáveis são passadas em uma seqüência e são recuperadas na mesma seqüência que foram passada, este processo pode ser verificado nas linhas de 05 à 19 para o processo de recuperação e nas linhas de 23 à 34 para o processo de persistência. No caso de se serializar uma string deve-se serializar caractere a caractere da string, como pode-se verificar nas linhas 09 à 18 para a recuperação e 26 à 34 para a persistência. O stream.is_loading() (linha 03) indica qual processo esta sendo realizado, o de persistência ou o de recuperação, sendo sua utilização explicada à frente. Para a forma de serialização via XML o processo muda como podese verificar na Figura 16. 01 void TMeuObjeto2::xml_serialize( eternity::xml_archive &xml) 02 { 03 if (xml.is_loading()) 04 { 05 std::string s; 06 xml.read("minhastring",s,0); 07 this->minhastring=s.c_str(), 08 xml.read("meuinteiro",this->meuinteiro,0); 09 xml.read("meufloat", this->meufloat,0); 10 } 11 else 12 { FIGURA 16 Método de serialização via XML.

32 13 std::string s; 14 s.append(minhastring.c_str()); 15 xml.write("minhastring",s); 16 xml.write("meuinteiro",this->meuinteiro); 17 xml.write("meufloat",this->meufloat); 18 } 19 } FIGURA 16 Método de serialização via XML (continuação). Pode-se verificar no exemplo da Figura 16 que a seqüência na qual as variáveis são persistidas não precisa ser necessariamente a mesma na qual estas vão ser recuperadas. Os métodos xml.read (linhas 06, 08 e 09) e xml.write (linhas 15, 16 e 17) são respectivamente os métodos de leitura e persistência, para os quais deve-se passar as variáveis a serem recuperadas ou persistidas, pode-se verificar tanto no método de leitura como no método de persistência que existem dois parâmetros sendo passados, onde um é uma string, esta será o rótulo de marcação para essa variável no XML resultante. Pode-se verificar que o rótulo de uma variável não deve ser modificado, uma vez que caso isso ocorra o valor que será atribuído a esta estará errado. 4.2.4 Instanciando Objetos via o Framework Para que o framework possa ser utilizado no processo de instanciação do objeto não deve ser realizado pelo comando new mas sim por uma seqüência de outros comandos. Primeiramente deve-se configurar os templates do framework para o objeto em questão, a diretiva AFactory indica que o objeto esta sendo instanciado na memória. No exemplo passa-se o objeto TMeuObjeto para o framework. Pode-se verificar na Figura 17 que a criação de um ponteiro do tipo do objeto em questão (TMeuObjeto) ao invés de se instanciar o objeto por

33 intermédio do comando new, foi utilizado o comando create passando o nome da classe do objeto e o ponteiro que irá apontar para o objeto a ser instanciado. 01 eternity::factory<tmeuobjeto> AFactory; 02 eternity::create("tmeuobjeto",&iniciolista); 03 TMeuObjeto *Objeto = NULL; FIGURA 17 Exemplo de criação de objeto. Todo este processo é necessário devido a este framework visar a portabilidade do que foi gerado e por este motivo verificou-se que diferentes plataformas representam o nome das classes de diferentes formas, ou seja, o Borland C++ Builder representa o nome das suas classes diferentemente do Microsoft Visual C++ e assim por diante. Por sua vez para solucionar este problema o framework representa o nome da classe separadamente, evitando assim diferenças nas formas de representação dos nomes das classes. Para poder realizar isso foi desenvolvido o método create, para o qual é passado por parâmetro o nome da classe que o framework irá utilizar e o ponteiro do objeto a ser serializado. 4.2.5 Executando a Serialização A serialização propriamente dita ocorre com a chamada do método de serialização que foi incluído no objeto TMeuObjeto podendo ser este: MeuObjeto1->serialize(fa); para a serialização binária e MeuObjeto2- >xml_serialize(xml); para a serialização via XML Pode-se verificar que há um parâmetro que é passado a estes métodos, este parâmetro é o arquivo onde será persistido o objeto podendo ser este do tipo eternity::xml_archive xml; para a serialização via XML ou eternity::file_archive fa; para a serialização binária.

34 Para ilustrar o processo completo, dois segmentos do código representados pelas Figuras 18 e 19 demonstram a realização da chamada da serialização. 01 { 02 try 03 { 04 // your code that use eternity 05 eternity::file_archive fa; 06 fa.open(earquivo->text.c_str(),eternity::archive::store); 07 MeuObjeto1->serialize(fa); 08 fa.close(); 09 free(meuobjeto1); 10 MeuObjeto1=NULL; 11 } 12 catch (eternity::exception e) 13 {}; 15 } FIGURA 18 Exemplo de chamada do método de serialização da forma binária. 01 { 02 eternity::xml_archive xml; 03 xml.open(earquivoxml->text.c_str(), eternity::archive::store); 04 MeuObjeto2->xml_serialize(xml); 05 xml.close(); 06 free(meuobjeto2); 07 MeuObjeto2=NULL; 08 } FIGURA 19 Exemplo de chamada do método de serialização para XML. 4.3 Serialização no Builder O C++ Builder disponibiliza métodos para a serialização de objetos, porém segundo os testes realizados verificou-se que objetos definidos para a ferramenta esta serialização não funciona. 4.3.1 Modo de Utilização A utilização dos métodos de serialização de objetos não é trivial, por este motivo foi desenvolvido um objeto que encapsula todos os processos de serialização. Objeto.h. Para se utilizar o objeto é necessário que se um include no arquivo

35 a classe objeto. Na Figura 20 pode-se verificar um exemplo de serialização utilizando 01 { 02 o = new Objeto(); 03 TEdit* L = new TEdit(this); 04 L->Parent = this; 05 L->Top=100; 06 L->Color=clBlue; 07 o->objetoparastring(l); 08 delete L; 09 o->stringparaobjeto(panel1); 10 TEdit* K; 11 K =(TEdit*) o->getobjeto(); 12 // K->Parent=this; 13 Memo1->Text = o->getstring(); 14 o->setnome("edit10"); 15 Memo2->Text = o->getstring(); 16 } FIGURA 20 Exemplo de Serialização pela classe Objeto. Neste exemplo pode-se verificar que foi criado e instanciado um objeto do tipo Objeto (linha 02). Foi criado e instanciado como exemplo um objeto TEdit (linha 03) o qual faz parte da VCL, algumas propriedades foram inicializadas para a ilustração do processo de serialização (linhas 04 a 06). Por fim, chama-se o método ObjetoParaString (linha 07) passando o objeto a ser serializado por parâmetro, no exemplo o objeto que foi serializado foi destruído logo em seguida (linha 08). Com isso termina-se o processo de serialização, ou seja, persistência do objeto. A recuperação de um objeto serializado é feito de forma similar. Para se recuperar o objeto deve-se passar à função StringParaObjeto (linha 09) o pai do objeto, ou seja, o objeto que controlará o objeto em questão, no caso um objeto TPanel.

36 A recuperação ocorre por meio do método GetObjeto(); (linha 11) o qual tem por retorno void* sendo necessário um cast para se atribuir a um ponteiro o objeto em questão. Caso deseje-se retornar um objeto serializado em disco no formato de string este será retornado via o método GetString(); (linha 13).

37 5 GERAÇÃO DE PROGRAMAS A ferramenta descrita nesta monografia tem como uma de suas funções a geração de programas. Para realizar a geração de programas a ferramenta deve gerar o código-fonte para estes. O código-fonte gerado pela ferramenta se baseia em modelos pré-definidos com marcações. As marcações tem por finalidade definir as posições no código-fonte modelo onde a ferramenta deverá inserir o código gerado. As marcações se diferem devido a cada uma indicar uma substituição específica, cada uma será substituída por um código diferente. 5.1 Marcações 5.1.1 Cadastro DFM $N Destinado a ser substituído pelo nome de um Form 3. $M Destinado a ser substituído pelos campos de um MemoryData 4, sendo que estes campos são referentes a cada objeto presente na tela. $Q Destinado a ser substituído pelo XML referente as Querys 5 DataSources 6. e 3 São objetos que representam as telas de aplicativos. 4 Objetos destinados a representar tabelas em memória. 5 Objeto destinado a encapsular o acesso e alterações a tabelas de uma banco de dados. 6 Objeto destinado a prover um caminho entre um provedor de dados e um modificador de dados.

38 5.1.2 Consulta DFM $N Destinado a ser substituído pelo nome de um Form. $O Destinado a ser substituído pelo nome do campo que foi selecionado pelo usuário no momento de geração de uma consulta. 5.1.3 Movimentação DFM $N Destinado a ser substituído pelo nome de um Form. $M Destinado a ser substituído por uma MemoryData com os campos já configurados. Os campos são referentes a cada objeto presente na tela. $Q Na movimentação permanece em aberto. $L Destinado a ser substituído por um valor inteiro referente à posição Left de um objeto TDBGrid 7. $T Destinado a ser substituído por um valor inteiro referente à posição Top de um objeto TDBGrid. 7 Objeto destinado a representar uma matriz visual a partir de um provedor de dados.

39 $V $K Destinado a ser substituído pela cláusula where 8 necessária ao SQL dos objeto TQuery. Deve ser substituído pelos parâmetros de uma query. A Figura 21 demonstra a estrutura de como deve ser montado o XML para os parâmetros. 01 ParamData = < 02 item 03 DataType = tipo 04 Name = 'Pnome_do_objeto' 05 ParamType = ptunknown" 06 end 07 > FIGURA 21 Exemplo da estrutura XML de parâmetros de uma Query. Para se colocar mais de um parâmetro deve-se repetir das linhas 02 a 06 modificando-se o tipo e o nome_do_objeto. O tipo é descrito pela Figura 43. $G Destinado a ser substituído pelo nome de um objeto TDBGrid. 5.1.4 Consulta PAS $N Destinado a ser substituído pelo nome de um Form. 8 Cláusula condicional do SQL.

40 $O Destinado a ser substituído pelo nome do campo que foi selecionado pelo usuário no momento de geração de uma consulta. 5.1.5 Cadastro PAS $A,$N Destinado a ser substituído pelo nome de um Form. $< Destinado a ser substituído pela declaração dos objeto colocados na tela pelo usuário. Deve ser composto de nome_do_objeto:tipo_do_objeto;. $Q Deverá ser substituído caso se tenha colocado um ou mais objetos do tipo TDBLookupComboBox 9 na tela. Será substituído pela declaração dos objetos TQuery e TDataSource utilizados pelos objetos TDBLookupComboBox. $F Deve ser substituído pela declaração dos campos do objeto MemoryData. A Figura 22 demonstra o modelo de como deve ser construída a declaração dos campos da MemoryData. c_nome_do_objeto:tipo_do_campo; FIGURA 22 Exemplo de uma declaração de um campo de uma MemoryData. 9 Objeto visual destinado a representar uma lista de dados providos de um provedor de dados. Tem como principal característica a utilização de uma lista drop_down para exibir os dados providos do provedor de dados.

41 A Figura 43 do capítulo 6 demonstra como deve ser substituído o tipo_do_campo. $K Destinado a ser substituído pela declaração das procedures 10 referentes aos métodos onclick 11 do botão de chamada da consulta. Deve ser composto de um procedure nome_do_objetoonclick (Sender: TObject);. $E Destinado a ser substituído pelo nome do objeto configurado como chave primária. $V Destinado a ser substituído pelo código do método onclick do botão de chamada de uma consulta. 5.1.6 Movimentação PAS $A,$N Destinado a ser substituído pelo nome de um Form. $< Destinado a ser substituído pela declaração dos objeto colocados em uma tela pelo usuário. Deve ser composto de nome_do_objeto:tipo_do_objeto;. 10 Sub-rotina, função. 11 Evento capturado quando se pressiona um botão do mouse sobre um objeto visual.

42 $Q Deverá ser substituído caso se tenha colocado um ou mais objeto do tipo TDBLookupComboBox em uma tela. Será substituído pela declaração dos objetos TQuery e TDataSource utilizados pelos objetos TDBLookupComboBox. $F Deve ser substituído pela declaração dos campos de um objeto MemoryData. A Figura 22 demonstra o modelo de como deve ser construída a declaração dos campos da MemoryData. A Figura 43 (capítulo 6, subseção 6.1.4) demonstra como deve ser substituído o tipo_do_campo. $K Destinado a ser substituído pela declaração das procedures referentes aos métodos onclick do botão de chamada de uma consulta. Deve ser composto de procedure nome_do_objetoonclick (Sender: TObject);. $L Destinado a ser substituído pela declaração das procedures referentes aos métodos onexit 12 dos objetos colocados em uma tela pelo usuário. Deve ser composto de procedure nome_do_objetoonexit (Sender: TObject);. 12 Evento capturado ao se retirar o foco de um objeto visual.

43 $E Destinado a ser substituído pelo nome do objeto configurado como chave primária. $J Deve ser substituído pelas passagens de parâmetros da query QDados2. A Figura 23 mostra o modelo de como deve ser montada a linha de substituição. $V $D QDados2.ParamByName('Pnome_do_objeto').value :=MDPrincipal['nome_do_objeto']; FIGURA 23 Linha de código exemplificando a passagem de parâmetros de uma MemoryData para uma Query. A linha demonstrada pela Figura 23 deve ser repetida para cada objeto que seja chave primária 13 ou secundária 14 alternado-se o nome_do_objeto. Destinado a ser substituído pelo código do método onclick do botão de chamada de uma consulta. Destinado a ser substituído pelo código do método onexit dos objeto colocados em uma tela pelo usuário. 13 Campo escolhido por um projetista do banco de dados como tendo significado principal para a identificação de entidades dentro de um conjunto de entidades. 14 É um atributo ou conjunto de atributos cujos valores aparecem necessariamente na chave primária de uma outra tabela.

44 5.1.7 Principal DFM $C Destinado a ser substituído pelo itens de um menu. A Figura 24 mostra o modelo de como os itens devem ser construídos. object nome_item: TMenuItem Caption = 'caption_que_aparecera_na_tela' end FIGURA 24 Objeto TmenuItem no formato de string. Para se colocar mais de um item, deve-se repetir a estrutura mostrada na Figura 24 5.1.8 Principal PAS $M Deve ser substituído pela declaração dos objetos item menu A Figura 25 demonstra o modelo de como deve ser construída a declaração dos objetos item menu. 15. Nome_do_form: TMainMenu; FIGURA 25 Exemplo de declaração de um objeto TMainMenu. Para se declarar mais de um objeto deste tipo deve-se apenas repetir a estrutura mostrada pela Figura 26 alterando o nome do Form. $A Destinado a ser substituído pela declaração de eventos onclick dos itens de menu. 15 Objeto visual destinado a representar itens de um dado menu.

45 A Figura 26 mostra o modelo de como esta declaração deve ser realizada. procedure nome_do_formclick(sender: TObject); FIGURA 26 Exemplo de uma declaração de um evento onclick. $C Destinado a ser substituído pelo código de métodos onclick dos itens de menu. $N Destinado a ser substituído pelas chamadas de units referentes aos outros Forms que compõem o projeto. A Figura 27 demonstra como deve ser realizada a construção da seqüência de units. unit nome_da_unit,... ; FIGURA 27 Seqüência de units. 5.1.9 Projeto DPR $N $A Destinado a ser substituído pela linha de código destinada a criar o vínculo entre nomes de units e arquivos que as contém. Deve ser construída como mostra a Figura 28 nome_da_unit in 'arquivo.pas' {nome_do_form};. FIGURA 28 Linha de código de vinculo entre aquivo e unit. O nome de unit deve ser o mesmos do arquivo.pas, caso não seja, o Delphi não conseguirá abrir os Forms. Destinado a ser substituído pela instanciação dos Forms na inicialização da aplicação.

46 A Figura 29 demonstra como deve ser a linha de código referente a instanciação de Forms. Application.CreateForm(tipo_do_form, nome_do_form); FIGURA 29 Linha de código de instanciação de Form.

47 6 A FERRAMENTA Neste capítulo serão descritas as estruturas de dados criada para a construção da ferramenta. 6.1 Estrutura de Dados A estrutura de dados utilizada na ferramenta é uma lista generalizada de objetos. A Figura 30 representa a um diagrama de colaboraçao de como a lista generalizada da ferramenta é estruturada. FIGURA 30 Diagrama de colaboração da lista generalizada 16 da ferramenta. Representa a estrutura da classe Objeto. 16 Uma lista generalizada é aquela que pode ter como elemento ou um átomo ou uma outra lista (sub-lista).

48 FIGURA 31 Diagrama de classes da classe Objeto. A Figura 32 representa a estrutura da classe lista_proje o. t FIGURA 32 Diagrama de classes da classe lista_projeto.

49 A Figura 33 representa a estrutura da classe BancoDeDados. FIGURA 33 Diagrama de classes da classe BancoDeDados. A Figura 34 representa a estrutura das classes TMeuObjetoInicioLista e TMeuObjetoLista. IdentificadorNivel : int IdentificadorObjeto : int IdentificadorPai : int IdentificadorNivelPai : int Proximo : TMeuObjetoLista ProximoNivel : TMeuObjetoLIsta objeto : void* conf _banco : *conf _banco TMeuObjetoLista retidentif icadornivel() : int retidentif icadorobjet o() : int retidentif icadorpai() : int retidentif icadornivelpai() : int retobjeto() : void* setidentificadornivel() : void setidentif icadorobjeto(identif icadorobjeto : int) : void setidentif icadorpai(identificadorpai : int) : void setidentificadornivelpai(identificadornivelpai : int) : void setobjeto(objetos : AnsiString, Owner : TComponent*) : int setobjeto(objeto : void*, nome : AnsiString) : int InsereProximoNivel(Identif icadorobjeto : int) : int InsereProximo(IdentificadorObjeto : int) : int setproximonivel(proximonivel : TMeuObjetoLista) : int setproximo(proximo : TMeuObjetoLista) : int retproximonivel() : TMeuObjetoLista retproximo() : TMeuObjetoLista SerializaObjeto() : AnsiString xml_serializa(xml : xml_archive, tipo : bool) : void ~TMeuObjetoLista() SerializaObjetoSemEnd(tipo : bool) : AnsiString setconfbanco(conf : *conf _banco_de_dados) : void retconfbanco() : *conf _banco_de_dados SetListsFields(obj : void*, conf : conf _banco_de_dados*, paiinicial : TComponent*, DSI : TDataSource*) : void Classe destinada a controlar a lista assim como a serialização dos objeto e a sua recuperação Eternity 1..1 possui 0..n TamanhoLista : int Lista : TMeuObjetoLista paiinicial : TComponent Indentif icadormaximoobjetos : int Trigger : AnsiString Tipo : char QInicial : TQuery* DSInicial : TDataSource* TMeuObjetoInicioLista rettrigger() : AnsiString settrigger(c : AnsiString) : void setparents(x : int) : void nullparents() : void retindentif icadormaximoobjetos() : int retprimeiro() : TMeuObjetoLIsta retobjeto(identificadornivel : int, IdentificadorObjeto : int) : TMeuObjetoLista BuscaPai(IdentificadorNivel : int, IdentificadorPai : int) : TMeuObjetoLista BuscaObjeto(Objeto : void*) : TMeuObjetoLista BuscaObjeto_Grid() : TMeuObjetoLista* deletar(identificadornivel : int, IdentificadorObjeto : int, cascata : bool) : bool insere(identificadornivel : int, IdentificadorPai : int) : int insere(identificadornivel : int, IndentificadorPai : int, idobjeto : int) : int setapaiinicial(paiinicial : TComponent*) : void setiniciais(dsi : TDataSource*, QI : TQuery*) : void xml_serialize(xml : eternity::xml_archive, pos : int) : void ret_nomefomr(xml : xml_archive) : AnsiString settabordemobjeto() : void gera_dfm(arq : FILE*) : void insere(identificadornivel : int, IdentificadorPai : int, idobjeto : int) : int gera_dfm(arq : *FILE) : void gera_dfm_mov(arq : FILE*) : void gera_pas(arq : *FILE) : void gera_dfm_qds(arq : FILE*, Nome : AnsiString) : void gera_pas_qds(arq : FILE*) : void buscaconf banco(nome : AnsiString) : *conf _banco_de_dados criatabela(nome : AnsiString, q : TQuery*) : AnsiString setdadosbancotabelas(dados : *lista_projeto) : void conf iguramd(origem : *TRxMemoryData) : void conf iguracampos(origem : *TStrings) : void deletatudo() : void deletatudo(obj : void*) : void conf DadosBanco(projeto : lista_projeto*) : void busca_chave_primaria() : TMeuObjetoLIsta* MD_Fields_PAS() : AnsiString busca_chave_secundaria() : TMeuObjetoLista* busca_tabela_origem() : AnsiString busca_tabela_destino() : AnsiString ADD_Itens_Grid() : AnsiString ADD_Colunas_Grid() : AnsiString ADD_Itens_K() : AnsiString ADD_Itens_J() : AnsiString ADD_Itens_V() : AnsiString ADD_Itens_E() : AnsiString ADD_Itens_D() : AnsiString ADD_Itens_Trig() : AnsiString busca_se_string(nome : AnsiString) : bool FIGURA 34 Diagrama de classes das classes TMeuObjetoInicioLista e TMeuObjetoLista. A Figura 35 representa a estrutura da classe conf_banco_de_dados.