Anda di halaman 1dari 150

Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.

com) 325
Procurando registros com Dbgrid e SetRange ?
No exemplo a seguir veremos com filtrar registros em uma tabela usando componentes DBGrid e SetRange.

O Insira um Form, File, New Form.
O Insira um Label1, clique no label1, pressione F11 e digite Cdigo Inicial:
O Insira um Label2, clique no label2, pressione F11 e digite Cdigo Final:
O Insira um componente Edit1 (aba Standard).
O Insira um componente Edit2 (aba Standard).
O Insira um Bitbtn (aba Additional), tecle F11, na propriedade Caption digite Procurar,
na propriedade Name, mude o nome BitBtn1 para Bit_Procura
O Selecione o formulrio, tecle ESC 3 vezes para cancelar possveis objetos selecionados, na propriedade
Name digite Pequisa_Frm.
O Insira um componente Table ( aba DataAccess).
O Insira um DBGrid ( aba DataControls ), clique no DBGrid, File, Use Unit e selecione Clientes, na
propriedade DataSource informe DataSource1












Clique duplo sobre o boto Procurar e digite as seguintes linhas de cdigo:



Como padro o Delphi executa sempre o primeiro formulrio (formulrio pai), para executar o form do Grid
por primeiro selecione opo que est na barra de ttulos, Project Options selecione o formulrio
Pesquisa_Frm ( nosso formulrio ) e arraste-o posicionando-o por primeiro, clique OK, finalmente tecle F9
para executar o programa.












O Clique na propriedade DatabaseName e
defina o Alias, defina propriedade
TableName = Clientes.db, clique em
Table1, clique no boto direito Fields
Editor Add Fields Ok
( para adicionar os campos )

Clique no Datasource1 e na propriedade
Dataset defina Table1.


Como padro o Delphi mostra no Edit1 e
Edit2 o texto Edit1 e Edit2, para apagar
pressione F11, clique na propriedade na
propriedade Text apague o texto Edit1.
Outra maneira SEM usar With do


Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 326
Como procurar registros em um DBGrid ?

No exemplo a seguir estamos fazendo a procura pela coluna Nome, ou seja, basta digitar as letras iniciais do
nome que desejar localizar na coluna Nome, a medida que for localizado algum nome, este ser exibido no
Label1, para apagar contedo campo use backspace.

Crie um ndice secundrio para o campo Nome, visto que a pesquisa ser feita pelo Nome.









O Clique no DBGrid e no evento OnKeyPress digite o cdigo abaixo:








O Crie uma tabela com
os campos DBGrid.
O Abaixo da seo Private digite a
ProcuraX: string;

Clique no DBGrid, clique Options,
clique na sub-opo dgEditing =
False, e na propriedade
ReadOnly = True.
Insira um Label1
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 327
Como ler / buscar valores da tabela para Edit ?

Veja abaixo maneiras para ler ( mostrar ) campos em um Edit. No campo Table1Codigo.AsString; usamos o conversor
AsString porque o contedo a ser exibido no Edit deve ser texto. Todos os cdigos abaixo foram definidos no evento
OnClick do boto Bitbtn.




1 forma:


2 forma:


3 forma:


O nmero seis [6] indica que o sexto campo da tabela. Estes nmeros devem estar de acordo com a criao dos campos
do DataBase Desktop. Vamos ler o campo o contedo do campo Nome e mostr-lo na tela, em um Edit.


















Para associar outros tipos de campos que no so texto a uma caixa de edio ( campo que aceita somente strings ),
devemos utilizar as propriedades de converso do componente TField :
AsBoolean, AdDateTime, AsFloat, AsInteger e AsString:





Table1 = tabela.
Codigo = nome do campo.
Table1Codigo.AsString
AsString ( converte para string texto )


O Insira um
componente Edit e
um Bitbtn, na
propriedade Name
digite Bit_Le_Nome.

Apo clicar OK o
nome ser
mostrado no Edit
Box.

Value: pega o valor ou contedo
do campo e mostra no Edit2.
Vamos ler um valor e mostr-lo em
um Edit ( em uma string ). Lembre-
se, antes devemos converte-lo para
texto string.

Para mostrar o cdigo / nmero
que esta armazenado na tabela
em um Edit preciso antes
converter o NMERO para
TEXTO ( AsString )
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 328
Lendo contedo do campo

No exemplo a seguir leremos o contedo do campo Estado Civil, se o contedo for a letra C, ser mostrada
a palavra Casado caso contrrio Solteiro.

O Crie a tabela abaixo ( use o Database Desktop )



O Crie o formulrio de cadastro.



O Clique no componente DataSource1, clique no evento OnDataChange e digite o cdigo abaixo:


Sero aceitas somente
as letras C e S.
Se for digitada a letra C ser
mostrada a palavra Casado em azul
com o tamanho da fonte de 15
Se for digitada a letra S ser mostrada
a palavra Solteiro em vermelho com
o tamanho da fonte de 20
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 329

Maneiras de ler campos











































Insira 5
componentes
Labels e 5 Bitbtn.
Insira um componente
DBGrid, Table e um
DataSource. Defina as
propriedades de cada um
destes componentes, j
aprendemos anteriormente

Insira 5 labels, na propriedade
Caption de cada um digite o
texto que esta em amarelo.
Foi inserido um
DBGrid para mostrar
os registros que esto na
tabela.
Se o salrio que contiver na
tabela for igual a 100, ser
mostrada a mensagem
Salrio OK ! em verde com
o tamanho da fonte de 12.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 330
Digite o cdigo abaixo no evento OnClick do boto OK.


Selecione o formulrio e no evento OnShow digite o cdigo abaixo:



Como editar / alterar um registro ?
O Dataset precisa estar em modo de edio para possibilitar a atualizao dos dados. Para isso voc precisa
utilizar o mtodo Edit e ao final utilize o mtodo Post para gravar o registro alterado. As linhas de cdigo
abaixo podem ser digitadas no evento OnClick de um BitBtn.



Verificando o estado da tabela, se estiver no modo de edio ou insero gravar o registro. O cdigo
abaixo foi definido no evento OnClick de um boto Bitbtn:


Como criar atalho com a combinao Ctrl + A ?

Selecione o formulrio corrente e defina a propriedade KeyPreview para o valor True e no evento
OnKeyDown digite o cdigo abaixo:












Na propriedade Caption
de cada boto sero
mostradas as 5 maneiras
de como ler o contedo
de um campo.


Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 331
Destacando opo selecionada no RadioGroup
Veja como destacar um item selecionado em um DBGrid.





Como desabilitar opes do RadioGroup ?











Digite o cdigo abaixo no
evento OnClick do
RadioGroup.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 332
Pesquisando registro com DBEdit ou Edit
Um truque para pesquisar registro no campo Cdigo.

O Crie a tabela abaixo com o Database Desktop


O Crie o formulrio abaixo. Analise a seguinte situao: No campo Cdigo no possvel efetuar pesquisa,
visto que o componente DBEdit no permite tal ao. Para pesquisar um cdigo ter que inserir um
componente Edit.



O Mova o componente DBEdit para o lado direito do formulrio, apenas para no remov-lo do projeto, ao
lado da label Cdigo insira um componente Edit.








Observe atentamente o cdigo fonte do formulrio acima, e cada um dos seus eventos.




Componente
EDIT que foi
inserido.
Componente movido. No momento
no precisamos apag-lo.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 333








Consulta_Frm a tela de pesquisa
rpida que faremos adiante.
Criando cdigo
automaticamente,
autoincrement
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 334

























Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 335





Agora, criaremos uma segunda tela para facilitar a pesquisa dos registros.








Neste campo voc poder digitar um cdigo
para realizar pesquisa, porm se fosse no
componente ao lado ( setinha vermelha ), isto
no seria possvel.


Clique no componente
RadioGroup, clique na
propriedade Items, ser aberta
uma tela, digite Cdigo e
Nome um abaixo do outro
como no exemplo acima, aps
clique Ok.
Clique no boto,
clique nan
propriedade
ModalResult e
defina mrOK
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 336









Clique duplo no registro selecionado transportar
do Grid para a tela de Cadastro.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 337
Relacionamento ( N N ) - ( Ex: 1 )
O exemplo a seguir mostra como cadastrar um funcionrio que trabalha em vrias empresas.

Crie as tabelas abaixo:

Funcionrios.db Empresas.db








Func_Empresa.db






O OO O File New Application remove file from Project yes (remova o formulrio em branco que o Delphi
abriu ).

O OO O Crie um Alias chamado de Relacionamento ( Database Explore Object New Standard Ok
digite o nome Relacionamento no lado direito , opo Path digite o caminho onde esto armazenadas as
tabelas (C:\Delphi Madruga\Sys 2\dados ) Apply e Ok para gravar.

O OO O Crie o formulrio de entrada de dados, use o Database - FormWizard para criar a tabela de Funcionrios
e Empresas. Clique o Formulrio e defina as propriedades bsicas: Caption = Cadastro de Funcionrios,
Name = Func_Frm, clique no componente Table1, pressione F11, na propriedade DataBaseName defina o
alias Relacionamento, Name para Funcionarios_TB, clique no DataSource1, pressione F11, mude a
propriedade Name para Funcionarios_DS
Veja o cadastro de Funcionrios abaixo:










O OO O Insira um componente Label e altere a propriedade Caption para Empresas.

O OO O Insira dois componentes Table e dois DataSource. Clique em Table1 defina a propriedade Databasename
= Relacionamento ( alias ), a propriedade Name para Empresas_TB, defina a propriedade TableName =
Empresas.db, clique no DataSource1 e mude a propriedade Name para Empresas_DS.

Clique em Table2, defina a propriedade Databasename = Relacionamento ( alias ), a propriedade Name para
Func_Empresas_TB, TableName = Func_Empresas.db, clique no DataSource2 e mude a propriedade
Name para Func_Empresas_DS, clique duplo em Func_Empresas, ser aberta uma pequena tela mostrando
os campos, clique boto direito, clique em Add Fields e OK, clique novamente boto direito, clique em New





Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 338
Field ( vamos criar um campo temporrio para mostrar o nome da empresa em um drop-down. Com drop-
down ser mais prtico), ser aberta uma tela para definir nome e tamanho do campo, preencha campos como
tela abaixo:


















O OO O Insira um DBGrid ( aba DataControls ), na propriedade DataSource defina Func_Empresas_DS, clique
duplo sobre o DbGrid, ser abeta uma tela onde definiremos as colunas dos dados que sero exibidos:




































Clique no
primeiro cone
amarelo ( Add
New Ins ),
clique duas vezes
para criar duas
colunas, clique
em FieldName e
defina o nome do
campo a ser
mostrado, clique
no + da opo
Title para alterar
o Caption para
Cdigo
Empresa.
O campo temporrio
relacionado com o
campo da tabela ( veja
ao lado ).
DBGRid
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 339
O Defina os relacionamentos, clique Func_Empresas_TB, clique em MasterSource e defina
Funcionarios_DS, clique em MasterFields para definir o relacionamento, veja abaixo:











































1
2
Veja o
relacionamento.
Func_Cod o
campo do Cdigo
do Funcionrio
que que foi criado
na tabela
Fun_Empresa.db
que serve para fazer
o relacionamento.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 340



O Crie o formulrio de entrada de dados para cadastrar algumas empresas ( utilize o FormWizard )











O Para selecionar uma empresa clique no final do campo Nome Empresa, ser aberta uma lista drop-down.




















Clique no DBGrid, defina a
propriedade DataSource
defina Func_Empresas_DS.
Insira um Label e na propriedade
Caption digite Empresas.
<< Abrindo duas tabelas >>





Esta a tabela
intermediria, somente para
fazer o relacionamento.
Tabela de Empresas.
Clique no DBNavigator, clique na
propriedade DataSource e defina
Funcionarios_DS
Um funcionrio poder ser
cadastrado em vrias empresas.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 341
Relacionamento ( 1 : 1 ) - ( Ex: 1 )

Temos duas tabelas, de Alunos e de Professores. Na tabela Alunos cadastraremos o Professor para um
aluno selecionado. Objetivo deste exemplo mostrar relacionamento de 1 para 1 ( 1 : 1 ).


















O File New application Project Remove from Project, selecione a Unit1 e Yes.

O Defina o Alias, aqui Madruga.

O Clique em Database Form Wizard para criar os dois formulrios Alunos e Professores, veja abaixo
como ficou o formulrio de entrada de dados para o Cadastro de Alunos.




























Relacionamento:
A tabela Alunos dever conter um
campo para o relacionamento. Desta
forma ligaremos o campo
Alu_Cod_Relaciona com o campo
Profe_Cod.


O Altere as propriedades bsicas
do Formulrio, Table, Name,
DataSource e Caption.

O Use o Form Wizard para
gerar o formulrio de entrada
de dados para os Professores.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 342
O Estamos na tabela dos Alunos, adicionaremos um componente DBLookupComboBox2 ( aba Data
Controls ) para fazer o relacionamento entre os Professores e Alunos. Clique File Use Unit Professores
























































Insira um componente
DBLookupComboBox1
( aba Data Controls ) e defina as
propriedades mostradas ao lado.
A Al lu un no os s

Alun_Cod_Aluno
Alun_Cod_Relaciona
P Pr ro of fe es ss so or re es s

Profe_Cod
Relacionamento
Insira um componente Table, defina a
propriedade DatabaseName = Alias
( ou caminho das tabelas ), altere a
propriedade Name para Profe_TB,
clique em TableName, defina o nome
da tabela para Professores.db, clique
duplo sobre Profe_TB, clique em
Add fields e Ok para adicionar todos
os campos.
Clique em DataSource1, clique na
propriedade DataSet, defina
Profe_TB, altere a propriedade Name
para Profe_DS.
Como funciona este relacionamento?

Um Aluno ter apenas
Um Professor
por isto se chama relacionamento de 1 para 1

O campo Professores poder
ficar em branco.
1:1
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 343
Como criar relatrio com relacionamento Professores e Alunos usando SQL ?

O File New Other e clique na opo Report, ser aberto um formulrio como o que est abaixo:





















































O Clique duplo no meio
deste formulrio, ser aberta
uma tela para configurar
tamanho do papel e outros.

O Aps clicar no
boto OK ser
includo 3 bandas.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 344
O Para forar quebra ( agrupamento ) por Professores precisamos incluir a banda que far esta quebra, uma
banda do tipo QRGroup.















O Na propriedade do formulrio Name altere o nome de QuickReport1 para QReport_Aula.

O Insira na banda Page Header um componente QRSysData, mude a propriedade Data ( qrsTime ) para
qrsReportTitle, onde ser impresso o ttulo do relatrio via programao. Mais para direita da banda insira
outro QRSysData, mude a propriedade Data para qrsDateTime ( para imprimir a data e a hora ), insira outro
QRSysData, mude a propriedade Data para qrsPageNumber ( para imprimir nmero da pgina ).

O Clique na banda Column Header, insira um componente QRLabel, mude a propriedade Caption para
Nome do Professor.

O Insira um componente SQL ( Query ), clique no componente Query, clique no boto direito, clique em
SQL Builder, na opo Database informe o Alias, na opo Table escolha a tabela de Professores e a tabela
de Alunos. Posicione o ponteiro do mouse sobre o campo Prof_Codigo e arraste-o at o campo
Alun_Cod_Relaciona, note o trao indicando o relacionamento, veja o grfico abaixo:



























Ao clicar no raio ser
mostrado o resultado SQL
que foi gerado.
Para fazer o relacionamento, clique na tabela de Professores, clique
no campo Prof_Codigo e arraste at o campo Alun_Codigo.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 345
O Clique no formulrio do relatrio QReport_Aula, na propriedade DataSet defina Query, na propriedade
Active defina True.

G Insira um componente QRDBText na banda Group Header, na propriedade DataSet defina Query, e na
propriedade DataField = Profe_Nome, agora clique na banda Group Header, clique na propriedade
Expression, clique boto Database field, clique em Query, clique em Profe_Nome, Ok e Ok.





























OO Clique na banda Detail, insira um componente QRDBText, altere a propriedade DataSet para Query,
DataField para Alun_Nome.





















Clique OK para
finalizar.


Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 346
OO No formulrio Menu insira um boto Bitbtn e no evento OnClick digite o cdigo abaixo:
Precisamos dizer ao formulrio Menu achar o formulrio do relatrio, clique em File, Use e QReport.
File use Qreport


















Aps clicar no boto Relatrio 1 ser mostrado o resultado abaixo:






























Professor
Nomes dos Alunos do
professor Jurandir
Mostra relatrio na tela,
podendo tambm
imprimir.
Note a quebra ( agrupamento ), a primeira
coluna dos Professores e a segunda
Alunos. Clique na banda Group Header,
clique na propriedade Child, defina o
valor para True, ser inserido mais uma
banda chamada HasChild, insira um
componente QRLabel e na propriedade
Capiton digite Nome do Aluno.
Relatrio de Professores
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 347
Veja abaixo aps inserir Child para mostrar o cabealho Nome do Aluno.







































Para visualizar o cdigo SQL que foi gerado pelo SQL Builder, clique no componente Query1, clique em
SQL Strings ( ... ) , veja abaixo:















Note que a cada quebra
de Professor
impresso o cabealho
Nome do Aluno
SELECT
Professores.Prof_Nome,
Alunos.Alun_Nome
FROM
"professores.db" Professores
INNER JOIN
"alunos.db" Alunos
ON
(Professores.Prof_Codigo = Alunos.Alun_Cod_Relaciona)
GROUP BY
Professores.Prof_Nome, Alunos.Alun_Nome
ORDER BY
Professores.Prof_Nome, Alunos.Alun_Nome

Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 348
Relacionamento ( 2 )

O Crie as duas tabelas.


O Crie o formulrio de entrada de dados para a Agenda. O campo cdigo no precisa ser posto no formulrio
visto que um campo auto-increment.



O Abaixo do campo nome insira um DbGrid, um Table e um Datasource.





Como padro o nome Table, mude a
propriedade Name para
Compromissos_TB e o DataSource para
Agenda_DS. Clique em Compromissos
_TB, defina a propriedade DatabaseName
= Alias, TableName = Compromissos.db
e defina Active para True.

Relacionando campos:
Clique em Compromissos_TB, clique na
propriedade MasterSource e defina
Agenda_DS, clique em MaterFields ( ser
aberta a tela abaixo ), clique no campo
Comp_Cod_Relaciona, clique no campo
Agen_Codigo e clique no boto Add e Ok.
Como padro o nome Table, mude a
propriedade Name para Agenda_TB e
o DataSource para Agenda_DS.
Clique em Agenda_TB, defina a
propriedade DatabaseName = Alias,
TableName = Agenda.db e defina
Active para True.
Clique em Agenda_DS e defina o
DataSet para Agenda_TB.
Insira um DBGrid, clique na
propriedade DataSource e
defina Compromissos_DS.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 349
O Clique no formulrio Agenda e abra as tabelas no evento OnCreate e no evento OnEnter do DBGrid.





= Se o registro Jurandir for removido, todos seus compromissos tambm sero removidos.
Alias ( 1 )





























O Insira um componente DataBase
( aba BDE ), clique duplo sobre este
componente, ser aberta uma tela, veja
abaixo:

O Clique e selecione o
driver Standard.
O Digite o nome do Alias
desejado, aqui, Madrugada.
O Digite o caminho onde esto
as tabelas de dados.
O Defina as propriedades do Database1


Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 350

























Alias ( 2 )

Selecione o formulrio corrente e no evento OnCreate digite as linhas de cdigo abaixo, insira tambm um
componente Session ( aba BDE ). Insira um componente Session ( aba BDE no delphi 6.0 ).


Digite o cdigo abaixo no evento OnCreate.










O Observe atentamente
cada evento O
Dados o nome da sub-
pasta onde contem todas as
tabelas de dados
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 351
Integridade referencial ( Paradox )

Exemplo: Temos um Cadastro de Cidades e um Cadastro de Funcionrios. Cada registro gravado no
Cadastro de Funcionrios ter uma cidade relacionada ( buscaremos a cidade do Cadastro de Cidades ),
portanto, todos os registros do Cadastro de Funcionrios tero vrias cidades filhas. Se alguma cidade for
excluda do Cadastro de Cidades criar registros rfos no Cadastro de Funcionrios, e isto JAMAIS pode
acontecer. A integridade referencial NO permite registros rfos no Cadastro de Funcionrios, ou no
caso, em qualquer outra tabela.































1

registro

Cadastro de Funcionrios

Cdigo: 1
Nome funcionrio: Mike Allan
Cidade: Timb

Registro nr 1

Cadastro de Cidades

Cdigo: 1
Cidade: Timb
Registro nr 2

Cadastro de Cidades

Cdigo: 2
Cidade: Blumenau
2

registro

Cadastro de Funcionrios

Cdigo: 2
Nome funcionrio: Eric Tomas
Cidade: Timb

3

registro

Cadastro de Funcionrios

Cdigo: 3
Nome funcionrio: Jurandir
Cidade: Blumenau

Integridade:

No Cadastro de Cidades se tentar excluir a
cidade de Blumenau ou Timb o programa ( ou
banco de dados ) NO dever permitir. Se isto
acontecer, teremos 3 registros no Cadastro de
Funcionrios sem suas respectivas cidades !
Lembre-se, o campo cidade do Cadastro de
Funcionrios esta relacionado com o Cadastro
de Cidades, que o local onde buscamos as
cidades.
Cidade filha
Cidade filha
Cidade filha
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 352
O Crie as duas tabelas abaixo com o utilitrio Database Desktop.






O Formulrio de Funcionrios.






















Cadastro de Cidades Cadastro de Funcionrios
Funcionrios: Insira um componente
Table, defina a propriedade
DatabaseName = Alias X,
Name = Funcionario_TB,
TableName = Funcionrios.db, clique
em Funcionrio_TB, clique no boto
direito, Add All Fields, clique em
Funcionrio_DS, na propriedade
DataSet defina Funcionrios_TB.

Cidades: Insira um componente Table,
defina a propriedade
DatabaseName = Alias X,
Name = Cidades_TB,
TableName = Cidades.db, clique em
Cidades_TB, clique no boto direito,
Add All Fields
clique em Cidades_DS, na propriedade
DataSet defina Cidades_TB.
Cidade: Insira um componente DBLookupComboBox1, clique
nele e defina as propriedades abaixo:
DataSource = Funcionrio_DS
DataField = Func_Cod_Relaciona_City ( campo relaciona )
ListSource = Cidades_DS ( Datasource )
ListField = Cid_Cidade ( campo a ser listado )
KeyField = Cid_Cod ( campo chave )

Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 353
O Abra o utilitrio Database Desktop, clique em File, clique em Working Directory e defina o caminho
onde esto as tabelas.



O Abra a tabela de Funcionrios, clique em Table, clique em Restructure, ser aberta a tela abaixo, role at
a opo Referential Integrity ( integridade referencial ) e clique, clique no boto Define ( que surgir ).




Clique no campo que
relacionaremos
Func_Cod_Relaciona_City,
clique na setinha pra direita.
Clique na Tabela
Cidades, clique na
setinha apontando
para esquerda, clique
no boto OK, ser
solicitado um nome
para a integridade,
digite o nome
Func_City.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 354








Insira um boto do tipo Bitbtn e no evento OnClick digite o cdigo abaixo:



Ao clicar no Navegador de registros retornar a Ao clicar no boto Excluir ser mostrada
Caixa de mensagem de erro abaixo: caixa de mensagem abaixo.






Nome da integridade
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 355
Sistema bsico com alguns mdulos

O Tela senha de acesso. Tela de acesso, o usurio ter 3 chances para digitar a senha corretamente, caso
contrrio o programa abortar.










Insira um componente MaskEdit,
defina a propriedade PasswordChar
diitando um asterisco ( * ), ou algum
outro caracter que ser mostrado no
campo da senha.

Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 356


O Crie um menu para os programas.










Cria o fundo gradiente no
formulrio da senha.
Insira um PopUpMenu, clique duplo sobre este
objeto e defina duas opes Scios e
Empresas: Clique na propriedade Caption, digite
Scios, na propriedade Name digite Socios2.
Ao clicar no boto direito haver um atalho para
os dois programas. Clique no formulrio
Mdulo Principal, clique na propriedade
PopupMenu e defina PopupMenu1.
Clique duplo no componente MainMenu1
e defina as propriedades: Clique na
propriedade Caption, no lado direito digite
Cadastros, na propriedade Name, digite
Cadastros1, agora defina as propriedades
para Scios, Empresas, Recibos e Sair.

Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 357
Formulrios abaixo so carregados para memria dinamicamente ( de forma + rpida ).







Outra maneira:


Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 358
O Defina os formulrios que sero carregados de maneira dinmica: Project Options Forms e posicione
os formulrios a serem carregados dinamicamente para o lado direito da tela ( coluna = Available forms ).




O Criaremos um modulo onde conter os componentes de dados:










Insira 3 componentes Table e 3 DataSources e
definas as propriedades DatabaseName = Alias,
TableName = Scios_TB, clique em Scios_DS
defina o DataSet = Scios_TB e a propriedade
Name = Scios_DS.

Como padro os nomes sero Table1, Table1 e
Table3, DataSource1, DataSource2 e
DataSource3, mude as propriedades de acordo
com o exemplo.
No Cadastro de Scios
criaremos a numerao de
registros automaticamente
( via programa ). Na seo
Private crie a varivel
NrProx
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 359











Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 360
O Crie a tabela Cadastro de Scios com os campos abaixo:











O primeiro Edit
utilizado apenas para
localizar registros, no
campo que faz parte da
tabela.
Insira um
StatusBar, clique
duplo, clique no
boto amarelo 7
vezes (Add new )
para criar as
divises.
Nesta diviso
ser mostrado
a quantidade
de registros
que esto na
tabela.
Clique no campo cdigo e na propriedade
ReadOnly = True . Desta forma no ser possvel
digitar o cdigo. Lembre-se que foi criado uma
varivel para criar o cdigo automaticamente
auto-incrementador.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 361






Localizar pelo Cdigo do
Scio ou atravs do Nome
( o campo Nome um ndice
secundrio ).
Soma quantidade de
registros que h na tabela e
mostrar na barra inferior.
Soma todos os
salrios da tabela e
mostra no Label10.
Ao fechar o formulrio e se for
alterado algum campo, antes de
fechar ser solicitada confirmaro
para a gravao ou no do registro
corrente.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 362











No campo Edit_Localiza
ser aceito somente letras.
Ao excluir o
registro corrente.
Se for ativada uma
das 3 teclas abaixo,
estas sero mostradas
na barra de status:

Caps, Del ou
NumLock.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 363






Verifica se registro
esta em edio ou
alterao, grava o
registro e toca um
som do tipo .wav
No campo Nome Scio ser
aceito somente letras.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 364








Apaga TODOS os
registros da tabela
mediante confirmao.
Ao clicar no boto ser
localizado um Scio
atravs do seu cdigo.
Procura registro
atravs do nome
informado.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 365







Navega nos registros,
permitindo apagar o
registro, usar setinha
para cima e para
baixo etc.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 366
O Crie a tabela Cadastro de Recibos com os campos abaixo:












Insira um componente DBLookupComboBox1
( aba DataControls ) e defina as propriedades
de acordo com o grfico.

Insira um segundo DBLookupComboBox2
para a Empresa e definas suas propriedades.

Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 367











O Crie a tela para pesquisar Nomes, aps encontrar o Nome este ser transportado para a tela de Recibos.








Insira um DBGrid, clique duplo
sobre o Grid, insira duas
colunas clicando na pastinha
amarela ( Add new ) e defina a
propriedade FieldName =
Nome_Socio e Cidade.
Insira um boto Bitbtn e na propriedade
ModalResult defina o valor para MrOk

Esta uma maneira prtica para selecionar registros. Ao
clicar no boto acima ( setinha vermelha ) ser aberta uma
tela ( veja abaixo ), sero listados todos os Scios
cadastrados, digite as letras iniciais do Scio que deseja
procurar ou clique sobre ele, aps clique no boto OK, o
registro ser transportado para a tela de Cadastro de
Recibos.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 368




Veja abaixo, foram digitadas as letras JUR, o cursor esta posicionado no registro JURANDIR PELLIN.











Ao clicar OK o registro selecionado
JURANDIR PELLIN ser transportado para a
tela de Recibos no campo Nome Scio.
Indice secundrio.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 369
Filter Procurando registros
Crie um Cadastro com os campos Nome e Data de Aniversrio. Com o Filter possvel pesquisar registros
registros atravs de qualquer campo.










Clique no componente Clientes_TB,
clique no evento OnFilterRecord e
digite o cdigo.
O campo Data_Aniver no
campo de ndice secundrio,
apenas um mero campo.
Na linha Uses digite a
biblioteca DateUtils.

No campo Edit digite
somente: dia ou o ms
ou o ano.
Insira um componente
RadioGroup ( Standard )
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 370
Resultado do cdigo da pgina anterior:




Segue abaixo outra maneira:











Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 371
Mesmo campo para procura e grava registro

Na situao a seguir usaremos um nico campo para procurar um registro e tambm para grav-lo. Aps o
usurio digitar um cdigo que j existe, este registros ser trazido para memria.

O Crie a tabela abaixo:



O Crie o formulrio abaixo, insira dois componentes Tables e dois DataSources. Nos dois Tables abaixo
usaremos a tabela de ClientesX ( uma nica tabela ).

Clique em Table1, defina as propriedades DatabaseName = Alias, clique em TableName = ClientesX.db,
clique em Name defina o nome Clientes_TB, clique em DataSource, defina o nome Clientes_DS, clique na
propriedade DataSet = Clientes_TB, propriedade Name = Clientes_DS, clique em Clientes_TB e defina
Active para True.

Clique em Table2, defina as propriedades DatabaseName = Alias, clique em TableName = ClientesX.db,
clique em Name defina o nome Table_Aux_TB, clique em DataSource, defina o nome
DataSource_Aux_DS, clique na propriedade DataSet = Table_Aux_TB, propriedade Name =
DataSource_Aux_DS, clique em Table_Aux_TB e defina Active para True.



O Cdigo fonte do programa acima:






Insira um DBNavigator,
clique na propriedade
DataSource defina
Clientes_DS.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 372







Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 373
Registro duplicado no permitido

Como evitar a duplicao de registros ? Uma pessoa ou registro pode ter somente um nico cdigo.

O Crie uma tabela. O campo cdigo I ( Long Integer )



O Clique no componente Table1, clique no evento OnPostError e digite o cdigo abaixo:



Outra forma:






Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 374
CGC Como validar ?





Aps sair do campo CGC ( perder o
foco do campo ), ser mostrada uma
menssagem confirmando validade do
CGC digitado.

Funo Right
Funo Cgc

DBEdit5 o campo onde
digitamos o nmero do CGC.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 375
CPF Como validar ?




TryStrToFloat Como aceitar somente valor ?






O contedo digitado no
campo do CPF ser
verificado no evento
OnExit, ou seja, quando
perder o foco do campo.

Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 376
Como reajustar todos os salrios de uma tabela ? ( 1 )

Mostra como efetuar reajuste salarial em todos os registros da tabela com um determinado percentual
utilizando os componentes SpinEdit ( aba Samples ), ProgressBar ( aba Win32 ).






Insira um componente
SpinEdit ( aba Samples ).
Insira uma ProgressBar ( aba Win32 ).
Retngulos pontilhados so
usados pela ProgressBar.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 377
Como reajustar todos os salrios de uma tabela ? ( 2 )

Atualizar todos os preos unitrios da tabela no percentual informado.









Insira uma ProgressBar ( aba Win32 )
A linha em vermelho
mostra como arredondar
o valor.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 378
Como somar todos os salrio ?

Aps clicar ser lido todos os registros da tabela e somar todos os campos salrio na varivel Total.













No evento OnClick do boto Calcula ( Bit_Calc_Salarios ) digite o cdigo abaixo.


























Como fazer barra de ttulo piscante ?












Insira um Timer ( aba System ), clique duplo sobre
Timer e digite o cdigo abaixo. Este cdigo far com
que a barra de ttulo pisque sem parar.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 379
Como criar um campo temporrio com relacionamento e pesquisa ?

No exemplo a seguir veremos como criar campo temporrio, relacionamentos e mais uma maneira de
pesquisar registros.


O Crie as duas tabelas abaixo: Na tabela Alunos.db h um campo chamado de Alun_Cod_Relaciona ( este
campo no ficar visvel no formulrio de Cadastros de Alunos, finalidade deste campo, unicamente fazer o
relacionamento), que ser o campo usado para fazer o relacionamento da tabela de Alunos com a tabela
Professores.











O Use o Form Wizard para criar o formulrio de entrada de dados para cadastrar os Alunos.















O Agora vamos fazer o relacionamento para buscarmos o nome do professor.

Insira um componente DBEdit, defina duas propriedades, DataSource para Alunos_DS, DataField para
Alun_Cod_Relaciona.

Insira um Table e um DataSource, altere os nomes destes componentes: Table para Profe_TB, DataSource
para Profe_DS. Clique Profe_TB, defina a propriedade DatabaseName = Alias, TableName para
Professores.db ( nome da tabela ). Clique em Profe_DS, DataSet defina Profe_TB e Name para Profe_DS.

Vamos criar o campo temporrio para mostrar o nome do professor. Clique no componente Alunos_TB,
clique no boto direito, clique em New Field, ser mostrado uma tela para definir o nome do campo, tipo,
tamanho etc , veja na pgina a seguir:




Tabela: Alunos.db

Tabela: Professores.db


Altere as propriedades bsicas do
formulrio: Caption para Cadastro de
Alunos, Name para Alunos_Frm.
Altere as propriedades dos componentes
de dados, Table1 para Alunos_TB,
DatabaseName = Alias, TableName
para Alunos.db, DataSource para
Alunos_DS, DataSet para Alunos_DS.

Estas so as propriedades bsicas para
personalizarmos o formulrio.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 380
Observe com ateno cada opo da tela abaixo. Digite o nome do campo ( Nome_Profe_Temp ), String
porque um campo texto, o tamanho de 20 caracteres, tipo de campo lookup, ou seja, campo tipo
drop-down, campo chave Alun_Cod_Relaciona ( campo que foi criado na tabela de Alunos ), DataSet
Profe_TB, chave de pesquisa Profe_Codigo, o que ser resultado ( nome do campo que ser mostrado ),
nome do professor ( Profe_Nome ).



















O Abaixo est o campo temporrio Nome_Profe_Temp, arraste-o para dentro do formulrio.































Clique no componente Alunos_TB,
clique duplo, ser aberto a tela
acima com todos seus campos.
Sempre escrevo Temp no final do
nome do campo para diferenciar um
campo fsico de um campo
temporrio

Arraste o campo para
dentro do formulrio

Traduzindo caixa campo temporrio:

Name............. : nome do campo ( temp - temporrio ).
Type.............. : tipo do campo string = texto.
Size................ : tamanho do campo ( 20 caracteres ).
Lookup ......... : veja no lado direito drop-down.
Keyfiels......... : nome campo para relacionar.
Dataset.......... : dataset-Professores para buscar o nome do Professor.
Lookup keys. : chave primaria campo Professor.
Result field ... : resultar mostrando o nome do Professor.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 381
O Agora vamos inserir um componente Bitbtn ( boto ) para abrir a tela de pesquisa dos professores, nomeie
este boto para Bit_Procura e no evento OnClick digite o cdigo abaixo:















O Insira um novo formulrio, na propriedade Name defina o nome para Localiza_Frm.



















O Clique no DBGrid, defina a propriedade ReadOnly para True, lembre-se, o Grid serve somente para
mostrar os nomes dos professores, e no para cadastrar, alterar ou excluir.



















Insira um componente
DBGrid, um Edit e 3
botes do tipo BitBtn.
Adiante criaremos um
formulrio para filtrar os
registros chamado de
Localiza_Frm.
Clique no boto OK, altere a
propriedade ModalResult para
mrOK.


Clique duplo sobre o DBGRid, ser aberta a tela
ao lado, insira uma coluna ( add new ) ( setinha
vermelha ), veja na pgina seguinte mais
propriedades ...


Clique no primeiro item
( 0 Prof_Nome ), defina o nome do
campo na propriedade FieldName e
mais abaixo a propriedade Caption
Nome do Professor.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 382
O No evento OnChange do Edit digite o cdigo abaixo. Note na linha With foi informado Profe_Frm para
indicar que o componente ( table tabela ) Profe_TB est no formulrio de Professores.









Quando for aberto o formulrio de consulta de professores o cursor estar posicionado no Edit para
imediamtamente iniciar a procura de um possvel nome de professor.


















PageControl e SatusBar Controle de pginas e Barra de status
Usaremos o componente PageControl ( aba Win32 ) e o componente SatatusBar ( aba Win32 ).
O Insira um formulrio ( New Form )
O Insira um PageControl, clique no boto direito, clique na opo New Page para inserir novas pginas ou
abas.



Abra a tabela de Professores e
crie um ndice secudrio
chamado de Inome_profe

Digite as linhas abaixo nos
respectivos eventos,
OnShow e OnClick.

Se voc esta na tela de pesquisa de
Professores, e se o professor que estiver
procurando no existir, clique no boto
Professores para cadastrar novos
teachers
O Clique no centro do form para
selecionar a TabSheet1 ( pgina ), na
propriedade Caption altere o nome de
TabSheet1 para Empresas, este passo
deve ser repetido para as outras duas
Tabsheets 2 e 3. Altere tambm a
propriedade Name de cada TabSheet1
para TabSheet_Empresa,
TabSheet_Funcionarios
TabSheet_Cidades.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 383
O Selecione o formulrio, na propriedade Caption digite Page Control e na propriedade Name digite
PageControl_Frm.

O Insira 3 componentes Table e 3 componentes DataSource. J aprendemos anteriormente as propriedades
bsicas que devem ser definidas para os componentes Table e Datasource.

Passos: Clique no primeiro Table, clique na propriedade DatabaseName e digite o Alias ou caminho onde
esto armazenadas as tabelas, clique na propriedade Name e digite Emp_TB, defina a propriedade
TableName = Empresas.DB. Clique no componente DataSource1, na propriedade DataSet defina Emp_TB
, na propriedade Name = Emp_DS. Clique em Emp_TB, clique no boto direito, Fields Editor, clique direito,
Add fields e clique OK.

Todos os passos acima devero ser repetidos para as duas outras tabelas (Tables e Datasources ) - (
Funcionrios e Cidades ).

O Clique duplo no componente Func_TB, ser aberta uma pequena tela mostrando os campos, selecione-os,
clique no primeiro campo ( Func_Cod ), mantenha a tecla Ctrl pressionada e clique nos campos desejados,
clique na rea azul ( note que todos os campos selecionados ), arraste-os para dentro da TabSheet_Empresas,
solte-os, estes sero posicionados no corpo do TabSheet_Empresas. Este processo feito para definir os
campos, apenas uma forma rpida, caso contrrio teramos que definir campo a campo .



O Clique no TabSheet_Empresas, insira dois botes Bitbtn para navegar nos registros.





Insira um DBNavigator ( aba Data
Controls ), defina a propriedade
DataSource para Func_DS.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 384
O Insira uma StatusBar ( aba Win32 ), esta ficar posicionada no rodap da tela corrente, clique duplo sobre
ela e clique 4 vezes na pastinha amarela ( Add new ), para inserir 4 divises na StatusBar.






O Veja abaixo o programa fonte completo:







Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 385




Veja abaixo vrios posicionamentos das abas ou palhetas, altera a propriedade TabPosition.









Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 386




No exemplo abaixo h apenas um DBNavigator1 ( navegador de registros ), no exemplo anterior havia um
navegador para cada cadastro.



Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 387
No evento OnChange do PageControl digite o cdigo abaixo:








CEP Como formatar ?










Inserindo cones para os Tabs (abas): Na barra de componentes do Delphi aba Win32
selecione o componente ImageList, clique duplo para selecionar os cones desejados,
selecione PageControl, na propriedade Images clique para definir ImageList1. Aps ser
definido automaticamente os cone para cada Tab (de acordo com a numerao)
Clique no PageControl e
na propriedade Image
defina o componente
ImageList1.
Clique nesta
regio para
melhor selecionar
a PageControl.

Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 388
PopMenu Como criar menu ?
Cria um menu de atalho ao clicar no boto direito do mouse.

O Na aba Standard , insira um componente PopupMenu, selecione o campo cdigo EditCodigo, na
propriedade PopupMenu deste campo informe PopupMenu1, desta forma quando o ponteiro do mouse
estiver sobre este campo e se clicado no boto direito do mouse ser aberto o menu de atalho. Para definir
opes no PopupMenu, clique duplo sobre PopupMenu, ser aberta uma outra tela, no primeiro Caption
informe Cor de fundo e no segundo Caption informe Cor da letra.







WAV Como reproduzir um arquivo de som do tipo .wav

Para reproduzir sons no formato WAV simples. Na linha Uses inclua a clusula MMSystem.

O Crie um boto chamado de Som, no evento OnClick digite a linha de cdigo abaixo: O arquivo de som
aqui Dog.Wav, poderia ser qualquer outro arquivo.



SND_ASYNC Executa o som assincronicamente, a funo retorna assim que inicia o som.
SND_NODEFAULT Especifica que se o som no pode ser tocado a funo no toca o som padro.
SND_MEMORY Use se o som est em um arquivo de recursos.
SNDLOOP Especifica que o som no deve para de tocar at que outro som seja chamado.
SND_NOSTOP Faz com que o som no possa ser interrompido por outro, retorna FALSE se isto
ocorrer.






Clique duplo para definir
as procedures que sero
no evento onclick.

Aps clique duplo sobre
PopupMenu ser aberto uma
tela para definir os Captions e
Eventos.

Ao clicar o
boto direito.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 389
Splash Screen Como criar tela de abertura ?

Criando tela de abertura do sistema.

O Insira um form.
O No cone View Unit abra seu projeto.













Como carregar uma imagem .bmp quando carregar o form ?








Insira uma figura, aba
Additional Image, na
propriedade Picture escolha
um arquivo de imagem.
Insira um componente Image ( aba
Additional ), um componente
OpenPictureDialog
( aba Dialogs )

Imagem deve
estar na pasta do
projeto corrente.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 390
Como adicionar um percentual em um valor ?

Temos 3 campos edits, no primeiro campo ser digitado um valor, no segundo um percentual e no terceiro edit
ser armazenado o total j acrescido do percentual, ou seja, valor atualizado. Teremos um problema por causa
do uso do ponto ( 100.22 ).












Para resolver este problema precisamos fazer uma pequena funo para remover o ponto do valor ( 100.22 )



Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 391
Soluo do ponto no valor ( 100.20 )




















Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 392
Encriptografando senha




















Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 393
DBGrid e SQL Um nico DbGrid com resultados diferentes

Neste exemplo usaremos um DBGrid, e faremos vrios DataSources, fazendo combinaes com
para retornar um resultado no Grid.














O Vamos criar um Modulo de dados para concentrar todos os componentes Query. Insira um
DataModule, na propriedade Name defina o nome DM_Qr. Clique em File New DataModule,
insira 8 Query ( plural queries ), defina os nomes de acordo com o grfico abaixo. Defina a
propriedade DatabaseName seu alias para cada Query do projeto corrente.

As Query ( queries ) abaixo sero usadas adiante para
fazermos os relatrios.


Tabela: Produtos.db


Cada DataSource que esta no formulrio
Grid dever ser associado com um
Query do mdulo DM_Qr. Clique em
File Use Unit e selecione DataModulo.
Clique em Produtos_Todos_DS, clique
na propriedade DataSet e associe com
seu respectivo Query ou,
Produtos_Todos_Qr.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 394
Agora vamos definir os cdigos de SQLs para cada Query que ser utilizado.

Clique no componente Query1, clique na propriedade SQL, clique no lado direito em TStrings (...) e
digite o cdigo SQL para cada componente ( Query1, Query2 ... )






































O Insira um segundo DataModulo, na propriedade Name defina o nome DM, insira 1 Table e 1
DataSource, defina o nome ( name ) do componente de acordo com o grfico abaixo, clique em
Produtos_TB, na propriedade DatabaseName defina o Alias ( ou caminho da tabela ), clique na
propriedade TableName, defina o nome da tabela que ser usada aqui Produtos.db, clique duplo
em Produtos_TB, clique no boto direito, clique em Add fields e Ok.


Query1

SELECT
Prod_Codigo,
Prod_Descricao,
Prod_Qtde,
Prod_Data,
Prod_Obs
FROM
"Produtos.db" Produtos
WHERE
(Prod_codigo >= :Cod_Inicial) and (Prod_codigo <= :Cod_Final)
Query2

SELECT
Prod_Codigo,
Prod_Descricao,
Prod_Qtde,
Prod_Data,
Prod_Tipo
FROM
"Produtos.db" Produtos
WHERE
(Prod_Data >= :Data_inicial) and (Prod_Data <= :Data_Final)
and (Prod_Tipo = :Tipo)

Query3

No digite nada
Query4

No digite nada
Query5

SELECT
Prod_Codigo,
Prod_Descricao,
Prod_Qtde,
Prod_Data,
Prod_Tipo
FROM
"Produtos.db" Produtos
WHERE
(Prod_Data >= :Data_Inicial) and (Prod_Data <= :Data_Final)
Todos_Produtos_Qr


Todos_Produtos_Igual_Qr


Produtos_Maior_Que_Qr


No evento OnCreate do DM ( DataModulo ) abra a tabela de Produtos.


Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 395
O Crie o formulrio de Produtos para dar entrada aos produtos.










O Insira um Form, um DbGrid, 7 Datasources, 19 botes BitBtn e10 Edit. Adiante veremos as
propriedades que devero ser definidas para cada um dos componentes que esto no formulrio.




Estando no DM ( Data Module ), clique em Produtos_TB, defina o
DatabaseName = Alias, defina a propriedade Name = Produtos.db, clique em
Produtos_TB, clique no boto direito, clique em Add fields e Ok, selecione
todos os campos, arraste-os para dentro do formulrio, clique na propriedade
Active e defina o valor True. Esta uma rpida maneira para criar o formulrio
de entrada de dados para os Produtos, a propsito, j vimos
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 396

Produtos cdigo fonte



Selees cdigo fonte do programa










No formulrio de Produtos, no evento
OnClose digite este cdigo. Ao fechar o
formulrio ser verificado o registro se
foi inserido ou alterado e ser solicitada
confirmao.
Abaixo segue os cdigo utilizados no formulrio
Selees ( veja o formulrio na pgina anterior )
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 397














Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 398





No incio do programa, na clusula Private digite a linha Procedure Limpa_Grid;

Digite a procedure abaixo:





SUM () Soma
AVG () Mdia
MAX () Mximo
MIN () Mnimo
COUNT(*) Conta registros
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 399














Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 400















Localiza uma descrio ou outra.
Selecionar o cdigo que
for digitado no Edit5.Text.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 401





Relatrio com

Vamos criar os relatrios do programa que criamos na pgina anterior usando SQL.

O Crie um formulrio para seleo. Insira um formulrio, 3 botes Bitbtn, 8 edit ( edits ) e um
componente RadioGroup. Criaremos 5 formulrio para os relatrios








O
O
O
O
O
RegsX uma varivel.

Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 402
O OO O Relatrio Lista todos os registros.



Associe cada QRDBText com o seu respectivo campo









Ateno ! DM_Qr o mdulo onde
contm todos os Query
( queries ) utilizados neste exemplo,
portanto, este deve vir por primeiro
para indicar a origem de todos os
outros Query.

DM_Qr.Produtos_Todos_Qr ...
Dataset:
DM_Qr.Todos_Produtos_Qr
Todos_Produtos_ Todos_Produtos_ Todos_Produtos_ Todos_Produtos_Q QQ Qr rr r
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 403
O OO O Relatrio Listar todos os registros iguais ao cdigo solicitado.








Dataset:
DM_Qr.Todos_Produtos_Igual_QR
Todos_Produtos_Igual_Qr Todos_Produtos_Igual_Qr Todos_Produtos_Igual_Qr Todos_Produtos_Igual_Qr
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 404
O OO O Relatrio Listar todos os registros por perodo









Dataset:
DM_Qr.Query1
Query1 Query1 Query1 Query1
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 405
O OO O Relatrio Listar por data e tipo







Dataset:
DM_Qr.Query2
Query2 Query2 Query2 Query2
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 406
O OO O Relatrio Listar perdo e opo selecionada










Dataset:
DM_Qr.Query5
Query5 Query5 Query5 Query5
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 407



Faremos um relatrio com quebra por datas ( perodo )
Clique em Query_Data, clique na propriedade DatabaseName e defina o Alias, neste caso Dm_Sqls




Clique na regio branca
e defina o DataSet para
Query_Data
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 408
Group Header: Insira uma banda QrGroup, insira nesta banda um QrExpr, clique em QrExpr e na proprieade
Expression digite Query_Data.Prod_Data, clique na banda QrGroup e na propriedade
Expression digite Query_Data.Prod_Data

Group footer: Insira um componente QrExpr, clique em QrExpr e na propriedade Expression digite
SUM(Query_Data.Prod_Qtde), clique na propriedade ResetAfterPrint e defina o valor para
True.

Summary Insira um componente QrExpr, clique em QrExpr e na propriedade Expression digite
SUM(Query_Data.Prod_Qtde), clique na proprieade ResetAfterPrint e define o valor para
True . Insira um QrSysData, mude a propriedade Data para qrsDetailCount, na propriedade
Text digite Regs:




Adicione dois Edit e um
boto do tipo Bitbtn
Formulrio do relatrio.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 409


Resultado


Rotinas Como criar ?

Como o prprio nome sugere rotinas, ou seja, pedaos / trechos de linhas de cdigo que so muito usadas
em vrios programas do seu projeto. Um arquivo de rotinas pode conter vrias rotinas. Uma rotina pode conter
vrias linhas de cdigo e ter um nico nome. Quando precisar chamar uma rotina em outro programa no
repita linhas de cdigo, digite apenas o nome da rotina desejada. Veja adiante um exemplo ( bsico ):

O File New Unit

Voc ter o cdigo abaixo padro:


Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 410
Rotina Mensagem



Usando rotina acima

O Abra seu programa (ou projeto) para aplicar a rotina que acabamos de criar.
O Clique em Add to project (+) e adicione o arquivo de rotina ( Rotina_Exemplo )
O File Use Unit e selecione o arquivo de rotinas.



Rotina cores Para mudar cores dos campos
Criaremos uma rotina para mudar a cor do campo quando sair / perder o foco do campo corrente.

O Crie um arquivo para armazenar as rotinas. File New Unit Ok e digite o contedo a seguir, salve a Unit
com o nome Minhas_Rotinas.

unit Minhas_Rotinas;
interface
uses dbctrls, Graphics;

// DbCtrls = dentro deste h as definies do Objeto TDbEdit
// Graphics = dentro deste h as definies das cores clYellow etc

Procedure Entra_Cor(Sender : TObject);
Procedure Sai_Cor(Sender : TObject);








Este o nome da procedure.
Crie uma nova rotina. File New Unit. Como padro o Delphi
atribui o nome de Unit1, salve o arquivo que conter todas as suas
rotinas com o nome de Rotina_Exemplo
Onde esto as mensagens.
Resultado da rotina. Quando perder o foco
ser mostrada a caixa de mensagem.
Digite esta
linha

Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 411
Implementation


Procedure Entra_Cor(Sender : TObject);
begin
With TDBEdit(Sender) do
begin
Color := clYellow;
Font.Color := clRed;
end;
end;

O Abra um formulrio, na segunda linha dos Uses digite Minhas_Rotinas, para abrir o arquivo das rotinas.
O Selecione os objetos (campos) cdigo e Nome apenas:
Clique no campo Cdigo, no evento OnEnter digite Entra_Cor(Sender);
Clique no campo Cdigo, no evento OnExit digite Sai_Cor(Sender);
Clique no campo Nome, no evento OnEnter digite Entra_Cor(Sender);
Clique no campo Nome, no evento OnExit digit: Sai_Cor(Sender);
Como somar, multiplicar e totalizar em um DBGrid ?











Quando for clicado no campo Nome do
Produto a cor da letra e do fundo
mudaro. Quando for clicado no prxmo
campo a cor retornar ao normal.
Procedure Sai_Cor(Sender : TObject);
begin
With TDBEdit(Sender) do
begin
Color := clBlue;
Font.Color := clRed;
end;
end;
Digite a rotina Sai_Cor abaixo
da rotina Entra_Cor.
Digite a rotina Entra_Cor abaixo
do item Implementation
Lembre-se: Quando
os dados esto
visveis porque a
propriedade do table
Active est com o
valor True.
Note que a coluna Total est vazia. Para
gerar o total criaremos um campo virtual
(temporrio), ou seja, far o calculo
somente quando o programa for
executado no um campo fsico da
tabela.
Insira um componente DBGrid
( aba DataControls) , na
propriedade DataSource
informe DataSource1.
Veja adiante as linhas de
cdigo dos Labels.

O Crie a tabela. Clique em Tools Database
Desktop File New Table Paradox 7
Ok digite os campos como no grfico ao
lado, aps grave clicando no boto SaveAs,
nome do arquivo Movtos.
Insira um DBNavigator (aba
DataControls), na propriedade
DataSource informe
Datasource1.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 412














Vamos criar um campo temporrio para o total, posicione o
ponteiro do mouse sobre Table1, clique no boto direito do
mouse, clique em Fields Editor, clique no boto direito, clique
New Field, digite o novo campo ( Total_Cal ).

Clique em Table1, no DabaseName defina o Alias Clculos, propriedade TableName Movtos.db. Clique no
cone DataSource1, propriedade Dataset defina Table1. Selecione o cone Table1, no evento OnCalcFields digite
a seguinte linha: Table1Total_Cal.Value := Table1Qtde.Value * Table1Preco.Value;

Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 413















Data Module O que ?

Com este recurso podemos concentrar vrios componentes, como: Table, Datasource, Query etc em um nico
mdulo e apontar o DataModule para os formulrios. Se no utilizar DataModule, voc sempre ter que
definir estes componentes em cada formulrio utilizado.

O File New Application O Crie duas tabelas, Fornecedores e Clientes













O File New Application, ser inserido um formulrio, insira dois componentes DBGrid, na propriedade
Name defina o nome para Data_Module_Frm.

















Fornecedores

Clientes


Este formulrio foi
salvo com o nome
Modulo_Grid.pas
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 414
O Vamos criar um mdulo de dados. File New DataModule.












O Insira no Data Module dois componentes Table e dois DataSources.












O Clique no Table1, propriedade Name para Professores_TB, DatabaseName para Madruga ( Alias ),
TableName para Professores.DB, clique em DataSource1, mude a propriedade Name para
Professore_DS, e o DataSet para Professores_TB.

O Clique no Form onde esto os dois DBGrids, File, Use unit, abra a unit dos mdulos que foi nomeada
Modulo_Dados, clique no DBGrid dos professores, na propriedade DataSource defina Professores_DS.

O Clique no DM_Modulo e no evento OnCreate digite: Professores_TB.Open;

O Clique no Table2, propriedade Name para Alunos_TB, DatabaseName para Madruga ( Alias ),
TableName para Alunos.DB, clique em DataSource1, mude a propriedade Name para Alunos_DS,
DataSet para Alunos_TB

G Clique no Form onde esto os dois DBGrids, File, clique em Use unit, abra o formulrio dos mdulos
que foi nomeado de Modulo_Dados, clique no DBGrid dos professores, na propriedade DataSource
defina Alunos_DS.

OO Clique no DM_Modulo e no evento OnCreate digite: Alunos_TB.Open;

OO Contedo do DataModule, veja abaixo o evento OnCreate:










Mude a propriedade
Name para DM_Dados

Grave a unit como o
nome de
Modulo_Dados.pas
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 415
OO Abaixo esta o mdulo de dados ( DM_Dados ):












OO DBGrid pronto com as duas tabelas no mesmo formulrio.





















Como ativar e desativar vrios botes do navegador ?

No exemplo a seguir aprenderemos a ativar e desativar botes das operaes bsicas para gerenciar os registros de
uma tabela.

O Abra um novo formulrio, insira 10 botes do tipo SpeedButton ( aba Additional ).






Para alinhar o cone no topo
altere a propriedade Layout
e defina blGlyphTop.
Cadastro de
Professores.
Cadastro de
Alunos.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 416
O Crie a tabela de Clientes.



O Digite o cdigo fonte abaixo em seus respectivos eventos.




Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 417

















Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 418





Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 419




Procura registro pelo cdigo.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 420


Como animar titulo janela corrente ?



No permitir gravar contedo
vazio no campo data estiver.


O texto da barra de ttulo
estar em constante rolagem
para o lado esquerdo da tela.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 421
ActionList Como fazer vrias aes ao mesmo tempo ?

Com o componente ActionList vrias aes podero ser feitas ao mesmo tempo. A seguir veremos um
exemplo simples de navegar nos registro da tabela com operaes bsicas como : incluir, excluir, consultar e
navegar nos registros.

O Insira um form, e 8 botes Bitbtn, insira um Table, um DataSource e um ActionList ( aba Standard ).





















O Clique duplo no componente
ActionList1, clique na opo New
Standard Action, ser a tela abaixo...


O Aps clicado na opo
New Standard Action
ser mostrada a tela ao
lado ( direito ), clique em
DataSet e Ok.
O Clique em Dataset
selecione as aes, first
( primeiro), prior ( anterior )
etc... como esta no grfico,
aps clique Ok

Estas aes j esto
disponveis no Delphi.

Aes que foram
selecionadas.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 422









Aps ter associado todos os botes execute e teste. Quando o ponteiro estiver no incio da tabela o boto
Anterior e Primeiro estaro desabilitados ( desativados ), este controle feito automaticamente.



Outro exemplo: Insira dois botes Bitbtn no formulrio, um boto esconde barra e outro mostra barra.




O Clique no primeiro boto, se j escreveu um
texto para o Caption, tipo Anterior, ser
convertido para ingls, clique na propriedade
Caption e altere novamente para portugus.
O Clique na propriedade Action,
clique no dropdown e escolha a opo
DataSetPrior ( o boto ser para
posicionar no registro Anterior ).
Cada boto ter uma ao a
ele associado.
O Clique na pastinha amarela para
criar novas aes, mude o nome do
Caption e da propriedade Name.
Clique no componente ActionList1,
na propriedade State defina
asSuspendedEnabled.
O Clique no boto Esconde barra, clique na
propriedade Action, est no lado direito, selecione no
dropdown a opo Action1_Esconde_Barra, clique
na aba Events, clique duplo no evento OnClick e
digite o cdigo que est na pgina seguinte, clique no
boto Mostra barra e repita os passos aqui
descritos.





Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 423


Como fazer uma tabela passo a passo ?
















Digite o cdigo abaixo





Crie os campos Cdigo, Nome,
Endereo, Cidade, Salrio e Data
usando o Database Desktop. Insira um
Form, insira 6 componentes Edit (aba
Standard), no use o Form Wizard.
Este exemplo mostra como usar
Fieldbyname e Value para gravar
registros.
Insira um componente Table e um
Datasource (aba Data Access). Defina
um Alias. Clique no Table, clique no
boto direito, Fields Editor, boto
direito Add Fields e Ok.
Ao clicar no boto L - Value
ser mostrado o registro na
tela ( memria ), aps clique
nas setinhas para navegar nos
registros.
AsString = converte o
contedo para texto e
mostra no Edit1.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 424














Pega os valores da tabela e
mostra na tela ( no Edit1 ).
Limpa todos os
campos.
O contedo que est no
Edit1 ser movido para o
campo Cdigo na tabela
(Table1).
Antes de mover o contedo do
Edit1, este precisa ser
convertido para inteiro, isto
que o Cdigo um valor
inteiro.
Converte o contedo do
campo Salrio para texto,
para exibi-lo no campo
Edit5.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 425
Recibo Como criar ?
Criaremos um programa para recibos. Crie a tabela abaixo aps defina o Alias de nome Recibo_Dados.
O Crie a tabela abaixo:


O Crie o formulrio abaixo com respectivos campos.






O Digite o cdigo fonte abaixo:


Insira um componente
SpinEdit ( aba Samples )
Defina o Alias a propriedade
TableName ... j vimos anteriormente
em vrias situaes como fazer isto.
Ao clicar ser aberta uma
tela de selees para
imprimir o Relatrio.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 426



O OO O File New Other e clique em Report, clique duplo no formulrio para configur-lo, veja o grfico
abaixo:



O Insira 4 QRDBText. Clique em Nr_Recibo, clique na propriedade Name, defina o nome para
QRDBText_Nr_Recibo, est sendo exibido o nome Nr_Recibo porque o campo foi associado a tabela e este
nome foi definido na tabela ( nomeao dos campos ). Para associar os campos, clique em QRDBText1, clique
em DataSet, defina Frm_Recibo_Dados.Recibo_TB, clique em DataField e defina o nome do campo
Nr_Recibo.

Os passos acima ( item 5 ) devero ser seguidos para todos os campos deste relatrio.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 427
Formulrio do relatrio:



O Crie uma unidade chamada Extensos. File New Unit. ( veja rotina adiante )

O Digite o cdigo fonte abaixo do formulrio Recibos.





Para os campos valor e
histrico insira dois
componentes QRRichText1,
defina a largura e altura destes
de acordo com este exemplo.
Definindo linhas: Clique na banda Page
Header, clique em Frame, defina o
valor das propriedade DrawBottom e
DrawTop para True, defina a largura
do fio na propriedade Width para 2.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 428
Resultado do programa:



Segue abaixo a rotina de extenso usada no exemplo acima ( File New Unit e salve o arquivo com o nome
Extenso )



Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 429



Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 430




Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 431
Como criar Contas a Pagar bsico ?

Criaremos um cadastro para Contas a Pagar e algumas telas de seleo de impresso para os relatrios com
quebra / agrupamento de data.

O Crie a tabela abaixo com os ndices secundrios.



Obs, o ndice secundrio INr_Cheque_Data_Vencto composto por dois campos Nr_Cheque e a
Data_Vencto



O Tela Contas a Pagar ( programa bsico ).



O Digite o cdigo fonte abaixo:



Crie os ndices
secundrios.
Indce secundrio formado por
dois campos:
Clique nos campos Nr_Cheque e
IData_Vencto, defina o nome do
ndice secundrio de
INr_Cheque_Data_Vencto.
No boto Imprimir, imprimir
todos os registros da tabela. Este
relatrio se encontra no final deste
projeto.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 432


O Crie a tela de critrios de acordo com exemplo abaixo, defina o nome ( Name ) de Opcoes1_Frm .






Listar registros somente com
intervalo de cdigo, ou somente
pelo perodo.
Se for clicado na
opo Por Cdigo.
Se for clicado na opo
Por Data de Vencto.

Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 433









Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 434




O Crie o formulrio abaixo - Rel_Contas_Pagar2. ( File New Other Report ).



No formulrio abaixo aumentei a largura das bandas para melhor identificar seus nomes

Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 435
O Aps clique duplo no formulrio do relatrio ser aberta a tela abaixo.



O Listar os nmeros dos cheques no intervalo de 1 at 200




Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 436
O Listar o perodo de 10/01/2002 at 10/01/2002 ( ou seja, de um nico dia )





O OO O Segundo formulrio do relatrio: Agora faremos outro formulrio que conter mais combinaes de
filtragem de dados. Com o formulrio abaixo poderemos listar pelo intervalo de cdigo e por perodo.






Foi selecionada a opo
Por Data de Vencto, os
campos Cdigo Inicial e
Cdigo Final foram
ocultos.
Opo
selecionada,
Por Data e
Vencto
Opo
selecionada,
Por Cdigo
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 437



Veja abaixo a distribuio dos campos e os nomes dos objetos:














Opo selecionada
Por Cdigo e
Data de Vencto
Insira as bandas de acordo
com o grfico abaixo:
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 438
Listar intervalo de cdigo de 10 at 50






Listar o perodo: 10/01/2002 at 10/01/2002 ( ou seja, de um nico dia )






Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 439
Listar intervalo de cdigo de 10 at 30 e no perodo de 10/01/2002 at 10/01/2002







O cdigo abaixo refere-se ao formulrio acima:












Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 440


O cdigo abaixo refere-se a tela de opes acima:





Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 441






Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 442








Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 443
Relatrio Imprimindo contedo de um RadioGroup.

Este exemplo mostra como imprimir no relatrio opes que foram definidas em um Radiogroup.

O Crie a tabela abaixo:



O Crie o formulrio de entrada de dados.















O No boto Relatrio digite o cdigo abaixo:






Insira um DBRadioGroup, no Caption digite
Opes, clique na propriedade DataSource e defina
DataSource1, DataField defina o campo
Estado_Civil, clique em Values e digite os
nmeros 1, 2 e 3 - um abaixo do outro, na
propriedade Items digite um abaixo do outro
Casado, Solteiro e Divorciado

Campo que ser
usado no
RadioGroup.

Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 444
O Crie o formulrio do relatrio. File New Other Report e Ok.





O Digite o cdigo abaixo no evento BeforePrint:



O Resultado do relatrio:






Insira um componente Table,
defina a propriedade
DatabaseName = Alias,
propriedade TableName =
Agenda.db, clique duplo sobre
o componente Table1, clique
no boto direito, Add Fields e
OK.
Clique na regio branca do
formulrio do relatrio ( veja
setinha verde ), clique na
propriedade DataSet e defina
Table1
Insira um componente QRLabel
para imprimir o estado civil.
Veja o Contedo do
campo do RadioGroup.
RadioGroup.
Mais um exemplo
usando Case ... of
Lembre-se, neste campo foi cadastrado apenas os nmeros 1, 2 e
3 e no a descrio Solteiro, Casada ou Divorciado)
Outra forma

Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 445
Relatrio Listando por intervalo de datas

Vamos imprimir registros somente do perodo selecionado.

O Estamos na tela de cadastro e desta chamaremos a tela de seleo do relatrio.



No boto Abre tela de Seleo do Relatrio Data digite a linha abaixo no evento OnClick:



O Crie a tela abaixo para entrar com as datas ( clique no cone Form ).








Insira dois componentes MaskEdit, clique na
propriedade EditMask, ser aberta uma tela
para formatar o campo.
Usamos MaskEdit para formatar o campo data
ou seja, basta digitar apenas o dia, ms e ano, as
barras sero postas pelo MaskEdit.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 446
O Continuando pgina anterior, clique duplo sobre o boto Relatrio, no evento OnClick digite o cdigo
abaixo:
















Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 447
O Crie o formulrio do relatrio abaixo File New Other Report - Ok















Listando todos os registro da tabela:




Listando registros por perodo : 01/01/1977 30/12/1978










O Insira um componente
QRSysData1 ( aba QReport )
e altere a propriedade Data
para qrsReportTitle.

O Defina as propriedades de cada objeto,
clique no Nome (QRDBText2 ), defina a
propriedade DataSet para Table1 e
DataField para Nome. Estes passos devero
ser feitos para os objetos Cdigo, Nome e
Data_Nasc.
O Clique no formulrio,
onde esta apontando o
balo, clique na propriedade
DataSet e defina Table1.
O Insira um componente Table1,
defina DatabaseName = Alias,
TableName = Agenda.db, clique em
Active defina o valor para True.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 448
Arquivo texto Como salvar relatrio em formato texto ?









Insira o
componente
QRTextFilter
( aba QReport )
QReport_Agenda o relatrio.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 449
Como mudar cor quando salrio for menor que R$ 100 ?
Se o salrio for menor que R$ 100,00 a cor ser vermelha e se for maior a cor ser azul.

O Crie uma tabela que contenha os campos abaixo:




O Clique no componente DataSource1, clique no evento OnDataChange e digite o cdigo abaixo:



Observe o campo Salrio:

Salrio maior que R$ 100,00




Salrio menor que R$100,00



Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 450
Preview Como criar preview personalizado para seu relatrio ?

O Crie o formulrio abaixo, cadastre 40 registros, pois com esta quantidade de registros proporcionar melhor
visualizao no preview.



O Digite a linha abaixo no incio do formulrio Agenda na seo Private:






O Crie o formulrio abaixo File New Other Report - Ok





Digite.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 451
Selecione o formulrio do relatrio QReport_Agenda, no evento OnPreview digite as linhas abaixo:

Na linha Uses incluir QRPrntr



Explicao das linhas acima:

Preview_PersonalizadoX_Frm = nome do formulrio do relatrio com preview personalizado.
QRPreview1 = nome do objeto onde sero visualizados os registros.

O A seguir vamos criar o formulrio preview. Insira um novo formulrio, clique no cone New Form e
insira os objetos abaixo de acordo com cada balo explicativo:








Insira uma StatusBar ( aba
Win32 ), clique duplo sobre esta
e crie 3 divises clicando no
boto Add New ( Ins ).
Insira um componente
QRPreview1 ( aba QReport ).
Insira dois componentes
SpinEdit ( aba Samples ).
Insira 10 botes Bitbtn, observe no
programa fonte seus nomes
( propriedade Name ).
Insira um
componente
ProgressBar.
( aba Win 32 )
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 452
Parte inicial do programa do formulrio preview personalizado.














Digite
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 453








Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 454







Veja na pgina seguinte o resultado ... cool ...



Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 455









Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 456
Devido a quantidade de registros o relatrio abaixo resultou 3 pginas:

Paginando relatrio Pgina # 1


Pgina # 2


Pgina # 3












Observe: O contedo da
banda PageHeader
impressa em todas as folhas,
j o contedo da banda Title
impressa somente na primeira
folha, compare as 3 telas.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 457
Como ler/mudar valor de um RadioGroup ?

O Temos o formulrio Agenda, este formulrio j foi feito anteriormente. No campo Radiogroup ser clicado
para informar o estado civil, se for Solteiro receber o valor 1, Casado ( valor 2 ) e Divorciado ( valor 3 ).
Voc ver no DBGrid apenas nmeros tornando a leitura um pouco difcil para o usurio. Agora mostraremos
o estado civil escrevendo Solteiro, Casado ou Divorciado, e no representado por nmeros.



O Precisamos fazer um campo calculado para mostrar a coluna Estado Civil e sua descrio por extenso e no
atravs da representao numrica.




O Clique duplo sobre o componente
Table1, clique no boto direito,
clique em New fields, ser aberta
uma tela para definir o nome do
campo calculado, tipo e tamanho.
Insira um novo formulrio, um Table,
defina a propriedade DatabaseName =
Alias, TableName = Agenda.db, clique
no DataSource1, clique na propriedade
DataSet e defina Table1, clique no
DBGrid e defina DataSource1. Insira um
RadioGroup, clique na opo Items e
digite as palavras a seguir uma abaixo da
outra: Solteiro, Casado e Divorciado,
clique na propriedade Columns e digite o
nmero 3.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 458
Criando campo temporrio:




O Clique no DBGrid, crie 3 colunas, clique na primeira coluna, pressione F11 para alternar para as
propriedades, clique na propriedade FieldName e defina o campo Nome, repita este passo para os outros dois
campos.











Campo calculado
que foi criado.







Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 459
= Outra maneira de fazer o cdigo da pgina anterior:

O Clique duplo no componente Table1, ser aberta uma pequena tela listando todos os campos, clique no
campo Estado_Civil ( o contedo ser Solteiro - receber o valor 1 ), Casado ( valor 2 ) e Divorciado ( valor
3 ), pressione F11 para alternar para aba Events, clique duplo no evento OnGetText e digite o cdigo abaixo:



Ao carregar o DBGrid ser mostrada a descrio por extenso e no em forma de nmeros


Abrindo programa via parmetros

Para abrir o segundo programa somente mediante senha.

O Crie um formulrio simples e salve o projeto com o nome Programa_par1.Exe.



Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 460
O Na barra de ttulos do Delphi, clique em Run, Parameters, ser aberta a tela abaixo, digite a senha no
campo Parameters.



O Pressione a combinao Ctrl F12, clique no nome do projeto Programa_par1 e Ok.



O Veja abaixo o cdigo da unit Programa_par1. ( unit do projeto )







Digite o contedo que esta
no quadro pontilhado.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 461
O Crie o segundo formulrio:



O No evento OnClick do boto acima digite as linhas de cdigo abaixo:



O Estando com o Windows Explorer aberto, clique duplo sobre o programa Programa_par1.exe, mostrada
a caixa de dilogo de erro.



Ao clicar no programa Programa_par2.exe, abrir o segundo programa.





O programa sera aberto
atravs de um
parmetro, neste
exemplo, senha123
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 462
Concatenar Como concatenar / juntar caracteres ?
Imprime vrios campos como se fossem um nico.

Ex: 1000-2A/10F=20V

O Veja como imprimir vrios campos concatenando-os.



O Crie um formulrio como exemplo abaixo, insira 4 componentes DBEdit ( aba Data Controls ), associe
cada DBEdit com a propriedade DataSource = Bancos_DS e DataField = Banco_Parte1.






Insira 4 Edits para fazer a pesquisa do
registro, aps preenchido os 4 edits
clique no boto Procura.
Altere as propriedades bsicas do formulrio:
Caption para CDIGOS, Name para
Concatenar_Frm. Altere as propriedades
dos componentes dos dados, Table1 para
Bancos_TB, DatabaseName = Alias,
TableName = Alunos.db, DataSource =
Bancos_DS, DataSet = Bancos_DS. Estas
so as propriedades bsicas para personalizar
o formulrio.

Estamos executando um
Findkey em vrios campos
chaves primrias.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 463
O Crie o formulrio para o relatrio, listaremos os cdigos. Crie o campo calculado Codigo_Temp para
concatenar ( juntar ) os cdigos. Para criar, clique duplo sobre Table1, clique no boto direito, clique New
field, ser aberta a tela baixo, digite os campos:









O Clique no componente Table1, clique no evento OnCalcFields e digite o cdigo abaixo:













Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 464
Relatrio Imprime somente registro que esta na memria

O Crie um formulrio com os campos abaixo.





O Crie o formulrio para imprimir o registro selecionado. File New Other Report Ok. Insira um
componente QRLabel, clique na propriedade Caption e digite Relatrio Agenda. Insira quatro componentes
QRLabel, clique no Caption do primeiro componente e digite Cdigo, nomeie todos os outros objetos de
acordo como o exemplo abaixo.





Imprimir o
registro que esta na
memria ( tela ).
Codigo o nome
do campo da tabela.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 465
O Clique em File, Use Unit, clique em Agenda2 para abrir o formulrio da Agenda.



O Clique na banda Detail e no evento BeforePrint digite o cdigo abaixo:




Imprime somente o registro que esta na memria ( na tela ).















Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 466
Como proteger seu projeto ? ( 1 ) ( mais segura )

O Criaremos uma rotina para criptografar ( codificar ) o progra a ser protegido. Crie uma Unit com o cdigo
fonte abaixo, grave-a com o nome Rotina_EWB. File New Unit.





Palavra ou termo que ser
codificada, neste exemplo a
palavra Sistema .
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 467
O Configure o Delphi para que ele possa enchergar a unit de rotina Rotina_EWB.pas. Clique em Tools
Environment options.













O OO O Clique neste campo, apague o
contedo da linha corrente e cole o
caminho/path que esta sua rotina,
aqui:

C:\Delphi Madruga\Exemplo
JURA'S BOOK\Protege
projeto\Sistema
XYZ\Rotina_EWB.pas

aps clique

Add e Ok
O OO O Clique no boto,
ser aberta a tela
abaixo:
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 468
Veja tela abaixo, unit Rotina_EWB.pas foi adicionada.



O Crie um novo formulrio ( ou projeto ) e coloque 3 labels e digite os textos abaixo.
Este ser o sistema / projeto a ser protegido contra cpias.



O OO O Pressione Ctrl F12 para abrir a lista das units, clique na unit Sis_Vendas e OK.











Protege.exe, tela abaixo,
programa que ativa a
proteo do programa.
Seu sistema. Sistema
que ser protegido
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 469

O Digite o texto que est entre o retngulo pontilhado:




O Crie um novo projeto ( Protege_Meu_Software ) - File New Application. Aps ter digitado
programa fonte abaixo, compile-o e execute-o no computador do desenvolvedor ( programador ) para
proteger o sistema, ou seja, ser pego o serial da mquina do desenvolvedor e criptograf-lo, certamente o
serial NUNCA ser igual ao de outra mquina espero . Caso algum copiar o projeto Sis_Vendas e
tentar rodar em outra mquina este no funcionar.








Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 470











Digite as funes abaixo
da diretiva {$R *.DFM}
Na regio onde a setinha
vermelha est apontando.
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 471






O Algum copiou o projeto Sis_Vendas ilegalmente e tentou rodar em outra mquina, ser mostrada a caixa
de dilogo abaixo e o programa ser abortado / interrompido.








Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 472
Como proteger seu programa ? ( 2 )

Uma dica muito simples para "camuflar" uma proteo em seu sistema.

Esta dica boa se voc mesmo for implementar a soluo no computador do cliente.

* Crie um arquivo qualquer, de preferncia com extenso .dll, .vxd, .udf ou .ins (para deixar o pirateador
confuso), dentro do diretrio do \Windows ou \Windows\System;

Desta forma o sistema s roda se encontrar este arquivo (como j disse, pode ser qualquer nome).

Digite o cdigo abaixo no evento OnCreate.



Como pedir senha na abertura do programa ? ( 3 )
uma maneira de forar digitao da senha antes de abrir a tela principal do sistema.

Digite o cdigo abaixo no evento OnCreate:









Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 473

Procurando registros com Dbgrid e SetRange ?............................................................................................ 325
Como procurar registros em um DBGrid ?....................................................................................................... 326
Como ler / buscar valores da tabela para Edit ? ............................................................................................ 327
Lendo contedo do campo................................................................................................................................ 328
Maneiras de ler campos .................................................................................................................................... 329
Como editar / alterar um registro ?................................................................................................................ 330
Como criar atalho com a combinao Ctrl + A ?.......................................................................................... 330
Destacando opo selecionada no RadioGroup................................................................................................ 331
Como desabilitar opes do RadioGroup ? ...................................................................................................... 331
Pesquisando registro com DBEdit ou Edit........................................................................................................ 332
Relacionamento ( N N ) - ( Ex: 1 )................................................................................................................ 337
Relacionamento ( 1 : 1 ) - ( Ex: 1 ) ................................................................................................................... 341
Como criar relatrio com relacionamento Professores e Alunos usando SQL ? .......................................... 343
Relacionamento ( 2 )......................................................................................................................................... 348
Alias ( 1 ) .......................................................................................................................................................... 349
Alias ( 2 ) .......................................................................................................................................................... 350
Integridade referencial ( Paradox ) .................................................................................................................. 351
Sistema bsico com alguns mdulos................................................................................................................. 355
Filter Procurando registros ............................................................................................................................ 369
Mesmo campo para procura e grava registro.................................................................................................... 371
Registro duplicado no permitido..................................................................................................................... 373
CGC Como validar ? ..................................................................................................................................... 374
CPF Como validar ? ..................................................................................................................................... 375
TryStrToFloat Como aceitar somente valor ? .............................................................................................. 375
Como reajustar todos os salrios de uma tabela ? ( 1 ) ................................................................................. 376
Como reajustar todos os salrios de uma tabela ? ( 2 ) ................................................................................. 377
Como somar todos os salrio ?...................................................................................................................... 378
Como fazer barra de ttulo piscante ? ............................................................................................................... 378
Como criar um campo temporrio com relacionamento e pesquisa ? .............................................................. 379
PageControl e SatusBar Controle de pginas e Barra de status .................................................................... 382
CEP Como formatar ?.................................................................................................................................... 387
PopMenu Como criar menu ?........................................................................................................................ 388
WAV Como reproduzir um arquivo de som do tipo .wav......................................................................... 388
Splash Screen Como criar tela de abertura ? ................................................................................................. 389
Como carregar uma imagem .bmp quando carregar o form ? .......................................................................... 389
Como adicionar um percentual em um valor ? ................................................................................................. 390
Encriptografando senha .................................................................................................................................... 392
DBGrid e SQL Um nico DbGrid com resultados diferentes ....................................................................... 393
Relatrio com.................................................................................................................................................... 401
O Relatrio Lista todos os registros............................................................................................................... 402
O Relatrio Listar todos os registros iguais ao cdigo solicitado. ............................................................... 403
O Relatrio Listar todos os registros por perodo ........................................................................................ 404
O Relatrio Listar por data e tipo................................................................................................................. 405
O Relatrio Listar perdo e opo selecionada ............................................................................................ 406
Rotinas Como criar ? ..................................................................................................................................... 409
Delphi Aplicado + ++ + by Jurandir A. Pellin Timb SC (E-mail: delphiewb@gmail.com) 474
Rotina Mensagem............................................................................................................................................. 410
Usando rotina acima ......................................................................................................................................... 410
Rotina cores Para mudar cores dos campos................................................................................................... 410
Como somar, multiplicar e totalizar em um DBGrid ?.................................................................................... 411
Data Module O que ?.................................................................................................................................. 413
Como ativar e desativar vrios botes do navegador ?..................................................................................... 415
Como animar titulo janela corrente ? ............................................................................................................ 420
ActionList Como fazer vrias aes ao mesmo tempo ?............................................................................... 421
Como fazer uma tabela passo a passo ? ........................................................................................................ 423
Recibo Como criar ?...................................................................................................................................... 425
Como criar Contas a Pagar bsico ?............................................................................................................ 431
Relatrio Imprimindo contedo de um RadioGroup. .................................................................................... 443
Relatrio Listando por intervalo de datas...................................................................................................... 445
Arquivo texto Como salvar relatrio em formato texto ?.............................................................................. 448
Como mudar cor quando salrio for menor que R$ 100 ?................................................................................ 449
Preview Como criar preview personalizado para seu relatrio ? .................................................................. 450
Como ler/mudar valor de um RadioGroup ?..................................................................................................... 457
Abrindo programa via parmetros .................................................................................................................... 459
Concatenar Como concatenar / juntar caracteres ?........................................................................................ 462
Relatrio Imprime somente registro que esta na memria............................................................................ 464
Como proteger seu projeto ? ( 1 ) ( mais segura ) ....................................................................................... 466
Como proteger seu programa ? ( 2 ) ................................................................................................................ 472
Como pedir senha na abertura do programa ? ( 3 )........................................................................................... 472

Anda mungkin juga menyukai