Anda di halaman 1dari 108

APOSTILA

DE
LINGUAGEM E
TCNICAS
DE
PROGRAMAO II

Professor Mark Juliani

NDICE
CRIANDO BANCO DE DADOS

05

1.1) Modelo de Dados

05

1.2) Escolhendo um Banco de Dados

06

1.3) Ferramenta para Criao de um Banco de Dados:

06

1.4) Definindo um Diretrio para o Banco de Dados

06

1.5) Criando Tabelas do Banco de Dados

06

1.6) Definindo Diretrio de Trabalho no DATABASE DESKTOP

11

1.7) Alterando uma Tabela

12

1.8) Propriedades da Tabela

13

1.9) Definindo a Propriedade TABLE LOOKUP

15

1.10) Definindo a propriedade SECONDARY INDEXES

17

1.11) Definindo a propriedade REFERENTIAL INTEGRITY

18

1.12) Definindo a propriedade PASSWORD SECURITY

19

1.13) Exerccios

21

CRIANDO ALIASE

23

2.1) Delphi x BD

23

2.2) O que um ALIASE

23

2.3) Criando e Configurando um ALIASE

24

2.4) Exerccios

28

CRIANDO PROJETOS

29

3.1) Criando uma nova aplicao com um Formulrio Principal

29

3.2) Montando um Formulrio Principal

29

3.3) Salvando o Projeto

30

3.4) Fechando o Projeto

32

3.5) Abrindo o Projeto

32

CRIANDO DATA MDULE

34

4.1) O que um Data Mdule?

34

4.2) Criando um Data Mdule

34

4.3) Visualizando Formulrios do Nosso Projeto

36

CRIANDO CADASTROS
5.1) Configurando componentes Data Access

38
38

5.2) Criando um novo formulrio para o cadastro

41

5.3) Cdigo Fonte do Formulrio de Cadastro

49

5.4) Chamando o Formulrio de Cadastro

56

5.5) Utilizando o Form Wizard

57

5.6) Exerccios

61

MSCARAS, CAMPOS LOOKUPS E CAMPOS CALCULADOS

62

6.1) O que so Mscaras?

62

6.2) Definindo Mscaras

62

6.3) O que so Campos Lookups?

66

6.4) Criando Campos Lookups

66

6.5) O que so Campos Calculados?

70

6.6) Criando Campos Calculados?

70

6.7) Componente DBLookupCombobox?

75

6.8) Utilizando o Componente DBLookupCombobox

75

6.9) Exerccios

77

CRIANDO CONSULTA SIMPLES

78

7.1) Criando menus no Formulrio Principal

78

7.2) Criando Consultas Simples

78

7.3) Exerccios sobre Consultas Simples

80

CRIANDO UM FORMULRIO DE CONSULTA

81

8.1) Componente Query

81

8.2) Configurando o Componente QUERY

81

8.3) Montando um Formulrio de Consulta

84

8.4) Cdigo Fonte do Formulrio de Consulta

87

8.5) Chamando o Formulrio de Cadastro

89

8.6) Exerccios

89

CRIANDO RELATRIOS

90

9.1) Criando menus no Formulrio Principal

90

9.2) Criando um Filtro para o Relatrio

90

9.3) Chamando o Formulrio de Filtro

95

9.4) Criando o Relatrio

95

9.5) Exerccios

104

9.6) Relatrios Agrupados

104

Linguagem e Tcnicas de Programao II

Mark Juliani

CAPITULO I
CRIANDO BANCO DE DADOS
1.1)

Modelo de Dados
Antes de escolhermos o Banco de Dados que iremos utilizar, necessrio

planeja-lo, evitando assim problemas futuros.


Um planejamento consiste no levantamento de informaes que iro formar o
nosso Banco de Dados.
Exemplo: digamos que aps termos feito um levantamento em uma empresa
constatamos que o modelo de nosso Banco de Dados ficar desta maneira:
1

CURSOS

ALUNOS

Onde:
CURSOS
CAMPO
COD_CURSO
NOME_CURSO

TIPO
I
A

TAM
50

REQ
SIM
SIM

CH
PK
-

TIPO
I
I
A
A
D
I
I

TAM
50
01

REQ
SIM
SIM
SIM
SIM
SIM
SIM
SIM

CH
PK
FK
-

ALUNOS
CAMPO
COD_ALUNO
COD_CURSO
NOME_ALUNO
SEXO_ALUNO
DT_NASC
SERIE
PERIODO

Campo:

Nome do campo da tabela

Tipo:

Tipo de dado (I Inteiro, A Alfanumrico, D Data, etc)

Tam:

Tamanho do campo

Req:

Indicador de campo obrigatrio ou no obrigatrio

CH:

Indicador de Chave (PK Primary Key, FK Foreign Key)


Pgina 6 de 108

Linguagem e Tcnicas de Programao II


1.2)

Mark Juliani

Escolhendo um Banco de Dados:


Aps a criao do modelo do Banco de Dados, precisaremos agora definir um

Aplicativo de Banco de Dados que iremos utilizar.


Ao instalarmos o Delphi, ele j vem com um Banco de Dados padro chamado
PARADOX e este o Banco que iremos utilizar em nossa disciplina.
1.3)

Ferramenta para Criao de um Banco de Dados:


Para criar um novo banco de dados, normalmente, necessrio dispor de alguma

ferramenta do prprio banco de dados, como o Access, mas se a base de dados for
Paradox, ou dBase, voc pode usar o Database Desktop, um utilitrio que vem com o
Delphi e permite a criao desses tipos de bancos de dados.
1.4)

Definindo um Diretrio para o Banco de Dados


Para facilitar o entendimento, vamos abrir o aplicativo Windows Explorer e criar

uma pasta onde iremos salvar o nosso Banco de Dados.

1.5)

Criando Tabelas do Banco de Dados


Para a criao das tabelas do nosso banco de dados vamos utilizar o aplicativo

DATABASE DESKTOP. Existem duas formas para localizarmos este aplicativo:

Clicar no Menu Iniciar / Programas / Borland Delphi / Database Desktop.

Pgina 7 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Abrir o Windows Explorer, entrar no diretrio C:\Arquivos de


programas\Borland\Database Desktop e dar um duplo clique com o
mouse em cima do arquivo dbd32.exe

Ao executar qualquer uma das opes acima, aparecer a seguinte tela:

Para criarmos uma tabela, basta clicarmos no menu FILE / NEW / TABLE
conforme mostra figura abaixo:

Aps executarmos o passo acima aparecer um formulrio onde vamos escolher


o banco de dados que estamos utilizando, no caso, Paradox 7:

Pgina 8 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Basta escolhermos o tipo de banco de dados (Paradox 7) e clicarmos no boto


OK. Aps isso, aparecer a tela onde iremos montar nossa tabela, conforme mostra
figura abaixo:

Nome do
Campo Da
Tabela

Tipo
Dado
Campo

de
do

Tamanho do
Campo

Indicador de
Chave
Primria

Propriedades
da Tabela

Indicador de
Campo
Requerido

Como exemplo, vamos montar a tabela de CURSOS, descrita no item 1.1 desta
apostila:

Pgina 9 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Descrio da Janela Acima:


FIELD NAME: devermos digitar no nome do campo, geralmente no utilizamos
espaos nem caracteres especiais e adotamos o padro maisculo.
TYPE: basta digitar o identificador do tipo (+, A, etc) ou pressionar Barra de Espao
para abrir uma lista com os tipos existentes.
SIZE: deveremos digitar o tamanho do campo, lembrando que determinados tipos de
campos no possuem tamanho.
KEY: deveremos indicar se o campo ou no chave primria, para isso basta pressionar
a Barra de Espao e o marcador ir aparecer ou sumir. No exemplo acima, apenas o
campo COD_CURSO ser chave primria. Uma tabela pode conter mais de uma chave
primria, mas estas devem ser sempre os primeiros campos da tabela.
Existe tambm outras opes que podero ser marcadas para cada campo, dentre
elas vamos destacar as mais importantes:
REQUIRED FIELD: para marcar se o campo dever ou no ser de preenchimento
obrigatrio.
MINIMUM VALUE: valor mnimo que o campo poder conter.
MAXIMUM VALUE: valor mximo que o campo poder conter.
Pgina 10 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

DEFAUT VALUE: para colocar um valor padro no campo quando for inserido um
registro na tabela.
Como prximo passo, deveremos salvar nossa tabela, para isso s clicar no
boto SAVE AS, e aparecer a seguinte tela:

Nesta tela, deveremos escolher o local onde iremos salvar nossa tabela e
escolhermos um nome para esta tabela. No exemplo, estou salvando a tabela na pasta
BANCO DE DADOS e o nome dela ser CURSOS. Lembrando que para nomes de
tabelas, geralmente no utilizamos espaos nem caracteres especiais e adotamos o
padro maisculo e nome no plural.
Aps clicarmos no boto SALVAR, a tela acima ser fechada, e ser
apresentada a primeira tela apresentada neste item.
Agora, vamos criar nossa tabela de ALUNOS, para isso, basta seguirmos todos
os passos mencionados no item 1.5:

Pgina 11 de 108

Linguagem e Tcnicas de Programao II

1.6)

Mark Juliani

Definindo Diretrio de Trabalho no DATABASE DESKTOP


Para que o nosso diretrio criado se torne o padro do DATABASE DESKTOP

ser necessrio fazermos uma pequena configurao.


Clique no menu FILE / WORKING DIRECTORY e aparecer a seguinte tela:

Basta clicar no boto Browse e escolher o diretrio desejado e pressionar o


boto OK da janela abaixo:

Pgina 12 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Aps clicar no boto OK, a tela anterior ficar da seguinte forma:

Clique no boto OK e pronto, j est configurado o novo diretrio de trabalho:


1.7)

Alterando uma Tabela


Para que possamos alterar uma tabela j criada, em primeiro lugar devermos

abrir a tabela, para isso, basta clicarmos no menu FILE / OPEN / TABLE, conforme
mostra figura abaixo:

Pgina 13 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Aps clicarmos neste menu, abrir uma tela para localizarmos nossa tabela:

Basta localizarmos o local onde a tabela foi salva, clicarmos na tabela desejada e
clicar no boto abrir. A tabela ser aberta no Database Desktop confome mostra figura
abaixo e para podermos modificar as propriedades e campos da tabela, s clicar no
boto RESTRUCTURE ou no menu TABLE / RESTRUTUCTURE.

Pgina 14 de 108

Linguagem e Tcnicas de Programao II

1.8)

Mark Juliani

Propriedades da Tabela
Neste item, veremos as propriedades de uma tabela paradox. Para que vejamos a

tela abaixo, precisaremos abrir uma tabela j criada, para isso, basta seguirmos o que foi
descrito no item anterior. As propriedades da tabela esto situadas no canto superior
esquerdo da janela conforme mostra a figura abaixo.

Dentre elas, vamos destacar a mais importante:


Pgina 15 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

TABLE LOOKUP: propriedade que serve para relacionar tabelas. Quando


configurada, um registro filho no poder ser includo sem que antes o registro pai
esteja cadastrado. Exemplo: S ser possvel cadastrarmos um aluno para um curso que
j tenha sido cadastrado anteriormente.
SECONDARY INDEXES: propriedade para definir ndices da tabela. Quando
configurada, a tabela poder ser ordenada pelo campo escolhido no ndice. Exemplo:
Para mostrarmos uma listagem de alunos cadastrados em ordem alfabtica, teremos que
criar um ndice secundrio para o campo NOME_ALUNO.
REFERENTIAL INTEGRITY: propriedade para relacionar tabelas. Quando
configurada, um registro pai no poder ser excludo sem que antes excluamos o
registro filho, ou quando excluirmos um registro pai, todos seus registros filhos sero
excludos. Exemplo: S ser possvel excluir um CURSO quando todos os alunos deste
curso forem excludos ou quando excluirmos um CURSO, todos os seus alunos tambm
sero excludos.
PASSWORD SECURITY: propriedade para definir senha. Quando configurada,
sempre que formos executar alguma operao com a tabela, est pedir uma senha.
Aps todas as mudanas, a tabela dever ser salva novamente.
Para configurarmos a propriedades das tabelas, obrigatrio definirmos o nosso
Diretrio de Trabalho, visto no item 1.6.
1.9)

Definindo a Propriedade TABLE LOOKUP


Esta propriedade s pode ser definida para as tabelas FILHAS. No nosso

exemplo a tabela ALUNOS filha da tabela CURSOS, pois elas esto relacionadas
entre si.

Pgina 16 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Abra a tabela desejada, selecione a propriedade TABLE LOOKUP e clique no


boto DEFINE. Aps clicar no boto, aparecer a seguinte tela:

No lado esquerdo da tela, devemos selecionar o campo que faz a ligao da


tabela FILHA com a tabela PAI. No nosso exemplo, COD_CURSO o campo de
ligao. No lado direito, deveremos selecionar a tabela PAI.
Basta agora clicar no boto OK e pronto. No esquea de salvar a tabela.
Pgina 17 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

1.10) Definindo a propriedade SECONDARY INDEXES


Esta propriedade pode ser definida para qualquer tabela, diferente da
propriedade anterior que s pode ser definida para as tabelas FILHAS.
Vamos definir um ndice Secundrio para o campo NOME_CURSO da tabela
CURSOS.

Abra a tabela CURSOS, selecione a propriedade SECUNDARY INDEXES, e


clique no boto DEFINE. Aparecer a seguinte tela:

Pgina 18 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Nesta tela deveremos selecionar o campo desejado no lado esquerdo e passarmos


este campo para o lado direito da janela e pressionarmos o boto OK. Vale lembrar que
um ndice pode conter mais de um campo da tabela. Aps clicar no boto OK, aparecer
a seguinte tela:

Defina um nome para o ndice e clique no boto OK. No esquea de Salvar a


Tabela.
1.11) Definindo a propriedade REFERENTIAL INTEGRITY
Esta propriedade bem semelhante a propriedade TABLE LOOKUP, e assim
como ela s pode ser definida para as tabelas FILHAS. Ento vamos definir a
integridade referencial entre as tabelas de CURSOS e ALUNOS. Para isso devemos
abrir a tabela de ALUNOS, pois esta filha da tabela CURSOS.

Pgina 19 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Selecione a propriedade REFERENTIAL INTEGRITY e clique no boto


DEFINE. Aparecer a seguinte tela:

No lado esquerdo da tela, devemos selecionar o campo que faz a ligao da


tabela FILHA com a tabela PAI. No nosso exemplo, COD_CURSO o campo de
ligao. No lado direito, deveremos selecionar a tabela PAI.
Ateno com a opo UPDATE RULE.
CASCADE: quando um registro na tabela PAI for apagado, todos os registros
relacionados nas tabelas FILHAS tambm sero apagados automaticamente.
PROHIBIT: s ser possvel apagar um registro na tabela PAI se todos o
registros relacionados nas tabelas FILHAS forem apagados manualmente.
Basta agora clicar no boto OK.

Defina um nome para o relacionamento e clique no boto OK. No esquea de


Salvar a Tabela.
1.12) Definindo a propriedade PASSWORD SECURITY

Pgina 20 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Esta propriedade pode ser definida para qualquer tabela. Vamos definir uma
senha para a tabela de CURSOS. Para isso devemos abrir a tabela de CURSOS.

Selecione a propriedade PASSWORD SECURITY e clique no boto DEFINE.


Aparecer a seguinte tela:

Basta digitar uma senha, sua confirmao e clicar no boto OK. Ateno para o
boto AUXILIAR PASSWORDS. Quando clicamos neste boto, aparece uma outra
janela.

Pgina 21 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Atravs desta janela, poderemos definir um esquema de segurana mais


avanado para nossa tabela, podendo definir senha para cada campo da tabela e qual o
direito de acesso para este campo.
1.13) Exerccios
Monte um Banco de Dados utilizando o PARADOX de acordo com a seguinte
Estrutura seguindo as instrues abaixo:
N

CIDADES

ESTADOS

PAISES

REGIOES

Onde:
REGIOES
CAMPO
COD_REGIAO
NOME_REGIAO

TIPO
I
A

TAM
50

REQ
SIM
SIM

CH
PK
-

Pgina 22 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

PAISES
CAMPO
COD_PAIS
NOME_PAIS
SIGLA_PAIS

TIPO
I
A
A

TAM
50
03

REQ
SIM
SIM
SIM

CH
PK
-

TIPO
I
I
A
A

TAM
50
03

REQ
SIM
SIM
SIM
SIM

CH
PK
FK
-

TIPO
I
I
I
A
I
D
$

TAM
+
50

REQ
SIM
SIM
SIM
SIM
SIM
SIM
SIM

CH
PK
FK
FK
-

ESTADOS
CAMPO
COD_ESTADO
COD_PAIS
NOME_ESTADO
SIGLA_ESTADO
CIDADES
CAMPO
COD_CIDADE
COD_ESTADO
COD_REGIAO
NOME_CIDADE
QT_HABITANTES
DT_FUNDACAO
RENDA_MENSAL

Crie um Diretrio chamado BD_CIDADES

Mude o Diretrio de Trabalho do DATABASE DESKTOP para o diretrio


criado.

Crie as Tabelas

Defina um ndice secundrio para os campos NOME_REGIAO, NOME_PAIS,


NOME_ESTADO, NOME_CIDADE de acordo com suas respectivas tabelas.

Defina as propriedades TABLE LOOKUP e REFERENTIAL INTEGRITY para


as tabelas FILHAS.

Pgina 23 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

CAPITULO II
CRIANDO ALIASE
2.1)

Delphi x BD
Para a fazer a comunicao da linguagem de programao DELPHI com o

Banco de Dados PARADOX vamos precisar do BDE (Borland Database Engine).


O BDE fornece a capacidade de acesso padronizado a banco de dados para
Delphi, C++ Builder e outros ambientes de programao da Borland, oferecendo um
grande conjunto de funes para auxiliar no desenvolvimento de aplicaes Desktop e
Cliente/Servidor.
Os controladores do BDE podem ser usados para acessar bases de dados dBase,
Paradox, Access, FoxPro, Interbase, Oracle, Sybase e MS-SQL Server, DB2, Informix,
alm de um controlador de acesso a arquivos texto. Voc tambm pode utilizar fontes
de dados ODBC, podendo acessar qualquer base de dados compatvel.
As funes que compe uma API do BDE so usadas internamente pelos
componentes de acesso a dados do Delphi e muito raramente voc teria que us-las
diretamente, mas isso totalmente possvel. A referncia completa das funes do BDE,
com exemplos em Delphi, est no BDE API Help na pasta do Delphi no Menu Iniciar.
2.2)

O que um ALIASE
Um ALIASE um nome mais amigvel que voc escolhe para referenciar o

caminho onde se encontra o seu Banco de Dados. Continuando nosso exemplo da


apostila anterior, foi criado um banco de dados no diretrio C:\ BANCO DE DADOS
com as tabelas ALUNOS e CURSOS.
Quando estivermos fazendo nosso programa, precisaremos colocar este caminho
em vrias partes do programa, imagine ento se mudarmos o caminho do nosso banco
de dados. Nosso programa ter que ser modificado para que funcione novamente. O
ALIASE vem justamente para contornarmos essa situao.
Voc pode criar um ALIASE que contem o caminho do banco de dados e
utilizar este ALIASE no programa, assim, se por acaso o caminho for modificado, no

Pgina 24 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

teremos que alterar uma linha de cdigo sequer no nosso programa, basta apenas
redirecionar o ALIASE para o novo caminho.
2.3)

Criando e Configurando um ALIASE


Para a criao e configurao do ALIASE, deveremos utilizar o SQL

EXPLORER ou o BDE ADMINISTRATOR. Existe duas formas para localizarmos este


aplicativo:

Clicar no Menu Iniciar / Programas / Borland Delphi / SQL Explorer.

Abrir o Windows Explorer, entrar no diretrio C:\Arquivos de


programas\Borland\Delphi4\Bin e dar um duplo clique com o mouse em
cima do arquivo dbexplor.exe

Ao executar qualquer uma das operaes acima, aparecer a seguinte tela:

Para criarmos um ALIASE, devemos selecionar a aba DATABASES e depois


clicar no menu OBJECT / NEW conforme mostra figura abaixo:

Pgina 25 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Aps o clique, aparecer um formulrio onde vamos escolher o tipo de banco de


dados que estamos utilizando, no caso do PARADOX o tipo de banco o STANDARD:

Basta escolhermos o tipo de banco de dados (Standard) e clicarmos no boto


OK. Aps isso, aparecer a tela onde iremos configurar o nosso ALIASE:

Pgina 26 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

No lado esquerdo, onde aparece escrito STANDARD1, deveremos colocar no


nome do nosso ALIASE.
No lado direito da imagem, onde temos a aba DEFINITION, deveremos
alterar o item PATH, que nada mais do que o caminho onde esto nossas tabelas.
Como exemplo, vamos colocar o nome do ALIASE de TESTE e dizer o
caminho onde salvamos nossa tabela, no caso do exemplo Banco de Dados. Para isso
devemos clicar no item PATH, embaixo da palavra FALSE do item acima e logo em
seguida clicar no boto com 3 pontinhos que aparece no final da linha. Ao clicar neste
boto, aparecer a seguinte tela:

Pgina 27 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Nesta tela, devemos escolher o local onde est o nosso Banco de Dados e
quando as tabelas estiverem sendo visualizadas no lado direito da janela, basta clicar no
boto OK. No nosso exemplo, aps o clique a tela ficar assim:

Para finalizarmos a criao do nosso ALIASE, basta clicarmos no menu


OBJECT / APPLY e pronto, conforme mostra figura abaixo:

Pgina 28 de 108

Linguagem e Tcnicas de Programao II


2.4)

Mark Juliani

Exerccios
Crie um ALIASE chamado AL_CIDADES para o exerccio do captulo anterior.

Pgina 29 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

CAPITULO III
CRIANDO PROJETOS
3.1)

Criando uma nova aplicao com um Formulrio Principal


Ao iniciar o Delphi, este j cria um novo projeto automaticamente denominado

PROJECT1 (veja figura abaixo). Este projeto composto por um formulrio chamado
FORM1.

Para podermos criarmos um projeto basta clicarmos no menu FILE / NEW


APPLICATION.

Ao clicar nesse menu, o Delphi iniciar um novo projeto composto por um


formulrio chamado FORM1, o qual geralmente ser utilizado como formulrio
principal de qualquer aplicao que venha a ser desenvolvida.
3.2)

Montando um Formulrio Principal


Deste ponto em diante, utilizaremos como exemplo o nosso Banco de Dados de

Cidades criado no captulo I. Vamos ento montar o formulrio principal para o nosso
projeto modelo. Para montarmos o formulrio principal, utilizaremos o FORM1 criado
pelo Delphi quando inicializamos o nosso projeto.
Vamos fazer com que o nosso formulrio principal fique conforme a figura
abaixo:

Pgina 30 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Faa as configuraes abaixo para cada componente utilizado:


Componentes Utilizados
Formulrio: Vamos alterar as seguintes propriedades.
Caption: Formulrio Principal - Projeto Cidades (texto da barra de titulo do
formulrio)
Color: clGray (cor de fundo do formulrio)
Name: frmPrincipal (nome mais amigvel para o formulrio)
WindowSatate: wsMaximized (fazer com que o formulrio abra de forma
maximizada quando o projeto for executado)
MainMenu: Primeiro componente da paleta STANDARD.

Basta colocar o componente no formulrio e dar um duplo clique com o mouse


sobre o mesmo. Vamos alterar as seguintes propriedades:
Caption: texto que ir aparecer no item de menu. Ao se digitar o caractere &
antes de uma letra, esta ficar sublinhada. Ao se digitar o caractere - neste
propriedade, aparecer um separador.
Hint: texto que ir aparecer na barra de status (veremos a seguir)
ShortCut: tecla de atalho para acessar o menu.

Pgina 31 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

StatusBar: Dcimo quinto componente da paleta WIN32. Clique no componente e em


seguida clique no formulrio. Vamos alterar as seguintes propriedades:
AutoHint: True (faz com que os hints digitados nos componentes apaream)
3.3)

Salvando o Projeto
Para salvarmos o nosso projeto, basta clicarmos no boto

(Save All) ou

clicar no menu FILE / SAVE ALL e aparecer a seguinte janela:

Primeiramente, deveremos salvar o formulrio principal (UNIT1). Vamos


selecionar o local desejado e chamar o arquivo UNIT1 de Principal. Ao clicar no boto
salvar, o Delphi lhe pedir para salvar o projeto (PROJECT1). Vamos salvar o nosso
projeto de Projeto_Cidades, conforme mostra a figura abaixo:

Pgina 32 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Reparem que ao clicar no boto salvar, o nosso projeto mudou de nome. Na


barra da janela do Delphi onde estava escrito PROJECT1, agora est escrito
Projeto_Cidades.

Sempre que criarmos um novo formulrio para o nosso projeto, necessrio que
salvemos este formulrio e para isso basta clicarmos sempre no boto SAVE ALL. Mas
lembre-se, este janela de salvar arquivo mostrada anteriormente, s aparece quando
estivermos salvando um arquivo pela primeira vez.
3.4)

Fechando o Projeto
Para fechar o nosso projeto, basta clicarmos no menu FILE / CLOSE ALL,

conforme mostra figura abaixo.

3.5)

Abrindo o Projeto
Para abrirmos o nosso projeto, basta clicarmos no menu FILE / OPEN

PROJECT (Crtl+F11), conforme mostra figura abaixo.

Aparecer a seguinte janela:


Pgina 33 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Nesta janela, basta localizar o projeto no local onde ele foi salvo, clicar com o
mouse em cima do nome do arquivo e pressionar o boto ABRIR.

Pgina 34 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

CAPITULO IV
CRIANDO DATA MDULE
4.1)

O que um Data Mdule?

um tipo de formulrio utilizado geralmente para armazenar todos os

componentes de acesso a dados (paleta Data Access) comuns a vrios formulrios do


sistema. Nele tambm costumam ficar rotinas comuns a vrios mdulos de um sistema.
4.2)

Criando um Data Mdule


Vamos adicionar um Data Mdule em nosso projeto. Para isso devemos abrir o

nosso projeto salvo anteriormente conforme foi mostrado no captulo III. Com o projeto
aberto, basta clicarmos no menu FILE / NEW.

Ao clicar neste menu, ser apresentada a seguinte tela:

Pgina 35 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Deveremos selecionar a paleta NEW e localizar o componente Data Module


selecionado na figura acima. Aps selecionarmos o componente deveremos clicar no
boto OK e o Delphi ir criar o nosso Data Module que possui a seguinte aparncia:

Reparem que o ttulo da janela criada, aparece com DataModule1 ou


DataModule2, dependendo da ordem que foi criado. Para facilitar o nosso trabalho
posteriormente, vamos mudar a propriedade NAME para DM e o nosso DataMdule
dever ficar da seguinte forma:

Vamos agora salvar o nosso projeto, clicando no boto SAVE ALL. Ateno,
com o nosso DataModule nunca foi salvo aparecer uma janela pedindo o local onde
iremos salvar-lo, basta escolher o mesmo local onde encontra-se salvo o nosso projeto,
dar um nome para o arquivo (UDM) e clicar no boto salvar, conforme mostra figura
abaixo:

Pgina 36 de 108

Linguagem e Tcnicas de Programao II

4.3)

Mark Juliani

Visualizando Formulrios do Nosso Projeto


Sempre que estivermos desenvolvendo um projeto que trabalhe em conjunto

com um Banco de Dados, comum que este projeto contenha vrios formulrios, da o
fato de que devemos renomear estes formulrios com um nome mais apropriado.
Digamos que tenhamos um projeto que contenha 30 formulrios, e na hora de salvar o
usurio tenha deixado os nomes sugeridos pelo Delphi (FORM1, FORM2, FORM3,
etc). Como vamos saber posteriormente que formulrio trata-se do cadastro de Cidades,
a menos que a pessoa tenha uma excelente memria, isto vai ficar extremamente
complicado. Por falar em vrios formulrios, como devemos fazer para manipular estes
vrios formulrios no Delphi.
Basta clicarmos no boto

(View Form) ou a tecla de atalho Shift+F12 ou

ainda o menu VIEW / FORMS que ser apresentada a seguinte tela:

Pgina 37 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Nesta tela, ficam relacionados todos formulrios do nosso projeto, para


visualizar um deles, basta selecion-lo na lista e pressionar o boto OK.
Mais uma vez venho destacar que quanto mais amigvel o nome do formulrio,
mais rpido iremos encontra-lo quando necessrio.

Pgina 38 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

CAPITULO V
CRIANDO CADASTROS
5.1)

Configurando componentes Data Access


Como exemplo vamos criar o formulrio de cadastro para a tabela de REGIES,

do exerccio do captulo I.
Como foi dito, no Data Module ficaro os componentes de acesso a dados
encontrados na paleta de componentes DATA ACCESS. Para comearmos a montar o
nosso cadastro, deveremos colocar um componente TABLE e um componente
DATASOURCE em nosso Data Module que dever ficar da seguinte forma:

Deveremos agora configurar estes componentes da seguinte forma:


TABLE: componente que representa nossa tabela no banco de dados e deveremos
configurar as seguintes propriedades:
DATABASENAME: Local onde est seu banco de dados ou nome do seu ALIASE, no
nosso caso, est propriedade dever conter o valor AL_CIDADES que foi o nome dado
para o nosso ALIASE no exerccio do captulo II.
TABLENAME: Local onde deveremos selecionar a tabela do nosso banco de dados. As
tabelas s aparecero quando a propriedade DATABASENAME for configurada
corretamente. No nosso exemplo, est propriedade ir conter o valor REGIOES.db que
o nome da nossa tabela no banco de dados.
NAME: Propriedade para mudarmos o nome do componente, o qual ser utilizado em
todo cdigo. No nosso exemplo, esta propriedade ir conter o valor tblRegioes.

Pgina 39 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

DATASOURCE: componente que faz a ligao dos componentes DATASET da paleta


DATA ACCESS com os componentes da paleta DATA CONTROLS e deveremos
configurar as seguintes propriedades:
AUTOEDTI: Esta propriedade quando FALSE, faz com que o usurio precise utilizar
um comando para alterar um registro, evitando assim alteraes indevidas. No nosso
exemplo, vamos utilizar esta propriedade como FALSE.
DATASET: Esta propriedade dever conter o componente DATASET relacionado. No
nosso exemplo, dever conter o valor tblRegioes.
NAME: Propriedade para mudarmos o nome do componente, o qual ser utilizado em
todo cdigo. No nosso exemplo, esta propriedade ir conter o valor dtsRegioes.
Quando terminarmos de configurar os componentes TABLE e DATASOURCE,
o Data Module dever ficar com a seguinte aparncia:

Agora devemos adicionar os campos da tabela no nosso componente TABLE,


para isso basta dar um duplo clique com o mouse no componente TABLE e aparecer a
seguinte tela:

Pgina 40 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Aps aparecer a tela, clique com o boto direito do mouse dentro desta tela e
selecione o menu ADD FIELDS, conforme mostra a figura a seguir:

Aps clicar neste menu, aparecer a seguinte tela, mas ateno, se ocorrer algum
erro nesta operao, significa que o seu componente TABLE ou o seu ALIASE no foi
configurado corretamente:

Esta tela contem todos os campos criados em sua tabela, basta clicar no boto
OK e a tela anterior ficar da seguinte forma:
Pgina 41 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Sempre que for modificado, excludo ou includo algum campo em sua tabela do
banco de dados, os campos da janela mostrada na figura acima devero ser retirados
(clicar no campo e pressionar a tecla Delete) e adicionados novamente.
5.2)

Criando um novo formulrio para o cadastro


Agora precisaremos criar um novo formulrio em nossa aplicao, que ser o

nosso formulrio de cadastro de REGIES, para isso basta clicar no menu FILE / NEW
FORM. Observem que um novo formulrio foi criado em nosso projeto.
Como os componentes de Acesso a Dados esto contidos no Data Mdule, o
nosso formulrio de cadastro dever utilizar o Data Mdule. Para fazermos esta relao
entre o formulrio de Cadastro e o Data Mdule, deveremos fazer o seguinte:
Primeiramente deveremos selecionar o formulrio de cadastro e depois clicar no menu
FILE / USE UNIT conforme mostra figura abaixo:

Pgina 42 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Ao clicar neste menu, aparecer a seguinte tela:

Nesta tela, deveremos selecionar a UNIT que o formulrio de cadastro precisar


utilizar. Como foi falado anteriormente, o formulrio de Cadastro dever utilizar o Data
Mdule, ento, basta selecionarmos a UNIT UDM e clicar no boto OK.
Vamos agora salvar a UNIT de Cadastro de Regies com o nome de
Cad_Regioes. Para isso basta clicar no boto SAVE ALL.
Agora, vamos comear a criar literalmente nosso formulrio de cadastro de
Regies. Observem a tela abaixo:

Para que nossa tela de Cadastro de Regies fique com a aparncia da tela acima,
precisaremos modificar algumas propriedades:
Caption : Cadastro de Regies (Texto que aparece na barra de ttulo)
BorderStyle: bsSingle (no permite que o usurio altere o formato da janela)
Name: frmCad_Regioes (nome mais amigvel para o formulrio)
Position: poDesktopCenter (faz com que o formulrio aparea no centro da tela)
Vamos agora colocar os botes que sero responsveis pela manipulao dos
dados em nossa tabela, para isso utilizaremos o componente TOOLBAR da paleta
WIN32

.
Pgina 43 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Para adicionar botes na barra, clique com o boto direito do mouse em cima da
barra e clique no menu NEW BUTTON.
Para adicionar separadores na barra, clique com o boto direito do mouse em
cima da barra e clique no menu NEW SEPARATOR.

Para que a barra fique com a aparncia da imagem acima, precisaremos


modificar algumas propriedades:
Duplo clique em EdgeBorders, ebBotton: True (adiciona uma borda na parte inferior da
barra)
Flat: True (Faz com que os botes da barra fiquem no estilo Office97)
Foram adicionados 11 botes e 3 separadores na barra de botes na imagem
acima.

Pgina 44 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Para facilitar o entendimento futuro, vamos dar nome aos botes.


Respectivamente da Esquerda para Direita, colocaremos os seguintes nomes na
propriedade NAME:

BTNPRIMEIRO

BTNANTERIOR

BTNPROXIMO

BTNULTIMO

BTNNOVO

BTNEDITAR

BTNEXCLUIR

BTNSALVAR

BTNATUALIZAR

BTNCANCELAR

BTNSAIR
Vamos agora, adicionar HINTS aos nossos botes. Para isso altere a propriedade

SHOWHINT para TRUE (faz com que aparece um texto ao se passar com o mouse em
cima de um boto) e depois digite o texto que voc quer que aparea na tela na
propriedade HINT de cada boto. Sugesto de HINTS para os botes:

Primeiro Registro

Registro Anterior

Prximo Registro

ltimo Registro

Novo Registro

Editar Registro

Excluir Registro

Salvar Registro

Atualizar Registro

Cancelar Registro

Sair do Formulrio
Pgina 45 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Vamos agora colocar algumas imagens em nossos botes. Como as imagens dos
botes sero as mesmas para todas as telas de cadastros, poderemos utilizar o Data
Mdule para isso.
Visualize o formulrio do Data Mdule e insira o componente ImageList

da

paleta WIN32. Nosso Data Mdule dever ficar com a seguinte aparncia:

Para inserirmos as imagens neste componente deveremos fazer o seguinte: D


um duplo clique com o mouse sobre o componente e aparecer a seguinte tela:

Clique no boto ADD.

Pgina 46 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Selecione a imagem desejada (esta geralmente fica no diretrio C:\Arquivos de


programas\Arquivos comuns\Borland Shared\Images\Buttons) e clique no boto abrir.

Caso aparea esta mensagem, significa que o tamanho da imagem diferente do


tamanho configurado no componente (padro 16x16). Clique no boto YES para
separar as imagens.

Basta agora remover a imagem indesejada.

Pgina 47 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

De acordo com as imagens sugeridas, nosso formulrio de cadastro ficar da


seguinte forma:

Para que as imagens apaream nos botes, precisaremos configurar uma


propriedade no componente TOOLBAR. Selecione o componente TOOLBAR (clique
no componente e no nos botes), localize a propriedade IMAGES e selecione o
componente adicionado no Data Mdule.

Caso o componente no aparece listado na propriedade, significa que o


formulrio de cadastro no est utilizando o Data Mdule, volte ao inicio deste captulo
e tente resolver o problema.
Aps efetuar estas operaes, nosso formulrio de cadastro dever ficar de
acordo com a imagem acima.
Para alterar a ordem das imagens, clique no boto desejado e altere a
propriedade IMAGEINDEX.

Continuando nosso formulrio de cadastro, o prximo passo agora, ser


colocarmos os componentes da paleta DATA CONTROLS no nosso formulrio de
cadastro e configura-los. Deveremos utilizar um componente para cada campo da
tabela. Observe a imagem a seguir:

Pgina 48 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Para que o nosso formulrio fique com est aparncia, basta colocar dois
componentes LABEL (
DBEDIT (

situado na paleta STANDARD) e dois componentes

situado na paleta DATACONTROLS).

Para que os componentes da paleta DATACONTROLS acessem o nosso Banco


de Dados, precisaremos configurar algumas propriedades, para isso basta clicar no
componente desejado (no nosso exemplo o DBEDIT1 e DBEDIT2) e alterar as
seguintes propriedades:
DATASOURCE: propriedade onde iremos escolher o DATASOURCE deste cadastro.
No nosso exemplo, esta propriedade ir possuir o valor DM.dtsRegioes, pois o
componente DATASOURCE do nosso cadastro encontra-se no Data Mdule. Todo
componente da paleta DATACONTROL possui esta propriedade.
DATAFIELD: propriedade onde iremos escolher o campo ao qual o componente est
relacionado. Esta propriedade s pode ser configurada aps configurarmos a
propriedade DATASOURCE. Nem todos os componentes da paleta DATA
CONTROLS possui esta propriedade. No nosso exemplo, o componente DBEDIT1
dever conter o valor COD_REGIAO e o componente DBEDIT2 o valor
NOME_REGIAO que so os campos da nossa tabela REGIOES.db.
Nosso cadastro de regies j est quase concludo, mas para podemos seguirmos
adiante ser necessrio que todos conheam alguns mtodos do componente TABLE.
Todos os componentes TABLE, possuem os seguintes mtodos:
Mtodos para manipulao de dados

FIRST

posiciona a tabela no primeiro registro.

PRIOR

posiciona a tabela no registro anterior ao atual.

NEXT

posiciona a tabela no prximo registro ao atual.

LAST

posiciona a tabela no ltimo registro.


Pgina 49 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

APPEND

inclui um novo registro no final da tabela.

INSERT

inclui um registro na posio atual da tabela.

POST

salva o registro atual que estiver sendo includo.

REFRESH

salva o registro atual que estiver sendo alterado.

CANCEL

cancela o registro atual que estiver sendo includo

ou alterado.

DELETE

exclui o registro atual.

EDIT

coloca a tabela em edio para alterao do registro

atual.
Mtodos para manipulao da tabela

RECORDCOUNT

retorna a quantidade de registros de uma

retorna o nmero do registro atual da

tabela.

RECNO
tabela.

EOF

verifica final de arquivo.

BOF

verifica inicio de arquivo.

OPEN

abre a tabela.

CLOSE

fecha a tabela.

Exemplo para podermos utilizar os mtodos do componente TABLE:


LOCAL_TABELA.COMPONENTE_TABLE.METODO;
DM.tblRegioes.Open; (abre a tabela de regies)
DM.tblRegioes.First; (posiciona a tabela de regies no primeiro registro
cadastrado)
5.3)

Cdigo Fonte do Formulrio de Cadastro


Vejamos agora, como dever ficar o cdigo fonte do nosso formulrio de

cadastro de regies. Todos os cdigos abaixo estaro comentados para melhor


entendimento.

Pgina 50 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

//btnPrimeiro
procedure TfrmCad_Regioes.btnPrimeiroClick(Sender: TObject);
begin
//posiciona a tabela no primeiro registro
DM.tblRegioes.First;
//habilita-desabilita botes
btnPrimeiro.Enabled
:= false;
btnAnterior.Enabled
:= false;
btnProximo.Enabled
:= true;
btnUltimo.Enabled
:= true;
end;
//btnAnterior
procedure TfrmCad_Regioes.btnAnteriorClick(Sender: TObject);
begin
//posiciona a tabela no registro anterior
DM.tblRegioes.Prior;
//habilita-desabilita botes
btnProximo.Enabled
:= true;
btnUltimo.Enabled
:= true;
//verificando se a tabela esta no primeiro registro
if DM.tblRegioes.Bof then
begin
btnPrimeiro.Enabled
:= false;
btnAnterior.Enabled
:= false;
end;
end;
//btnProximo
procedure TfrmCad_Regioes.btnProximoClick(Sender: TObject);
begin
//posiciona a tabela no prximo registro
DM.tblRegioes.Next;
//habilita-desabilita botes
btnPrimeiro.Enabled
:= true;
btnAnterior.Enabled
:= true;
//verifica se a tabela est no ultimo registro
if DM.tblRegioes.Eof then
begin
btnProximo.Enabled
:= false;
btnUltimo.Enabled
:= false;
end;
end;

Pgina 51 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

//btnUltimo
procedure TfrmCad_Regioes.btnUltimoClick(Sender: TObject);
begin
//posiciona a tabela no ltimo registro
DM.tblRegioes.Last;
//habilita-desabilita botoes
btnPrimeiro.Enabled
:= true;
btnAnterior.Enabled
:= true;
btnProximo.Enabled
:= false;
btnUltimo.Enabled
:= false;
end;
//btnNovo
procedure TfrmCad_Regioes.btnNovoClick(Sender: TObject);
begin
//inclui um novo registro na tabela
DM.tblRegioes.Insert;
end;
//btnEditar
procedure TfrmCad_Regioes.btnEditarClick(Sender: TObject);
begin
//coloca um registro da tabela em edio
DM.tblRegioes.Edit;
end;
//btnExcluir
procedure TfrmCad_Regioes.btnExcluirClick(Sender: TObject);
begin
//exibe mensagem de confirmao - comando Application.Messagebox
if Application.MessageBox('Excluir Registro?', 'Excluso',
mb_applmodal+mb_iconquestion+mb_yesno+mb_defbutton1) = 6 then
begin
//verificao de erro ao excluir um registro
try
//exclui um registro da tabela
DM.tblRegioes.Delete;
except
//mensagem de erro
Application.MessageBox('Erro ao Excluir Registro.', 'Aviso',
mb_applmodal+mb_iconinformation+mb_ok+mb_defbutton1);
end;
end;
end;
Pgina 52 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

//btnSalvar
procedure TfrmCad_Regioes.btnSalvarClick(Sender: TObject);
begin
//mensagem de confirmao - comando Application.MessageBox
if Application.MessageBox('Salvar Registro?', 'Salvar',
mb_applmodal+mb_iconquestion+mb_yesno+mb_defbutton1) = 6 then
begin
//verificao de erro ao salvar registro
try
//salva um registro que estiver sendo includo ou alterado
DM.tblRegioes.Post;
except
//mensagem de erro
Application.MessageBox('Erro ao Salvar Registro.', 'Aviso',
mb_applmodal+mb_iconinformation+mb_ok+mb_defbutton1);
end;
end;
end;
//btnAtualizar
procedure TfrmCad_Regioes.btnAtualizarClick(Sender: TObject);
begin
//mensagem de confirmao - comando Application.MessageBox
if Application.MessageBox('Atualizar Registro?', 'Atualizar',
mb_applmodal+mb_iconquestion+mb_yesno+mb_defbutton1) = 6 then
begin
//verificao de erro ao atualizar registro
try
//atualiza um registro que estiver sendo includo ou alterado
DM.tblRegioes.Refresh;
except
//mensagem de erro
Application.MessageBox('Erro ao Atualizar Registro.', 'Aviso',
mb_applmodal+mb_iconinformation+mb_ok+mb_defbutton1);
end;
end;
end;
//btnCancelar
procedure TfrmCad_Regioes.btnCancelarClick(Sender: TObject);
begin
//cancela um registro que estiver sendo includo ou alterado
DM.tblRegioes.Cancel;
end;

Pgina 53 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

//btnSair
procedure TfrmCad_Regioes.btnSairClick(Sender: TObject);
begin
//fechar o formulario
Close;
end;
Os cdigos abaixo devem ser utilizados para que a tabela de regies seja aberta
ou fechada. Para melhor funcionamento do programa, no recomendvel deixar uma
tabela (componente TABLE) sempre aberta, pois isso pode vir ocasionar erros
gravssimos no Banco de Dados. O ideal abrir a tabela quando o formulrio de
cadastro for aberto e fecha-la quando o mesmo formulrio for fechado. Para fazer os
cdigos abaixo, precisaremos utilizar o evento ONSHOW (abertura do formulrio) e
ONCLOSE (fechamento do formulrio) do nosso formulrio de cadastro. Para isso
basta clicar no formulrio de cadastro desejado, selecionar a paleta de EVENTOS do
OBJECT INSPECTOR, localizar o evento desejado e dar um duplo clique com o mouse
sobre a caixa de texto branca em frente do nome do evento.

//Evento OnShow do formulario de Cadastro de Regioes


procedure TfrmCad_Regioes.FormShow(Sender: TObject);
begin
//abriar a tabela
DM.tblRegioes.Open;
end;
//Evento OnClose do formulario de Cadastro de Regioes
procedure TfrmCad_Regioes.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
//fechar a tabela
DM.tblRegioes.Close;
end;
Pgina 54 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Vamos agora fazer o cdigo para habilitar e desabilitar os botes de funes


(INSERT, POST, DELETE, etc) do formulrio de cadastro, mas antes precisamos
conhecer sobre os Estados da Tabela representados na figura abaixo:
Post
Cancel
Delete

Insert
Append
dsInsert

dsBrowse
Post
Cancel
Delete

dsEdit
Edit

dsInsert

= significa que est sendo includo um registro na tabela.

dsEdit

= significa que um registro est sendo alterado.

dsBrowse

= significa que a tabela est apenas aberta.

De acordo com o estado da tabela, determinados botes ficaro habilitados e


outros desabilitados, por exemplo, quando estivermos inserindo um novo registro na
tabela, no recomendvel que o boto de Excluir ou os botes de Navegao
(Primeiro, Anterior, Prximo e ltimo) fiquem habilitados. O cdigo abaixo dever ser
inserido no evento ONSTATECHANTE do componente DATASOURCE (dtsRegioes)
que est dentro do nosso DataMdule.
//codigo para habilitar-desabilitar botoes do formulario de cadastro
procedure TDM.dtsRegioesStateChange(Sender: TObject);
begin
//verificando se o formulrio de cadastro est ativo
if frmCad_Regioes.Visible then
begin
//se a tabela do cadastro estiver em insero ou edio
if DM.tblRegioes.State in ([dsInsert, dsEdit]) then
begin
//habilita-desabilita determinados botoes
with frmCad_Regioes do
begin
btnPrimeiro.Enabled
:= false;
btnAnterior.Enabled
:= false;
btnProximo.Enabled
:= false;
btnUltimo.Enabled
:= false;
btnNovo.Enabled
:= false;
btnEditar.Enabled
:= false;
Pgina 55 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

btnExcluir.Enabled
:= false;
btnSalvar.Enabled
:= true;
btnAtualizar.Enabled := true;
btnCancelar.Enabled
:= true;
btnSair.Enabled
:= false;
end;
end
//seno a tabela vai estar no estado de visualizao (dsbrowse)
else
begin
//habilita-desabilita determinados botoes
with frmCad_Regioes do
begin
btnPrimeiro.Enabled
:= true;
btnAnterior.Enabled
:= true;
btnProximo.Enabled
:= true;
btnUltimo.Enabled
:= true;
btnNovo.Enabled
:= true;
btnEditar.Enabled
:= true;
btnExcluir.Enabled
:= true;
btnSalvar.Enabled
:= false;
btnAtualizar.Enabled := false;
btnCancelar.Enabled
:= false;
btnSair.Enabled
:= true;
end;
end;
end;
end;
Com os cdigos acima, reparem como ficam os botes do nosso formulrio de
cadastro quando estivermos inserindo um registro.

Com isso, conclumos o nosso formulrio de cadastro, mas vale lembrar que
existem vrias formas de se fazer um cadastro, o que foi passado neste captulo apenas
uma delas.

Pgina 56 de 108

Linguagem e Tcnicas de Programao II


5.4)

Mark Juliani

Chamando o Formulrio de Cadastro


O nosso formulrio de cadastro j est finalizado, mas agora precisaremos fazer

com que o nosso formulrio principal chame o nosso formulrio de cadastro, pois afinal,
pra isso que existe um formulrio principal. Para isso devemos selecionar o nosso
formulrio principal e clicar no item de menu que vai estar chamando o nosso
formulrio de cadastro.

Basta darmos um clique sobre o menu desejado e se abrir o Editor de Cdigo


do Delphi para que ns possamos digitar os comandos para abertura do outro
formulrio.
//item de menu que chama o formulario de cadastro de regioes
procedure TfrmPrincipal.Regies1Click(Sender: TObject);
begin
//chamando o formulario de cadastro de regioes
frmCad_Regioes.ShowModal;
end;
Aps digitarmos os comandos acima, precisaremos executar o nosso programa,
para isso, basta pressionarmos a tecla F9 ou pressionarmos o boto de execuo

Quando executarmos o projeto pela primeira vez aps inserirmos o cdigo


acima, aparecer a seguinte mensagem:

Esta mensagem quer dizer que, o formulrio principal ir utilizar o formulrio de


cadastro e o Delphi est lhe perguntando se realmente isso que estamos querendo
fazer. Basta ento, dar um clique no boto YES e executarmos o programa novamente.
Pgina 57 de 108

Linguagem e Tcnicas de Programao II


5.5)

Mark Juliani

Utilizando o Form Wizard


O FORM WIZARD um assistente de criao automtico de formulrios de

cadastros do DELPHI. Com esse assistente podemos criar rapidamente de forma bem
simples um cadastro. Vejamos como devemos utilizar este assistente:
Vou tomar como exemplo, o cadastro de Regies, somente para efeitos
explicativos, pois o mesmo j foi desenvolvido.
Para acionarmos o assistente, devemos clicar no menu DATABASE / FORM
WIZARD.

Ao clicar neste menu, estaremos inicializando o assistente e aparecer a seguinte


tela:

Nesta tela podemos escolher o tipo de formulrio:


Simple Form para formulrios simples, tipo o cadastro de regies j criado
anteriormente.
Mster/Detail Form para formulrios evolvendo vrias tabelas. Ex: um formulrio de
compra que possui seus itens aparecendo na mesma tela.
Pgina 58 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Podemos tambm escolher o tipo de componente DATASET que iremos utilizar


um nosso cadastro: componente TABLE ou componente QUERY (este componente
ser visto mais adiante).
No caso do cadastro de regies, trata-se de um formulrio de cadastro simples e
iremos utilizar o componente TABLE. Clique no boto NEXT para prosseguirmos:

Na tela acima, no lado direito, deveremos selecionar o caminho do nosso banco


de dados e no lado esquerdo, deveremos escolher a tabela do cadastro que esta sendo
montado. Para efeito explicativo, estamos utilizando a tabela de REGIES e o caminho
o Alase AL_CIDADES.
Clique no boto NEXT para continuar:

Pgina 59 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Nesta tela aparece todos os campos existente na tabela escolhida. No lado


esquerdo ficam todos os campos da tabela e no lado direito, devemos colocar os campos
que desejamos que aparea na tela de cadastro.
Clique em NEXT para continuar:

Nesta tela deveremos escolher como ficar o desenho do nosso formulrio de


cadastro:
Clique em NEXT para continuar:

Pgina 60 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Esta a ltima tela do assistente, nela faremos as configuraes finais do nosso


cadastro.
A opo GENERATE A MAIN FORM no deve ser marcada, quando esta
opo estiver marcada, o formulrio criado ser o formulrio PRINCIPAL da sua
aplicao. No nosso caso, j temos um formulrio principal, estamos criando apenas um
formulrio de cadastro.
Na opo FORM GENERATION, devemos escolher a opo FORM ONLY,
pois se escolhermos a outra opo, o assistente criar um outro DATA MODULE para
nossa aplicao.
Clique em FINISH para concluir o cadastro:

Pgina 61 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Como vocs podem perceber o formulrio criado bastante precrio mas


funciona perfeitamente. Para vermos este formulrio funcionando, cham-lo atravs do
nosso formulrio principal.
Estes formulrios so raramente utilizados e o mesmo s foi mostrado neste
captulo para efeito de conhecimento.
5.6)

Exerccios
Montar os formulrios de Cadastros de Pases, Estados e Cidades sem a

utilizao do assistente Form Wizard e fazer com estes sejam chamados atravs do
formulrio principal.

Pgina 62 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

CAPITULO VI
MSCARAS, CAMPOS LOOKUPS E CAMPOS CALCULADOS
6.1)

O que so Mscaras?
Mscaras so aqueles caracteres que complementam determinados campos

padres, evitando assim que o usurio tenha que digitar caracteres desnecessrios.
Por exemplo: Em nosso Cadastro de Cidades existe um campo chamado
DT_FUNDACAO, que a data de fundao da cidade. Sempre que o usurio for digitar
a data de fundao da cidade, este ter que digitar as barras / que compem a data.
Como toda data possui este caractere de barra / padro, poderamos definir uma
mscara para que o usurio digite apenas os valores numricos da data.
Poderamos tomar como exemplo diversos outros tipos de campos, tipo CPF,
CEP, TELEFONE, etc.
6.2)

Definindo Mscaras
Para facilitar a explicao, utilizaremos como exemplo o nosso formulrio de

cadastro de cidades.
Sempre que formos definir uma mscara de um determinado campo de uma
tabela, precisaremos definir esta mscara no componente TABLE que est
referenciando a tabela. Como vamos definir a mscara do campo DT_FUNDACAO da
tabela de CIDADES, precisaremos localizar o componente TABLE utilizado para isto.
Vamos ento abrir o Data Mdule do nosso projeto:

A figura acima, mostra o Data Mdule do nosso projeto aps todos os cadastros
terem sido feitos. Reparem que existe um componente TABLE para cada tabela do
Pgina 63 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

nosso Banco de Dados. Vamos ento selecionar a nossa tabela de CIDADES


(tblCidades). Para definir a mscara, d um duplo clique com o mouse sobre a tabela
desejada, fazendo assim, que aparece uma janela mostrando todos os campos desta
tabela:

Selecione o campo desejado, clique no OBJECT INSPECTOR, localizando a


propriedade EDITMASK.

Clique agora sobre o boto com 3 pontinhos que apareceu na frente desta
propriedade:

Pgina 64 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

A janela acima representa um editor de mscaras. Vamos agora descrever esta


janela.
IMPUT MASK: Local onde dever ficar a mscara do campo.
CHARACTER FOR BLANKS: Caracter que dever aparece no local onde o usurio
dever digitar o texto. Exemplo: com o caractere padro _ , se for feita uma mscara
para data, est ficar assim: __/__/__. Agora se o caractere padro fosse o @, ao se
digitar uma data, esta ficaria assim: @@/@@/@@
TEST IMPUT: Local de teste para podermos testar nossa mscara.
SAMPLE MASKS: Mscaras padro oferecidas pelo Delphi.
Vamos selecionar uma mscara padro para definirmos a mscara do nosso
campo:

Reparem que a mscara padro selecionada, possui um ano de 2 dgitos para a


data, mas no Brasil, costumamos utilizar o ano com 4 dgitos, basta alterarmos a
mscara sugerida no IMPUT MASK para o nosso ano ficar com 4 dgitos.
Pgina 65 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Com a mscara definida (IMPUT MASK) e o teste feito (TEST IMPUT) basta
clicarmos no boto OK e pronto, nossa mscara acaba de ser definida.

Agora s executar o programa e quando estivermos cadastrando uma cidade, o


campo contendo a data de fundao estar formatado. Observem a figura abaixo:

Pgina 66 de 108

Linguagem e Tcnicas de Programao II


6.3)

Mark Juliani

O que so Campos Lookups?


So campos de tabelas, criados em tempo de projeto, ou seja, no existe no

banco de dados, para mostrar campos existentes em outras tabelas. Por exemplo: No
nosso projeto exemplo, temos a nossa tabela de ESTADOS, esta tabela possui apenas o
campo COD_PAIS, mas no possui o campo NOME_PAIS. Este campo lookup,
permite que a gente possa visualizar o campo NOME_PAIS na tabela de ESTADOS
sem que este tenha sido definido no banco de dados, usando apenas para isso, o campo
de ligao entre as duas tabelas, o COD_PAIS.
Vejamos a nossa tela de cadastro de ESTADOS:

Ao cadastrar o estado do ESPRITO SANTO, o usurio ter que digitar o cdigo


de um pas, pois na tabela de ESTADOS possui o campo COD_PAIS. Reparem que no
tem como o usurio saber, que pais o representado pelo cdigo 1, ao menos que o
usurio tenha decorado esta cdigo. para facilitar este tipo de coisa que existem os
campos lookups.
6.4)

Criando Campos Lookups


Em nosso exemplo, para criarmos um campo lookup na tabela de ESTADOS

que mostre o nome do Pas, precisaremos abrir o nosso Data Mdule e selecionarmos a
tabela de ESTADOS.

Pgina 67 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

D um duplo clique sobre a tabela de estados que aparecer automaticamente


todos os campos desta tabela.

Para criarmos um campo lookup com o nome do Pas, precisaremos inserir um


novo campo na tabela, para isso clique com o boto direito do mouse em cima da janela
contendo os campos da tabela.

Ir aparecer um menu, selecione a opo NEW FIELD.


Pgina 68 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Aparecer a seguinte janela. Vamos descrever esta janela:


Field properties (propriedades do novo campo)
NAME: nome do novo campo
COMPONENTE: nome interno gerado pelo Delphi para o novo campo
TYPE: tipo de dado que o campo armazenar
SIZE: tamanho do campo
Field Type (Tipo de Campo)
DATA: so os tipos de campos que realmente existem na tabela
CALCULED: so os campos do tipo calculado (visto posteriormente)
LOOKUP: so os campos do tipo lookup.
Lookup Definition (Definio do Campo Lookup)
KEY FIELD: campo de ligao entre as duas tabelas.
DATASET: tabela pai de onde esta sendo puxado o campo lookup.
LOOKUP KEY: campo chave primria da tabela pai.
RESULT FIELD: campo que ser visualizado
Aps a configurao, a tela acima dever ficar da seguinte forma:

Pgina 69 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Basta clicar no boto OK. Reparem que na janela que contem os campos
existentes na tabela surgiu um novo campo.

Vamos agora abrir o nosso formulrio de cadastro de Estados e adicionar o


nosso campo lookup.

Pgina 70 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Em vez de um componente DBEDIT, vamos utilizar um componente DBTEXT


(apenas para conhecermos um novo componente). Basta configurarmos nosso
componente DBTEXT:
DATASOURCE: DM.dtsEstados
DATAFIELD: PAIS
Quando executarmos o programa, o nosso campo lookup j estar funcionando.

Vale a pena mencionar que um campo lookup no pode ser digitado pelo
usurio, no caso do cadastro, o usurio vai digitar um cdigo e aparecer o nome do pas
na frente. O campo lookup apenas de visualizao.
6.5)

O que so Campos Calculados?


Como o prprio nome j diz, estes campos so utilizados para fazer clculos.

Estes campos tambm so criados em tempo de projeto, ou seja, no existe no banco de


dados. Por exemplo: No nosso projeto exemplo, temos o campo DT_FUNCAO dentro
da tabela de CIDADES. Digamos que eu queira criar um campo calculado que mostre a
idade da cidade em anos a partida de sua data de funo, precisaremos para isso, criar
um campo calculado.
6.6)

Criando Campos Calculados?


Em nosso exemplo, para criarmos um campo calculado na tabela de CIDADES

que mostre a idade em anos de fundao da cidade, precisaremos abrir o nosso Data
Mdule e selecionarmos a tabela de CIDADES.

Pgina 71 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

D um duplo clique sobre a tabela de cidades que aparecer automaticamente


todos os campos desta tabela.

Para criarmos um campo calculado com a idade de fundao, precisaremos


inserir um novo campo na tabela, para isso clique com o boto direito do mouse em
cima da janela contendo os campos da tabela.

Ir aparecer um menu, selecione a opo NEW FIELD.


Pgina 72 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Aparecer a seguinte janela, a qual, j foi descrita anteriormente, mas para os


campos calculados, s precisaremos preenche a parte de FILED PROPERTIES e
FIELD TYPE.
Aps a configurao, a tela acima dever ficar da seguinte forma:

Basta clicar no boto OK. Reparem que na janela que contem os campos
existentes na tabela surgiu um novo campo.

Pgina 73 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Como o campo criado um campo calculado, nosso trabalho no para por a,


precisaremos fazer a frmula de clculo deste campo. Para isso, precisaremos selecionar
a tabela de CIDADES, clicar na paleta EVENTS do OBJECT INSPECTOR e selecionar
o evento OnCalcFields.

Aps o duplo clique na caixa de texto branca que aparece em frente ao evento, o
Delphi abrir o Editor de Cdigos para podemos fazer o cdigo de clculo para o
campo. O cdigo para calcular a quantidade de anos a partir de uma determinada data
o seguinte:
//codigo do campo calculado de idade da cidade
procedure TDM.tblCidadesCalcFields(DataSet: TDataSet);
//variavel auxiliar para armazenar a data
var
Aux_Data : Real;
begin
//pegar a data atual e diminuir da data desejada
Aux_Data := Date - tblCidadesDT_FUNDACAO.Value;
//pegar o resultado e dividir pelo numero de dias do ano
Aux_Data := Aux_Data / 365.25;
//fazer com que o campo criado receba a idade calculada
tblCidadesIDADE.Value := IntToStr(Trunc(Aux_Data)) + ' anos';
Pgina 74 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

end;
Vamos agora abrir o nosso formulrio de cadastro de Cidades e adicionar o
nosso campo calculado.

Em vez de um componente DBEDIT, vamos utilizar um componente DBTEXT


(apenas para conhecermos um novo componente). Basta configurarmos nosso
componente DBTEXT:
DATASOURCE: DM.dtsCidades
DATAFIELD: IDADE
Quando executarmos o programa, o nosso campo calculado j estar
funcionando.

Pgina 75 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Vale a pena mencionar que um campo calculado no pode ser digitado pelo
usurio, no nosso exemplo, o usurio vai digitar somente a data de fundao e o campo
calculado ira mostrar a idade desta cidade. O campo calculdo apenas de visualizao.
6.7)

Componente DBLookupCombobox?
Como estamos falando de campos lookups e campos calculados, no poderia

deixar de apresentar este componente. O componente DBLookupCombobox

situado na paleta DATACONTROLS, serve para facilitar a vida do usurio do nosso


programa. Com este componente, por exemplo, o usurio no precisa saber o cdigo de
um pas para cadastrar um estado, apenas precisa saber o nome do pas, e mesmo assim
este nome no precisa ser decorado, pois o componente exibe uma lista com todos os
pases cadastrados.
6.8)

Utilizando o Componente DBLookupCombobox


Como exemplo, vamos utilizar o nosso cadastro de Estados, vamos fazer com

que o usurio do nosso programa, ao invs de digitar o cdigo de um pas para cadastrar
um estado, selecione este pas atravs de uma lista com todos os pases cadastrados.
Primeiramente vamos ter que abrir o nosso formulrio de cadastro de Estados.

J havamos feito um campo lookup que mostra o nome do Pas quando o


usurio digita o cdigo. No vamos alterar isso, mas vamos dar a opo do usurio
digitar o cdigo ou apenas selecionar o nome do Pas atravs de um componente
DBLookupCombobox.

Pgina 76 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Como todo componente da paleta DATACONTROLS, este tambm precisa ser


configurado. Propriedades a serem configuradas:
LISTSOURCE: nesta propriedade ficar o DATASOURCE da tabela pai, no nosso
exemplo, a tabela pai da tabela de Estados a tabela de Pas, ento esta propriedade
dever receber o DATASOURCE da tabela de pas e ficar com o seguinte valor:
DM.dtsPaises.
LISTFIELD: nesta propriedade ficar o campo que ser mostrado na tela da tabela Pa,
no nosso exemplo, o campo que ser mostrado o nome do Pas, ento esta propriedade
dever receber o seguinte valor: NOME_PAIS.
KEYFIELD: nesta propriedade dever ficar o campo chave primria da tabela Pai, no
nosso exemplo, o campo que chave primria da tabela de Pas o campo COD_PAIS.
DATASOURCE: nesta propriedade, ficar o DATASOURCE da tabela filha a qual est
sendo feito o cadastro, no nosso exemplo, estamos fazendo o cadastro de Estados, ento
esta propriedade conter o valor DM.dtsEstados.
DATAFIELD: nesta propriedade, ficar o campo que est sendo salvo na tabela filha,
no nosso exemplo, o campo que temos na tabela Estados para guardar o cdigo do Pas
o campo COD_PAIS.
Para finalizarmos teremos que abrir a tabela de Pases ao abrir o formulrio de
cadastro de Estados e fechar a tabela de Pases ao fechar o formulrio de cadastro de
Estados, para isso, s colocarmos os cdigos de abertura e fechamento da tabela nos
eventos ONSHOW e ONCLOSE do formulrio.
Aps todas as configuraes, basta executarmos o nosso projeto e o formulrio
de cadastro de Estados ficar da seguinte forma:
Pgina 77 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Reparem que agora, quando formos cadastrar um Estado, poderemos digitar o


cdigo do Pas a qual ele pertence, ou selecionarmos este Pas atravs de uma listagem
de todos os pases cadastrados.
6.9)

Exerccios

Criar dois campos lookups que mostre o nome do Estado e o nome da


Regio no cadastro de Cidades.

Criar um campo calculado que mostre o texto RENDA ALTA para Cidade
que possua uma renda maior que 100.000.000 e RENDA BAIXA caso
possua valor inferior.

Coloque dois componentes DBLookupCombobox no cadastro de Cidades,


uma para mostrar o nome de todos os Estados cadastrados e outro para
mostrar o nome de todas as Regies Cadastradas.

Pgina 78 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

CAPITULO VII
CRIANDO CONSULTAS SIMPLES
7.1)

Criando menus no Formulrio Principal


Nesta prxima etapa do nosso projeto, estaremos conhecendo novos

componentes e utilizando novos comandos para montarmos as consultas de nosso


projeto. Primeiramente, vamos criar novos menus para o formulrio principal do nosso
projeto, os menus de Consultas.
Para isso vamos abrir o nosso formulrio principal e dar um duplo clique com o
mouse sobre o componente MAINMENU, e completarmos conforme mostra figura
abaixo.

7.2)

Criando Consultas Simples


Primeiramente, vejamos como criar uma consulta simplificada em nosso prprio

formulrio de cadastro. Para isso vamos precisar conhecer um novo mtodo do


componente TABLE que o LOCATE.
O mtodo LOCATE utilizado para a localizao rpida de registros em uma
tabela, e para sua utilizao precisaremos passar 3 parmetros.
1: Campo que se deseja localizar
2: Valor do Campo que se deseja localizar.
3: Parmetros de Consulta que devem estar entre colchetes e separados por vrgula
Os parmetros de consulta (3) podem ser:
LoPartialKey: localiza registros contendo determinada palavra ou letra.
LoCaseInsensitive: localiza registros sem se preocupar com letras maisculas e
minsculas.
Pgina 79 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Vamos utilizar nosso exemplo para explicao:


Localizao Exata: Localizar o Pas que contenha o cdigo 10.
DM.tblPaises.Locate (COD_PAIS, 10, [ ]);
Localizao parcial e sem se preocupar com maisculas e minsculas: Localizar
o primeiro Pas que o nome comece com a letra B
DM.tblPaises.Locate (NOME_PAIS, b, [loPartialKey, loCaseInsensitive]);
Localizao parcial: Localizar o primeiro Pas que o nome comece com a letra B
DM.tblPaises.Locate (NOME_PAIS, B, [loPartialKey]);
Localizao sem se preocupar com maisculas e minsculas: Localizar o
primeiro Pas que o nome comece com a letra B
DM.tblPaises.Locate (NOME_PAIS, b, [loCaseInsensitive]);
Visto o comando LOCATE, vamos agora montar uma consulta simples em
nosso cadastro de Regies, para isso devemos abrir o nosso formulrio de cadastro.
Vamos fazer com que ele fique de acordo com a figura abaixo:

Componente
GROUPBOX

Componente
RADIOGROUP

Componente
LABEL

Componente
BUTTON

Componente
EDIT

Esta consulta dever permitir que o usurio localize uma REGIO por CDIGO
ou por NOME. O cdigo do boto localizar dever ficar da seguinte forma:

Pgina 80 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

//codigo do boto localizar


procedure TfrmCad_Regioes.Button1Click(Sender: TObject);
begin
//verificando se o usuario marcou alguma opcao de consulta
if RadioGroup1.ItemIndex = -1 then
begin
//se no selecionou, exibir mensagem
ShowMessage('Selecione alguma opo de consulta.');
Exit;
end;
//verificando se o usuario digitou algum texto de consulta
if Edit1.Text = '' then
begin
//se nao digitou, exibir mensagem
ShowMessage('Digite algum texto para consulta.');
Edit1.SetFocus;
Exit;
end;
//verificando opcao selecionada pelo usuario
if RadioGroup1.ItemIndex = 0 then
begin
//se o usuario marcou por Cdigo
DM.tblRegioes.Locate('COD_REGIAO',Edit1.Text,[]);
end
else if RadioGroup1.ItemIndex = 1 then
begin
//se o usuario marcou por Nome
DM.tblRegioes.Locate('NOME_REGIAO',Edit1.Text,
[loPartialKey, loCaseInsensitive]);
end;
//limpando texto digitado
Edit1.Clear;
Edit1.SetFocus;
end;
7.3)

Exerccios sobre Consultas Simples

Montar uma consulta simples para os formulrios de cadastros de Pases,


Estados e Cidades.

Pgina 81 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

CAPITULO VIII
CRIANDO UM FORMULRIO DE CONSULTA
8.1)

Componente Query
Para que nossa consulta fique com uma maior velocidade, utilizaremos o

componente QUERY. Este componente assim como o TABLE, tambm pertencem a


classe DATASET. Ao utilizarmos o QUERY, vamos precisar utilizar os comandos da
linguagem SQL para fazermos consulta em nosso banco dados. Este componente est
localizado na paleta DATA ACCESS e representado pelo cone

Vejamos algumas propriedades importantes deste componente:


DATABASENAME: Nesta propriedade ser selecionado o ALIASE ou o
caminho do banco de dados.
NAME: Propriedade que contm o nome do componente.
PARAMS: Propriedade que serve para configurarmos os parmetros, caso estes
tenham sido criados.
REQUESTLIVE: Quando o TRUE, deixa o componente QUERY em edio,
podendo assim ser utilizando como se fosse um componente TABLE.
SQL: Propriedade onde ficaro os comandos da linguagem SQL.
8.2)

Configurando o Componente QUERY


Usaremos como exemplo a tabela de REGIES do nosso projeto para

montarmos nossa consulta.


Primeiramente, deveremos colocar um componente QUERY e um componente
DATASOURCE em nosso Data Module:

Pgina 82 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Devemos agora configurar algumas propriedades destes componentes:


Primeiramente vamos configurar o nosso componente QUERY.
DATABASENAME : nome do nosso alase ALIASE. Ex: AL_CIDADES.
NAME

: nome do componente. Ex: qryRegioes


Vamos agora configurar o componente DATASOURCE que estar relacionado

com o componente QUERY.


DATASET

: componente QUERY. Ex: qryRegioes

NAME

: nome do componente. Ex: dtsQryRegioes


Aps as configuraes acima, nosso Data Mdule dever ter ficado da seguinte

forma:

Agora devemos configurar a tabela que o componente QUERY ir usar. O


componente QUERY no possui a propriedade TABLENAME, teremos que fazer isso
utilizando o a linguagem SQL. Para isso clique no QUERY desejado e selecione sua
propriedade SQL que conter o valor (TStrings). Ao dar um duplo clique nesta
propriedade ou clicar no boto com 3 pontinhos aparecer a seguinte tela:

Pgina 83 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

nesta tela que deveremos utilizar a linguagem SQL para selecionar os dados
da(s) tabela(s) desejada(s). No nosso exemplo, estamos utilizando a tabela de
REGIOES.

A figura acima, mostra que foram selecionados todos os campos da tabela de


REGIOES e que a consulta ser ordenada pelo NOME da regio. Basta digitar os
comandos necessrios como mostra a figura acima e clicar no boto OK.
Para concluirmos as configuraes, s adicionar os campos no componente
QUERY.

Pgina 84 de 108

Linguagem e Tcnicas de Programao II


8.3)

Mark Juliani

Montando um Formulrio de Consulta


A partir deste ponto, comearemos o montar o nosso formulrio de consulta de

regies. Vamos ento criar o novo formulrio. Clique no menu FILE / NEW FORM e
um novo formulrio ser criado em nosso projeto. Agora vamos salvar a UNIT deste
novo formulrio com o nome de Con_Regioes.Vamos deixar este formulrio com a
seguinte aparncia:
Componente
RADIOGROUP

Componente
BUTTON

Componente
DBGRID

Agora, precisamos fazer alguns configuraes em nosso novo formulrio:


Primeiramente, temos que dizer ao Delphi, que nosso formulrio de consulta
estar utilizando o Data Mdule, para isso, selecione o formulrio, clique no menu do
Delphi FILE / USE UNIT e selecione a UNIT do nosso Data Mdule.
Agora vamos configurar o nosso componente FORM:
Caption: Consulta de Regies
BorderStyle: bsSingle
Name: frmCon_Regioes
Position: poDesktopCenter
Reparem, que o formulrio apresenta um novo componente da paleta
DATACONTROL, o DBGRID que representado pelo cone

. Vamos agora

Pgina 85 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

configurar este componente. Quando inserimos este componente em nosso formulrio,


ele fica da seguinte forma.

Primeiramente, vamos ter que ligar este componente com o DATASOUCE do


nosso QUERY de consulta, para isso vamos alterar a propriedade DATASOURCE do
componente DBGRID para DM.dtsQryRegioes. Reparem que este componente no
possui a propriedade DATAFIELD, pelo motivo do mesmo no mostrar apenas um
nico campo da tabela e sim vrios.
Com a configurao acima, a aparncia do componente DBGRID continua a
mesma, vamos agora, adicionar os campos da tabela em nosso componente DBGRID,
para isso, d um duplo clique com mouse sobre este componente.

Aparecer a janela acima. Como nossa tabela de regies possui dois campos
(COD_REGIAO, NOME_REGIAO), vamos ter que adicionar duas colunas em nosso
DBGRID, para isso, clique no boto representado por uma pastinha amarela. Cada
clique no boto corresponde a um campo que ser visualizado.

Pgina 86 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Vamos agora configurar estes campos. Clique no primeiro campo (0 Tcolumn)


e localize a propriedade FIELDNAME no OBJECT INSPECTOR. Nesta propriedade
devemos selecionar o campo da tabela que ir aparecer nesta coluna.

Faa a mesma operao para o outro campo do DBGRID, lembrando de escolher


o outro campo da tabela na propriedade FILEDNAME.

Para que as colunas do DBGRID no fiquem com o nome dos campos da tabela,
basta selecionar a propriedade TITLE da coluna e alterar o CAPTION da mesma.

Pgina 87 de 108

Linguagem e Tcnicas de Programao II


8.4)

Mark Juliani

Cdigo Fonte do Formulrio de Consulta


Vejamos agora, como ficar o cdigo fonte do nosso formulrio de consulta de

regies, o cdigo fonte estar todo comentado. Primeiramente, devemos colocar os


cdigos de abertura e fechamento do componente QUERY nos eventos ONSHOW e
ONCLOSE do nosso formulrio de consulta.
//evento OnShow do Formulrio de Consulta
procedure TfrmCon_Regioes.FormShow(Sender: TObject);
begin
//abrindo o Query de Consulta
DM.qryRegioes.Open;
end;
//evento OnClose do Formulrio de Consulta
procedure TfrmCon_Regioes.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
//fechando o Query de Consulta
DM.qryRegioes.Close;
end;
Vamos agora fazer o cdigo do Boto OK. Este dever verificar se o usurio
selecionou alguma opo de consulta, verificar se o usurio digitou algum texto para
localizao e depois selecionar todos os registros de acordo com o filtro e o texto
informado pelo usurio.
//codigo do boto OK
procedure TfrmCon_Regioes.Button1Click(Sender: TObject);
begin
//verificando se o usurio selecionou alguma opcao
if RadioGroup1.ItemIndex = -1 then
begin
//se no selecionou, exibir mensagem
ShowMessage('Selecione uma Chave de Consulta.');
Exit;
end;
//verificando se o usurio digigou algum texto
if Edit1.Text = '' then
begin
//se nao digitou, exibir mensagem
ShowMessage('Digite algum texto para consulta.');
Edit1.SetFocus;
Exit;
end;
//comando para usar o componente de consulta
Pgina 88 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

with DM.qryRegioes do
begin
//vamos agora alterar a propriedade SQL do componente QUERY de
//acordo com a opo feita pelo usurio
//fechando o componente QUERY
Close;
//limpando a propriedade SQL
SQL.Clear;
//adicionando novo conteudo na propriedade SQL
SQL.Add('SELECT * FROM REGIOES WHERE');
//verificando opcao escolhida pelo usurio
if RadioGroup1.ItemIndex = 0 then
begin
//se o usurio escolheu a opcao CDIGO
//filtrar o codigo e ordernar por codigo
SQL.Add(' COD_REGIAO = '+Edit1.Text+' ORDER BY COD_REGIAO');
end
else if RadioGroup1.ItemIndex = 1 then
begin
//se o usurio escolheu a opcao NOME
//filtrar o nome e ordernar por nome
SQL.Add(' NOME_REGIAO LIKE '+#39+Edit1.Text+'%'+#39+
' ORDER BY NOME_REGIAO');
end;
//abrindo o componente QUERY
Open;
//verificando se achou algum registro
if RecordCount = 0 then
begin
//se no achou, exibir mensagem
ShowMessage('Nenhum Registro Encontrado.');
end;
Edit1.SelectAll;
Edit1.SetFocus;
end;
end;
Vejamos agora com vai ficar o cdigo do boto LOCALIZAR e do boto SAIR.
O boto localizar dever fechar o formulrio de Consulta e abrir o formulrio de
Cadastro correspondente com o registro que foi selecionado na consulta.
//codigo do boto Sair
procedure TfrmCon_Regioes.Button3Click(Sender: TObject);
begin
//fechando o formulario
Close;
end;
Pgina 89 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

//codigo do boto Localizar


procedure TfrmCon_Regioes.Button2Click(Sender: TObject);
begin
//fechando o formulario de consulta
Close;
//abrindo o formulario de cadastro de regioes
frmCad_Regioes.Show;
//localizando a regiao que foi selecionada na consulta na tabela
DM.tblRegioes.Locate('COD_REGIAO',DM.qryRegioesCOD_REGIAO.Value,[]);
end;
Com isso finalizamos o nosso formulrio de Consulta de Regies.
8.5)

Chamando o Formulrio de Cadastro


O nosso formulrio de consulta j est finalizado, mas agora precisaremos fazer

com que o nosso formulrio principal chame o nosso formulrio de consulta. Para isso
devemos selecionar o nosso formulrio principal e clicar no item de menu que vai estar
chamando o nosso formulrio de consulta.

Basta darmos um clique sobre o menu desejado e se abrir o Editor de Cdigo


do Delphi para que ns possamos digitar os comandos para abertura do outro
formulrio.
//item de menu que chama o formulario de consulta de regioes
procedure TfrmPrincipal.Regies2Click(Sender: TObject);
begin
//chamando o formulario de consulta de regioes
frmCon_Regioes.ShowModal;
end;
8.6)

Exerccios
Montar os formulrios de Consulta de Pases, Estados e Cidades.

Pgina 90 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

CAPITULO IX
CRIANDO RELATRIOS
9.1)

Criando menus no Formulrio Principal


Nesta prxima etapa do nosso projeto, estaremos conhecendo novos

componentes e utilizando novos comandos para montarmos os relatrios de nosso


projeto. Primeiramente, vamos criar novos menus para o formulrio principal do nosso
projeto, os menus de Relatrios.
Para isso vamos abrir o nosso formulrio principal e dar um duplo clique com o
mouse sobre o componente MAINMENU, e completarmos conforme mostra figura
abaixo.

9.2)

Criando um Filtro para o Relatrio


Geralmente antes de se montar um relatrio, o programa apresenta um tela onde

o usurio poder escolher alguma filtragem ou ordem de impresso para o relatrio.


Exemplo: digamos que o usurio queira um relatrio de todas as regies, em um
determinado momento, ordenado pelo cdigo e em um outro momento, ordenado pelo
nome, para isso, vamos precisar fornecer para ele, uma tela que permite que ele faa
esse tipo de coisa. Continuando nosso projeto modelo, vamos montar uma tela de filtro
para o usurio escolher a ordem de impresso do relatrio de Regies.
Primeiramente teremos que inserir um novo formulrio em nosso projeto e
vamos salvar a UNIT deste formulrio com o nome de Rel_Regioes.
Agora, vamos montar nossa tela de acordo com a figura abaixo:

Pgina 91 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani
Componente
RADIOGROUP
Componente
BUTTON

Para que o nosso formulrio fique de acordo com a figura acima, precisaremos
modificar algumas propriedades:
BorderStyle: bsSingle
Caption : Relatrio de Regies
Name: frmRel_Regioes
Position : poDesktopCenter
Vamos tambm modificar a propriedade NAME dos botes para melhor
entendimento nas futuras explicaes:
BtnImprimir, btnVisualizar e btnSair
Todo relatrio deve ser ligado a um componente DATASET, ento antes de
comearmos a preparar o relatrio, precisamos fazer primeiro, sua consulta SQL. Para
preparar sua consulta, precisaremos de um componente QUERY, que pode ou no ser
um outro componente j utilizado. O relatrio que iremos montar ser uma listagem das
regies cadastradas, e poder ser impresso em ordem de CODIGO ou ALFABETICA e
tambm poder ser IMPRESSO ou VISUALIZADO na tela. Para concluirmos nosso
relatrio, vamos utilizar o mesmo componente QUERY utilizado na consulta de regies
(qryRegioes). Antes de prosseguirmos vamos criar um novo formulrio em nosso
projeto e salvar a sua UNIT com o nome de QR_Regioes, mudar a propriedade NAME
deste formulrio para frmQR_Regioes e colocar um componente chamado QUICKREP
neste formulrio. Este componente est localizado na paleta QREPORT e
representado pelo cone

Este novo formulrio criado vai ficar com a seguinte aparncia:

Pgina 92 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

neste novo formulrio que iremos montar o nosso relatrio de regies, mas,
por enquanto, deixemos este formulrio de lado e vamos voltar ao nosso formulrio de
filtro.

Vejamos agora, como ficar o cdigo fonte dos botes IMPRIMIR,


VISUALIZAR e SAIR deste formulrio:
//codigo do boto Sair
procedure TfrmRel_Regioes.Button3Click(Sender: TObject);
begin
//fechando o formulario
Close;
end;
//codigo do boto Imprimir
procedure TfrmRel_Regioes.btnImprimirClick(Sender: TObject);
begin
//verificando se o usuario selecionou alguma ordem de impressao
if RadioGroup1.ItemIndex = -1 then
begin
//se nao selecionou, exibir mensagem
Pgina 93 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

ShowMessage('Selecione uma ordem de impresso.');


Exit;
end;
//utilizando o componente query de consulta de regioes
with DM.qryRegioes do
begin
//fechando o Query
Close;
//limpando a propriedade SQL
SQL.Clear;
//adicionando novo conteudo a propriedade SQL
SQL.Add('SELECT * FROM REGIOES ORDER BY');
//verificando ordenao
if RadioGroup1.ItemIndex = 0 then
begin
//ordenar por codigo
SQL.Add(' COD_REGIAO');
end
else if RadioGroup1.ItemIndex = 1 then
begin
//ordenar por nome
SQL.Add(' NOME_REGIAO');
end;
//abrindo o Query
Open;
//verificando se achou algum registro
if RecordCount = 0 then
begin
//se nao achou, exibir mensagem
ShowMessage('Nenhum registro encontrado.');
Exit;
end;
end;
//o codigo abaixo, chama o relatrio criado
//verificando se para imprimir ou visutalizar o relatorio
if Sender = btnImprimir then
begin
//se for para imprimir
//comando para imprimir o relatorio que esta no outro formulario
frmQR_Regioes.QuickRep1.Print;
end
else if Sender = btnVisualizar then
begin
//se for para visualizar
//comando para visualizar o relatorio que esta no outro formulario
frmQR_Regioes.QuickRep1.Preview;
end;
Pgina 94 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

//aps visualizao ou impressao, retirar o relatorio da memria


frmQR_Regioes.QuickRep1.QRPrinter := nil;
end;
O cdigo fonte do boto imprimir, dever ser idntico ao do boto visualizar,
mas para no termos que repetir todo o cdigo foi feita a identificao do boto no
cdigo acima, para assim, podermos utilizar o mesmo cdigo nos dois botes. Reparem
no cdigo acima o comando if Sender = btnImprimir, este comando identifica que foi
o boto imprimir que chamou o cdigo e o comando else if Sender = btnVisualizar,
identifica que foi o boto visualizar que chamou o cdigo. Mas precisamos configurar o
boto visualizar para conter este mesmo cdigo, pois quando damos um duplo clique no
boto visualizar, no aparece nada. Para associar o cdigo do boto imprimir ao boto
visualizar, precisaremos fazer o seguinte: Selecione o boto visualizar (apenas um
clique), Localize o evento OnClique deste boto na paleta EVENTS do OBJECT
INSPECTOR, conforme mostra figura abaixo:

Agora, ao invs de dar um duplo clique na caixa de texto branca que aparece em
frente ao evento, vamos selecionar o evento OnClique do boto Imprimir que j foi
feito.

Pronto, agora quando dermos o duplo clique no boto Visualizar o cdigo fonte
j estar l.
Outro fato interessante no cdigo fonte do boto imprimir o seguinte: Reparem
que para se chamar um relatrio no utilizamos os comandos SHOW e SHOWMODAL,
e sim PRINT (imprimir) e PREVIEW (visualizar).
Pgina 95 de 108

Linguagem e Tcnicas de Programao II


9.3)

Mark Juliani

Chamando o Formulrio de Filtro


O nosso formulrio de filtro j est finalizado, mas agora precisaremos fazer

com que o nosso formulrio principal chame o nosso formulrio de filtro. Para isso
devemos selecionar o nosso formulrio principal e clicar no item de menu que vai estar
chamando o nosso formulrio de filtro.

Basta darmos um clique sobre o menu desejado e se abrir o Editor de Cdigo


do Delphi para que ns possamos digitar os comandos para abertura do outro
formulrio.
//item de menu que chama o formulario de filtro de regioes
procedure TfrmPrincipal.Regies3Click(Sender: TObject);
begin
//chamando o formulario de filtro de regioes
frmRel_Regioes.ShowModal;
end;
9.4)

Criando o Relatrio
O Delphi possui vrias ferramentas para se fazer relatrios. Em nosso projeto

utilizaremos o Quick Report, que j vem com a instalao do Delphi. Todos os


componentes que utilizaremos para a criao de nosso relatrio de regies, vo estar
contidos dentro da paleta QREPORT.
Voltemos agora, ao formulrio de relatrio (frmQR_Regioes) criando
anteriormente.

Pgina 96 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Vemamos algumas propriedades importantes do componente de relatrio


QUICKREP, o primeiro componente inserido em nosso formulrio:
DATASET: componente DATASET relacionado com o relatrio (nesta propriedade,
escolha o QUERY do relatrio. Ex: qryRegioes). Para conseguir visualizar os
componentes DATASETS nesta propriedade, ser necessrio fazer a relao do
formulrio de relatrio com o Data Module. Para isso, selecione o formulrio de
relatrio, clique no menu do Delphi FILE / USE UNIT e selecione a UNIT do nosso
Data Mdule.
BANDS: divises do relatrio
-

HasColumnHeader: informaes que aparecem no inicio de cada grupo.

HasDetail: informaes dos registros (dados do DATASET).

HasPageFooter: informaes que aparecem no final de cada pgina.

HasPageHeader: informaes que aparecem no inicio de cada pgina.

HasSumary: informaes que aparecem somente na ltima pgina ou final do


grupo.

HasTitle: informaes que aparecem somente na primeira pgina.

Outra informao importaten a seguinte: Dando um duplo clique no relatrio


aparece uma tela para configurao de pgina, mostrada na figura abaixo:

Pgina 97 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Nesta tela, ficam as informaes de configuraes de pgina do relatrio.


Aps conhecermos as propriedades mais importantes do componente
QUICKREP, vamos agora comear a montar o nosso relatrio de regies.
Todo relatrio do QUICK REPORT deve conter pelo menos uma banda, para o
nosso relatrio modelo, vamos ativar as bandas HasDetail, HasPageFooter,
HasPageHeader, HasSumary. Para isso, selecione o componente de relatrio, e
selecione o propriedade BANDS no OBJECT INSPECTOR. Aps as configuraes,
nosso relatrio dever ficar com a seguinte aparncia:

Pgina 98 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Todo componente inserido no relatrio, dever estar dentro de uma Banda. De


modo algum devemos inserir um componente fora das bandas.
Para aumentar a largura de uma banda, basta clicar na banda desejada, clicar
com o mouse em cima de um pontinho preto que aparece no centro da banda e arrastar
at obter o tamanho desejado.
Para colocar bordas em uma banda, pasta clicar na banda desejada e alterar a
propriedade FRAME.
Vejamos

agora,

alguns

dos

componentes

mais

utilizados

da Paleta

QUICKREPORT, so eles:
QUICKREPORT: representa o relatrio
QRGROUP: componente para agrupar relatrio
QRLABEL: componente para escrever no relatrio, similar ao LABEL.
QRDBTEXT: componente para mostrar os dados do DATASET relacionado.
QREXPR: componente para mostrar campos calculados. (contadores, somas, etc.)
QRSYSDATA: componente para mostrar num. Pginas, Data, Hora, etc.
QRSHAPE: componente para fazer figuras geomtricas. (linhas, crculos, etc.)
QRIMAGE: componente para mostrar imagens.
Como j foi dito, vamos montar o nosso relatrio utilizando estes componentes.
Basta clicar nos componentes e colocar no local desejado (Detail, Sumary, etc.).

Pgina 99 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Primeiramente vamos colocar os componentes QRSHAPE para enfeitar nosso relatrio:


Coloque 2 componentes SHAPE (

) na banda PAGEHEADER um 1 na banda

PAGEFOOTER. Nosso relatrio dever ficar com a seguinte aparncia:

Propriedades importantes deste componente


BUSH/COLOR: mudar a cor de fundo do componente SHAPE
SHAPE: tipo de figura (quadrado, crculo, linha, etc).
Para visualizarmos como est ficando o nosso relatrio, clique com o boto
direito do mouse, na parte que representa uma rgua em nosso relatrio. Ir aparecer um
menu, s clicar na opo PREVIEW, conforme mostra a figura abaixo:

Continuando, agora vamos inserir os componentes QRLABELS (

) em nosso

relatrio. Procurem deixar o relatrio com a seguinte aparncia:

Pgina 100 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Propriedades importantes deste componente:


CAPTION: texto que aparece na tela.
FONT: formatao de fonte.
TRANSPARENT: deixa a cor de fundo do QRLABEL transparente.
Vamos agora, colocar os componentes para mostrar os dados do DATASET
ligado ao relatrio que so os QRDBText (

). Estes componentes so geralmente

colocados na banda DETAIL, pois esta a banda destinada a mostrar os registros


contidos no DATASET. Ex: se houver 10 regies cadastradas, essa banda DATAIL ser
exibida 10 vezes, cada uma contendo os dados de uma empresa. Vamos tentar deixar o
nosso relatrio com esta aparncia:

Pgina 101 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Propriedades importantes deste componente:


DATASET: componente DATASET relacionado com o relatrio.
DATAFIELD: nome do campo do DATASET.
TRANSPARENT: deixa a cor de fundo do QRDBTEXT transparente.
Vamos agora mostrar a quantidade de registro achados em nosso relatrio, para
isso precisaremos utilizar o componente QREXPR (

) e colocar a funo COUNT()

na propriedade EXPRESSION.

Pgina 102 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Propriedades importantes deste componente:


EXPRESSION: montar formulas.
Vamos agora colocar a data, hora e nmero da pgina do relatrio, para isso
precisaremos utilizar o componente QRSYSDATA (

):

Propriedades importantes deste componente:


DATA: selecionar a funo desejada para o componente (data, hora, n de pginas, etc).
TEXT: texto que deseja que aparea antes da funo.
TRANSPARENT: deixa o fundo do componente transparente.
Aps as configuraes acima, basta executar o programa para ver como ficou o
relatrio.

Pgina 103 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Vamos agora, mostrar o cdigo fonte necessrio para o que qrlOrdem, utilizado
em nosso relatrio, mostre a ordem de impresso escolhida pelo usurio. Todo cdigo
que formos fazer em nosso relatrio, deve pertencer a uma determinada banda. Vou
agora mostrar os dois eventos mais importantes destas bandas:
Evento BEFORE PRINT: neste evento, devem ficar os cdigos que sero
executados antes da banda desejada ser impressa.
Evento AFTER BRINT: neste evento, devem ficar os cdigos que sero
executados depois que a bando desejada for impresa.
Para fazermos com que a ordem de impresso selecionada pelo usurio aparea
no componente QRLABEL chamado QRLORDEM, devemos colocar o cdigo abaixo
no evento BEFORE PRINT da banda PAGEHEADER, mas porque? Devido ao fato do
componente esta contido na banda PAGEHEADER e que o texto s pode ser
modificado antes da banda ser impressa.
//codigo do evento BeforePrint da banda PageHeader
procedure TfrmQR_Regioes.PageHeaderBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
begin
//codigo para mostrar a ordem de impressao escolhida pelo usuario
qrlOrdem.Caption := frmRel_Regioes.RadioGroup1.Items.Strings[
frmRel_Regioes.RadioGroup1.itemIndex];
end;
Pgina 104 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

O cdigo acima, pega o texto contido no componente RADIOGROUP existente


no formulrio de filtro do relatrio de regies, jogando-o na propriedade CAPTION do
componente QRLORDEM contido na bando PAGEHEADER do formulrio de
relatrio.

A figura acima, mostra o resultado final de como ficar o nosso relatrio de


regies.
9.5)

Exerccios
Montar os formulrios de Filtro de Relatrio e Relatrios de Pases, Estados e

Cidades.
9.6)

Relatrios Agrupados
Como exemplo, vamos pegar o nosso relatrio de regies e agrupa-lo por letra

do alfabeto, exemplo: todas as regies com a letra A, B, C.


Primeiramente precisaremos inserir um componente chamado QRGROUP (

em nosso relatrio de empresas:


Pgina 105 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Propriedades importantes deste componente:


EXPRESSION: nesta propriedade ficar a condio do grupo que pode ser uma frmula
ou o nome do campo da tabela que se deseja agrupar. No nosso caso, no existe um
campo da tabela que guarde a primeira letra do nome da regio, ento precisaremos
agrupar por uma formula.
Para nosso exemplo funcionar, basta colocar a seguinte formula na propriedade
EXPRESSION: COPY(NOME_REGIAO,1,1).
Esta formula vai agrupar o relatrio pela primeira letra do campo
NOME_REGIAO.

Vamos agora colocar algum texto para aparecer no inicio de cada grupo, para
isto, basta colocar os componentes desejados dentro da banda QRGROUP.

Pgina 106 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Na imagem acima, foi adicionado dois componentes QRLABEL em nosso


relatrio, dentro do componente QRGROUP e um destes componentes possui a
propriedade NAME = qrlLetra.
Para que no componente qrlLetra aparea a primeira letra do nome da regio,
precisaremos fazer o seguinte cdigo fonte mostrado abaixo:
//evento BeforePrint do componente QRGROUP
procedure TfrmQR_Regioes.QRGroup1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
begin
//codigo para jogar a primeira letra da regiao no componente qrlLetra
qrlLetra.Caption := Copy(DM.qryRegioesNOME_REGIAO.Value,1,1);
end;
Aps seguir os passos acima, nosso relatrio dever ficar com a seguinte
aparncia.

Lembrando que um relatrio agrupado deste tipo, s tem finalidade se o usurio


escolher a opo ordenar por nome.
Ento para que nosso relatrio funcione perfeitamente, vamos fazer uma
pequena alterao em nosso formulrio de filtro.
Pgina 107 de 108

Linguagem e Tcnicas de Programao II

Mark Juliani

Vamos adicionar o cdigo mostrado na imagem abaixo no boto Imprimir:

Pgina 108 de 108

Anda mungkin juga menyukai