O objetivo deste artigo é mostrar como criar um formulário simples e genérico para realizar consulta e cadastro (inserção, exclusão e edição) no Delphi, utilizando o conceito de herança para agilizar o desenvolvimento das telas de CRUD do sistema. Não iremos nos ater a design ou detalhes mais simples e sim abordar a ideia geral por trás desta prática. Aqui, utilizaremos os componentes da paleta ADO (ADOConnection e ADOQuery), mas o mesmo pode ser feito com outras engines.

Mãos à obra, vamos montar a estrutura do form. Inicialmente, devemos adicionar um formulário ao projeto (VCL Forms Application) e chamá-lo de “frmGenerico”. Neste form, adicionemos os seguintes controles:

TADOQuery

  • Name = “qryGeral”;
  • Connection = ADOConnection adicionado em um DataModule e configurado para acessar um banco de sua escolha

TDataSource

  • Name = “dsGeral”
  • DataSet = qryGeral

TPageControl

  • Name = “pgcPrincipal”
  • TTabSheet
    Caption = “Consulta”
  • TTabSheet
    Caption = “Cadastro”

Agora, dentro da aba Cadastro do pagecontrol, vamos adicionar os controles da seguinte forma:

TDBNavigator

  • Align = alTop
  • DataSource = dsGeral

TPanel

  • Name = “pnlDados”

Por último, dentro da aba Consulta do pagecontrol, adicionemos os seguintes controles:

TDBGrid

  • Align = alClient
  • DataSource = dsGeral

TPanel

  • TCombobox
    Name = “cbbColunas”
  • TEdit
    Name = “edtConsulta”
  • TButton
    Name = “btnConsultar”

Pronto, a estrutura básica está montada. Agora vamos ao código.

Antes de tudo é preciso declarar uma variável privada do tipo string chamada “SQL” que será usada na consulta. Feito isso, no evento onShow do form, devemos escrever o seguinte código:

Listagem 1: código do evento onShow


var
  i:Integer;
begin
  for i := 0 to Pred(dsGeral.DataSet.FieldCount) do
  begin
    if dsGeral.DataSet.Fields[i].Tag = 1 then
       cbbColunas.Items.Add(dsGeral.DataSet.Fields[i].DisplayLabel);
  end;
  SQL := (dsGeral.DataSet as TADOQuery).SQL.Text;

Esse código adiciona no combobox o título das colunas da ADOQuery que estajam marcadas com Tag=1, essa foi a forma que definimos para identificar as colunas que podem ser usadas para consulta. No final, inicializamos a variável SQL com o conteúdo da propriedade SQL.Text da query, ou seja, devemos definir uma consulta inicial que possa ser usada de forma genérica, por exemplo: SELECT * FROM CLIENTES.

Agora, no evento onClick do botão btnConsultar, codificamos da seguinte forma:

Listagem 2: Código do evento onClick do botão Consultar


var
  coluna:string;
  i : Integer;
begin
  coluna := EmptyStr;
  for i := 0 to Pred(dsGeral.DataSet.FieldCount) do
  begin
    if dsGeral.DataSet.Fields[i].DisplayLabel = cbbColunas.Text then
       coluna := dsGeral.DataSet.Fields[i].FieldName;
  end;
  dsGeral.DataSet.Close();
  (dsGeral.DataSet as TADOQuery).SQL.Text := SQL + ' WHERE '+coluna+' = :valor ';
  (dsGeral.DataSet as TADOQuery).Parameters.ParamByName('valor').Value := edtConsulta.Text;
  dsGeral.DataSet.Open();

Esse trecho de código funciona da seguinte maneira: verificamos qual coluna está selecionada no combobox e encontramos o nome do campo para montar a consulta SQL. Percebemos que é necessário que a propriedade DisplayLabel das colunas seja única, para que se possa localizar corretamente a coluna selecioanda. Uma vez conhecida a coluna pela qual se deseja consultar, montamos uma instrução SQL com base no conteúdo da variável SQL (que deve ser algo como SELECT * FROM TABELA), definindo uma condição de consulta.

Para concluir a escrita de código, basta adicionar nos eventos onDblClick do DBGrid e onStateChange do DataSource os códigos constantes nas listagens 3 e 4.

Listagem 3: Código do evento onDblClick do DBGrid


pgcPrincipal.ActivePageIndex := 1;
//Ao clicar duas vezes sobre o grid, selecionar a aba de cadastro

Listagem 4: Código do evento onStateChange do DataSource.


pnlDados.Enabled := dsGeral.DataSet.State in [dsEdit, dsInsert];
//O painel com os campos para edição e inserção só fica habilitado
//se o DataSet estiver em edição ou inserção}

Para testar o fucionamento deste form genérico, basta adicionar ao projeto oum novo form herdando deste (File > New > Other > Inheritable Items > frmGenerico). Criado o form herdado, é necessário alterar o SQL da query para uma consulta simples como já foi citado, alterar a propriedade DisplayLabel das colunas e alterar para 1 a propriedade Tag das colunas pelas quais se deseja permitir a consulta. Na aba de cadastro, basta arrastar os campos da query para o painel pnlDados (ou adicionar da forma como preferir). Em geral, não é necessário adicionar nenhum código no form herdado, pois todas as rotinas de consulta e cadastro são genéricas e encontram-se no form pai. Se considerarmos um sistema com várias telas de CRUD básicas, que não diferem muito em funcionalidade, percebemos a praticidade que esta forma de trabalho garante.

Bem, o código é simples. Não me ative a detalhes, mas essa é a ideia geral na qual baseia-se a criação do form genérico de consulta e cadastro. Surgindo alguma dúvida, basta entrar em contato.

Um abraço e até a próxima.