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:
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 |
***** |
conexao |
***** |
***** |
Command |
***** |
select * from clientes |
***** |
***** |
DataSet |
***** |
***** |
sql_clientes |
***** |
Provider |
***** |
***** |
***** |
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) |
|
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:
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:
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:
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:
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.