A idéia que tive ao desenvolver as rotinas contidas neste artigo, foi de poupar trabalho tanto no ambiente visual, padronizando assim visualmente minhas aplicações, como no ambiente de programação, tornando assim a manutenção do código de forma mais simples.

 

Com as rotinas aqui demonstradas você evitará de realizar repetição de código fonte, com reaproveitamento total destes, economizando assim tempo de produção e documentação de suas rotinas. Outro fator importante é questão visual aonde você criará formulários de consulta e de manutenção, a partir de formulários pai  pré-definidos, a tão falada herança. Isso evitará problemas como tamanhos de formulários, figuras, etc.

 

Utilizei para desenvolver esse artigo o Delphi 7, mas você poderá utilizar o Delphi 2005 ou BDS 2006.

 

Crie uma pasta com o nome de artigo na unidade que for mais conveniente para você.

 

Inicie uma nova aplicação no Delphi indo em File, New, Application. No formulário gerado pelo Delphi, mude os valores das seguintes propriedades:

 

Name: FPrincipal

WindowsState: wsMaximized

Caption: Sistema

Color: $00F5F5F5.

 

Insira no formulário FPrincipal um componente Statusbar e um ToolBar. Clique na ToolBar com o botão direito e após sobre a opção New Button. Repita o procedimento e insira dois botões. Mude a propriedade ShowCaptions da ToolBar para True. Os captions dos botões serão mostrados. No primeiro botão, mude sua propriedade Caption para Clientes e no segundo botão para Sair.

 

Para terminar, insira um componente ImageList. Acrescente nele duas imagens (uma para o botão sair, outra para o botão clientes). Aponte a propriedade Images da ToolBar para ImageList1 e na propriedade ImageIndex de cada ToolButton, aponte para a figura que será listada.

 

Vá em File > Save All e salve a unit1 com o nome de uPrincipal, na pasta artigo. O próximo passo é salvar o projeto, mudando seu nome de project1 para Sistema, salvando na mesma pasta.

 

Seu formulário de principal (FPrincipal) deverá ficar parecido como mostrada a seguir:

 

 FIGURA 1.JPG

 

Quero salientar que você está livre para inserir imagens, formatações, enfim, configurar a aparência de seus formulários como achar mais conveniente. Não é necessário seguir os padrões visuais que coloquei aqui mas o importante antes de tudo é entender o objetivo do artigo.

 

O próximo passo é criar nosso DataModule. Vá em File > New > DataModule. Mude sua propriedade name para DM. Vá em File, Save All e salve sua unit com o nome de UDM, na pasta artigo.

Insira os seguintes componentes no datamodule: sqlconnection, sqldataset, datasetprovider, clientdataset. Mude as propriedades destes componentes, conforme mostra o quadro a seguir:

 

 

 

sqlconnection

sqldataset

datasetprovider

clientdataset

Name

Conexão

sql_clientes

dsp_clientes

clientes

Sql
connection

*****

conexao

*****

*****

Command
Text

*****

select * from clientes

*****

*****

DataSet

*****

*****

sql_clientes

*****

Provider
Name

*****

*****

*****

dsp_clientes

 

Depois de configurados os componentes acima, devemos realizar uma última manutenção, que é relativa à criação do acesso a dados.

Para isso, utilizei o banco de dados Firebird 1.5, aonde criei um database com o nome de sistema.fdb, salvando-o na pasta artigo. Neste database criei apenas uma tabela com o nome de clientes. Você poderá utilizar o IBExpert para criar a tabela.


A estrutura de dados da tabela clientes é mostrada a seguir:

 

Campo

Tipo/Tamanho

ind_cli

Integer (Primary Key)

Cliente

Varchar(50)

Email

Varchar(100)

Telefone

Varchar(14)

http

Varchar(100)

UF

CHAR(2)

 

 

Suas configurações de propriedades, devem relacionar os componentes, conforme mostra a figura a seguir:

 

FIGURA 2.JPG

 

Para o generator:

CREATE GENERATOR GEN_CLIENTES_ID;

 

Para a trigger:

CREATE TRIGGER CLIENTES_BI FOR CLIENTES

ACTIVE BEFORE INSERT POSITION 0

AS

BEGIN

  IF (NEW.ID_CLI IS NULL) THEN

    NEW.ID_CLI = GEN_ID(GEN_CLIENTES_ID,1);

END

 

Agora vamos ao tão comentado reaproveitamento de código. No datamodule (DM), na seção public, declare a seguinte procedure:

 

procedure registros (operacao: integer; formulario: tform; tabela: tclientdataset);


Declare também, mas no uses do DM, a unit forms.

Vamos agora a criação da procedure na integra:

 

  //manipula registros

  procedure tdm.registros (operacao: integer; formulario: tform; tabela: tclientdataset);
  begin
      //inclusão
      if operacao = 1 then

      begin
          tabela.insert;
          formulario.showmodal;
       end;

 

    //alteracao
    if operacao = 2 then

       formulario.showmodal;

 

   //exclusao

   if operacao = 3 then

     if application.messagebox("deseja realmente excluir o registro", "aviso", 1+0) = 1 then
     begin
        tabela.delete;
        tabela.applyupdates(0);
      end;
  end;

 

No primeiro If, temos a operação de inclusão, seguida da exibição do formulário de manutenção de dados. No segundo, temos a operação de alteração de dados, apenas chamando o form de manutenção para exibição do registro existente. No terceiro If, temos a operação de exclusão, seguida da atualização do banco, caso seja confirmada a exclusão.

A procedure registros será usada em praticamente todos nossos formulários de consulta, os quais serão criados a seguir mas, antes disso, aproveitando que estamos trabalhando com rotinas no datamodule, vamos criar outra procedure que será responsável pela filtragem (pesquisa) de informações locais (em memória) junto aos clientdasets da aplicação. Para isso, na seção public declare:

 

procedure filtra_registros (tabela: TClientDataSet; campo, valor: string);

 

Agora vamos a criação da procedure filtra_registros

 

//filtra registros

procedure TDM.filtra_registros (tabela: TClientDataSet; campo, valor: string);

begin

   tabela.Filtered := false;

   tabela.Filter    := campo + = +#39+valor+*+#39;

   tabela.Filtered := true;

end;

 

Temos aqui uma seleção básica de dados e informações, que são filtrados a partir de parâmetros. Os valores para esses parâmetros, em ambas as procedures criadas, serão  valores passados via o evento OnShow dos formulários de consulta, que serão vistos agora.

 

 

Vá em File > New > Form. No formulário inserido, mude as seguintes propriedades:

Name: FConsulta

Position: poScreenCenter

BorderStyle: bsToolWindow

ClientHeight: 484

ClientWidth: 861


Insira no formulário os seguintes componentes:


- Um ImageList, adicionando 4 imagens de seu gosto;

 

- Uma ToolBar. Insira quatro ToolButton. Altere a propriedade ShowCaptions da ToolBar para True. Aponte a propriedade Images para ImageList1;

 

- Um ActionList. Aponte a propriedade Images para o componente Image1. Insira 4 actions, mudando a propriedades de cada um como segue na tabela abaixo:

 

 

Action

Propriedade

Valor

Action 01

Name

Ac_Inserir

Caption

Inserir

ImageIndex

0

Action 02

Name

Ac_Exclui

Caption

Excluir

ImageIndex

1

Action 03

Name

Ac_Alterar

Caption

Alterar

ImageIndex

2

Action 04

Name

Ac_Sair

Caption

Sair

ImageIndex

3

 

- Clique em cada ToolButton da ToolBar e aponte sua propriedade Action para os actions criados anteriormente, na seguinte ordem: ac_inserir, ac_alterar, ac_excluir e ac_sair. Os botões são automaticamente configurados com a Imagem e caption correspondente;

 

- Um GroupBox. Configure sua propriedade Align para alTop e seu caption para “Pesquisa”;


- Um LabeledEdit. Mude seu name para EdtPesquisa, coloque o valor 0 para sua propriedade LabelSpacing e, por último, mude seu caption para “Digite aqui os dados para pesquisa”;

 

- Um StatusBar. Configure sua propriedade SimplePanel para True. Altere o valor da propriedade SimpleText para: “F2 - Insere / F3 - Alterar / F4 - Excluir / ESC – Sair do formulário”;

 

- Um TabControl. Mude seu name para Abas. Em sua propriedade Tabs insira todas as letras do alfabeto. Aponte o valor de TabPosition para tpBottom. Em TabWidth coloque o valor para 20. Aponte o valor de sua propriedade Align para allClient;

 

- Insira um componente datasource, mudando seu name para ds_Origem.

 

- Dentro do Tabcontrol, insira um DbGrid. Altere sua propriedade Align para allClient e name para Grade. Aponte a propriedade datasource do dbgrid para ds_Origem;

 

Agora salve tudo. Dê o nome a unit de uConsulta, salvando na pasta artigo. Seu formulário FConsulta deverá ter a aparência da figura a seguir:

 

FIGURA 3.JPG

 

Agora vamos criar o outro formulário para a Manutenção dos Dados. Vá novamente em File, New, Form. No formulário inserido, mude as seguintes propriedades:

 

Name: FManutencao

Position: poScreenCenter

BorderStyle: bsToolWindow

ClientHeight: 342

ClientWidth:713

 

Insira no formulário os seguintes componentes:


- Um Panel. Configure sua propriedade Align para alBottom.

 

- Dois BitBtn. Esses devem ser inseridos dentro do Panel, um ao lado do outro. Configure suas propriedades como mostrado abaixo:

 

BitBtn

Propriedade

Valor

BitBtn

Name

BtnOK

Caption

Ok

Kind

bkOk

BitBtn

Name

BtnCancelar

Caption

Cancelar

Kind

bkCancel

 

Dê o nome a unit de uManutencao, salvando na pasta artigo. Seu formulário FManutencao deverá ter a aparência da figura a seguir:

 

FIGURA 4.JPG

 

 

Agora vamos automatizar o form de consulta (FConsulta) com as procedures que  criamos anteriormente e também adicionar outros recursos.

 

Declare, na seção uses do form FConsulta, a biblioteca DbClient.

Na seção public, declare as seguintes variáveis:

 

Formulario : TForm; 

Tabela: TClientDataSet;

campo: string;



Agora vamos inserir nosso primeiro código. No evento OnKeyDown do form, coloque:

 

var i: integer;

begin

   //sai da tela de consulta

   if key = vk_escape then

      close;

 

   //insere registro

   if key = vk_f2 then

      dm.registros(1, formulario, tabela);

 

   //altera registro

   if key = vk_f3 then

      dm.registros(2, formulario, tabela);

 

   //excluir registro

   if key = vk_f4 then

      dm.registros(3, formulario, tabela);

 

   //filtra registro

   if key = vk_return then

   begin

      dm.filtra_registros(tabela, campo, edtpesquisa.text);

 

      //posiciona na aba correta

      for i := 0 to abas.tabs.count do

      begin

         abas.tabindex := i;

         if abas.tabs[abas.tabindex] = copy(edtpesquisa.text, 1, 1) then

            break;

      end;

   end;

 

O código acima verifica a tecla pressionada e executa as tarefas de pesquisa, inserção, exclusão ou alteração de dados. Caso a operação seja de filtragem de dados, é feita uma pesquisa utilizando a procedure filtra_registros e, após, através do loop for, através da primeira letra digitada em EdtPesquisa, o foco é passado para a aba correspondente.  O nome do formulário e da tabela que são passados como valores de parâmetros, são indicados no evento OnShow do form de consulta. Isso veremos daqui a pouco, pois agora temos que atribuir o código descrito acima a outros objetos do formulário.

 

Para isso, selecione simultaneamente os seguintes objetos: EdtPesquisa e Grade. Vá no Object Inspector, aba Events e procure o evento OnKeyDown. Aponte para FormKeyDown.

 

No evento OnActivate de FConsulta, vamos passar o foco e limpar o valores contidos em EdtPesquisa e digite as seguintes linhas de código:

 

//passa foco

edtpesquisa.setfocus;

 

//limpa edit

edtpesquisa.clear;

 

Vamos automatizar os actions criados no objeto ActionList. Clique duplamente no objeto ActionList1 e, na listas de actions que aparece na caixinha de lista, clique duplamente novamente no primeiro action (ac_insere) e insira o seguinte código no evento OnExecute:

 

//insere registro

dm.registros(1, formulario, tabela);

 

Faça o mesmo procedimento para os próximos actions, apenas mudando o valor da opção. Valor 2, corresponde a alteração e valor 3 a exclusão. No último action, ac_sair, digite o código abaixo:

 

//sai do form

 close;

 

No objeto Grade (Dbgrid), no seu evento OnDblClick digite:

 

//chama form

formulario.showmodal

 

O código acima chama o formulário que exibirá os dados (formulários de manutenção), no nosso caso, os formulários gerados a partir do modelo FManutencao.

 

O próximo passo é garantir com que ao clicarmos em qualquer um das abas do tabControl, seja realizada uma pesquisa pelo valor de cada aba. Para isso, vamos novamente utilizar a procedure filtra_registros, como mostrado a seguir:

 

   //filtra registros

   dm.filtra_registros(tabela, campo, abas.tabs[abas.tabindex]);

 

 

Temos agora que abrir a tabela, passando está como sendo o dataset para o datasource ds_origem. Após, através de uma chamada aos métodos presentes no evento OnChange do tabcontrol Abas, garantimos que as informações sejam filtradas e então exibidas no dbgrid.

 

No evento OnShow do formulário de consulta, devemos colocar as seguintes codificações:

 

  //abre tabela

  tabela.open;

 

  //aponta para tabela

  ds_origem.dataset := tabela;

 

  //filtra registros

  abaschange(nil);

 

 

 

 

O formulário de consulta está quase que totalmente automatizado Para concluir, devemos realizar agora devemos apenas fechar tabela. Para isso, vá no evento OnClose do formulário de consulte e digite:

 

//fecha tabela

tabela.close

 

Salve todas as alterações. Acabamos praticamente todo o processo, mas vamos criar um exemplo. Na mesma aplicação, vá em File > New > Other. Na caixa de diálogo, clique na aba Sistema, que é a aba referente aos arquivos pertencentes a este projeto. Você observará que todos os formulários criados estão ali.

 

Clique no formulário FConsulta e após sobre Ok. Será gerado um novo formulário com o nome de FConsulta1. Mude as seguintes propriedades desse form:

 

Name: FClientes

Caption: “Clientes”

 

Salve a unit do form com nome de uClientes. Vá no form FPrincipal, no ToolButton1, em seu evento OnClick, e digite:

 

//chama form

fclientes.showmodal

 

Vá novamente em File > New > Other, na aba Sistema e selecione agora FManutencao e clique em Ok. Um novo formulário modelo é criado. Mude as seguintes propriedades deste form:

 

Name: FManutencaoClientes

Caption: “Clientes [Manutenção]”

 

Agora salve essa unit com o nome de uManutencaoClientes. Ok, até aqui tudo legal, agora insira os campos contidos no clientdataset (Clientes), no DM, dentro do form de manutenção de clientes. Ele deverá parecido com o da figura a seguir:

 

FIGURA 5.JPG

 

 

Agora vamos até o form FClientes e vamos adicionar o seguinte código no seu evento OnShow:

 

  tabela := dm.clientes;

  formulario := FManutencaoClientes;

  campo := cliente;

 

  inherited;

 

 

Nos código acima, a variável Formulário faz referência ao form de Manutenção de Dados, neste caso a FManutencaoClientes e a variável Tabela se refere a tabela de Clientes (dataset). A variável Campo recebe o valor referente ao tfield da tabela clientes que será utilizado pela procedure filtra_registros para filtragem de dados.

 

O último passo agora é automatizar os botões do form FManutencaoClientes. No evento OnClick do botão BtnOk digite:

 

//atualiza dados

dm.clientes.applyupdates(0);

 

No botão BtnCancelar, no evento OnClick digite:

 

//cancela atualização

dm.clientes.cancelupdates;

 

 

Para finalizar, aponte a propriedade datasource de cada dbedit para ds_origem. Caso ds_Origem não esteja disponível, vá até o menu File, opção use unit e selecione UClientes.

 

Salve todas as alterações e execute o projeto. Insira, altere, pesquise e exclua registros a vontade e crie outros forms baseados nos modelos existentes.

Espero que este artigo seja produtivo e útil para todos.

Abraço a todos até a próxima.