Esse artigo faz parte da revista Clube Delphi Edição 100. Clique aqui para ler todos os artigos desta edição

Neste artigo veremos

·         Como criar uma classe capaz de gerar formulários automaticamente;

·         Inclusão automática de controles em tela;

·         Técnicas avançadas de automatização de tarefas.

Qual a finalidade?

·         Com as técnicas apresentadas é possível agilizar o processo de criação de telas de cadastro.

Quais situações utilizam esses recursos?

·         Podemos aplicar esses recursos em praticamente todo tipo de sistema, porém o maior foco são softwares que necessitam de telas de cadastro.

 

Resumo do DevMan

         Sabemos que no dia-a-dia de qualquer software house ou mesmo desenvolvedores autônomos, tempo é dinheiro e agilizar o processo de desenvolvimento é sempre bem-vindo. Com certeza as telas que mais demandam tempo em um projeto real são as de cadastro. Geralmente são telas comuns e quase com as mesmas funções. Mesmo assim gastamos grande parte do nosso desenvolvimento fabricando tais mecanismos. Por que não automatizar tudo isso? Criar janelas de cadastro genéricas onde o próprio sistema as cria?

         Pois bem, baseados nisso faremos um exemplo bem completo onde faremos a criação automática de telas de cadastro automatizando e agilizando esse processo em nossos sistemas.

 

A partir do momento em que iniciamos a construção de um projeto de grande porte, temos em mente a dificuldade que será mantermos a compatibilidade entre cada formulário da interface com o usuário final. Mais do que isso, sabemos do tempo a ser investido na confecção de cada um deles separadamente.

Entretanto, desenvolvedores um pouco experientes certamente já pensaram: “se estes formulários de cadastro são tão básicos, porque não existe algo que automatize sua criação?”. Pois, essa tarefa só nos toma tempo e stress na hora de verificar se tudo está compatível.

Mesmo no caso de estarmos utilizando uma estrutura hierárquica bem estruturada de formulários, podemos encontrar problemas desse tipo. Por exemplo, se quisermos colocar todos os campos TEdit para edição em letras maiúsculas, teremos de ir tela por tela alterando todos os componentes. Ou optarmos por adicionar um algoritmo na classe base que varra os componentes e faça as alterações em runtime. Isso é bastante trabalhoso. A situação piora quando queremos acabar com abreviações em labels, ou verificar espaços entre componentes, ou mudar a classe base de um formulário etc.

Através de um aplicativo de exemplo bastante prático, a solução apresentada é a da construção de formulários em runtime, ou seja, com apenas algumas linhas de código, criamos telas para cadastro de informações básicas de nosso projeto. Assim, não precisaremos investir nosso tempo em tarefas cotidianas, facilmente automatizáveis. Além disso, estas classes base podem ser facilmente acopladas aos frameworks para desenvolvimento de aplicações que utilizamos em nossas empresas.

 

A classe base do formulário

Antes de iniciar a automação propriamente dita, vamos criar uma classe base, da qual todos os formulários de cadastro de nossa aplicação herdarão. Assim, todas as operações de cadastro terão um ponto em comum.

 

Nota: Se você já possui um projeto em andamento, tente, em vez de criar outra classe, utilizar a classe base dos formulários de seu próprio sistema. Com algumas pequenas alterações, certamente o resultado será o mesmo e se adaptará ao seu contexto.

 

Crie um novo projeto chamado AutoFormTestApp.dpr e renomeie o formulário gerado para fmBaseForm, salvando-o em seguida como BaseForm.pas. Baseando-se na Figura 1, adicione e configure os seguintes componentes. Inclua um SQLConnection(conAutoForm) e configure sua propriedade LoginPrompt para False. Também da paleta dbExpress inclua um SQLQuery(sqAutoForm) e conecte-o ao conAutoForm pela propriedade SQLConnection. Acesse a paleta Data Access e arraste um DataSetProvider(dspAutoForm) configurando sua propriedade DataSet para sqAutoForm. Em seguida arraste um ClientDataSet(cdsAutoForm) conectando-o ao DataSetProvider pela propriedade ProviderName. Por fim inclua um DataSource(dsAutoForm) com a propriedade DataSet igual a cdsAutoForm. Com isso criamos uma conexão com nosso banco de dados.

Agora faremos a inclusão de componentes visuais começando por um Panel(pnlControls). Modifique sua propriedade Align para alTop. Insira um novo Panel(pnlWindowNav) com a propriedade Align igual a alBottom. Em seguida arraste um Splitter(splGrid) da paleta Additional com sua propriedade Align igual a alTop. Esse componente será útil para que possamos redimensionar a área de visualização dos controles. Insira um novo Panel(pnlGrid) como alClient. Dentro do pnlWindowNav inclua um Label(lblFormName) e Caption igual a Form Name, um BitBtn(btnOk) com Caption igual a Ok, Kind igual a bkOk e Default True. Ainda no pnlWindowNav coloque outro BitBtn(btnOk) com Caption igual a Cancel e Kind igual a bkCancel.

Já dentro do pnlGrid insira um DBNavigator(dbnAutoForm) com o seu DataSource apontado para dsAutoForm e VisibleButtons desmarque (False) o item nbRefresh. Modifique sua propriedade Align para alTop. Para finalizar inclua dentro do pnlGrid um DBGrid(dbgAutoForm). Modifique seu Align para alClient, DataSource para dsAutoForm e Options desmarque (False) a opção dbTabs.

Com isso conseguimos montar um layout semelhante a Figura 1. Fiz ainda algumas modificações nas propriedades de fonte do Label lblFormName bem como o fundo do Panel onde ele está alocado, ou seja, fica a seu critério modificar a parte visual como desejar em nossa aplicação.

 

Figura 1. Configuração dos componentes do formulário base

 

Para a configuração do banco de dados, utilize o SGBD de sua preferência e maior familiaridade. Apenas lembre-se de configurar o componente conAutoForm (TSQLConnection) corretamente. Preferivelmente, crie um novo banco de dados para o exemplo. Serão necessárias 6(seis) tabelas em nosso banco de dados. Na Figura 2 fiz questão de descrever as propriedades de cada tabela que deverá ser criada. Não esqueça que as tabelas Produto, Venda e Venda_Produto deverão conter Foreign Key, ou seja, chaves estrangeiras nos campos:

 

·         Produto: campos ID_MARCA;

·         Venda: ID_VENDEDOR e ID_CLIENTE;

·         Venda_Produto: ID_PRODUTO. Esse também deverá fazer parte da Chave Primária da tabela.  

 

Não entrarei em detalhes sobre a criação do banco, tabelas, chaves primárias e/ou chaves estrangeiras por não fazer parte do escopo desse artigo.

 

Figura 2. Estrutura das tabelas do banco de dados

 

Como você pode ver, esta será uma aplicação exemplo clássica de venda de produtos. Vamos então incrementar um pouco nosso formulário base.

 

Codificando o formulário

Vamos iniciar a codificação do nosso formulário padrão começando pelo evento OnShow. Manipule o evento citado do Form incluindo as linhas de programação a seguir:

 

  lblFormName.Caption := 'Cadastro de ' + GetDisplayName;

   Self.Caption := lblFormName.Caption;

  cdsAutoForm.Open;

 

Perceba que a codificação é bem simples. Apenas modificamos o Caption do form concatenando a frase Cadastro de mais o método GetDisplayName que veremos logo a seguir. Em seguida nós abrimos o ClientDataSet cdsAutoForm. Declare agora, na seção Protected, da classe TfmBaseForm as seguintes funções:

  ...

Quer ler esse conteúdo completo? Tenha acesso completo