Você está na página 1de 160

DESENVOLVENDO APLICAES PARA

BANCOS DE DADOS DESKTOP COM


BORLAND DELPHI 6

2002, Paulo Roberto Alves Pereira

Introduo
No incio, programar em Windows era algo extremamente complicado e
acessvel apenas a programadores dispostos a investir muito tempo e fosfatos
na leitura de pilhas de livros, interminveis testes e anlise de programas
exemplos que mais confundem do que explicam. Mas porque era to difcil
fazer programas para Windows? Para comear, o Windows usa o conceito de
GUI (Graphic User Interface Interface Grfica com o Usurio), que embora
fosse muito familiar para usurios do Unix e do Mac OS, era novidade para
usurios do DOS. O uso de um sistema GUI implicava em aprender vrios
conceitos que eram estranhos ao usurio de um sistema baseado em texto
como o DOS. Para complicar um pouco mais, o Windows um sistema multitarefa, e as aplicaes so orientadas a eventos, o que implica em aprender
um novo estilo de programao. Finalmente, o programador tinha que ter
alguma familiaridade com as centenas de funes oferecidas pela API do
Windows. Por tudo isso, programao em Windows era um assunto que
costuma provocar arrepios nos programadores.
Felizmente as linguagens visuais chegaram para mudar esta situao. Foi s
com elas que o Windows consegui cumprir sua promessa de ser um sistema
amigvel e fcil de usar tambm para os programadores, que sempre tiveram
que pagar a conta da facilidade de uso para o usurio.
Entre as linguagens visuais que surgiram, nenhuma veio to completa e bem
acabada quanto o Delphi. Desde o incio ele possua um compilador capaz de
gerar cdigo diretamente executvel pelo Windows, proporcionando uma
velocidade de execuo de 5 a 20 vezes maior que as linguagens interpretadas
como o Visual Basic e Visual FoxPro que geravam executveis Pcode que
precisam de arquivos auxiliares de run-time. Alm disso, o Delphi tambm
possua uma engine para acesso a diversos bancos de dados e um gerador de
relatrios. O tempo de desenvolvimento de qualquer sistema foi reduzido a
uma frao do tempo que seria necessrio usando outras linguagens e o
resultado sempre muito melhor. por isso que o Delphi fez e faz tanto
sucesso no mundo inteiro, sempre ganhando prmios como melhor ferramenta
de desenvolvimento para Windows.
O objetivo principal de qualquer ferramenta de desenvolvimento ou linguagem
de programao a criao de aplicaes. Determinadas linguagens ou
ferramentas devido aos recursos que possuem so mais indicadas para a
criao de aplicaes comerciais, outras se destinam mais a aplicaes
cientficas ou ainda para a criao de sistemas operacionais.
O Delphi uma ferramenta RAD (Rapid Application Development
Desenvolvimento Rpido de Aplicaes) criada pela Borland. uma ferramenta
de propsito geral, permitindo o desenvolvimento de aplicaes tanto
cientficas como comerciais com a mesma facilidade e alto desempenho.
Integra-se facilmente com a API (Application Program Interface) do Windows,
permitindo a criao de programas que explorem ao mximo os seus recursos,
assim como os programas escritos em linguagem C/C++.

Possui um compilador extremamente rpido, que gera executveis nativos (em


cdigo de mquina, no interpretado), obtendo assim melhor performance e
total proteo do cdigo fonte.
O Delphi extensvel, sua IDE (Integrated Development Environment
Ambiente de Desenvolvimento Integrado) pode ser ampliada e personalizada
com a adio de componentes e ferramentas criadas utilizando-se o Object
Pascal, a linguagem de programao do Delphi. Neste ambiente constroem-se
as janelas das aplicaes de maneira visual, ou seja, arrastando e soltando
componentes que iro compor a interface com o usurio.
O Object Pascal uma poderosa linguagem Orientada a Objeto, que alm de
possuir as caractersticas tradicionais das mesmas como classes e objetos,
tambm possui interfaces (semelhantes s encontradas em COM e Java),
tratamento de exceo, programao multithreaded e algumas caractersticas
no encontradas nem mesmo em C++, como RTTI (Runtime Type Information).
Assim como o C++, o Object Pascal uma linguagem hbrida, pois alm da
orientao a objeto possui tambm uma parte da antiga linguagem estruturada
(Pascal)
Devido ao projeto inicial da arquitetura interna do Delphi e da orientao a
objeto, suas caractersticas bsicas mantm-se as mesmas desde o seu
lanamento em 1995 (ainda para o Windows 3.1, pois o Windows 95 ainda no
havia sido lanado), o que demonstra um profundo respeito com o
desenvolvedor. Isto permite que uma aplicao seja facilmente portada de uma
verso anterior para uma nova, simplesmente recompilando-se o cdigo fonte.
Obs: Embora as caractersticas, teorias e exemplos abordadas aqui sejam
sobre o Delphi 6 (ltima verso disponvel), tudo pode ser aplicado em verses
anteriores do Delphi, excetuando-se o caso da utilizao de componentes e
ferramentas introduzidos apenas nesta verso.
O Delphi distribudo em trs verses diferentes: Personal, Professional e
Enterprise.

A verso Personal consiste no Ambiente de Desenvolvimento, com


compilador e debugador e os componentes bsicos. indicado para o
aprendizado do Object Pascal e da utilizao da IDE e para o
desenvolvimento de pequenas aplicaes. Esta verso no contm os
componentes de acesso a bancos de dados. Atualmente foi liberada
para download gratuito no site do fabricante (http://www.borland.com);

A verso Professional tem todos os componentes da verso Personal


mais componentes de acesso a banco de dados (BDE) Desktop e
atravs de ODBC, para impresso de relatrios (Quick Report),
elaborao de grficos (TeeChart), uma verso especial do InstallShield
para criar programas de instalao para distribuir seus aplicativos,
componentes para criao de aplicativos para internet, componentes

CLX para criao de aplicativos multiplataforma (podem ser compilados


no Kylix, o Delphi para Linux) e o cdigo fonte dos componentes;

A verso Enterprise contm os mesmos componentes da verso


Professional mais ferramentas e drivers para acesso a bancos de dados
cliente-servidor (Oracle, DB/2, Sybase, MS-SQL Server ou Interbase); o
BizSnap, componentes para criao de aplicativos B2B (Business-ToBusiness) ; DataSnap para criao de aplicativos multicamadas; o Team
Source, ferramenta para gerenciamento do desenvolvimento em equipe;
componentes ADO para acesso direto (OLE/DB ) ao MS-SQL Server.

CAPTULO 1
Princpios da Programao para Windows
Antes de comear a trabalhar com o Delphi, importante ter algumas noes
do que est envolvido na programao Windows e no Delphi em particular.
Algumas coisas tornam a tarefa de programao no Windows (e ambientes
baseados em eventos e interface grfica) bem diferente de outros ambientes e
das tcnicas de programao estruturada normalmente ensinadas nos cursos
de lgica de programao:
Independncia do Hardware: No Windows, o acesso aos dispositivos de
hardware feito com intermdio de drivers fornecidos pelo fabricante do
hardware, o que evita que o programador tenha que se preocupar com
detalhes especficos do hardware. Como acontecia com a programao em
DOS.
Configurao Padro: O Windows armazena centralmente as configuraes
de formato de nmeros, moeda, datas e horas, alm da configurao de cores,
livrando o programador de se preocupar com esses detalhes especficos.
Multitarefa: Antigamente, no DOS (no estamos falando do Prompt do MSDOS), um programa geralmente tomava o controle da mquina s para si, e
outros programas no rodavam at que o mesmo fosse fechado. J no
Windows vrios programas so executados de maneira simultnea e no h
como evitar isso.
Controle da Tela: No DOS geralmente um programa ocupa todo o espao da
tela, e o usurio via e interagia apenas com aquele programa. J no Windows,
todas informaes mostradas e todas entradas recebidas do usurio so feitas
por meio de uma janela, uma rea separada da tela que pode ser sobreposta
por outras janelas do mesmo ou de outros programas.
Padres de Interface: No Windows, todos os elementos de interface
aparecem para o usurio e interagem da mesma forma. Alm disso, existem
padres definidos pela Microsoft que so recomendados para conseguir a
consistncia entre aplicativos. Falaremos de alguns deles no curso, mas a
melhor forma de aprend-los analisar os aplicativos Windows mais usados do
mercado.
Eventos e a Cooperao com o Sistema: Num programa criado para DOS
(como os programas escritos em Clipper) ele responsvel pelo fluxo de
processamento, temos que definir claramente no s que instrues, mas
tambm em que ordem devem ser executadas, ou seja a execuo segue uma
ordem preestabelecida pelo programador, e o programa s chama o sistema
operacional quando precisa de alguma coisa dele. Em Windows no bem

assim. Nosso programa no controla o fluxo de processamento, ele responde e


trata eventos que ocorrem no sistema. Existem muitos eventos que podem
ocorrer, sendo que os principais so aqueles gerados pelo usurio atravs do
mouse e do teclado. A coisa acontece mais ou menos assim: O usurio clica o
mouse e o Windows verifica que aplicao estava debaixo do mouse no
momento em que foi clicado. Em seguida ele manda uma mensagem para a
aplicao informando que ocorreu um clique e as coordenadas do cursor do
mouse na tela no momento do clique. A aplicao ento responde mensagem
executando uma funo de acordo com a posio do mouse na tela. claro
que o Delphi toma conta do servio mais pesado e facilita muito as coisas para
o programador. Detalhes como as coordenadas da tela em que ocorreu o
clique, embora estejam disponveis, dificilmente so necessrios nos
programas. Isso, como veremos, afeta radicalmente o estilo de programao e
a forma de pensar no programa. A seqncia de execuo do programa
depende da seqncia de eventos.

Conhecendo o CD de Instalao do Delphi 6

Dentre as opes presentes no CD de Instalao, para este curso ser


necessrio alm da instalao do prprio Delphi (primeira opo) a instalao
do InstallShield (ltima opo), que ser responsvel pela criao dos discos
de instalao dos seus aplicativos.
Segue abaixo uma pequena explicao sobre as demais opes:

TeamSource: utilizado em grandes projetos, para permitir o


desenvolvimento em equipe, controlando verses e o acesso ao cdigo
fonte;

InterBase 6.0 Server: Servidor de Banco de Dados SGDB da Borland,


pode ser instalado tanto em Windows NT/2000/XP quanto no Windows
95/98/Me. Existem tambm verses para Novell, Solaris e Linux;

InterBase 6.0 Desktop Edition: Cliente do InterBase Server, incluindo


drivers e ferramentas de manipulao do banco;

Remote Debugger Server: Permite depurar um programa que est


sendo executado em outra mquina.

Conhecendo o Delphi 6
O Delphi oferece dois nveis de programao distintos. Existe o nvel que o
manual chama de designer, que utiliza os recursos de programao visual e
aproveita os componentes prontos, e o nvel do component writer, onde
escrevemos os componentes para o designer utilizar nas aplicaes. Podemos
dizer que o component writer programa em um nvel mais baixo e o designer
em um nvel mais alto. Para este curso, consideraremos apenas a
programao no nvel do designer.
Inicie o Delphi clicando no cone Delphi 6 que se encontra no menu Iniciar /
Programas / Borland Delphi 6.

Quando ativamos o Delphi, a tela inicial parecida com a acima. Os itens que
voc est vendo formam o que chamamos de IDE, com um projeto novo
aberto. Na janela superior, temos a barra do menu principal do Delphi,
esquerda a SpeedBar, com as opes mais comuns e direita a paleta de
componentes. Estes componentes formam a base da programao visual e
onde o designer vai buscar recursos para criar sua aplicao.
A seguir, vamos analisar as ferramentas que compe o ambiente de
desenvolvimento e os arquivos que constituem um projeto.

Janela Principal

A janela principal o prprio Delphi, se a fecharmos estaremos fechando todo


o Delphi. Esta janela composta basicamente pelo menu e mais duas reas
distintas, o SpeedBar e a Component Palette - Paleta de Componentes.

SpeedBar

SpeedBar (Barra de Velocidade) foi o nome dado pela Borland barra de


ferramentas com atalhos para os procedimentos comumente executados
durante a fase de desenvolvimento de um projeto. So eles:

New. Abre uma caixa de dilogo que permite selecionar o tipo de objeto
a ser criado (novo aplicativo, formulrio, DLL, relatrios, entre outros).
Equivalente ao menu File | New | Other.

Open. Abre uma Unit, Form, Projeto ou Package. Equivalene ao menu


File | Open.

Save. Salva a Unit/Form atual. Equivalente ao menu File | Save.

Save All. Salva todas as Units/Forms abertos que sofreram alterao.


Equivalente ao menu File | Save All ou as teclas Shift+Ctrl+S.

Open Project. Abre um arquivo de projeto (.dpr Delphi Project).


Equivalente ao menu File | Open Project ou as teclas Ctrl+F11.

Add file to Project. Acrescenta um arquivo j existente ao projeto atual.


Equivalente ao menu Project | Add to Project ou as teclas Shift+F11.

Remove file to Project. Remove um arquivo do projeto. O arquivo no


ser removido do disco, apenas deixar de fazer parte projeto.
Equivalente ao menu Project | Remove from Project.

Help Contents. Aciona o Help do Delphi. Equivalente ao menu Help |


Delphi Help.

View Unit. Permite escolher uma Unit do projeto para ser exibida.
Equivalente ao menu View | Units ou as teclas Ctrl+F12.

View Form. Permite escolher um Form do projeto para ser exibido.


Equivalente ao menu View | Forms ou as teclas Shift+F12.

Toggle Form/Unit. Permite alternar entre um formulrio e seu


respectivo cdigo fonte. Equivalene ao menu View | Toggle Form/Unit ou
a tecla de funo F11.

New Form. Adiciona um novo formulrio ao projeto. Equivalente ao


menu File | New Form.

Run. Executa a aplicao, compilando-a se necessrio. Equivalente ao


menu Run | Run ou a tecla de funo F9.

Pause. Suspende a execuo do programa. Equivalente ao menu Run |


Pause Program.

Trace Into. Executa o programa passo a passo, linha a linha, dentro da


rotina que for invocado e dentro de todas as rotinas que forem
acessadas posteriormente. Equivalente ao menu Run | Trace Into ou a
tecla de funo F7.

Step Over. Semelhante ao Trace Into, porm a execuo passo a passo


ocorrer somente dentro da rotina em que for invocado. Equivalente ao
menu Run | Step Over ou a tecla de funo F8.

Component Palette (Paleta de Componentes)


Cada cone na paleta refere-se a um componente que, quando colocado em
um Form, executa determinada tarefa: por exemplo, um TLabel mostra um
texto esttico, e um TEdit uma caixa de edio que permite mostrar e alterar
dados, o TComboBox uma caixa que permite selecionar um dentre os itens
de uma lista, etc.
A paleta de componentes tem diversas guias, nas quais os componentes so
agrupados por funcionalidade. Outras guias podem ser criadas com a
instalao de componentes de terceiros.
Segue abaixo a relao completa de todas as guias que compe o Delphi 6
Enterprise:

Standard: componentes padro da interface do Windows, usados para barras


de menu, exibio de texto, edio de texto, seleo de opes, iniciar aes
de programa, exibir listas de itens etc. Geralmente so os mais usados.

Additional: componentes especializados que complementam os da pgina


Standard. Contm botes com capacidades adicionais, componentes para
exibio e edio de tabelas, exibio de imagens, grficos etc.

Win32: componentes comuns de interface que so fornecidos pelo Windows


95/NT para os programas. Contm componentes para dividir um formulrio em
pginas, edio de texto formatado, barras de progresso, exibio de
animaes, exibio de dados em rvore ou em forma de cones, barras de
status e de ferramentas etc.

System: componentes que utilizam funes avanadas do sistema


operacional, como temporizao (timers), multimdia e conexes OLE e DDE.

Data Access: componentes de acesso a bancos de dados e conexo com


controles de exibio de dados.

Data Controls: componentes semelhantes aos encontrados nas guias


Standard e Additional, porm ligados a banco de dados.

dbExpress: componentes de conexo com bancos de dados SQL introduzida


no Delphi 6 e no Kylix (Delphi para Linux). Entre os principais recursos desta
nova arquitetura esto dispensar o uso do BDE (Borland Database Engine)

10

para acesso a dados e fazer um acesso muito mais rpido e leve. A


configurao e instalao tambm so mais simples que a do BDE. Atualmente
existem drivers para Oracle, DB/2, Interbase e MySQL entre outros. No existe
suporte para bancos de dados Desktop, assim, no permite acesso a dBase,
Paradox ou Access para estes voc dever continuar a utilizar o BDE.

DataSnap: componentes que permitem a criao de middleware de alto


desempenho capazes de trabalhar com Web services, possibilitando fcil
conexo de qualquer servio ou aplicao de cliente com os principais bancos
de dados, como Oracle, MS-SQL Server, Informix, IBM, DB2, Sybase e
InterBase, atravs de Servios Web padro da indstria e XML, DCOM ou
CORBA. (No Delphi 5 esta guia era chamada de Midas).

BDE: componentes de acesso a dados utilizando a BDE (at o Delphi 5 faziam


parte da guia Data Access). A BDE a engine que acompanha o Delphi desde
sua primeira verso. Muito completa, permite acessar desde bases de dados
desktop, como Paradox, dBase ou Access, at bases de dados SGDB, como
Interbase, DB/2, Oracle, Informix, SyBase ou MS-SQL Server, todos em modo
nativo. Permite ainda o acesso a outros bancos de dados atravs de ODBC.

ADO: componentes de acesso a dados da interface dbGo (introduzida no


Delphi 5 como o nome de ADO Express) atravs da tecnologia ADO (ActiveX
Data Objects), da Microsoft. Tanto a ADO como o OLE DB (drivers de acesso)
esto includos no MDAC (Microsoft Data Access Components) e permitem
acesso a uma srie de bancos de dados e ODBC. Sua principal vantagem
estar incorporada as verses mais recentes do Windows (2000/XP e ME) no
sendo necessrio nenhuma instalao de engine de acesso. Tambm
escalvel, permitindo acesso desde bases de dados desktop at aplicaes
multicamadas. A desvantagem que no portvel para outras plataformas,
caso queira portar seu sistema para Linux, ter que trocar todos os
componentes de acesso a dados.

Interbase: componentes para acesso nativo ao Interbase, atravs de sua API,


constituindo o mtodo de acesso mais rpido e eficiente para este banco de
dados. Por no ser uma interface genrica permite utilizar todos os recursos

11

que o Interbase disponibiliza. A desvantagem, no entanto que ao utiliza-los


perde-se a possibilidade de alterar o banco de dados sem mudar o programa,
visto que os mesmos se destinam apenas ao Interbase.

WebServices: componentes que formam a BizSnap, uma plataforma RAD para


desenvolvimento de Web services, que simplifica a integrao B2B criando
conexes e Web services baseados em XML/SOAP

InternetExpress: componentes para manipulao de XML e produo de


pginas para internet.

Internet: componentes para manipulao de Sockets, pginas e web browser.

WebSnap: componentes para o desenvolvimento de aplicaes Web que


suporta os principais Servidores de Aplicaes Web, inclusive Apache,
Netscape e Microsoft Internet Information Services (IIS);.

FastNet: componentes para manipulao de protocolos e servios da internet


como http, nntp, ftp, pop3 e smtp entre outros. (So mantidos por
compatibilidade com o Delphi 5, nesta verso foram inseridos os componentes
Indy com maior funcionalidade).

Decision Cube: componentes para tomada de deciso atravs da anlise


multidimensional de dados, com capacidades de tabulao cruzada, criao de
tabelas e grficos. Estes componentes permitem a obteno de resultados
como os obtidos por ferramentas OLAP (On-Line Analytical Processing
Processamento Analtico On-Line) utilizados para anlise de Data Warehouses.

12

Qreport: QuickReport um gerador de relatrios que acompanha o Delphi e se


integra totalmente ao mesmo, sem a necessidade de run-time ou ferramentas
externas como o Cristal Report, etc. Estes componentes permitem a criao de
diversos tipos de relatrios de forma visual e tambm a criao de preview
personalizado.

Dialogs: O Windows tem caixas de dilogo comuns, como veremos, que


facilitam mostrar uma interface padro dentro do seu programa para as tarefas
comuns, como abrir e salvar arquivos, impresso, configurao de cores e
fontes etc. Esta guia tem componentes que permitem utilizar essas caixas de
dilogo comuns.

Win 3.1: esta guia contm controles considerados obsoletos, que esto
disponveis apenas para compatibilidade com programas antigos. No crie
programas novos que utilizem esses controles.

Samples: contm exemplos de componentes para que voc possa estud-los


e aprender a criar seus prprios componentes. O cdigo fonte desses
exemplos est no subdiretrio SOURCE\SAMPLES do diretrio de instalao
do Delphi.

ActiveX: um componente ActiveX um tipo de componente que pode ser


criado em outra linguagem (como C++) e utilizado no Delphi. Esta pgina
contm alguns exemplos de componentes ActiveX prontos para utilizar, que
tm funes de grficos, planilha, etc. O Delphi tambm pode criar
componentes ActiveX, que podem ser utilizado em ambientes como Visual
Basic e Visual FoxPro.

13

COM+: catlogo de objetos COM (Component Object Model), tecnologia


desenvolvida pela Microsoft que possibilita a comunicao entre clientes e
aplicaes servidores. Uma interface COM a maneira como um objeto expe
sua funcionalidade ao meio externo.

Indy Clients: componentes para criao de aplicativos clientes para protocolos


HTTP, TCP, FTP, DNS Resolver, POP3, SMTP, TELNET, entre outros.

Indy Servers: componentes para criao de aplicativos servidores de HTTP,


TCP, FTP, TELNET, GOPHER, IRC, entre outros.

Indy Misc: componentes complementares aos das guias Indy Clients e Indy
Servers, para criao de aplicativos clientes e servidores com acesso a
internet, como clientes de ftp, irc e browsers.

Servers: componentes para automatizao do Microsoft Office, permitindo o


controle, impresso e criao de documentos destes aplicativos dentro do seu
programa.

Formulrio para criao do Aplicativo

14

Cada aplicativo criado em Delphi chamado de projeto e pode ser formado por
um ou mais formulrios (Janelas), ou ainda em casos especiais no possurem
janela alguma (Console Application).
sobre estes formulrios que sero colocados os componentes para a criao
da interface do aplicativo.
Todo formulrio possui um arquivo de programa-fonte correspondente,
chamado Unit, que pode ser visualizado no editor de cdigo (Code Editor). A
janela do editor de cdigo pode ser acessada clicando-se no boto Toggle
Form/Unit da SpeedBar caso o Formulrio esteja selecionado; voc tambm
pode clicar na borda que aparece logo abaixo do formulrio, ou ainda
pressionando-se a tecla F12 que permite alternar entre o editor de cdigo e o
formulrio.

15

A Unit est intimamente ligada ao formulrio, chamado Form: quando se


adiciona um componente ao Form, o Delphi inclui na Unit deste Form o cdigo
referente incluso do mesmo, ou seja, uma mudana no lado visual resulta
em uma alterao automtica no cdigo. A Borland, empresa que fez o Delphi,
denominou isso de Two-Way-Tool (ferramenta de duas vias).
esquerda do editor de cdigo esta o Code Explorer, uma ferramenta que
permite visualizar a acessar no cdigo fonte as units, classes, variveis,
constantes e objetos (componentes) que fazem parte do Form.
Na mesma janela do editor de cdigo pode ser acessada a guia Diagram que
permite documentar o relacionamento entre os componentes, alm de
modificar algumas caractersticas destas relaoes. Inicialmente ela est vazia,
para incluir os componentes, voc deve arrast-los do Object TreeView e soltalos sobre o diagrama.

Object TreeView

16

O Delphi 6 introduziu uma nova janela, o Object TreeView, que mostra o


relacionamento entre os componentes que so colocados no Form. Como
veremos adiante, existem componentes que funcionam como recipientes, ou
seja, podem conter outros componentes dentro de si. O Object TreeView
permite a visualizao destes relacionamentos e o acesso rpido a estes
objetos.

Object Inspector (Propriedades e Eventos)

Objeto
atualmente
selecionado.

O Object Inspector a ferramenta responsvel por permitir a modificao das


propriedades dos componentes/objetos de forma visual, durante o projeto
(Design Time). Por enquanto, pense em propriedades como sendo as
caractersticas dos componentes, tanto visuais quanto funcionais. O combobox
na parte superior desta janela d acesso a todos os objetos do Form atual e
sempre exibe o nome do objeto/componente selecionado. Uma vez
selecionado voc pode inspecionar suas propriedades e altera-las se desejar.
A alterao das propriedades pode modificar a aparncia de objetos visuais e
tambm seu funcionamento padro.

17

A alterao o valor de uma propriedade depende de seu tipo, para textos e


nmeros basta apenas digita-los no quadro correspondente (em frente ao
nome da propriedade). Caso o mesmo seja formado por uma lista, ser
fornecido um combobox com os valores possveis neste mesmo local.
Se existir um sinal de adio esquerda do nome da propriedade, isto indica
que a mesma possui subpropriedades, para acessa-las clique no sinal de
adio que as mesmas sero exibidas. Algumas propriedades possuem um
editor de propriedade, nestes casos fornecido um boto com reticncias.
Clicando-se neste boto a tela de edio da propriedade deve ser exibida.
A ordem e as propriedades que devem ser exibidas no Object Inspector podem
ser configuradas clicando-se com o boto direito do mouse sobre o mesmo
para acionar seu menu popup. A opo View permite selecionar as categorias
a serem exibidas, desativando uma categoria, todas as propriedades que
pertencem a elas no sero mostradas. A opo Arrange do menu permite
ordenar por categoria ou por nome.
Alm da modificao das propriedades, os componentes sofrem a ao de
eventos. Um evento ocorre quando o programa est sendo executado e o
usurio pressiona o boto do mouse ou uma tecla, por exemplo. Voc pode
querer que seu programa execute uma determinada tarefa se uma dessas
aes ocorrem.

Cada um dos eventos exibidos no Object Inspector para um determinado objeto


acionado quando executada uma ao especfica. Por exemplo, fechar a
janela ativaria o evento OnClose da mesma. Se houver algum cdigo
associado a esse evento, ele ser executado naquele momento. Assim, voc
pode observar que o programa no Windows essencialmente passivo, isto ,
ele espera at que algo acontea e ele seja chamado. Se um evento

18

codificado, mas o mesmo no ocorre durante a execuo do aplicativo seu


cdigo no executado.

Conhecendo a Estrutura de uma Aplicao


Uma aplicao feita em Delphi composta de um arquivo de projeto, que
gerencia quais Forms e Units compem a aplicao. O nome dado ao arquivo
do projeto, normalmente ser o nome dado ao executvel da aplicao quando
a mesma for compilada.
Em alguns casos podemos ter uma Unit sem Form, um exemplo seria uma Unit
com funes para serem utilizadas por toda a aplicao (em vrios Forms),
mas todo Form obrigatoriamente deve possuir sua Unit correspondente.
Vejamos um esquema grfico de como estruturado um projeto em Delphi:

Project1
(arquivo de projeto)
extenso .DPR
(Delphi PRoject)

Form1

Form2

Unit3

extenso .DFM
(Delphi ForM

extenso .DFM

extenso .PAS

Unit1

Unit2

extenso .PAS
(PAScal)

extenso .PAS

Estrutura da Unit de um Form


As Units do Delphi possuem uma estrutura que deve ser obedecida.
Quando um Form criado tambm criada uma Unit associada ao mesmo.
A estrutura bsica de uma Unit pode ser visualizada observando-se o cdigo
fonte da mesma no editor de cdigo. Ser semelhante ao exibido a seguir:

19

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
end.

Vamos analisar o cdigo acima:

Na primeira linha, o nome em frente palavra unit, no caso Unit1, indica


o nome dado ao arquivo com a programao do formulrio. Se o
formulrio fosse salvo com este nome ele geraria um arquivo externo
com o nome de Unit1.pas e outro com o nome de Unit1.dfm. (Quando for
salvar seus formulrios voc deve dar nomes mais significativos).

Na linha seguinte, a palavra interface delimita a seo de interface na


qual sero colocadas as definies de funes, procedimentos, tipos e
variveis que podero ser vistos por outras units da aplicao.

A clusula Uses dentro da seo interface indica quais units devero ser
ligadas para poder complementar a nossa . Ao criar um Form as Units
definidas no cdigo acima so inseridas automaticamente, pois
fornecem o suporte para criao do mesmo. Ao inserir componentes
num Form, outras Units podem ser adicionadas a esta lista.

A seguir temos a definio dos tipos do programa, identificada pela


palavra type. Neste ponto temos a definio de uma classe TForm1 que
derivada da classe base TForm. Ao se acrescentar componentes no
Form tambm ser gerado no cdigo definio correspondente aos
mesmos. (O conceito de classes e objetos ser explicado no Captulo 2)

20

O prximo item a definio de variveis e constantes globais, atravs


da palavra reservada var. Neste ponto criada uma varivel com
visibilidade global (pode ser vista em outras units nas quais a mesma
seja includa na clusula uses)

A palavra chave implementation delimita a segunda seo da unit,


onde sero colocadas as funes e variveis que sero acessadas
apenas por ela mesma (no so visveis em outras units).

O smbolo {$R *.dfm} faz a associao da unit com seu respectivo form
e no deve ser modificado. Uma unit de funes no possui esta
diretiva.

Ao Final da Unit, temos uma linha com end. Ele o marcador de final de
arquivo. Qualquer coisa colocada aps esta linha ser ignorada.

Opcionalmente, uma unit pode ter ainda duas sees: initialization e


finalization, com comandos que so executados quando a aplicao
iniciada ou finalizada.

Criando seu Primeiro Programa em Delphi


comum que todo programador ao iniciar numa linguagem de programao
crie um programa chamado Al Mundo! (Hello World!). No quebraremos esta
tradio aqui.
Com um projeto novo aberto, v ao Object Inspector e procure a propriedade
Caption do Form, que representa o Ttulo da Janela. No lugar do texto atual
(Form1) digite o texto Meu Primeiro Programa (sem as aspas). A seguir,
localize a propriedade Name e altere seu contedo de Form1 para
FormPrincipal. (Obs: At agora alteramos o Ttulo da Janela e seu nome
interno).
Agora iremos escrever o texto Al Mundo!, para isso iremos precisar de um
componente para este fim. V at a paleta de componentes, na guia Standard
e clique no componente Label, quarto item da guia, representado por uma letra
A. Em seguida clique no Form onde deseja que o texto aparea.
Pressione F11 para selecionar a janela do Object Inspector e procure a
propriedade Caption. No Label ela responsvel pela exibio de um Texto.
Digite Al Mundo! (novamente sem as aspas). Localize a propriedade Name e
altere-a para LabelMensagem. Procure a propriedade Font e clique no editor de
propriedade (o boto com reticncias), na caixa de dilogo selecione a fonte
Arial estilo Negrito Itlico, tamanho 16 cor Azul-marinho.

21

Se voc acompanhou tudo at aqui, seu Form deve estar semelhante a figura a
seguir:

Agora vamos aprender a salvar nosso projeto. Para isso v ao menu File e
escolha a opo Save All, ou ainda clique no boto Save All do SpeedBar.
Voc tambm pode utilizar o atalho de teclado Shift + Ctrl +S.
Ser apresentada uma caixa de dilogo com o ttulo Save Unit1 As, o Unit
do ttulo indica que estamos salvando o Form (a Unit do mesmo). Observe no
item Salvar em qual o local onde ser salvo o projeto e modifique se necessrio
ou ento crie uma pasta para o mesmo. Em Nome do arquivo digite
Principal.pas e pressione Enter (ou clique no boto Salvar).
Uma nova caixa de dilogo ser apresentada, desta vez com o ttulo Save
Project1 As. No item Nome do arquivo digite AloMundo.dpr.
Com estes procedimentos acabamos de salvar nosso projeto e o formulrio do
mesmo. Se voc observar o diretrio em que os salvou, notar a existncia dos
seguintes arquivos:

AloMundo.dpr: o arquivo de projeto

Principal.pas: arquivo com a Unit do Form

Principal.dfm: arquivo do Form, que recebe automaticamente o mesmo


nome dado a sua Unit.

AloMundo.res: arquivo de recursos do projeto, normalmente contm


apenas o cone que ser usado no executvel, mas pode receber outros
recursos.

AloMundo.dof e AloMundo.cfg: arquivos de configurao de compilao


e ambiente.

22

Os arquivos principais so os .dpr, .pas e .dfm, os demais caso no sejam


encontrados sero recriados com as opes padro.
V ao editor de cdigo e observe que na primeira linha onde estava escrito unit
Unit1; agora se encontra unit Principal; o nome que atribumos ao formulrio
quando o salvamos.
Agora que j salvamos nosso programa, vamos executa-lo. Para isso v at o
menu Run e escolha a opo Run, ou ainda clique no boto de mesmo nome
no SpeedBar. Voc tambm pode usar o teclado, pressionando a tecla F9.
O projeto ser compilado e executado. Parabns, voc criou seu primeiro
programa em Delphi!
Para fecha-lo pressione Alt+F4 ou clique no boto fechar na barra de ttulo.
Se voc observar novamente a pasta onde os arquivos foram salvos ver que
dois novos arquivos foram criados:

Principal.dcu: a Unit e o Form compilados, dcu significa Delphi Compiled


Unit. A unio de todos os .dcu de um projeto juntamente com outras
Units internas do Delphi iro formar o arquivo executvel .exe.

AloMundo.exe: o aplicativo independente (executvel que roda sem o


Delphi), criado com o mesmo nome dado ao projeto.

Caso se deseje fazer uma cpia de segurana de um projeto, os arquivos .dcu


e .exe podem ser apagados, pois podem ser recriados atravs de uma nova
compilao do projeto. Aps a compilao, apenas o executvel necessrio.
ele que ser enviado ao usurio final.
Este foi um captulo extenso, no qual procuramos exibir algumas das principais
caractersticas e recursos Delphi, para lhe dar uma viso geral do que esta
fantstica ferramenta de desenvolvimento capaz de fazer.
No prximo captulo introduziremos conceitos sobre OOP (Object Oriented
Programming Programao Orientada a Objeto) e analisaremos em maior
profundidade as propriedades e os eventos do Form e de alguns componentes.

23

Exerccios
1) O que Delphi?
2) O que IDE? Quais os itens que a compe?
3) Para que serve o Object Inspector?
4) Quais so os principais arquivos de um projeto?
5) O que um evento?

24

Captulo 2
Programao Orientada a Objeto (POO)
Embora no seja objetivo deste curso ensinar POO, uma breve introduo
necessria, j que o Delphi essencialmente orientado a objeto.
De maneira prtica, podemos pensar no objeto sendo uma estrutura que
agrupa dados e funes para manipular estes dados. Como as funes so
sempre intimamente ligadas aos dados, o sistema todo funciona de maneira
mais segura e confivel. Alm disso, a POO utiliza conceitos como
encapsulamento e herana que facilitam muito a programao e manuteno
dos programas.
Os dados de um objeto costumam ser chamados de variveis de instncia e as
funes de mtodos. As variveis de instncia definem as propriedades
(tambm chamadas de atributos) do objeto e os mtodos definem o seu
comportamento.

Encapsulamento - Como as variveis e mtodos esto na mesma estrutura,


pode-se pensar em variveis e mtodos privados, ou seja, dados e funes
que s podem ser manipulados pelas funes que esto dentro da estrutura.
Desta maneira possvel formar uma camada protetora nos dados e evitar
atribuies desastradas que comprometeriam o funcionamento do programa.
Os defensores mais ortodoxos da POO dizem que todos os dados de um
objeto deveriam ser privados e o nmero de funes pblicas deve ser o menor
possvel, mas isso nem sempre vivel ou prtico. O Delphi implementa este
conceito e oferece dados/funes publicas (public) e privadas (private). Outra
conseqncia do encapsulamento que os objetos podem ser caixas pretas.
No necessrio (teoricamente) conhecer detalhes de funcionamento de um
objeto para us-lo, basta enviar as mensagens apropriadas que ele responde
com a ao desejada.
Classes - A classe representa um tipo ou categoria de objetos, o modelo a
partir do qual um objeto pode ser construdo. a estrutura propriamente dita,
que define os dados e mtodos daquela classe de objetos. O objeto em si
uma instncia da classe. Podemos fazer uma analogia com a programao
estruturada entre os tipos e variveis, onde a classe equivale ao tipo e o objeto
varivel desse tipo.
Herana - a capacidade que uma classe de objetos tem de herdar variveis
e mtodos de outra classe. Esta capacidade permite que o cdigo j escrito
seja reutilizado de maneira muito mais eficiente e simples do que na
programao estruturada. Um programa orientado a objeto costuma
implementar verdadeiras rvores genealgicas de classes, com vrios nveis
de herana.

25

Para programar no nvel do designer no necessrio um conhecimento


profundo de POO. Mas preciso conhecer pelo menos a sintaxe. Todas as
aplicaes para Windows precisam de pelo menos uma janela, que no Delphi
chamada de Form. Cada form (assim como todos os objetos visuais) tem um
objeto associado a ele e sua representao visual, que vemos na tela. Todos
os componentes que inclumos no form passam a fazer parte do objeto que
define o form. Exemplo: Se colocarmos um boto no form, a classe deste form
ser modificada para incluir este boto. Os eventos e mtodos deste form,
tambm esto na classe. Assim, supondo que o form se chame Form1 (nome
default), por exemplo, para desativar o boto que inclumos (de nome Buttom1)
escreveramos:
Form1.Buttom1.Enabled := false;
Note como o Buttom1 faz parte da estrutura que define o form. Mas se
quisermos ativar mtodo RePaint (Repintar) do form faramos:
Form1.Repaint;
Veja que Repaint, no uma varivel, tecnicamente uma procedure
(mtodo), mas fazemos referncia a ela como parte da estrutura Form1. Isso
pode parecer confuso no incio, mas facilita muito a programao.

Conhecendo propriedades, mtodos e eventos bsicos


No Anexo A, temos uma referncia sobre propriedades, mtodos e eventos dos
componentes mais utilizados numa aplicao. Para que possamos prosseguir
veremos agora algumas propriedades, mtodos e eventos comuns a maior
parte dos componentes do Delphi:

Propriedades Bsicas
Name: comum a todos os componentes da paleta. O Delphi nomeia
automaticamente todos os componentes que so includos no form (inclusive o
proprio form). Usa o nome da classe do componente mais um nmero
sequencial. O nome atribudo pelo Delphi pode ser mantido, mas
aconselhvel renomear os componentes que sero referidos no programa. No
nosso primeiro exemplo, o programa AloMundo, o Form e o Label que
inserimos tinham os nomes de Form1 e Label1, mas ns os alteramos para
FormPrincipal e LabelMensagem. Como no fizemos nenhuma programao
isso seria at desnecessrio, mas voc deve criar o hbito de renomear todos
os componentes que utiliza, caso seja feita referncia a eles no cdigo fonte,
muito mais claro imaginar que um boto chamado ButtonFechar seja para
fechar seu form do que se o nome fosse Button1 ou Button13. Quando voc
renomeia um componente, o Delphi atualiza automaticamente todo o cdigo
gerado por ele, o que inclui o cabealho da Unit, os eventos do componente e
as propriedades de outros componentes que fazem referncia ao componente
renomeado, mas no atualiza o cdigo gerado por voc. Exemplo: se

26

renomearmos um boto de Button1 para ButtonIncluir, o Delphi atualizar o


cabealho da unit, o nome dos eventos de Button1, mas voc ter que atualizar
todas as referncias que voc fez ao Button1 em seu cdigo com o novo nome.
Alis, esta uma regra geral no Delphi: ele nunca modifica automaticamente o
cdigo gerado pelo programador, mesmo que esteja em comentrio. E por
segurana, voc deve fazer o mesmo, no modifique o cdigo gerado por ele, a
no ser que saiba exatamente o que est fazendo, poder inutilizar seu form,
em alguns casos tendo problemas at para salva-lo.
Caption: Todos os componentes que podem apresentar um rtulo tem esta
propriedade. Armazena a string que ser mostrada quando o componente for
desenhado. No Form ele corresponde ao texto exibido na barra de ttulo.
Left e Top: Esquerda e Topo. Armazenam a posio do componente em
relao ao form ou painel que o contm. Movendo o componente, estas
propriedades se atualizam automaticamente, e alterando estas propriedades, o
componente movido.
Height e Width: Altura e comprimento do componente, alterando estas
propriedades, o componente ter seu tamanho alterado.
Font: Permite selecionar a fonte, o tamanho, o estilo e a cor da fonte que ser
usada para escrever o texto no componente.
Color: Cor do componente. Existe uma lista de cores padro usadas pelo
Windows e pelo Delphi, mas possvel definir qualquer cor atravs de seus
componentes RGB.
TabOrder: Ordem do componente no Form ou painel. Quando h vrios
componentes selecionveis no Form ou painel, a tecla Tab permite navegar
entre os componentes. Esta propriedade define a ordem em que os
componentes so selecionados quando o usurio tecla Tab.
Hint: (Dica) Este um recurso muito til e fcil de usar. Permite que aparea
um texto de ajuda quando o usurio posiciona o cursor do mouse sobre um
componente. Todos os componentes podem ter Hint. Na propriedade Hint,
voce deve digitar a frase que deve aparecer. Veja a propriedade abaixo.
ShowHint: Ativa o hint para o componente. Se estiver desligado, o hint no
mostrado.

Eventos bsicos
OnClick: gerado cada vez que o boto esquerdo do mouse pressionado e
solto. O evento s ocorre quando o usurio libera o boto. O Delphi j direciona
o evento para o componente que est debaixo do cursor do mouse.
OnDblClick: Gerado quando feito um duplo clique no boto esquerdo.

27

OnKeyPress: Gerado quando o usurio pressiona (e libera) uma tecla no


teclado.
OnEnter: Gerado quando o foco de ateno do Windows cai sobre o
componente. Exemplo: Suponha uma tela de entrada de dados, onde vrios
campos (caixas de texto) devem ser digitados. Quando a tela apresentada, o
foco, ou o cursor de texto, est sobre o primeiro campo. Depois de digitar o
campo, o usurio pressiona Tab para passar para o campo seguinte. Veja que
o que passa para o campo seguinte a ateno da aplicao e do Windows.
Essa ateno chamada de foco, ou focus em ingls. Este evento gerado
assim que o componente recebe o foco, antes de executar qualquer cdigo do
componente.
OnExit: Gerado imediatamente antes de o foco deixar o componente.
OnResize: Gerado quando o tamanho do componente alterado. usado
principalmente em forms e painis.
OnChange: Gerado quando o valor do componente muda. S aplicado em
componentes que permitem edio de seu contedo.

Mtodos Bsicos
Show: Desenha o componente. Se for uma janela (form) ela desenhada e
ativada.
Close: Fechar. Aplicado geralmente em forms e componentes de acesso a
dados. Quando utilizado no form principal, encerra a aplicao.
Repaint: Repintar. Redesenha o componente ou form.
Refresh: Tem o mesmo efeito que o Repaint, mas antes de desenhar, apaga o
componente. Quando aplicado em componentes de acesso a dados, faz com
que o buffer do arquivo seja recarregado.
Create: Aloca memria para criar um componente ou form, dinmicamente.
Free: Libera a memria alocada com o Create.

Criando um Projeto Piloto


Para continuar nosso aprendizado, desenvolveremos um projeto piloto, um
sistema de entrada de pedidos. Nele introduziremos os conceitos de acesso a

28

dados, os comandos de Object Pascal e toda teoria necessria criao de


aplicativos em Delphi.
Para comear vamos dar uma boa olhada no DER (Diagrama EntidadeRelacionamento) da figura abaixo. Temos o cadastro de clientes que armazena
dados sobre os clientes. Da mesma maneira, o cadastro de produtos. Para o
cadastro de pedidos, existe um problema: Se o Pedido relacionar diretamente o
Cliente com o Produto, teremos uma relao de M para M (Muitos para Muitos),
por que um cliente pode pedir muitos produtos e um produto pode fazer parte
de muitos pedidos. Procuramos sempre evitar esse tipo de relao, ento
inclumos mais uma relao: o Item de Pedido. Relacionando Pedidos com
Produtos atravs de Itens de Pedido, ficamos apenas com relaes de 1 para
M. Um pedido pode ter muitos itens, mas um item s pode fazer parte de um
pedido. Da mesma maneira, um produto pode fazer parte de muitos itens, mas
um item s pode ter um produto associado.

Agora, precisamos decidir qual ser nosso banco de dados e qual a engine que
utilizaremos: BDE, dbGO (ADO), IBX (Interbase Express) ou dbExpress.
Optamos por utilizar o BDE pois o mesmo se encontra disponvel em todas as
verses do Delphi. Utilizaremos uma base de dados Desktop, o Paradox, que
para nossos propsitos ser mais que suficiente.
Antes de criarmos nossa base de dados, interessante observar s mais um
detalhe. O Paradox uma base de dados onde cada tabela armazenada em
um arquivo externo separado. Cada um destes arquivos de dados pode ter
associado a ele vrios outros arquivos (necessrios para a criao de ndices,
verificao de referncias, validao e etc). Portanto o nmero total de arquivos

29

na base de dados aumenta rapidamente conforme vamos implementando


novos cadastros. Por esse motivo, no aconselhvel deixar a base de dados
no mesmo diretrio que os programas fontes. Recomendo que debaixo do
diretrio que voc criou para o projeto, crie um subdiretrio chamado Dados ou
DB. nesse diretrio que voc dever criar sua base de dados.

Criando o diretrio para o seu Projeto


Abra o Windows Explorer e crie no drive C: (ou onde achar mais adequado)
uma pasta para seu projeto. Por exemplo, criamos uma pasta chamada
Pedidos, e dentro desta uma outra chamada Dados. A estrutura de diretrios
ficou assim:

Conhecendo o BDE (Borland Database Engine)


Quando o Delphi precisa acessar um banco de dados, ele o faz atravs dos servios
do Borland Database Engine (BDE). O BDE funciona da mesma maneira para ler
dados armazenados localmente em arquivos DB (Paradox) e DBF (dBase/FoxPro),
bem como para os mais sofisticados sistemas client/server.
Muitos anos atrs, a Borland percebeu um problema com o acesso a banco de dados
em seus softwares. Eles produziram vrios produtos que eram usados para acesso a
bancos de dados, mas cada um tinha um mtodo diferente para conectar-se e utilizar
os dados. A Borland percebeu que uma abordagem de conectividade de banco de
dados unificada forneceria muitas vantagens. Ento decidiram criar um novo software
que deveria abstrair toda a funcionalidade de um banco de dados dentro de um
engine.

30

H vrios anos atrs, a Borland vendia um Paradox engine para programadores. Era
composto pela parte de acesso do DBMS Paradox e foi desenvolvido para ser usado
em programas que precisavam ler e gravar informaes em tabelas Paradox (.DB). O
BDE substituiu este engine, mas adicionou funcionalidade para conexo com outros
tipos de bancos de dados. O BDE tambm est disponvel separadamente do Delphi,
caso voc precise de uma performance slida em um ambiente de desenvolvimento
que no seja da Borland.
Ter todas as aes mais comuns de banco de dados dentro de um pedao de software
produz muitos efeitos positivos. Um nico conjunto de drivers permite a melhoria de
um driver em particular sem ter que reivindicar a roda cada vez que um novo pacote
tem acesso a um banco de dados. Isto significada que o acesso banco de dados
pode ser atualizado sem ter que atualizar um pacote de software inteiro. Se voc
instalar uma nova verso do BDE em um sistema com uma verso antiga do Paradox
pode imediatamente beneficiar-se dos novos drivers.
O conceito de driver unificado tambm salva voc do armazenamento permanente que
desaparece quando voc tem muito cdigo redundante. Um sistema com Paradox,
Delphi e BDE requer muito menos espao em disco porque o Paradox e o Delphi no
necessitam ter seus prprios engines de acesso banco de dados. Hoje em dia onde
cada nova gerao de programas requerem mais espao em disco rgido, cada bit
economizado ajuda.
Por ltimo e, contudo mais importante, usar um mtodo de acesso banco de dados
comum garante que o cdigo para acessar um tipo particular de banco de dados seja
escrito apenas uma vez.
Este captulo se concentrar em lhe dar uma introduo aos recursos e capacidades
do BDE.

O Utilitrio BDE Administrador


Quando o Delphi instalado, ele cria um cone ou atalho para o utilitrio BDE
Administrador. (Abaixo temos o BDE Administrator rodando no Windows XP).

31

Ele pode ser acessado pelo menu do Windows em Programas | Borland


Delphi 6 | BDE Administrator.
O Delphi 6 coloca todos os executveis e arquivos de configurao no diretrio
Arquivos de programas\Arquivos comuns\Borland Shared\BDE. No Delphi 1 estes
arquivos eram colocados em um diretrio chamado IDAPI, nomeado depois de
utilitrio de configurao antigo. IDAPI significa Independent Database Application
Programmer Interface, e d este nome para muitos dos arquivos e diretrios no
sistema. O BDEAdmin atua como sua interface para o BDE. O utilitrio permite que
voc mude muitos aspectos de como o BDE trabalha. O BDE armazena suas
informaes de configuraes no Registry do Windows. Depois que voc mudar suas
definies no utilitrio BDE Administrator, voc dever gravar suas definies
selecionando Object | Apply ou dando um clique sobre o boto Apply.

Pgina Database
Na pgina Database do BDE Administrator esto os aliases para os bancos de dados
disponveis. Os bancos do dados so exibidos em uma rvore hierrquica parecida
com o Windows Explorer. Para visualizar seus aliases de bancos de dados,
simplesmente d um clique sobre o smbolo de mais prximo ao banco de dados. Uma
vez exibido, a definio de cada alias pode ser facilmente visualizada ou modificada
selecionando o alias para exibi-lo no painel a direita do BDE Administrator.

Aliases de Bancos de Dados


Os aliases de banco da dados do a voc a habilidade para mudar a maneira que
trabalha com seus dados em uma maneira muito poderosa. No mundo das aplicaes
de negcios, os bancos de dados so realocados freqentemente quando as
organizaes geram novos arquivos e movem suas operaes de bancos de dados
para servidores de bancos de dados dedicados. Alguns ambientes de
desenvolvimento necessitam que voc recompile sua aplicao toda vez que um
banco de dados mude de local, ou para construir uma camada adicional de abstrao
dentro do seu cdigo. O BDE automaticamente d a voc esta habilidade atravs do
uso dos aliases. Antes de vermos em detalhes como os aliases do BDE trabalham,
veremos um pouco alm a natureza de dados e tabelas de bancos de dados.

Banco de Dados versus Tabelas


Quando Wayne Radcliff projetou a estrutura de arquivo do dBASE nos tempos dos
PCs-Compatveis, ele usou a extenso DBF (Database File) para descrever isso. Este
um termo errado porque banco de dados significa uma coisa especfica que no se
aplica a arquivos DBF.
Cada arquivo DBF possui uma tabela, uma coleo ordenada de dados. Uma tabela
divide informaes entre colunas conhecidas como campos e linhas (Fields and
Rows), que relacionados formam um registro. Esse termo Banco de Dados
geralmente denomina a coleo de tabelas que se relacionam a outras no mesmo
caminho. Exceto para aplicaes simples, o banco de dados consiste em mltiplas
tabelas relacionadas e cada tabela contm vrios registros e campos.

32

Agora que voc entendeu que um banco de dados composto por um conjunto de
tabelas relacionadas, ns precisamos observar como implementar esse conjunto.
Servidores de banco de dados como Interbase, SyBase e Oracle tm uma estrutura de
banco de dados que pode ser composta por mltiplas tabelas. Desenvolvedores de
banco de dados muitas vezes precisam utilizar esse tipo de estrutura, mas em
ambientes sem servidores geralmente falta um mecanismo para linkar mltiplas
tabelas. Voc pode criar seu prprio formato de banco de dados para conter todas as
suas tabelas, mas depois voc perder a compatibilidade com outros programas que
utilizam banco de dados mais antigos.
O BDE possui uma soluo avanada para esse problema. Colocado um grupo de
tabelas relacionadas em uma mesma pasta, voc pode associar essas tabelas juntas
usando o BDE. Basta dar um alias, ou nome ao banco de dados, para que o grupo de
arquivos em uma pasta particular se torne um conjunto de tabelas logicamente
ligadas. O BDE chama um conjunto como este de Pseudo Database. Um PseudoDatabase no possui caractersticas avanadas como encontramos em um Database
Server, como preservar integridade referencial. De qualquer modo ele permite a voc
utilizar o nome do banco de dados como ponteiro para o local de seus dados.
Vamos criar um novo alias, para nosso projeto. Comece selecionando Object | New
no menu principal.
Voc ser questionado a selecionar um tipo de driver na caixa de dilogo New
Database Alias.

O driver Standard fornece acesso s tabelas DB (Paradox), DBF


(dBase/FoxPro) e arquivos Txt. D um clique sobre o OK para retornar a
pagina Database. Agora, voc precisar entrar com um nome para o alias no
painel esquerdo. Vamos cham-lo de Pedidos.

33

Voc precisa tambm definir a localizao das tabelas no campo PATH. Defina
o caminho utilizado na criao da pasta do projeto: C:\Pedidos\Dados.
Certifique-se de gravar a configurao, clicando no boto Apply ou indo ao
menu Object | Apply. Tambm possvel utilizar o atalho de teclado Ctrl+A.
Agora quando voc precisar pegar dados em uma tabela, voc pode usar o
alias ao invs do nome diretrio.
At agora, parece que ns simplesmente mudamos um nome - o diretrio, para
outro - o alias. Isto nos salva de problemas quando chegar a hora de
mudarmos a localizao do banco de dados. Ns podemos coloc-lo em um
servidor de arquivos de rede, movendo-o para um disco rgido maior, ou at
mesmo fazer a mudana para um sistema de banco de dados cliente-servidor.
Voc no ter que mudar ou recompilar seus programas aps as tabelas terem
sido removidas. Voc precisar criar um novo ponteiro para o alias no BDE.
A meta dos aliases do BDE criar um ponteiro para um ponteiro. Qualquer
rotina de acesso banco de dados do Delphi far referncia ao alias de banco
de dados, o qual faz referncia s tabelas. Agora, mudando o alias, voc tem
uma maneira rpida de achar seus dados quando eles forem movidos de um
lugar para outro.
Voc dever, sempre que criar uma nova tabela de banco de dados ou acessar
uma antiga, tentar referenciar-se a ela pelo alias ao invs do path.

Criando as Tabelas de Dados no Database Desktop


O Database Desktop a ferramenta utilizada para a criao/modificao de
tabelas de bancos de dados desktop, como Paradox. Voc pode acessa-lo no
menu do Windows em Programas | Borland Delphi 6 | Database Desktop, ou
ainda no menu do Delphi em Tools | Database Desktop. Ser apresentada
uma janela como a figura a seguir.

34

Selecione o menu File| New | Table, ser exibida a caixa de dilogo Create
Table. Na caixa de combinao Table type est uma lista com os tipos de
arquivos disponveis. O tipo padro, Paradox 7 vem selecionado.

Como utilizaremos este tipo mesmo, simplesmente clique no boto OK. Ser
exibida a caixa de dilogo Create Paradox 7 Table.

Na coluna Field Name, digitamos o nome para o campo; em Type escolhemos


o tipo da informao que desejamos armazenar; em Size digitamos o tamanho
para esta informao, se aplicvel, pois alguns tipos possuem tamanho
predefinido; em Key selecionamos se este campo pertence chave primria1.
Segue abaixo as regras para definio de nome de campos bem como de tipo
e tamanho:
O tamanho mximo para o nome de um campo de 25 caracteres.
Cada nome de campo deve ser nico, voc no pode ter dois campos com o
mesmo nome na mesma tabela.
1

Chave primria o nome do ndice que ser utilizado para identificar exclusivamente um registro de
uma tabela em nosso banco de dados, bem como classific-la inicialmente.

35

O nome no pode iniciar com espaos em branco, mas pode conter espaos
(exceto no final). No entanto, no uma prtica muito interessante, pois isto
limitaria a maneira de se acessar a informao mais diretamente, pois o nome
do campo no seria um identificador vlido em Object Pascal, assim, uma
boa prtica no utilizar espaos no nome dos campos.
Caracteres especiais no devem ser utilizados como parte do nome, apenas
letras, nmeros e o caractere de sublinhado. Portanto no acentue as palavras.
(Use Codigo e no Cdigo).
Evite utilizar palavras reservadas
SELECT ou COUNT para dar
problemas caso voc deseje no
servidor. Procure atribuir nomes
campo e sua finalidade.

ou palavras chave de comandos SQL como


nomes aos campos, isto poderia trazer
futuro acessar uma base de dados clienteque descrevam claramente o contedo do

Obs: Estas regras se aplicam utilizao da estrutura das tabelas do Paradox,


outros bancos de dados (desktop ou no) podem possuir regras prprias
diferentes das utilizadas pelo Paradox. Um bom princpio seria nunca definir
nomes de campos que no poderiam ser identificadores vlidos no Delphi, isto
pode lhe poupar horas de esforos tentando encontrar erros de codificao e
resolvendo mensagens de exceo. Para obter maiores informaes sobre
regras de outras tabelas/bancos de dados, consulte o Help do Database
Desktop ou do prprio banco de dados sendo utilizado.

Segue abaixo, uma tabela com a relao dos tipos e tamanhos dos campos em
Paradox:
Smbolo

Tamanho

1-255

Automtico

Automtico

Automtico

Automtico

0 32

Tipo
Alpha - Pode conter strings (texto) formadas por letras,
nmeros e smbolos especiais ($, %, #, *, =) o campo
que voc utilizar para armazenar Nome, Endereo,
Telefone, CEP, etc.
Number - Pode conter apenas nmeros, valores positivos
ou negativos. Os valores aceitos esto na faixa de -10307 a
10308 com uma preciso de at 15 dgitos.
Money - Campo numrico, pode conter apenas nmeros,
valores positivos ou negativos. formatado para exibir
smbolo monetrio e separar as casas decimais.
Short - Pode conter apenas nmeros no intervalo de 32.767 a 32.767
Long Integer - Campo de 32 bits, pode conter apenas
nmeros no intervalo de -2147483648 to 2147483647.
Requer espao para armazenamento maior do que o
campo Short.
BCD - Armazena nmeros no formato BCD (Binary Coded
Decimal). So utilizados para executar clculos de alta
preciso, porm a velocidade dos clculos lenta, se

36

Smbolo

Tamanho

Tipo
comparada com os outros tipos numricos. Usado para
compatibilidade com outros aplicativos que utilizem este
tipo de campo. (O tamanho representa o nmero de
dgitos aps o ponto decimal)
Date - Armazena qualquer data no intervalo de 1 de
Automtico janeiro de 9999 AC at 1 de janeiro de 9999 DC.

Automtico

Automtico

1 240

0 240

0 - 240

Automtico

Automtico

Time - Armazena horrios no padro de 24 horas. (A


exibio pode ser modificada dentro dos programas).
Timestamp - Armazena uma combinao de data e hora
com as mesmas caractersticas dos campos separados
(Date e Time)
Memo - Campos memo so similares aos campos Alpha,
porm no possuem a limitao de 255 caracteres de
armazenamento. O valor definido em tamanho representa
a quantidade de caracteres que ser armazenada como
um campo na tabela, o restante dos caracteres digitados
sero armazenados em um arquivo separado com o
mesmo nome da tabela e extenso .MB. Se a maior parte
de seus memos so de 50 caracteres, voc poderia definir
este campo com tamanho 50, assim, os dados seriam
armazenados na tabela principal, sem necessidade de
acessar o arquivo .MB, este seria acessado somente
quando o tamanho de um campo ultrapassasse este
limite. A quantidade de informao armazenada limitada
apenas pelo espao em disco disponvel em seu Hard
Disk.
Formatted Memo - Este campo similar ao campo Memo,
porm consegue reter informao de formatao como
definio de Tipo e tamanho de Fonte (letra), Estilo
(Negrito, Itlico, etc.) e cor. Definindo o tamanho em 0,
todo o texto ser armazenado em um arquivo externo
.MB, como acontece com o Memo..
Graphic - Armazena grficos criados por aplicativos de
desenho como Paint do Windows, ou imagens scaneadas.
Dentro do Database Desktop podemos selecionar
imagens de formatos .BMP, .PCX, .TIF, .GIF e .EPS,
porm eles sero convertidos para o formato BMP quando
forem armazenados. A melhor prtica definir seu
tamanho como 0 pois armazenar toda a imagem num
arquivo separado.
Logical - Armazena valores lgicos (boolean) verdadeiro
(true) ou falso (false).
Autoincrement - Campo numrico que contm valores do
tipo long integer, apenas para leitura (no pode ser
alterado). Inicia com o nmero 1 e este valor
incrementado em um a cada registro adicionado a tabela.

37

Smbolo

Tamanho

0 - 240

1 - 255

Tipo
Normalmente usado para criar um campo de numerao
automtica como um cdigo de cliente, por exemplo. A
excluso de registros no faz com que esta numerao
recomece ou retroceda. E um nmero excludo jamais
ser inserido novamente, o valor ser sempre crescente.
Binary - Utilizado para armazenar informaes que no
devem ser interpretadas, devem ser armazenadas em
modo binrio. A utilizao mais comum o
armazenamento de som. Assim como campos Graphic,
seu tamanho no precisa ser obrigatoriamente ser
definido, pois a informao ser armazenada em um
arquivo .MB.
Bytes - Armazena informaes que no devem ser
interpretadas, devem ser armazenadas em modo binrio.
A utilizao mais comum o armazenamento de cdigos
de barra e magnetic strips de cartes. Diferente dos
campos Binary, a informao armazenada na tabela
Paradox para um acesso mais rpido. (Tamanho mximo
de 255 bytes)

Para darmos prosseguimento ao desenvolvimento de nosso sistema de


Controle de Pedidos, apresentaremos a baixo as definies de estrutura das
tabelas de nosso bancos de dados que ser formado pelas quatro tabelas que
descrevemos anteriormente em nosso DER: Clientes, Produtos, Pedidos e
Itens do Pedido.
Tabela de Clientes: Clientes.DB
N
Nome do Campo
1 Cdigo
2 RazaoSocial
3 Fantasia
4 Tipo
5 CGC_CPF
6 Insc_RG
7 Endereco
8 Bairro
9 Cidade
10 UF
11 CEP
12 Telefone
13 Fax
14 EMail
15 HomePage
16 Obs
17 Cadastro

Tipo
+
A
A
A
A
A
A
A
A
A
A
A
A
A
A
F
D

Tamanho Chave
Sim
35
20
1
14
15
35
20
30
2
8
15
15
30
50

38

N
Nome do Campo
18 Ativo
ndices Secundrios:
N
Nome
1 IRazaoSocial
2 ICidadeUF

Tabela Produtos: Produtos.DB


N
Nome do Campo
1 Codigo
2 Descricao
3 Preco
4 Unidade
ndices Secundrios:
N
Nome
1
IDescricao

Tipo

Tamanho Chave
L

Campos / Expresso de classificao


RazaoSocial
Cidade e UF

Tipo
I
A
$
A

Tamanho Chave
Sim
35
5

Campos / Expresso de classificao


Descrio

Tabela de Pedidos: Pedidos.DB


N
1
2
3
4

Nome do Campo
NumeroPedido
Cliente
DataPedido
FormaPgto
ndices Secundrios:
N Nome
1 ICliente
2 IDataPedido

Tipo
+
I
D
A

Tamanho Chave
Sim

30

Expresso de classificao
Cliente e NumeroPedido
DataPedido

Tabela de Itens do Pedido: Itens.DB


N
1
2
3
4

Nome do Campo
NumeroPedido
CodigoProduto
Quantidade
ValorUnitario

Tipo
I
I
N
$

Tamanho Chave
Sim
Sim

Obs: As estruturas definidas para as tabelas, visam apenas a aplicao


didtica do desenvolvimento de software para banco de dados. O sistema que
iremos desenvolver ser funcional e com ele aprenderemos todas as tcnicas
necessrias para criao de sistemas versteis, rpidos e precisos. No entanto,
para o desenvolvimento profissional de software, devemos trabalhar sobre uma
anlise mais profunda do sistema e da empresa onde este ser implantado. As
tabelas certamente teriam muitos outros campos e provavelmente outras
tabelas tambm seriam necessrias. Porm, como o objetivo deste sistema
apenas o aprendizado, manteremos estas tabelas desta forma mais
simplificada, para facilitar o processo de compreenso.

39

Vamos iniciar criando passo a passo a primeira tabela, Clientes. Digite em Field
Name o nome do primeiro campo, CODIGO, na coluna Type digite +, para criar
um campo autoincrement e na coluna Key d um duplo clique ou pressione
uma tecla para marcar este campo como sendo campo chave. Proceda da
mesma forma para os campos seguintes (observe que na definio da tabela
apenas o primeiro campo campo chave, ento no marque os demais).
Aps digitar os campos sua tela deve ficar semelhante a esta:

Agora vamos criar o ndice secundrio. Para isso, na caixa de combinao


(combo) Table properties, selecione a opo Secundary Indexes.
O lado direito da caixa de dilogo ser alterado e ficar semelhante figura a
seguir:

40

Clique no boto Define e uma nova caixa de dilogo ser aberta:

Clique no campo RazaoSocial na coluna Fields, selecionando-o. Em seguida,


clique no boto com a seta para direita, o que ir transferir o campo para a
coluna Indexed fields. Sua janela dever ser algo como a figura abaixo.

Clique no boto OK e na caixa de dilogo Save Index As digite o nome do


ndice secundrio (IRazaoSocial), clicando em OK novamente.

Voc retornar a caixa de dilogo anterior, no entanto repare que na caixa de


listagem aparece o nome do ndice recm criado.

41

Clique no boto Save As para salvar nossa tabela. Na caixa de dilogo Save
Table As selecione no combo Alias o alias que criamos para nosso banco de
dados (Pedidos). Note que ao selecionar o alias, a combo Salvar indica a
Pasta Dados, para onde ns definimos o path do mesmo.

Em nome do arquivo, digite o nome que ser dado a tabela, neste caso
Clientes.db (ou apenas Clientes, pois a extenso ser adicionada
automaticamente de acordo com o tipo de arquivo sendo criado).
Bem, com isso criamos nossa primeira tabela. Utilize o mesmo procedimento
para a criao das outras trs, observando para selecionar os campos
marcados como chave.
Antes de voc criar as tabelas restantes, vamos a uma dica: Para que voc no
precise selecionar o alias toda vez que for gravar uma nova tabela que criar ou
ao abri-la para modificao, podemos informar ao Database Desktop que
estaremos trabalhando com um alias em particular, tornando-o o alias padro.
Para isso v ao menu File | Working directory e selecione o alias Pedidos
clicando em seguida no boto OK.

42

Est feito, d prxima vez que for salvar a tabela, o nosso alias j estar
selecionado.
Crie as tabelas restantes, pois necessitaremos delas nas prximas aulas, onde
estaremos iniciando a criao do nosso aplicativo.

Exerccios
1)
2)
3)
4)
5)

O que so Classe e Objeto?


O que so mtodo e propriedade?
O que e para que serve o BDE?
Qual a vantagem de se utilizar Alias?
Qual a funo do Database Desktop?

43

Captulo 3
Criando nosso Formulrio Principal
A partir de agora, passaremos a desenvolver uma aplicao que vai usar os
recursos bsicos para a maioria das aplicaes. Conforme vamos
incrementando a aplicao, veremos os principais conceitos da programao
em Delphi. Como definimos anteriormente, nossa aplicao ser um mini
sistema de pedidos. O sistema manter cadastros de clientes e produtos e ser
capaz de gerar e armazenar os pedidos dos clientes.

Criando o Menu
Como primeiro passo, cuidaremos do sistema de menus. O componente do
menu o segundo na pgina Standard da paleta de componentes (o primeiro,
Frames, na verdade no um componente, apenas permite inserir um frame
dentro do form). Coloque o menu no form. O cone aparece mas ainda no h
nenhuma barra de menu. Para entrar no Menu Editor (editor de menu)
necessrio um duplo clique no cone do componente que foi colocado form.
Note que quando o editor ativado o Object Inspector passa a mostrar as
propriedades e eventos dos itens de menu.
Selecione a propriedade Caption e digite &Arquivo. O menu passa a mostrar
agora uma opo para Arquivo e um retngulo pontilhado ao lado. Note que o
& utilizado antes da palavra Arquivo serviu para identificar que a letra A ser
um atalho para esta opo de menu, que poder ser acessada no sistema
atravs das teclas Alt+A.

44

Clique no retngulo, selecione a propriedade Caption e digite C&adastros.


Repita a operao e coloque mais um tem para A&juda.
Neste ponto j temos o que num sistema DOS chamaramos de menu principal.
As opes que aparecem horizontalmente na barra de menu, normalmente
ativam sub-menus que oferecem mais opes, e estas eventualmente podem
abrir mais sub-menus, num leque que pode crescer bastante, se necessrio.
(Embora seja prudente no estender em excesso esta estrutura, pois tornaria o
sistema complexo para o usurio final).
Para criar um sub-menu do menu principal, basta clicar na opo desejada e
utilizar o retngulo que aparece abaixo da opo. Crie agora os seguintes submenus:
Para Arquivo: &Sair
Para Cadastro: &Clientes, &Produtos e P&edidos
Para Ajuda: &Sobre o sistema...
Observe que quando escolhemos as letras a que funcionaro como atalho para
as opes do menu atravs de ALT + <letra escolhida>. As letras no precisam
ser necessariamente a primeira letra da palavra. Tambm preciso tomar
cuidado para escolher letras diferentes para cada opo no mesmo nvel. Um
exemplo o sub-menu Pedido dentro do menu Cadastro, se no tivssemos
escolhido a primeira letra teramos dois itens com o mesmo atalho.
Para criar sub-menus em sub-menus, selecione a opo que ser a raiz e
pressione CTRL + Seta Direita. Crie as opes Cadastro e Listagem no
cadastro de Clientes e no de Produtos. No cadastro de Pedidos crie trs
opoes: Cadastro, Impresso e Listagem. O menu completo fica assim:
Arquivo
Sair

Cadastros
Clientes
Cadastro
Listagem
Produtos
Cadastro
Listagem
Pedidos
Cadastro
Impresso
Listagem

Ajuda
Sobre o sistema...

Antes de fechar definitivamente o editor de menus, temos ainda outra tarefa.


Note que a opo Cadastro aparece em 3 sub-menus. Em cada um deles, o
item de menu para Cadastro deve receber um nome diferente, e o Delphi
resolve o problema chamando estes itens de Cadastro1, Cadastro2 e
Cadastro3. Apenas para deixar o cdigo fonte mais claro e legvel, poderamos
renomear estes itens para algo como mnuCadCli, mnuCadProd e mnuCadPed.
Estamos usando o prefixo mnu para indicar que um item de menu. um bom
hbito utilizar prefixos que indiquem a classe do componente, isso facilita muito

45

a leitura do cdigo fonte. Para fixar melhor este hbito, renomeie tambm as
opes de Listagem.
Agora j podemos fechar o editor de menus, clicando no boto fechar na
barra de ttulo da janela.
Falta agora criar o cdigo para cada opo do menu. A maioria das opes
deixaremos para codificar mais adiante, de imediato vamos apenas codificar a
opo de sada do sistema. J com o editor de menus fechado, selecione a
opo Arquivo/Sair no prprio form da aplicao. O editor de cdigo ser
ativado. Na rea onde o cursor aparece piscando escreva Close; Este mtodo
ser responsvel por fechar este Form, como estamos no formulrio principal a
aplicao toda ser fechada.
O cdigo do programa ficar assim:
procedure TForm1.Sair1Click(Sender: TObject);
begin
Close;
end;
Clique no Form para selecion-lo e altere a propriedade Name do mesmo para
FormPrincipal. Na propriedade Caption digite Controle de Pedidos.
Observe que ao trocar o Name do form o Delphi fez as modificaes no cdigo
fonte tambm.
procedure TFormPrincipal.Sair1Click(Sender: TObject);
begin
Close;
end;
Note tambm que o componente de menu que inclumos foi adicionado
definio da classe do Form, juntamente com os itens de menu que incluimos
atravs do Menu Editor. Isso pode ser visto no editor de cdigo se voc for
para o incio da unit. A nova definio ser semelhante ao exemplo abaixo:

type
TFormPrincipal = class(TForm)
MainMenu1: TMainMenu;
Arquivo1: TMenuItem;
Cadastros1: TMenuItem;
Ajuda1: TMenuItem;
Sair1: TMenuItem;
Clientes1: TMenuItem;
Produtos1: TMenuItem;
Pedidos1: TMenuItem;
mnuCadCli: TMenuItem;
mnuListCli: TMenuItem;
mnuCadProd: TMenuItem;
mnuListProd: TMenuItem;
mnuCadPed: TMenuItem;

46

mnuImpPed: TMenuItem;
mnuListPed: TMenuItem;
procedure Sair1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormPrincipal: TFormPrincipal;

Salvando o Projeto
Salve o projeto na pasta que criamos (C:\Pedidos), como aprendemos na
nossa primeira aula. Caso no se recorde, vamos fazer juntos para fixar:
Clique no boto Save All do SpeedBar. Na caixa de dilogo Save Unit1 As no
item Nome do arquivo digite Principal.pas e verifique a pasta que est
selecionada, se no for a pasta Pedidos localize e selecione-a antes de clicar
no boto Salvar ou teclar Enter.
Na caixa de dilogo Save Project1 As no item Nome do arquivo digite o nome
que daremos ao projeto, Pedidos.dpr.

Definindo o tipo de aplicao


Se voc executar o projeto, notar que o menu j est funcionando, incluindo a
opo Sair do menu Arquivo, que encerra a execuo do mesmo. Tambm
deve ter notado que o formulrio aparece na mesma posio e do mesmo
tamanho que estava quando o desenhamos. Se quisermos, por exemplo, que
ele aparea maximizado, poderemos fazer isso definindo a propriedade
WindowState em nosso Form. Para isso, v at o Object Inspector e defina
WindowState para wsMaximized (No esquea de fechar a janela se o estiver
executando).
Tambm devemos decidir que tipo de aplicao ns teremos. Basicamente
existem dois tipos de aplicativos, SDI (Simple Document Interface Interface
Simples de Documentos ) e MDI (Multiple Document Interface - Interface de
Mltiplos Documentos). O SDI tipo padro, onde cada form independente
do outro. Se tivermos um formulrio principal com um menu e acionarmos um
segundo formulrio, poderemos minimixar o formulrio principal e este outro
continuaria ativo e ainda em alguns casos poderiam aparecer dois botes na
barra de tarefas do Windows.

47

J em um aplicativo MDI temos um formulrio principal (Pai), que contm todos


os demais formulrios (filhos). Assim, se voc minimizar o principal, todos os
filhos so minimizados com ele. Apenas um boto exibido na barra de tarefas
e os formulrios filhos tambm no podem ser arrastados para fora da rea do
formulrio Pai.
Poderamos trabalhar com um formulrio principal SDI maximizado ou
reduzindo-o ao menu e uma barra de ferramentas, como o caso do prprio
Delphi. Existe at um exemplo deste estilo de sistema dentro do diretrio de
exemplos que acompanha o Delphi. Se voc fez a instalao mantendo
diretrios sugeridos poder encontrar este projeto em:
C:\Arquivos de programas\Borland\Delphi6\Demos\Db\MastApp.
Optamos por trabalhar com um formulrio MDI para criar uma interface prxima
da qual a maior parte dos usurios do Windows j esto acostumados ao
utilizarem editores de texto como o Microsoft Word que trabalham desta forma.
(Obs: A partir da verso 2000 do Office o Word deixou de ser um aplicativo
puramente MDI, pois se abrirmos dois documentos o mesmo exibe dois botes
na barra de tarefas do Windows).
Para criarmos um Formulrio MDI devemos definir a propriedade FormStyle
como sendo fsMDIForm.
Obs: S pode existir um formulrio com FormStyle definido com
fsMDIForm por projeto. Os formulrios filhos (Children Forms) devero ter
seu FormStyle definido como fsMDIChild. (No h limite para o nmero de
formulrios filhos).

Preparando o Acesso aos Dados


Para fazer o acesso aos dados, poderamos criar um DataModule, uma espcie
de formulrio especial onde podemos colocar componentes de acesso a dados
e outros componentes da categoria Invisible components (componentes que
no criam interface com o usurio, e por isso no so visveis em tempo de
execuo). No entanto o uso do DataModule aumentaria um pouco mais o nvel
de dificuldade pois teramos que fazer muitas outras consideraes. Assim,
optamos por manter os componentes de acesso a dados dentro dos prprios
formulrios, o que de certa forma tambm deixar nossa aplicao mais leve
no final.
V at a guia BDE da paleta de componentes, selecione o componente
DataBase e adicione-o ao Form. Para acesso a tabelas Paradox isso
desnecessrio, visto que o mesmo s precisa da informao de path do alias,
mas facilitaria para uma futura mudana para um banco de dados clienteservidor, assim no vemos razo para no utiliza-lo sempre. Defina no
componente DataBase as seguintes propriedades:

48

Propriedade
AliasName
DatabaseName
Name

Contedo
Pedidos
DBPedidos
DatabasePedidos

A propriedade AliasName indica qual alias do BDE iremos utilizar e


DatabaseName define qual ser o nome interno desse alias. Assim, caso
instale seu sistema em um micro que j possua um sistema em Delphi e que
por infelicidade utilize o mesmo alias, voc pode simplesmente criar um outro o
nome para o seu alias e selecionar este nome novo no AliasName do seu
componente DataBase.
Salve as alteraes que fizemos at agora clicando no boto Save do
SpeedBar ou utilizando o menu do Delphi se preferir. Habitue-se em ir salvado
seu projeto na medida que o vai modificando ou adicionando novos cdigos e
componentes. Pois no caso de uma queda de energia ou travamento do
Windows o que no estiver salvo ser perdido, como em qualquer outro
programa.

Criando o Cadastro de Clientes


Para criarmos nosso cadastro de Clientes devemos incluir um novo formulrio
no projeto. Fazemos isso clicando no boto New Form do SpeedBar ou ento
no menu File | New | Form.
Inserido o novo Form, teremos novamente um Form1. Defina as propriedades
deste Form como na tabela abaixo:
Propriedade
Name
Caption
FormStyle
Position

Contedo
FormClientes
Cadastro de Clientes
fsMDIChild
poMainFormCenter

A propriedade Position define em qual a posio o Form ir aparecer::

poDesigned: o Form aparece na posio que estava no projeto (design


time).
poDefault: Tanto a posio do Form (Top e Left) como seu tamanho
(Height e Width) definida pelo sistema operacional. A cada execuo o
Form exibido direita e abaixo da posio anterior, formando o que
chamamos de alinhamento de janelas em cascata.
poDefaultPosOnly: O tamanho definido no projeto ser mantido, mas a
posio definida pelo sistema operacional.
poDefaultSizeOnly: A posio definida na projeto mantida, mas o
tamanho pode ser alterado pelo sistema operacional.

49

poScreenCenter: O Form ser exibido no centro da tela virtual, caso se


utilize dois monitores o mesmo aparecer centralizado na rea definida
pelos dois, ficando assim metade do form em cada monitor.
poDesktopCenter: O Form ser centralizado considerando-se apenas a
rea de trabalho do monitor, caso se utilize dois monitores ele no
considerar o segundo.
poMainFormCenter: aparece no centro de um Form MDI (pai), utilizada
para formulrios com FormStyle igual a fsMDIChild.
poOwnerFormCenter: Mantm o tamanho definido no projeto, mas
centraliza o Form no centro do formulrio definido na propriedade
Owner. Caso a mesma no seja definida o resultado ser o mesmo de
poMainFormCenter.

Agora vamos comear a criar a interface. Na guia Stardard, selecione o


componente Panel e coloque-o no Form. Defina as propriedades assim:

Propriedade
Align
Caption
Name

Contedo
alBottom
Apague o contedo deixando em branco
PanelBotoes

Observe que Align define o alinhamento deste componente, assim definindo


alBottom o alinhamos na parte inferior do Form ou objeto que o contm.
Adicione um ScrollBox (ele criar uma caixa com barra de rolagem), que se
encontra na guia Additional, tendo o cuidado de coloca-lo na rea do form que
no contm o primeiro Panel. Para este componente defina as propriedades:

Propriedade
Align
Name

Contedo
AlClient
ScrollBoxDados

Agora vamos inserir o componente que dar acesso a nossa tabela. V at a


guia BDE, selecione o componente Table e coloque-o no Form. Como este
um componente invisvel o local onde ficar no tem muita importncia, ento
coloque no fim do Form, para no atrapalhar sua viso do local onde
colocaremos os objetos para digitao de dados.
Precisamos agora conectar nossa Table ao alias que desejamos acessar ou ao
componente Database que aponta para esse alias. Como nosso componente
Database est no nosso FormPrincipal, devemos permitir que este Form possa
visualizar o outro. Para isso v at o menu File | Use Unit (ou pressione
Alt+F11) e selecione a unit que voc quer permitir visualizar dentro desta.
Selecione Principal (que a nica que temos alm da atual) e clique em OK.
Agora configure o componente Table como segue:

50

Propriedade
DatabaseName
Name
Table

Contedo
DBPedidos
TableClientes
Clientes.db

Assim, definimos que este componente ir acessar a tabela Clientes.db que


pertence ao Database DBPedidos, que por sua vez sabemos que aponta para
o alias Pedidos que criamos no incio.
D um clique duplo no componente Table de seu Form. Ser exibido o Fields
Editor. Pressione Ctrl+F e sero adicionadas definies de campo para cada
um dos campos da tabela. Voc tambm pode fazer isso clicando com o boto
da direita do mouse sobre o Fields Editor e selecionando a opo Add all fields
no menu de contexto do mesmo. Seu ambiente de trabalho deve estar
apresentando algo assim:

Clique no primeiro campo da lista, selecionando-o. V ao Object Inspector e


defina a propriedade DisplayName para Cdigo. (O DisplayName servir para
preencher a propriedade Caption dos respectivos Labels que sero inseridos).
Faa o mesmo com os campos seguintes, alterando por exemplo, RazaoSocial
para Razo Social, CGC_CPF para CGC/CPF, Insc_RG para Insc.Estadual/RG
e assim por diante.

51

Agora volte ao primeiro campo da lista, segure a tecla Shift e utilizando a seta
para baixo selecione at Fantasia. Agora arraste os campos selecionados para
o Form, na rea definida pelo ScrollDados. Voc deve obter algo assim:

Observe que os campos selecionados ao serem arrastados inseriram um Label


com o Texto definido na propriedade DisplayLabel do mesmo e um objeto
DBEdit, responsvel por permitir a edio de dados, j configurado para
acessar este campo. Tambm foi inserido um componente DataSource. Este
responsvel por interligar os dados acessados pelo componente Table com os
componentes de exibio de dados (da guia Data Controls). Vamos continuar
com a criao do nosso Form e depois explicaremos mais detalhadamente
como estes componentes se relacionam.
Como o componente DataSource tambm invisvel mova-o para uma rea
livre, como ao lado do Table e altere sua propriedade Name para
DataSourceClientes (ou DSClientes se preferir um nome mais curto).
Para o campo tipo, vamos usar um outro tipo de controle, ento iremos inseri-lo
manualmente. V at a guia Data Controls, selecione o componente
DBRadioGroup e coloque-o no Form. Defina as seguintes propriedades:

Propriedade
Caption
Columns
DataField
DataSource
Height
Items
Name
Values
Width

Contedo
Tipo
2
Tipo
DataSourceClientes
38
Pessoa Fsica
Pessoa Jurdica
DBRadioGroupTipo
F
J
208

52

As propriedades Items e Values definem respectivamente os textos que sero


exibidos no objeto DBRadioGroup e quais os valores sero gravados na tabela.
Estas propriedades possuem um editor (boto com reticncias), para defini-las
clique no boto e informe os textos um em cada linha, como no exemplo
abaixo:

Clique em OK para voltar ao Object Inspector novamente. E defina a


propriedade Values da mesma forma
.
Tenha o cuidado de ir arrumando os campos no Form, de maneira a abrir
espao para os demais campos e procurando deixar o form com uma
aparncia mais agradvel. Tambm seria prudente voc salvar seu Form a
esta altura, para evitar o risco de perder tudo o que j fez no caso de uma
queda de energia ou um esbarro no estabilizador (o que no muito
incomum). Salve esta Unit como Clientes.pas.
Abra o Fields Editor novamente, com um clique duplo no componente Table.
Selecione agora os campos CGC_CPF e Insc_RG e arraste-os para o Form.
Faa o mesmo com os outros at checar ao campo Obs, pois neste campo
tambm utilizaremos outro componente.
Talvez seja necessrio redimensionar seu Form dependendo da aparncia que
voc deseja dar ao mesmo. Para fazer isso voc pode alterar os valores nas
propriedades Height e Width do Form ou ento modifica-lo com o mouse, como
faria com qualquer outra janela ou ainda utiliza-lo maximizado caso prefira.
Insira um Label (guia Standard) e defina seu Caption como Observao.
Abaixo do Label insira um componente DBRichEdit definindo suas
propriedades para:
Propriedade

Contedo

53

DataField
DataSource
Name

Obs
DataSourceClientes
DBRichEditObs

Volte ao Fields Editor e insira o campo Cadastro, se ainda no o Fez.


O ltimo campo, Ativo ns tambm definiremos manualmente, ser um
componente DBCheckBox (guia Data Controls). Insira-o no Form e defina suas
propriedades para:

Propriedade
Caption
DataField
DataSource
Name

Contedo
Cliente Ativo
Ativo
DataSourceClientes
DBCheckBoxAtivo

Agora vamos voltar aos componentes que foram inseridos automaticamente


(arrastados do Fields Editor para o Form) e vamos definir a propriedade Name
dos mesmos para algo mais significativo. Sugerimos que utilize DBEdit (nome
da classe) como prefixo e adicione no lugar dos nmeros o nome do campo,
como fizemos abaixo:
Campo
Cdigo
RazaoSocial
Fantasia
CGC_CPF
Insc_RG
Endereo
Bairro
Cidade
UF
CEP
Telefone
Fax
Email
HomePage
Cadastro

Name
DBEditCodigo
DBEditRazaoSocial
DBEditFantasia
DBEditCGC_CPF
DBEditInsc_RG
DBEditEndereco
DBEditBairro
DBEditCidade
DBEditUF
DBEditCEP
DBEditTelefone
DBEditFax
DBEditemail
DBEditHomePage
DBEditCadastro

Dependendo da maneira como voc arrumou os componentes DataControl em


seu Form eles podem ter ficado com a tabulao (ordem em que so
selecionados ao pressionarmos a tecla Tab) incorreta, para redefinir clique com
o boto da direita no ScrollDados em uma rea vazia (sem DataControls) e
selecione a opo Tab Order no menu de contexto. Ser exibida a caixa de

54

dilogo Edit Tab Order, que lhe permitir ordenar os objetos na seqncia
correta.

Agora, para podermos navegar e modificar os dados vamos inserir o


componente DBNavigator. Selecione-o na guia Data Controls e insira-o no
PanelBotoes (que ns alinhamos na parte inferior do formulrio) e defina suas
propriedades como segue:
Propriedade
DataSource
Flat
Hints

Name

Contedo
DataSourceClientes
True
Primeiro Registro
Registro Anterior
Prximo Registro
ltimo Registro
Incluir Registro
Excluir Registro
Alterar Registro
Gravar Incluso/Alterao
Cancelar Incluso/Alterao
Reexibir os Dados
DBNavigatorClientes

A propriedade Flat define que os botes tero aparncia plana, assumindo a


forma de boto apenas quando o mouse passa sobre eles. Esse o
comportamento das barras de ferramenta das verses mais recentes do
Windows e do Internet Explorer, bem como do prprio Delphi.
A propriedade Hints define as dicas que sero exibidas para cada um dos
botes que fazem parte do DBNavigator. Para que estas dicas seja exibidas
voc deve definir a propriedade ShowHint no Form para True.

55

Por ltimo, incluiremos um boto do tipo BitBtn, que se encontra na guia


Additional. Insira-o tambm no PanelBotoes, no canto Direito e defina as
propriedade assim:
Propriedade
Kind
Caption
Name

Contedo
bkClose
&Fechar
BitBtnFechar

Salve novamente seu Formulrio e vamos adicionar a codificao mnima e


coloca-lo para funcionar.
No Object Inspector selecione o Formulrio (FormClientes) utilize o combo no
topo do mesmo ou ento clique em um objeto qualquer do Form e v teclando
Esc continuamente, at que o Object Inspector exiba no seu combo
FormClientes: TFormClientes. (Essa dica uma maneira rpida de acessar
um objeto que est sobreposto por outro, como o caso do Form).
V para a guia Events o Object Inspector e localize o evento OnCreate. D um
duplo clique na caixa em frente ao evento. Isso abrir o editor de cdigo para
voc. Nele digite o seguinte:
TableClientes.Open; // abre a tabela de dados
O seu editor de cdigo deve estar assim:
procedure TFormClientes.FormCreate(Sender: TObject);
begin
TableClientes.Open; // abre a tabela de dados
end;

Localize agora o evento OnDestroy, d um duplo clique novamente para abrir o


editor de cdigo e insira a linha abaixo:
TableClientes.Close; // fecha a tabela de dados

Isso j o suficiente para que possamos executar nosso formulrio. Devemos


agora fazer a ligao deste com o menu do FormPrincipal. Isso feito da
seguinte maneira.
Volte ao FormPrincipal, isso pode ser feito clicando-se na guia com o nome
Principal no editor de cdigo ou ainda atravs do boto View Forms do
SpeedBar (neste caso voc deve selecionar FormPrincipal na lista e clicar em
OK).
Selecione no seu FormPrincipal o menu Cadastros | Clientes | Cadastro. Isso
abrir o editor de cdigo na opo de menu selecionada. Para chamarmos o
FormClientes devemos digitar o seguinte cdigo:
FormClientes.Show; //exibe o formulrio

56

Tambm precisamos informar que vamos utilizar o FormClientes dentro do


FormPrincipal, para isso v ao menu File | Use Unit. E selecione Clientes na
lista de Units. (Caso voc no faa este procedimento, o Delphi ir verificar
que voc est tentando utilizar este Form e ir questiona-lo se ele deve incluir a
informao de que voc vai utiliza-lo. Na verdade este procedimento insere o
nome da Unit na clusula uses da seo implementation da unit do form
sobre o voc chamou a opo Use Unit).
Salve o Projeto e execute-o, pressionando F9.
Voc deve notar que ao executar seu aplicativo, o formulrio do Cadastro de
Clientes j aparece aberto. Isso se deve ao fato de que todo formulrio filho
exibido no momento em que criado e o Delphi, por padro, cria todos os
formulrios no inicio (quando executado). Assim se tivessemos 50 formulrios
filhos todos eles seriam exibidos ao mesmo tempo. Note tambm que se voc
tentar fechar o formulrio ele ser minimizado. Este tambm um
comportamento padro para formulrios filhos. Como estes comportamentos
no so os que desejamos, iremos modifica-los.
Encerre a execuo do programa e volte ao Delphi. No menu do Delphi escolha
Project | Options ou tecle Ctrl + Shift + F11.

Mova o FormClientes da Lista de Auto-create forms para a lista de Available


forms, deixando-o como na figura anterior. Clique em OK e o problema do form
aparecer sem clicar no menu estar terminado. Devemos adicionar na opo
de menu que chama o FormClientes mais uma linha de cdigo, pois agora
nossa a responsabilidade de criar o formulrio. O seu cdigo deve ficar assim:

57

Application.CreateForm(TFormClientes,FormClientes); // cria o form


FormClientes.Show; //exibe o formulrio
No FormClientes, devemos codificar um novo evento para eliminar o problema
das janelas minimizarem quando tentamos fecha-las. Localize o evento
OnClose (do FormClienes), abra sua codificao como foi feito anteriormente e
acrescente o seguinte cdigo:
Action := caFree; // remove o form da memria
Este comando far com que o formulrio seja removido da memria quando o
fecharmos, resolvendo assim o problema. A esta altura voc tambm deve ter
notado que utilizamos duas barras de diviso ( // ) para indicar um comentrio.
Voc pode ver maiores detalhes sobre isso no apndice A que contm a
sintaxe bsica dos comandos e estruturas de controle do Object Pascal.
Se voc executar o aplicativo agora, ver que os problemas anteriores no
existem mais. No entanto, caso voc acione o menu para abrir o Cadastro de
Clientes mais de uma vez, sem fechar a janela na primeira vez, ver que uma
nova cpia da janela ser criada. Isso permite que se possa estar cadastrando
um Cliente e antes de terminar abrir uma nova janela para consultar um outro.
Pode ser um recurso interessante, mas tambm pode ser confuso para
usurios menos experientes. Assim, iremos limitar nosso aplicativo a executar
apenas uma cpia da mesma janela de cada vez. Para isso, vamos adicionar
mais uma linha no cdigo da opo de menu do FormPrincipal que chama o
FormClientes. Seu cdigo agora deve ficar assim:
if FormClientes = NIL then //cria o form se ele no foi criado ainda
Application.CreateForm(TFormClientes,FormClientes);
FormClientes.Show; //exibe o formulrio
E outra linha de cdigo no evento OnClose do FormClientes:
Action := caFree; // remove o form da memria
FormClientes := NIL; // informa que foi destrudo (no criado)

Com isso, nosso aplicativo j funciona corretamente. Podemos incluir, alterar e


excluir informaes, bem como nos movimentarmos entre os registros. No
entanto, algumas melhorias podem ser feitas:
Ao clicar na incluso poderamos jogar o cursor no primeiro campo que
queremos editar, como Razo Social por exemplo;
Poderamos trazer a data de Cadastro preenchida com a data do dia;
Os campos de CGC/CPF, CEP e Cadastro j poderiam vir com
mscaras de digitao;
A mensagem que aparece quando tentamos excluir poderia ser
traduzida;
Seria interessante poder localizar um determinado cliente atravs de seu
Nome.

58

Certamente, voc deve ter pensado em algumas outras tambm, isso depende
muito de como voc deseja que seu Form se comporte e que funcionalidade
deseja implementar.
Realizaremos estas melhorias no prximo captulo, neste momento, vamos
entender como os dados so acessados e exibidos.

Entendendo como acessamos os dados no Delphi


Para acessar e manipular as tabelas de bancos de dados, devemos utilizar os
componentes de acesso a bancos de dados, que esto armazenados nas guias
da Paleta de Componentes, de acordo com o tipo de engine utilizado: BDE,
dbGO (guia ADO), IBX (guia Interbase) ou dbExpress. No nosso caso,
utilizamos o BDE, mas estes conceitos so vlidos tambm para as outras
engines de acesso. Os componentes destas guias so responsveis apenas
pelo acesso (leitura/gravao e movimentao).
Para que os mesmos possam ser modificados e visualizados pelo usurio,
devemos utilizar os componentes da guia Data Controls. Nesta guia
encontramos componentes semelhantes aos da guia Standard, porm criados
especificamente para dar acesso aos dados.
Voc pode estar se perguntando, qual seria a vantagem de se dividir tanto os
mtodos de acesso e manuteno e usar toda essa quantidade de
componentes. E a resposta simples, flexibilidade. Cada uma das guias de
acesso possui mais de um tipo de componente para acesso a dados, alguns
que exploram melhor a capacidade de acesso a tabelas desktop (como o
caso do componente Table do BDE) e outros voltados especificamente para o
acesso cliente-servidor (como o componente Query da mesma guia).
Separando-se os controles de edio (Data Controls) dos componentes de
acesso a dados (BDE, dbGO, IBX ou dbExpress) temos um meio mais fcil de
substituir a metodologia de acesso sem contudo afetar a interface visual j
construda anteriormente.
Como os componentes de acesso so diferentes (embora possuam
propriedades e mtodos comuns) para que no fossem necessrios Data
Controls especficos para cada um, a Borland criou um outro componente, que
responsvel por fazer a ligao entre os componentes de exibio e os
componentes de acesso. Estamos falando do componente DataSource, que se
encontra na guia Data Access. Este componente se liga aos componentes de
acesso a dados atravs da propriedade DataSet. E os Data Controls se
conectam a ele atravs de uma propriedade tambm chamada DataSource.
Assim, se desejarmos trocar os componentes de acesso, simplesmente os
inserimos no Form (ou DataModule) e apontamos os DataSources para os
novos componentes de acesso, sem precisar modificar nada nos Data
Controls.

59

Se voc j programou em outras linguagens visuais pode ter uma idia melhor
de como esta arquitetura criada pela Borland realmente superior s outras
formas de desenvolvimento utilizadas por outras ferramentas. (A Borland
tambm possui o Borland C++ Builder, uma ferramenta semelhante ao Delphi,
mas que baseada em linguagem C/C++. Nela a forma de desenvolvimento
a mesma utilizada aqui).

Exerccios
1) Qual a funo do Menu Editor?
2) Qual a diferena entre aplicaes SDI e MDI? Qual tipo podemos criar
com o Delphi?
3) Para que servem os componentes da Guia BDE?
4) Qual a funo dos componentes da Guia Data Controls?
5) Qual a funo do componente DataSource?

60

Captulo 4
Aprimorando nosso formulrio de Cadastro de Clientes
Caso seu projeto esteja fechado, voc pode abri-lo clicando no boto Open
Project do SpeedBar, teclando Ctrl+F11 ou ainda acessando o menu
File|Open Project. Se trabalhou recentemente com o projeto, pode tentar um
caminho mais rpido, atravs do menu File|Reopen, localizando-o na lista dos
ltimos projetos abertos.
Retorne ao nosso FormClientes (selecionando-o por exemplo, atravs do boto
View Form no SpeedBar ) para que possamos complementa-lo.

Definindo mscaras de edio


Inicialmente, vamos definir mscaras de formatao que iro facilitar a
digitao dos dados. Abra o Fields Editor (com um duplo clique no componente
Table) e localize o campo CEP. No Object Inspector procure a propriedade
EditMask e digite: 99999\-999;0;_
A primeira parte antes da vrgula define a mscara para o CEP, o zero aps a
vrgula indica que o hfen no ser salvo, e o sublinhado no final define o
caractere que ser exibido quando a posio estiver em branco. (Se achar
melhor voc pode substituir o sublinhado por um espao em branco).
Agora localize o campo Cadastro no Fields Editor e voltando ao Object
Inspector defina a propriedade EditMask para: !99/99/9999;1;_
Esta a mscara para dadas, a exclamao indica que espaos em branco
no sero exibidos, o nmero 1 indica que as barras ( / ) sero salvas
juntamente com os nmeros digitados.
Por ltimo, procure o campo UF no Fields Editor e no Object Inspector defina
seu EditMask para: !ll (exclamao e duas letras L minsculas)
A letra l indica que ser aceito apenas caracteres alfabticos.
Voc encontrar maiores detalhes sobre as mscaras no apndice A.

Codificando eventos das tabelas de dados


Modificaremos agora o comportamento do nosso aplicativo atravs da
codificao de eventos especficos.

61

Definindo um valor inicial para um campo


Para que um determinado campo tenha um valor inicial quando acionamos a
incluso, devemos codificar o evento OnNewRecord. Para isso, selecione o
objeto Table e v para a guia Events no Object Inspector. Localize este evento
e abra o Code Editor com um duplo clique na caixa direita da propriedade
(como fizemos at agora). Na rea criada para a codificao do evento digite:
TableClientesCadastro.AsDateTime := Date; // atribui a data atual
TableClientesAtivo.AsBoolean := True; // cliente ativo
Estamos fazendo assim uma atribuio da data atual (atravs da funo Date)
para o campo Cadastro que esta no TableClientes (TableClientesCadastro)
sendo do tipo de dados date (AsDateTime). Na segunda linha, definimos que o
contedo do campo ativo ser True (verdadeiro), informando assim que o
cliente ativo (dificilmente cadastraramos um cliente inicialmente inativo, ele
se torna inativo com o tempo).

Posicionando o foco no primeiro item a ser editado.


Quando iniciamos uma incluso ou alterao pode ser mais prtico que o foco
esteja num determinado controle, como o DBEdit do campo RazaoSocial. Para
isso vamos codificar o evento BeforeInsert (que ocorre antes da incluso):
DBEditRazaoSocial.SetFocus; // posiciona o cursor neste controle
Como desejamos que a mesma ao seja executada no momento que
acionarmos a alterao, devemos codificar a mesma coisa no evento
BeforeEdit. No entanto, o Delphi fornece um mecanismo maravilhoso (no
encontrado em outras linguagens) que permite a voc simplesmente indicar
que se um determinado evento ocorrer ele deve executar o cdigo contido em
outro evento. Para definir isso, simplesmente v no Object Inspector e localize
o evento BeforeEdit. Desta vez, ao invs de dar um clique duplo selecione no
combo como mostrado na figura abaixo:

Traduzindo a mensagem de Excluso


A mensagem Delete Record? que aparece quando voc tenta excluir um
registro pertence ao componente DBNavigator. Para podermos traduzi-la
devemos desativar esta mensagem. Para isso selecione este componente no
seu Form e defina a propriedade ConfirmDelete para False. O prximo passo
codificar no Table o evento BeforeDelete (que ocorre antes da excluso).

62

Localize-o e abra o editor de cdigo (com um clique duplo), digitando os


comandos a seguir:
if Application.MessageBox('Deseja excluir o registro atual?','Confirme',
MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2) = IDNO then
Abort; //interrompe e no exclui o registro
Isso criar uma caixa de dilogo com o ttulo Confirme e a mensagem Deseja
excluir o registro atual?, exibindo os botes Sim e No e o cone padro
para perguntas. O segundo boto (No) foi definido como boto padro.
Observe tambm que as mensagens foram digitadas entre aspas simples, que
o formato para strings no Delphi.

Validando as informaes antes de gravar


Outro item importante a ser implementado no permitir a gravao de
informaes incorretas ou em branco. Assim podemos fazer algumas
verificaes no evento BeforePost (que quando clicamos no boto Post antes
da gravao dos dados):
Duas aspas simples sem espao
If DBEditRazaoSocial.Text = then //nada foi digitado
Begin
ShowMessage(Digite a Razo Social / Nome);
DBEditRazaoSocial.SetFocus; // posiciona o cursor
Abort; // no grava e continua editando
End;

Definindo mscaras de formatao dinamicamente


Localize no Form o Label correspondente ao campo RazaoSocial e altere o
Name para LabelRazaoSocial. Faa o mesmo com o Label do campo Fantasia,
modificando o Name para LabelFantasia.
Localize o controle DBRadioGroupTipo, iremos codificar o evento OnClick do
mesmo, definindo o cdigo a seguir:
if DBRadioGroupTipo.ItemIndex = 0 then // pessoa fsica
begin
LabelRazaoSocial.Caption := 'Nome';
LabelFantasia.Caption := 'Apelido';
TableClientesCGC_CPF.EditMask := '999\.999\.999\-99;0;_';
end
else // pessoa jurdica
begin
LabelRazaoSocial.Caption := 'Razo Social';
LabelFantasia.Caption := 'Fantasia';
TableClientesCGC_CPF.EditMask := '99\.999\.999\/9999\-99;0;_';
end;

63

Voc tambm deve codificar de forma semelhante o evento AfterScroll, que


ocorre depois que nos movemos de um registro para outro, pois assim
estaremos exibindo as mscaras corretas para o registro corrente. No evento
AfterScroll a codificao ser ligeiramente diferente na primeira linha, ao invs
de acessarmos o controle, faremos a leitura da informao diretamente do
campo:
if TableClientesTipo.AsString = 'F' then // pessoa fsica
begin
LabelRazaoSocial.Caption := 'Nome';
LabelFantasia.Caption := 'Apelido';
TableClientesCGC_CPF.EditMask := '999\.999\.999\-99;0;_';
end
else // pessoa jurdica
begin
LabelRazaoSocial.Caption := 'Razo Social';
LabelFantasia.Caption := 'Fantasia';
TableClientesCGC_CPF.EditMask := '99\.999\.999\/9999\-99;0;_';
end;

Digitao em maisculo ou minsculo independente do Caps Lock


Uma ltima alterao que podemos fazer forar a digitao para maisculo
no campo UF. Para isso v at o controle DBEditUF e altere a propriedade
CharCase para ecUpperCase.
Voc pode fazer o mesmo com os outros campos de texto (Razo Social,
Fantasia, Endereo, etc) caso deseje que todas as informaes sejam
digitadas e gravadas em maisculo.
O campo de email sempre deve ser digitado em minsculo, podemos ento
definir isto automaticamente para que o usurio no tenha que se preocupar
com isso. Para tal, selecione o DBEditemail e defina a propriedade ChaCase
para ecLowerCase.

Localizando informaes
Insira um BitBtn no PanelBotoes e defina suas propriedades como segue:

Propriedade
Caption
Name
Glyph

Contedo
&Procurar
BitBtnProcurar
Imagem find.bmp

64

A imagem find.bmp faz parte do arquivo de imagens do Delphi que est em:
C:\Arquivos de programas\Arquivos comuns\Borland Shared\Images\Buttons.
D um duplo clique no boto para abrir o editor de cdigo que vir assim:
procedure TFormClientes.BitBtnProcurarClick(Sender: TObject);
begin
end;
Antes da instruo begin voc deve inserir o seguinte:
var
Nome: String;
O editor dever estar apresentando o seguinte cdigo:
procedure TFormClientes.BitBtnProcurarClick(Sender: TObject);
var
Nome: String;
begin
end;

Digite o seguinte cdigo entre as instrues begin e end; (onde sempre fizemos
at agora):
Nome := ''; // inicia definindo uma string vazia
if InputQuery('Procurar', 'Razo Social/Nome', Nome) then
if not TableClientes.Locate('RazaoSocial', Nome,
[loCaseInsensitive, loPartialKey]) then
ShowMessage('Razo Social/Nome no encontrado!');

Seu editor de cdigo deve estar apresentando algo assim:


procedure TFormClientes.BitBtnProcurarClick(Sender: TObject);
var
Nome: String;
begin
Nome := ''; // inicia definindo uma string vazia
if InputQuery('Procurar', 'Razo Social/Nome', Nome) then
if not TableClientes.Locate('RazaoSocial', Nome,
[loCaseInsensitive, loPartialKey]) then
ShowMessage('Razo Social/Nome no encontrado!');
end;

65

A funo InputQuery responsvel por criar uma caixa de dilogo para


digitao de informao do tipo texto. O mtodo locate um dos mtodos
responsveis pela localizao de informaes.
Deve ser necessrio acertar a ordem de tabulao dentro do PanelBotoes, uma
outra maneira de ajustar definir a propriedade TabOrder. Defina o TabOrder
do BitBtnProcurar para 1. (O DBNavigator deve ter seu TabOrder definido
como 0 e conseqentemente o BitBtnFechar ser 2).
O nosso Cadastro de Clientes ficou assim:

Certamente o seu deve ter algumas diferenas, dependendo da maneira que


escolheu para dispor os controles, etc.
Finalizaremos este captulo por aqui. Agora voc deve criar o formulrio de
Produtos, utilizando os conhecimentos que obteve at o momento.

Exerccios:
1) Qual a funo propriedade EditMask?
2) Qual o evento que devemos utilizar para inicializar valores num
campo?
3) Para que serve a propriedade CharCase?
4) Qual a utilizade do mtodo Locate?
5) Para que serve a funo InputQuery?

66

Captulo 5
Criando o Cadastro de Pedidos
Vamos comear esta aula de forma diferente. Iremos apresentar a aparncia
final do formulrio de cadastro de pedidos, e depois iremos destrincha-lo,
fazendo passo a passo cada um dos procedimentos para sua construo.

Esta ser a interface que criaremos para o pedido. Passemos ento a sua
criao:
Crie um novo formulrio no projeto e configure as seguintes propriedades:
Propriedade
Caption
FormStyle
Height
Name
Position
ShowHint
Width

Contedo
Cadastro de Pedidos
fsMDIChild
375
FormCadPedidos
poMainFormCenter
True
550

Salve-o com o nome CadPedidos.pas.

67

Insira um componente Panel (guia Standard), configurando estas propriedades:


Propriedade
Align
Caption
Enabled
Height
Name

Contedo
alTop
Apagar o contedo
False
145
PanelDados

Insira um segundo Panel (na rea livre) configurando-o assim:


Propriedade
Align
Caption
Name

Contedo
alBottom
Apagar o contedo
PanelBotoes

O prximo passo inserir um componente DBGrid (guia Data Controls) na rea


entre os dois Panels. Com ele poderemos visualizar todos os itens de um
pedido. O DBGrid deve ter sua propriedade Align definida para alClient, para
ocupar a rea restante do form. Defina a propriedade Name para DBGridItens.
O passo seguinte incluso do DBNavigator e dos botes no PanelBotoes.
Insira um DBNavigador no PanelBotoes e na propriedade VisibleButtons, defina
para False todas as subpropriedades a partir de nbInsert, como pode ser
observado na figura abaixo:

Isso far com que o DBNavigator exiba apenas os quatro primeiros botes,
responsveis pela movimentao na tabela. Para as outras opes ns
utilizaremos nossos prprios botes, aprendendo como o DBNavigator
manipula os mtodos para dar manuteno no sistema.

68

Como os outros botes foram ocultados, vamos reduzir a largura do mesmo


para melhorar sua aparncia. Assim, defina a propriedade Width para 80.
Defina a propriedade Name do DBNavigator para DBNavigatorPedidos.
Insira agora seis componentes SpeedButton (guia Additional). Para inserir
mltiplos componentes segure a tecla Shift antes de clicar no componente na
paleta de componentes. Solte a tecla Shift e clique nos locais onde deseja que
o componente seja inserido, quando terminar, v at a paleta de componentes
e clique no cone semelhante seta do mouse.
Defina para estes botes as propriedades que seguem:
(Obs: As imagens utilizadas na propriedade glyph devem ser encontradas em:
C:\Arquivos de programas\Arquivos comuns\Borland Shared\Images\Buttons).

Primeiro boto (SpeedButton1):


Propriedade
Contedo
Glyph
Imagem filenew.bmp
Name
SpdBtnIncluir
Segundo boto (SpeedButton2):
Propriedade
Contedo
Glyph
Imagem edit.bmp
Name
SpdBtnAlterar
Terceiro boto (SpeedButton3):
Propriedade
Contedo
Glyph
Imagem erase.bmp
Name
SpdBtnExcluir
Quarto boto (SpeedButton4):
Propriedade
Contedo
Glyph
Imagem filesave.bmp
Enabled
False
Name
SpdBtnGravar
Quinto boto (SpeedButton5):
Propriedade
Contedo
Glyph
Imagem ignore.bmp
Enabled
False
Name
SpdBtnCancelar
Sexto boto (SpeedButton6):
Propriedade
Contedo
Glyph
Imagem find.bmp
Enabled
False

69

Name

SpdBtnProcurar

Para criar o boto para fechar o form, utilizamos o nosso j conhecido BitBtn
(tambm da guia Additional). Insira um BitBtn no PanelBotoes e defina suas
propriedades como segue:
Propriedade
Caption
Name
Glyph

Contedo
&Procurar
BitBtnProcurar
Imagem find.bmp

A etapa seguinte ser a incluso dos componentes de acesso a dados. Insira


quatro componentes Table (guia BDE) configurando-os assim:
Primeiro Table (Table1):
Propriedade
Contedo
DatabaseName
DBPedidos
Name
TablePedidos
TableName
Pedidos.db
Segundo Table (Table2):
Propriedade
Contedo
DatabaseName
DBPedidos
Name
TableItens
TableName
Itens.db
Terceiro Table (Table3):
Propriedade
Contedo
DatabaseName
DBPedidos
Name
TableClientes
TableName
Clientes.db
Quarto Table (Table4):
Propriedade
DatabaseName
Name
TableName

Contedo
DBPedidos
TableProdutos
Produtos.db

Precisamos inserir agora dois componentes DataSource (guia Data Access):


Primeiro DataSource (DataSource1):
Propriedade
Contedo
DataSet
TablePedidos
Name
DSPedidos

70

Segundo DataSource (DataSource2):


Propriedade
Contedo
DataSet
TableItens
Name
DSItens

Selecione o componente DBNavigatorPedidos e defina sua propriedade


DataSource para DSPedidos.
Selecione o DBGridItens e defina sua propriedade DataSource para DSItens.
Agora devemos adicionar os campos da tabela Pedidos dentro do seu
respectivo componente Table. Como fizemos anteriormente, d um duplo
clique no objeto Table para abrir o Fields Editor. Pressione Ctrl+F para
adicionar todos os campos. Pressione Ctrl+N para adicionar um novo campo.
Criaremos agora um campo de LookUp, responsvel por localizar uma
determinada informao em outra tabela e retornar o contedo de um
determinado campo. Observe na figura abaixo como definimos um campo
Lookup:

O item Name representa o nome que daremos ao campo (digite NomeCliente).


Component ser o nome interno do campo, que criado automaticamente,
baseando-se no nome do Table e o nome que voc informou em Name. No
item Type informamos o tipo do campo (selecione String que igual ao Alpha
do Paradox). Em Size definimos o tamanho do campo quando aplicvel (digite
35, o mesmo tamanho do campo Nome na tabela de cliente).
Em Field type devemos indicar Lookup, para termos acesso ao grupo Lookup
definition.
O item Key Fields representa qual campo utilizaremos para procurar (selecione
Cliente). Em Dataset temos o nome da tabela na qual a busca ser realizada

71

(selecione TableClientes). O item Lookup Keys o campo da tabela definida


em Dataset que deve corresponder ao campo definido em Key Fields
(selecione Cdigo). O Item Result Field tem o nome do campo que deve ter seu
contedo retornado se a informao for encontrada (selecione RazaoSocial).
Ao clicar em OK, seu Fields Editor deve ter ficado como a primeira figura
abaixo (do lado esquerdo):

Mova este campo arrastando-o com o mouse, deixando-o abaixo do campo


Cliente.
Altere as propriedades DisplayLabel dos campos, para algo mais significativo
(como o exibido na figura do nosso formulrio no incio do captulo). Defina
tambm o EditMask do campo DataPedido como fizemos no cadastro de
clientes.
Arraste os campos para o PanelDados (na parte superior do Form), alinhandoos como fizemos (ou da forma como preferir).
Obs: Para alinhar dois objetos na mesma linha, ajuste a propriedade Top
de ambos para o mesmo valor. Para alinhar o lado esquerdo, defina a
propriedade Left. Uma maneira selecionar o primeiro componente,
segurar a tecla Shift e selecionar os outros. V at a propriedade que quer
definir e tecle Enter. Isso far com que os outros objetos assumam o
mesmo valor que estava definido na propriedade do primeiro objeto.

Selecione o TableItens e adicione os seus campos, da mesma forma como


fizemos com o TablePedidos. Adicione tambm um campo de Lookup,
configurando-o assim:
Name: Descriao
Type: String
Size: 35
Field type: Lookup
Key Fields: CodigoProduto

72

Dataset: TableProdutos
Lookup Keys: Cdigo
Result Field: Descrio

Posicione este campo Lookup abaixo do campo CodigoProduto, da mesma


maneira como fizemos na tabela anterior.
Adicione um novo campo, agora ser um campo Calculated, responsvel por
efetuar o clculo do total do item (quantidade x preo) sem que seja necessrio
armazena-lo na tabela. Configure-o assim:
Name: Total
Type: Currency
Field type: Calculated
(Obs: Os outros campos so definidos apenas para campos Lookup).
Faremos agora uma ligao meste-detalhe entre os componentes
TablePedidos e TableItens. V ao componente TableItens e defina a
propriedade MasterSource para DSPedidos. A seguir clique no editor (boto
com reticncias) da propriedade MasterFields.

Ser exibido o Field Link Designer, como na figura acima. Selecione o campo
NumeroPedido na lista Detail Fields e na lista Master Fields. Clique no boto
Add. A caixa Joined Fields deve exibir o seguinte:

73

Clique no boto OK para prosseguir. Com isso indicamos que o TableItens est
ligado como filho do TablePedidos. Cada vez que movimentarmos a
TablePedidos na TableItens sero exibidos apenas os registros que pertenam
ao pedido exibido.

Para finalizar, vamos terminar de configurar o DBGridItens. D um duplo clique


no DBGrid para abrir o editor de colunas. Clique no terceiro boto para inserir
todos os campos como exibido abaixo:

Selecione o campo NumeroPedido e o remova teclando Delete. (O nmero do


pedido no precisa aparecer no DBGrid).
Vamos mudar um pouco a aparncia do nosso DBGrid, alterando a cor dos
ttulos das colunas e a cor de fundo para exibio dos dados
Selecione o campo CodigoProduto e localize a propriedade Title no Object
Inspector. Abra as subpropriedades clicando no sinal de + esquerda da
propriedade.

74

Selecione a subpropriedade Font e defina a cor para Azul-marinho (se desejar


altere tambm a fonte). Faa o mesmo para os outros campos. No campo Total
defina tambm o estilo da fonte para negrito.
Selecione agora o DBGridItens e defina sua propriedade Color para clInfoBk.

Nos falta agora inserir dois ltimos componentes. Insira um Label no


PanelDados e configure sua propriedade Caption para Total do Pedido. Insira
um componente StaticText (guia additional) abaixo do Label, definindo suas
propriedades da seguinte forma:
Propriedade
Alignment
AutoSize
BorderStyle
Caption
Height
Font
Name

Contedo
taRightJustify
True
sbsSunken
Apagar o contedo
21
Times New Roman, Negrito, Tamanho 9,
cor Azul-marinho
StaticTextTotal

Com isso terminamos toda a parte visual (design). Devemos agora iniciar a
codificao, no esquecendo de salvar novamente antes de prosseguir.

Codificando o formulrio Cadastro de Pedidos


Vamos comear definindo os eventos de criao, destruio e fechamento do
nosso form. Selecione o FormCadPedidos atravs do combo do Object
Inspector ou utilizando o Object TreeView. Localize o evento OnCreate do form
e abra o editor de cdigo com um duplo clique na caixa de combinao do
respectivo evento. Adicione as linhas de cdigo abaixo:
// abre as tabelas
TableProdutos.Open;
TableClientes.Open;
TablePedidos.Open;
TableItens.Open;

75

O editor de cdigo deve estar semelhante ao cdigo a seguir:


procedure TFormCadPedidos.FormCreate(Sender: TObject);
begin
// abre as tabelas
TableProdutos.Open;
TableClientes.Open;
TablePedidos.Open;
TableItens.Open;
end;

Continue da mesma forma para os demais eventos. Agora codifique o evento


OnDestroy:
// fecha as tabelas
TableProdutos.Close;
TableClientes.Close;
TablePedidos.Close;
TableItens.Close;

E o evento OnClose:
Action := caFree; // libera form da memria
FormCadPedidos := NIL; // indica que foi liberado

Localize o BitBtnFechar e d um clique duplo para abrir o cdigo do evento


OnClick do mesmo. Como fizemos anteriormente no cadastro de clientes,
simplesmente chame o mtodo para fechar o form:
Close; // fecha o form

No TablePedidos vamos codificar o evento OnNewRecord:


TablePedidosDataPedido.AsDateTime := Date; //inicia com a data atual

Criaremos agora duas procedures (mtodos) dentro do nosso formulrio, para


executar rotinas que podem ser chamadas vrias vezes.
V at o inicio da unit do formulrio na clusula private e acrescente as linhas
em destaque sua definio, ficando como exibido abaixo:
private
{ Private declarations }
procedure AtivarControles(Ativar: Boolean);
procedure RecalculaPedido;
public

Linhas
inseridas

76

{ Public declarations }
end;

Agora v ao final da unit e digite todo o cdigo abaixo antes do end.


procedure TFormCadPedidos.AtivarControles(Ativar: Boolean);
begin
PanelDados.Enabled := Ativar;
DBNavigatorPedidos.Enabled := (not Ativar);
DBGridItens.ReadOnly := (not Ativar);
SpdBtnIncluir.Enabled := (not Ativar);
SpdBtnAlterar.Enabled := (not Ativar);
SpdBtnExcluir.Enabled := (not Ativar);
SpdBtnGravar.Enabled := Ativar;
SpdBtnCancelar.Enabled := Ativar;
SpdBtnProcurar.Enabled := (not Ativar);
end;

procedure TFormCadPedidos.RecalculaPedido;
var
TmpTable: TTable;
Total: Currency; // armazena valores do tipo moeda
begin
// cria um objeto Table via codificao
TmpTable := TTable.Create(Application);
try
// define DatabaseName e TableName via codificao
TmpTable.DatabaseName := TableItens.DatabaseName;
TmpTable.TableName := TableItens.TableName;
TmpTable.Open;
TmpTable.FindKey([TablePedidosNumeroPedido.AsInteger]);
Total := 0; // inicializa a variavel totalizadora
while (not TmpTable.Eof) and
(TmpTable.FieldByName('NumeroPedido').AsInteger =
TablePedidosNumeroPedido.AsInteger) do
begin
// Acumula o Total da linha
Total := Total + (TmpTable.FieldByName('Preco').AsCurrency *
TmpTable.FieldByName('Quantidade').AsFloat);
TmpTable.Next; // prximo registro
end;
finally
TmpTable.Close; // fecha a tabela
TmpTable.Free; // libera objeto da memria
end;
StaticTextTotal.Caption := FormatCurr('###,###,##0.00', Total);
end;

77

Selecione novamente o TableItens e localize o evento OnCalcFields. O cdigo


a ser inserido o seguinte:
if (TableItensQuantidade.AsFloat > 0) and
(TableItensPreco.AsCurrency > 0) then
TableItensTotal.AsCurrency := TableItensPreco.AsCurrency *
TableItensQuantidade.AsFloat;
RecalculaPedido; // recalcula e exibe novamente

No evento OnNewRecord, definiremos estas duas linhas:


TableItensQuantidade.AsFloat := 1;
DBGridItens.SelectedIndex := 0; //cdigo

O evento BeforeInsert deve ser codificado como segue:


if TablePedidosNumeroPedido.AsString = '' then
begin
if TablePedidos.State = dsInsert then
begin
// grava para salvar o nmero do pedido na tabela pai
TablePedidos.Post;
// ativa a alterao novamente
TablePedidos.Edit;
end;
end;

O cdigo abaixo voc deve inserir no evento BeforePost:


if TableItensNumeroPedido.AsString = '' then
TableItensNumeroPedido.AsInteger :=
TablePedidosNumeroPedido.AsInteger;
if TableItensCodigoProduto.AsString = '' then
begin
DBGridItens.SelectedIndex := 0; // seleciona a coluna cdigo
ShowMessage('Cdigo do produto deve ser informado!');
Abort; // interrompe a gravao
end;
if TableItensQuantidade.AsFloat <= 0 then
begin
DBGridItens.SelectedIndex := 2; // seleciona coluna quantidade
ShowMessage('Cdigo do produto deve ser informado!');

78

Abort; // interrompe a gravao


end;

Selecione agora o objeto DBGridItens e localize o evento OnKeyDown,


codificando-o como segue:
// muda para a prxima coluna se pressionar Enter
if Key = VK_RETURN then // pressionou ENTER
begin
case DBGridItens.SelectedIndex of
0: DBGridItens.SelectedIndex := 2; //quantidade
1: DBGridItens.SelectedIndex := 2; //quantidade
2: DBGridItens.SelectedIndex := 3; //Preco
else
DBGridItens.SelectedIndex := 0; //cdigo
TableItens.Next;
if TableItens.Eof then
TableItens.Append;
end;
end;

Definiremos agora uma validao para o campo CodigoProduto na TableItens.


Abra o Fields Editor, selecione o campo CodigoProduto e localize o evento
OnValidate. Neste evento iremos definir o cdigo abaixo:
if TableItensCodigoProduto.AsString <> '' then
begin
if TableProdutos.FindKey([TableItensCodigoProduto.AsInteger]) then
TableItensPreco.AsCurrency :=
TableProdutos.FieldByName('Preco').AsCurrency
else
begin
ShowMessage('Cdigo invlido');
Abort;
end;
end;

Existe mais um ajuste que devemos fazer na parte de eventos ligados aos
campos. Ao digitarmos uma data, num campo onde definimos o EditMask, se
apagarmos o contedo do mesmo ser gerado um erro por definio de data
em branco ( / / ). Este cdigo a seguir responsvel por identificar esta
situao e efetuar a correo necessria. Deve ser digitado no evento
OnSetText:
if Text = ' / / ' then
Sender.Clear // apaga o campo data

79

else
// atribui a data digitada ao campo
try
Sender.AsString := Text;
except
ShowMessage('Data invlida!');
end;

Agora faltam os cdigos do evento OnClick dos SpeedButtons. Codifique para


o SpdBtnIncluir o seguinte:
AtivarControles(True); // ativa os controles para digitao
TablePedidos.Append; // inclui um novo registro na tabela
DBEditDataPedido.SetFocus;
O prximo boto a receber cdigo ser o SpdBtnAlterar:
if TablePedidos.IsEmpty then
begin
// a tabela est vazia, ento devemos incluir
SpdBtnIncluir.Click; // executa o click no boto
Exit; // retorna
end;
AtivarControles(True); // ativa os controles para digitao
TablePedidos.Edit; // permite alterar os dados
DBEditDataPedido.SetFocus;

O boto seguinte o SpdBtnExcluir:


if Application.MessageBox('Deseja excluir este pedido?','Confirme',
MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2) = IDNO then
Exit; // retorna (sem fazer nada)
// devemos excluir os itens primeiro, para no termos
// registros rfos
try
TableItens.First; // posiciona no primeiro item
while not TableItens.Eof do // executa at o fim do arquivo
begin
TableItens.Delete; // exclui o item
TableItens.First;
end;
TablePedidos.Delete; // exclui o pedido
except
ShowMessage('Ocorreu um erro durante a excluso do pedido');
end;

80

Para o boto SpdBtnGravar teremos esta codificao:


if TablePedidosNumeroPedido.AsInteger <= 0 then
begin
ShowMessage('Digite o nmero do pedido!');
DBEditPedido.SetFocus;
Exit;
end;
if TablePedidosDataPedido.IsNull then
begin
ShowMessage('Digite a data do pedido!');
DBEditDataPedido.SetFocus;
Exit;
end;
if TablePedidosCliente.AsInteger > 0 then
begin
// procura pelo cliente usando o cdigo
if not TableClientes.FindKey([TablePedidosCliente.AsInteger]) then
begin
ShowMessage('Cdigo de cliente invlido!');
DBEditCliente.SetFocus;
Exit;
end;
end
else
begin
ShowMessage('Digite o cdigo do cliente!');
DBEditCliente.SetFocus;
Exit;
end;
TablePedidos.Post;
if TableItens.State in [dsInsert,dsEdit] then
TableItens.Post;
AtivarControles(False); // desativa os controles

E para o boto SpdBtnCancelar o cdigo ser este:


TablePedidos.Cancel; // cancela incluso/alterao
AtivarControles(False); // desativa os controles

O SpdBtnProcurar ns codificaremos na prxima aula, pois criaremos um


formulrio especial de pesquisa. Vamos ligar nosso formulrio ao menu no
FormPrincipal para que possamos v-lo em ao.
V at o FormPrincipal e clique na opo de menu correspondente a este
cadastro. Na rea que se abriu no editor de cdigo insira as linhas abaixo:

81

if FormCadPedidos = NIL then // cria o form se ele no foi criado ainda


Application.CreateForm(TFormCadPedidos,FormCadPedidos);
FormCadPedidos.Show; //exibe o formulrio

Tambm devemos remover a criao automtica deste form, como fizemos


com o cadastro de clientes. Para isso v at a caixa de dilogo Project Options
(Shift+Ctrl+F11) e mova o FormCadPedidos para a lista de Available forms.
Salve o projeto e execute-o. Observe como se comporta e quais so as
melhorias que voc poderia implementar no mesmo. No captulo seguinte
criaremos o form de localizao e veremos como associa-lo ao cadastro de
pedidos. Faremos tambm uma anlise profunda da lgica de funcionamento
deste tipo de interface que criamos e das codificaes que foram utilizadas.

Exerccios
1) Para que serve a propriedade Glyph presente em alguns tipos de boto?
2) Como podemos ocultar os botes do DBNavigator?
3) Qual a melhor maneira para se inserir um determinado componente
em um Form vrias vezes?
4) Qual a finalizade de campos LookUp?
5) Qual a finalizade de campos Calculated?

82

Captulo 6

Criando um formulrio de Pesquisa


Da mesma forma como fizemos no captulo anterior, vou lhe mostrar o
resultado final e veremos como chegar at ele.
Esta ser a aparncia do Form que vamos criar:

Crie um novo formulrio e defina seu Name para FormLocalizaPedidos e o


Caption para Localiza Pedidos. Altere as propriedades Height para 375 e Width
para 600. Modifique a propriedade BorderStyle para bsDialog. Salve-o com o
nome LocalizaPedidos.pas.
Insira um componente PageControl (guia Win32) e definas suas propriedades
da seguinte maneira:
Propriedade
Align
Height
Name
Style

Contedo
AlTop
105
PgCtrlLocalizar
TsFlatButtons

Clique com o boto da direita sobre o PageControl e selecione New Page no


menu de contexto. Ser inserido um TabSheet (uma espcie de pgina).

83

Clique neste objeto para seleciona-lo e defina o Name para


TabSheetNumPedido e o Caption para Nmero do Pedido.
Insira neste TabSheet um Label, um Edit (ambos da guia Standard) e um BitBtn
(guia Additional). No Caption do Label escreva Nmero do Pedido. Apague o
texto contido na propriedade Text do componente Edit e altere seu Name para
EditPedido. O Name do BitBtn deve ser BitBtnPedido e no seu Caption voc
deve digitar &Procurar. Na propriedade glyph utilize a imagem find.bmp ou
outra mais conveniente.
Insira agora um DBGrid (guia Data Controls) abaixo do PageControl,
configurando suas propriedades assim:
Propriedade
Height
Left
Name
ReadOnly
Top
Width

Contedo
195
0
DBGridPedidos
True
105
594

Modifique ainda no DBGrid, na propriedade Options a sub-propriedade


RowSelecte para True.

Insira abaixo do DBGrid um Panel, configurando-o assim:


Propriedade
Caption
Height
Left
Name
Top
Width

Contedo
Apagar o contedo
41
0
PanelBotoes
300
594

Insira dentro no Panel dois BitBtn, configurando-os nesta seqncia:


Primeiro Boto (BitBtn1):
Propriedade
Contedo
Kind
bkOK
Caption
&Selecionar
Default
False
Name
BitBtnSelecionar
Width
90

84

Segundo Boto (BitBtn2):


Propriedade
Contedo
Kind
bkCancel
Caption
&Cancelar
Name
BitBtnCancelar
Width
90

Retorne ao PageControl e clicando novamente com o boto da direita, escolha


New Page para inserir outro TabSheet. Desta vez, escreva no Caption do
TabSheet Data do Pedido e Altere o Name Para TabSheetData.
Insira um Label neste TabSheet definindo seu Caption como Data Inicial.
Adicione um componente DateTimePicker (guia Win32) em frente ao Label.
Defina o Name para DTPickerInicial e preencha a propriedade Format com
dd/mm/yyyy. Repita o processo, adicionando outro Label, agora com o Caption
Data Final e outro DateTimePicker com o Name DTPickerFinal e o mesmo
contedo em Format. Adicione outro BitBtn com o Name BitBtnData e as
mesmas configuraes do BitBtn adicionado pgina anterior. Neste ponto
este TabSheet deve ser semelhante a figura abaixo:

Selecione o PageControl e insira a ltima pgina. Nela voc deve colocar um


Label com o Caption Cdigo do Cliente, um Edit com o nome de EditCliente e
com o contedo da propriedade Text apagado. Insira tambm outro BitBtn, com
o Nome de BitBtnCliente e as mesmas configuraes dos outros dois. Voc
deve ter um TabSheet semelhante a este:

Adicione agora dois componentes Table (guia BDE) e um DataSource (guia


Data Access). Configure o primeiro Table para:
Propriedade
DatabaseName
Name
Table

Contedo
DBPedidos
TableClientes
Clientes.db

85

E o segundo para:
Propriedade
DatabaseName
Name
Table

Contedo
DBPedidos
TableClientes
Clientes.db

Altere o nome do DataSource para DSPedidos e aponte sua propriedade


DataSet para o TablePedidos.
Adicione os campos no TableClientes e ajuste as propriedades DisplayLabel e
crie um campo de Lookup chamado NomeCliente, da mesma forma como
fizemos no Cadastro de Pedidos.
Agora vamos iniciar a codificao. No evento OnCreate do Form, escreva o
seguinte:
TablePedidos.Open;
TableClientes.Open;
Height := 140; // define a "altura" do form

No evento OnDestroy, a codificao ser esta:


TablePedidos.Close;
TableClientes.Close;

No evento OnClick do BitBtnPedido codifique como as linhas destacadas


abaixo:
procedure TFormLocalizaPedidos.BitBtnNumPedidoClick(Sender: TObject);
var
NumPedido: Integer;
begin
if EditPedido.Text = '' then
begin
ShowMessage('Digite o nmero do Pedido!');
EditPedido.SetFocus; // posiciona na caixa de texto novamente
Exit; // retorna
end;
// agora devemos converter o texto digitado
// para um nmero inteiro
try
// converte string para inteiro
NumPedido := StrToInt(EditPedido.Text);
except
on EConvertError do // ocorreu um erro na converso
begin

86

ShowMessage(EditPedido.Text + ' no um nmero inteiro


vlido!');
EditPedido.Clear; // limpa o conteudo da caixa de texto
EditPedido.SetFocus;
Exit;
end;
end;
// Cancela qualquer definio de faixa de dados (filtragem)
TablePedidos.CancelRange;
// define que o indice usado ser a chave primria
TablePedidos.IndexName := '';
// Procura pelo nmero do pedido
if TablePedidos.FindKey([NumPedido]) then
begin
// aumenta o formulrio para exibir o DBGrid
// e os botes para selecionar ou cancelar
Height := 375;
// posiciona na "linha" 110 para garantir
// que os botes no fiquem abaixo da barra de tarefas
Top := 110;
// como s vai haver um pedido posiciona no botao para selecionar
BitBtnSelecionar.SetFocus;
end
else
begin
ShowMessage('Pedido no encontrado!');
EditPedido.SetFocus;
end;
end;

No evento OnClick do boto BitBtnData, devemos definir o seguinte cdigo:


// Cancela qualquer definio de faixa de dados (filtragem)
TablePedidos.CancelRange;
// define que o indice usado ser a data do pedido
TablePedidos.IndexName := 'IDataPedido';
// Exibe apenas os registros nesta faixa de datas
TablePedidos.SetRange([DateToStr(DTPickerInicial.Date)],[DateToStr(DTP
ickerFinal.Date)]);
if TablePedidos.Eof then // fim de arquivo
begin
TablePedidos.CancelRange;
ShowMessage('Nenhum pedido encontrado no perodo informado!');
DTPickerInicial.SetFocus;
end
else

87

begin
Height := 375;
Top := 110;
DBGridPedidos.SetFocus;
end;

O evento OnClick do BitBtnCliente deve ficar assim:


procedure TFormLocalizaPedidos.BitBtnClienteClick(Sender: TObject);
var
NumCliente: Integer;
begin
if EditCliente.Text = '' then
begin
ShowMessage('Digite o Cdigo do Cliente!');
EditCliente.SetFocus; // posiciona na caixa de texto novamente
Exit; // retorna
end;
// agora devemos converter o texto digitado
// para um nmero inteiro
try
// converte string para inteiro
NumCliente := StrToInt(EditCliente.Text);
except
on EConvertError do // ocorreu um erro na converso
begin
ShowMessage(EditCliente.Text + ' no um nmero inteiro
vlido!');
EditCliente.Clear; // limpa o conteudo da caixa de texto
EditCliente.SetFocus;
Exit;
end;
end;
if not TableClientes.FindKey([NumCliente]) then
begin
ShowMessage('Nenhum cliente cadastrado com o cdigo ' +
EditCliente.Text);
EditCliente.Clear; // limpa o conteudo da caixa de texto
EditCliente.SetFocus;
Exit;
end;
// Cancela qualquer definio de faixa de dados (filtragem)
TablePedidos.CancelRange;
// define que o indice usado ser a chave primria
TablePedidos.IndexName := 'ICliente';
// Exibe apenas os registros deste cliente
TablePedidos.SetRange([NumCliente],[NumCliente]);

88

if TablePedidos.Eof then // fim de arquivo


begin
TablePedidos.CancelRange;
ShowMessage('Nenhum pedido deste cliente!');
EditCliente.SetFocus;
end
else
begin
Height := 375;
Top := 110;
DBGridPedidos.SetFocus;
end;
end;

Selecione novamente o primeiro TabSheet (TabSheetNumPedido) pois o


TabSheet que estiver selecionado no momento da compilao o que estar
selecionado por padro.
V ao Form e defina a propriedade ActiveControl como EditPedido.
Selecione o PageControl e no evento OnChange escreva o seguinte:
Height := 140; // define a "altura" do form

Voc deve remover a criao automtica deste formulrio. O prximo passo a


chama-lo dentro do Cadastro de Pedidos. Para isso, v ao formulrio de
Cadastro de Pedidos. No menu File|Use unit selecione o form LocalizaPedidos.
No boto correspondente a opo procurar, digite o seguinte:
Application.CreateForm(TFormLocalizaPedidos, FormLocalizaPedidos);
if FormLocalizaPedidos.ShowModal = mrOK then
TablePedidos.GotoCurrent(FormLocalizaPedidos.TablePedidos);
FormLocalizaPedidos.Free;

Isto far com que o pedido localizado no form de procura seja selecionado (e
exibido) no formulrio de pedidos, atravs da sincronizao das posies dos
registros (mtodo GotoCurrent do Table).
Salve seu projeto e execute-o. Cadastre alguns pedidos, localize-os. Veja como
o aplicativo se comporta.

Comentando a codificao feita

89

Este form que criamos, quando chamado, exibir apenas a parte superior (o
PageControl). O usurio poder escolher atravs das pginas qual tipo de
procura deseja fazer. Caso alguma informao seja encontrada o DBGrid com
os dados e o Panel com os botes sero exibidos pois o formulrio ir alterar
seu tamanho. Caso ao invs de selecionar o item o usurio decidir alterar o tipo
de procura o mesmo reduzir seu tamanho novamente.
Para a localizao de informaes utilizamos basicamente dois mtodos do
Table, o Locate (para pesquisas flexveis, que permitam diferenciar ou no
letras maisculas e minsculas) e o FindKey (para procuras exatas, contidas
na chave primria ou em ndices secundrios). Ambos os mtodos retornam
True caso tenham encontrado a informao e False se no encontrarem.

Em nosso Form de Pedidos, utilizamos um Panel (PanelDados) com a


propriedade Enabled definida como False. Isso nos permite travar todos os
objetos que estejam contidos nele, impedindo que o usurio os acesse at que
alteremos o valor de Enabled para True.
A propriedade ReadOnly do DBGridItens tem o mesmo propsito, impedir
digitao quando o usurio estiver apenas visualizando o pedido. Voc deve
notar que ambos so ativados atravs de uma chamada ao mtodo que
criamos, o AtivarControles, que reproduzimos abaixo para facilitar o
entendimento:
procedure TFormCadPedidos.AtivarControles(Ativar: Boolean);
begin
PanelDados.Enabled := Ativar;
DBNavigatorPedidos.Enabled := (not Ativar);
DBGridItens.ReadOnly := (not Ativar);
SpdBtnIncluir.Enabled := (not Ativar);
SpdBtnAlterar.Enabled := (not Ativar);
SpdBtnExcluir.Enabled := (not Ativar);
SpdBtnGravar.Enabled := Ativar;
SpdBtnCancelar.Enabled := Ativar;
SpdBtnProcurar.Enabled := (not Ativar);
end;
Este mtodo/procedure pode receber um parmetro do tipo Boolean (lgico),
ou seja, True ou False. Ao invs de utilizarmos estruturas if de controle,
procuramos utilizar o valor passado diretamente, para ativar ou desativar os
controles. Assim, quando os botes de gravar e cancelar estiverem ativos, os
outros no estaro, por isso usamos (not Ativar). O PanelDados tambm
estar ativo para permitir que os dados seja digitados.
Vejamos o outro mtodo que criamos, o Recalcula Pedido:
procedure TFormCadPedidos.RecalculaPedido;
var
TmpTable: TTable;

90

Total: Currency; // armazena valores do tipo moeda


begin
// cria um objeto Table via codificao
TmpTable := TTable.Create(Application);
try
// define DatabaseName e TableName via codificao
TmpTable.DatabaseName := TableItens.DatabaseName;
TmpTable.TableName := TableItens.TableName;
TmpTable.Open;
TmpTable.FindKey([TablePedidosNumeroPedido.AsInteger]);
Total := 0; // inicializa a variavel totalizadora
while (not TmpTable.Eof) and
(TmpTable.FieldByName('NumeroPedido').AsInteger =
TablePedidosNumeroPedido.AsInteger) do
begin
// Acumula o Total da linha
Total := Total + (TmpTable.FieldByName('Preco').AsCurrency *
TmpTable.FieldByName('Quantidade').AsFloat);
TmpTable.Next; // prximo registro
end;
finally
TmpTable.Close; // fecha a tabela
TmpTable.Free; // libera objeto da memria
end;
StaticTextTotal.Caption := FormatCurr('###,###,##0.00', Total);
end;

Neste mtodo criamos um objeto Table (TmpTable) atravs de programao e


o associa a mesma tabela de Itens do pedido ao qual o TableItens esta
conectado. Procura pelo pedido atual e totaliza os registros. Note que
utilizamos uma estrutura de controle de excees (try..finally..end) para garantir
que a memria alocada com a criao do objeto table seja devolvida ao
Windows, quer a operao seja bem sucedida ou no. Isso garante que seu
programa seja mais robusto.
Um ltimo tpico a ser comentado o cdigo do boto de excluso:
if Application.MessageBox('Deseja excluir este pedido?','Confirme',
MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2) = IDNO then
Exit; // retorna (sem fazer nada)
// devemos excluir os itens primeiro, para no termos
// registros rfos
try
TableItens.First; // posiciona no primeiro item
while not TableItens.Eof do // executa at o fim do arquivo
begin
TableItens.Delete; // exclui o item
TableItens.First;

91

end;
TablePedidos.Delete; // exclui o pedido
except
ShowMessage('Ocorreu um erro durante a excluso do pedido');
end;

A idia que voc deve excluir primeiro os itens (filhos) antes de excluir o
pedido (pai), pois caso algum dos filhos no possa ser excludo, por algum
estar utilizando ou algo assim (no caso do sistema estar em rede) voc teria
registros rfos na sua tabela. A estrutura de controle de exceo
try..except..end foi utilizada para informar interromper a execuo (no excluir
mais) e avasar caso ocorra algum erro. Se nenhum problema ocorrer, a
mensagem no exibida.

Exerccios
1)
2)
3)
4)
5)

Quais so os principais mtodos de pesquisa do componente Table?


Como podemos alterar dinamicamente o tamanho de um formulrio?
Qual a funcionalidade do componente PageControl?
Para que serve as estruturas de controle de exceo try..finally..end?
Qual o mtodo utilizado para sincronizar a posio de registro de dois
componentes Table configurados para acessar a mesma tabela?

92

Captulo 7

Criando Relatrios e Listagens


Para criar um relatrio, insira um novo Form no seu projeto. Defina o Name
para FormListagemProdutos.
V at a guia QReport, selecione o primeiro componente e coloque em seu
form. Este componente criar uma espcie de folha de desenho, deixando-o
como na figura abaixo:

Defina o Name o objeto QuickReport para QuickRepProdutos. Na propriedade


ReportTitle escreva Listagem de Produtos.
Insira um Table, altere o Name para TableProdutos e configure-o para acessar
nossa tabela de produtos. Retorne ao QuickRepProdutos e na propriedade
DataSet selecione o TableProdutos.
Clicando com o boto da direita sobre este componente, selecione no menu de
contexto a opo Report Settings. Ser exibida uma caixa de dilogo que
permitir definir o tamanho do papel, seu lay-out (retrado ou paisagem),
margens, etc.

93

No grupo Bands selecione Page header, Detail band e Page footer, clicando
em seguida no OK. Isso introduzir trs bands (reas de relatrio) j
configurados para exibir cabealho, rea de dados e rodap. (Tambm
possvel inserir e configurar as bands manualmente, atravs do componente
QRBand que se encontra na mesma guia).

Insira no topo do primeiro band (baixa) um componente QRSysData, configure


a propriedade Data para qrsReportTitle, Aligment para taCenter e AlignToBand
como True. Altere a fonte (propriedade Font) para Arial, Negrito tamanho 16.
Aumente a altura deste primeiro band (utilizando o mouse) para abrir espao
para os outros itens.
Insira quatro componentes QRLabel na primeira band (faixa), definindo seus
captions respectivamente para Cdigo, Descrio, Preo e Unidade.
No band do meio, insira quatro componentes QRDBText e configure a
propriedade DataSet de todos eles para TableProdutos. Depois selecione na
propriedade DataField o campo correspondente (Codigo, Descricao, Preco e
Unidade).

94

Na ltima band, adicione um componente QRSysData configurando a


propriedade Data para qrsPageNumber, e a propriedade Text para Pgina:
Altere tambm Alignment para taRightJustify e AlignToBand para True.
Retorne ao FormListagemPedidos e no evento OnCreate insira a linha:
TableProdutos.Open;
Insira tambm no evento OnClose a instruo complementar para fechar a
tabela:
TableProdutos.Close;
Salve-o com o nome de ListagemPedidos. Remova a criao automtica.
V at o formulrio principal e acione no menu da aplicao a opo para
Produtos|Listagem e insira as linhas abaixo:
Application.CreateForm(TFormListagemProdutos,FormListagemProduto);
FormListagemProdutos.QuickRepProdutos.PreviewModal;
FormListagemProdutos.Free;
Observe que no chamamos Formulrio.Show nem Formulrio.ShowModal,
estamos acessando o componente QuickReport. O mtodo PreviewModal
responsvel por exibir uma janela de visualizao de impresso (Idem ao
mtodo Preview, mas PreviewModal bloqueia a execuo de outras rotinas at
que seja fechado). Se quisssemos fazer a impresso diretamente,
utilizaramos o mtodo Print no lugar de PreviewModal ou Preview.
Uma melhoria que voc poderia fazer seria criar um formulrio com dois botes
e chamar seu relatrio a partir deste outro formulrio. Um boto para Imprimir e
outro para Visualizar.
Agora voc deve ter condies de criar as outras listagens tambm. Tente
fazer a listagem de Clientes e de Pedidos. Para a listagem de pedidos voc ir
precisar configurar dois componentes Table, como fizemos no
FormProcuraPedido, para que o nome do cliente possa ser exibido.
Explicarei apenas a Impresso do Pedido, por possuir detalhes que no
aprendemos ainda.

Criando a impresso do Pedido

95

Para a criao da Impresso do Pedido, o procedimento semelhante ao


anterior, no entanto, no Report Settings ao invs de selecionarmos o Page
footer selecionamos a band Summary, que ser responsvel por fazer a
totalizao de todos os itens. Sero necessrios quatro componentes Table,
um para cada tabela que possumos. A configurao dos Tables a mesma
utilizada no cadastro de pedidos, a nica diferena que no criamos o campo
Calculated no TableItens. Se voc deseja, pode selecionar os componentes
Table e o DataSource DSPedidos, copi-los (Ctrl + C), vir at o form que voc
est criando para a impresso do pedido e cola-lo (Ctrl+V). Assim, s ser
necessrio excluir o campo Calculated (Total) do TableItens. Para praticar voc
deveria inserir os Tables e o DataSource tentar configura-los segundo as
instrues do cadastro de pedidos, no se esquecendo de interligar as tabelas
de Pedidos e itens atravs das propriedades MasterSource e MasterFields,
como fizemos l.
O segredo deste relatrio est nos componentes que aparecem circulados na
figura. So componentes QRExpr, que permite a digitao de frmulas e
expresses. Insira um na band detail (do meio) e na propriedade Expression
digite: TableItens.Quantidade * TableItens.Preco.
Isso far com que o total seja calculado. Voc tambm pode definir uma
mscara na propriedade Mask, usando o seguinte: ###,###,##0.00
Assim, teremos a separao de decimais e milhar. Por se tratar de valor, voc
deveria alinha-lo pela direita, isso feito na propriedade Alignment, definindo-a
como taRightJustify. (Pode fazer o mesmo para os campos quantidade e preo.
Na band summary (terceira) insira o mesmo componente, com as mesmas
configuraes, alterando apenas o contedo em Expression para:
SUM(TableItens.Quantidade * TableItens.Preco)
Esta expresso ir fazer uma somatria de todas as linhas com esta frmula
(quantidade x preo).
Defina o Name do Form para FormImprimePedido. Insira no evento OnCreate o
seguinte cdigo:
// abre as tabelas
TableProdutos.Open;
TableClientes.Open;

96

TablePedidos.Open;
TableItens.Open;

E no evento OnDestroy este outro:


// fecha as tabelas
TableProdutos.Close;
TableClientes.Close;
TablePedidos.Close;
TableItens.Close;
Salve este formulrio como ImprimePedido.pas. Remova sua criao
automtica e na opo correspondente no menu do FormPrincipal digite o
cdigo em destaque:
procedure TFormPrincipal.mnuImpPedClick(Sender: TObject);
var
NumPedido: Integer;
Texto: String;
begin
Application.CreateForm(TFormImprimePedido,FormImprimePedido);
if (FormCadPedidos <> NIL) and
(FormCadPedidos.TablePedidosNumeroPedido.AsInteger > 0) then
NumPedido := FormCadPedidos.TablePedidosNumeroPedido.AsInteger
else
begin
Texto := '';
if InputQuery('Digite o nmero do Pedido',
'Impresso de Pedido',Texto) then
begin
try
NumPedido := StrToInt(Texto);
except
ShowMessage('Nmero invlido!');
// libera o formulario de relatorio
FormImprimePedido.Close;
Exit;
end;
end
else
begin
FormImprimePedido.Close;
Exit;
end;
end;
if not FormImprimePedido.TablePedidos.FindKey([NumPedido]) then
begin
ShowMessage('Pedido no encontrado!');

97

FormImprimePedido.Close;
Exit;
end;
FormImprimePedido.QuickRepPedidos.PreviewModal;
FormImprimePedido.Free;
end;

Salve o projeto e execute. Voc notar que se chamar este relatrio com o
cadastro de pedidos aberto, ele apresentar a visualizao do pedido
atualmente selecionado. Se o mesmo estiver fechado, ser solicitado o nmero
do pedido a ser impresso/visualizado.

Criando uma caixa de dilogo sobre o sistema


Clique no boto New do SpeedBar e na caixa de dilogo New Itens, selecione
a pgina Forms. Escolha o objeto AboutBox e clique em OK.

Ser criado um Form semelhante ao d figura anterior. Altere o Name para


FormSobre, o Caption para Sobre e no evento OnClose do mesmo digite o
seguinte:
Action := caFree;
FormSobre := NIL;

Utilize os Labels para digitar seus dados. E modifique as fontes como achar
mais adequado. Veja exemplo abaixo:

98

Criando uma barra de Ferramentas


V at a guia Win32 e insira no FormPrincipal um componente ToolBar e um
componente ImageList.
Clique com o boto da direita do mouse sobre o componente ToolBar (que se
alinhou automaticamente na parte superior do Form, logo abaixo do menu) e
escolha a opo New Button no menu de contexto.
Repita este procedimento mais duas vezes, inserindo mais dois botes. Clique
novamente com o boto da direita do mouse e escolha a opo New Separator.
Repita a operao inserindo mais um boto.
O componente ImageList responsvel por manter uma lista de figuras que
pode ser associada a menus e barras de ferramenta.
D um clique duplo no componente ImageList para abrir a caixa de dilogo
para incluso de figuras (cones e bmp).

99

Para inserir um cone/bmp, clique no boto Add. Selecione quatro cones ou


bmp (pequenos, especficos para boto) para o Cadastro de Clientes,
Produtos, Pedidos e uma Calculadora (existe uma no diretrio do Delphi). As
figuras que usamos nos BitBtn tambm servem, mas por possurem duas
imagens (e consequentemente o dobro da largura) voc deve aceitar que o
ImageList as desmembre em duas figuras. Neste caso voc exclui a ltima
selecionando-a e clicando em Delete. Quando inserir todas as imagens clique
em OK.
Altere a propriedade Images do ToolBar, apontando para o componente
ImageList.
V ao Object Inspector e no evento OnClick dos trs primeiros botes aponteos para o evento OnClick das opes de menu correspondentes (CadCli,
CadProd e CadPed. Para o ltimo boto, o da calculadora, d um duplo clique
sobre o boto ou acione o evento OnClick no Object Inspector e insira o
seguinte cdigo:
WinExec('CALC.EXE',0);

WinExec uma funo da API do Windows, responsvel por executar outros


programas. Este comando far com que a calculadora do Windows seja
chamada. Voc pode fazer o mesmo com o Bloco de Notas (NotePad.exe), o
Word (WinWord.exe) ou qualquer outro aplicativo de seu micro. Dependendo
do programa o Windows pode no localiza-lo, neste caso seria necessrio
informar o Path (caminho) completo. Por exemplo, para chamar o Delphi:
WinExec('C:\Arquivos de Programas\Borland\Bin\Delphi.exe',0);

100

Exerccios:
1)
2)
3)
4)
5)

Para que serve o Componente ImageList?


Qual o Componente responsvel pela criao de relatrios?
Para que serve o componente QRExpr?
Como so construdos os relatrios?
Para que serve a funo WinExec?

101

Apndice A

Object Pascal: Estruturas Bsicas


Palavras reservadas
As palavras reservadas independente de qualquer biblioteca, fazem
parte do ncleo da linguagem, e por isso so utilizadas por qualquer
compilador Delphi. Normalmente elas esto em evidencia no programa
(negrito).
Palavra
Begin
End
Type
Var
Uses
Class
Implementatio
n

Interface

Do
while
for
if
else
Case
Then
Public
Private
Protected

Unit
Array
Of
Repeat
Until

Descrio
Incio de bloco de programa.
Fim de Bloco de Programa.
Definio de tipos.
Definio de variveis.
Definio de bibliotecas.
Definio de classes.
Seo da unidade, onde esto todas as definies da
mesma, variveis, tipos, constantes, bibliotecas, etc., que so
privadas unidade. Alm isso est todo o cdigo dos
mtodos da unidade.
Seo da unidade, onde esto todas as definies da
mesma, variveis, tipos, constantes, bibliotecas, etc., que
sero tornadas pblicas pela unidade.
Comando interno de execuo de algum outro comando.
Comando de repetio.
Comando de repetio.
Comando de seleo.
Comando de exceo a uma seleo.
Comando de seleo.
Comando de auxiliar de seleo.
Propriedades e Mtodos que podem ser acessados por
qualquer unidade do programa.
Propriedades e Mtodos que s podem ser acessados pela
prpria unidade.
Propriedades e Mtodos que podem ser acessados apenas
pela prpria unidade e pelos mtodos das unidades derivadas
desta.
Chave para a declarao do nome da unidade.
Palavra para a definio de vetores.
Comando auxiliar para definies de tipos.
Comando de Repetio.
Comando auxiliar na repetio.

102

With

Comando utilizado para referir-se a um registro de um objeto


de forma direta.

Tipos de Dados
Tipos Inteiros
Tipo
Shortint
Smallint
Longint
Byte
Word
Integer
Cardinal
Integer
Cardinal

Domnio
-128 127
-32768 32767
-2147483648 2147483647
0 255
0 65535
-32768 32767
0 65535
-2147483648 2147483647
0 2147483647

Tamanho
1
2
4
1
2
2
2
4 (32-bits)
4 (32-bits)

Tipos Booleanos
Tipo
Boolean
ByteBool
WordBool
LongBool

Descrio
1 byte, assume apenas valores TRUE ou FALSE
um byte com caractersticas booleanas, 0(FALSE) e
diferente de 0 (TRUE)
um Word com caractersticas booleanas, 0(FALSE) e
diferente de 0 (TRUE)
um Longint com caractersticas booleanas, 0(FALSE) e
diferente de 0 (TRUE)

Tipos Caracteres
Tipo
Char
String

Descrio
1 byte, caracter
n bytes, caracteres

Tipos Reais
Tipo
Real
Single
Double
Extended
Comp
Currency

Domnio
2.9 x 10-39 1.7 x 1038
1.5 x 10-45 3.4 x 1038
5.0 x 10-324 1.7 x 10308
3.4 x 10-4932 1.1 x 104932
-263+1 263 -1
-922337203685477.5808
922337203685477.5807

Alg. Sig. Tam.


11-12
6
7-8
4
15-16
8
19-20
10
19-20
8
19-20
8

Definio de Arrays
Um array um vetor de dados de um determinado tipo. Ele representa
uma lista com uma determinada caracterstica, e definido no Delphi da
mesma forma como era definido no Pascal.

103

Var
Nome_da_varivel: array[1..n] of Tipo_da varivel; // ou
Nome_da_varivel: array[1..n,1..m,1..x,..] of Tipo_da varivel; // Para
matrizes

Ex.:
X: array[1..10] of Integer; // Vetor de 10 elementos inteiros
S: array[1..50] of Double; // Vetor de 50 elementos reais
M: array[1..10,1..20] of Boolean; // Matriz booleana de 10x20

Comentrios
Comentrio de Uma linha: // comentrio
Comentrios de vrias linhas { comentrio }

Formas de Atribuio
O Delphi utiliza a mesma forma de atribuio do Pascal ( := ). A nica
diferena que a atribuio foi estendida aos objetos e aos novos tipos do
Delphi.
Ex.:
X := 10 + Y;
Form1 := Form2; Operadores:
O Delphi Possui uma estrutura de operadores muito parecida com a do
pascal, apenas com a incluso de alguns novos operadores.

Operadores
Operadores Aritmticos
Operado
r
+

Operao

Subtrao

Multiplica
o
Diviso

/
Div
Mod

Adio

Diviso
inteira
Resto da
diviso
inteira

Tipos
Usados
Inteiros
Reais
Inteiros
Reais
Inteiros
Reais
Inteiros
Reais
Inteiros

Tipos
Resultantes
Inteiro
Real
Inteiro
Real
Inteiro
Real
Real
Real
Inteiro

Inteiros

Inteiro

104

Operadores Unrios
Operado
r
+
-

Operao

Tipos
Usados
Inteiros
Reais
Inteiros
Reais

Identidade
do sinal
Negao
de sinal

Tipos
Resultantes
Inteiro
Real
Inteiro
Real

Operadores Lgicos (Bit a Bit)


Operado
r
Not
And
Or
Xor

Shl
Shr

Operao

Tipos
Usados
Inteiros
Inteiros
Inteiros
Inteiros

Tipos
Resultantes
Booleano
Booleano
Booleano
Booleano

Inteiros

Booleano

Inteiros

Booleano

Tipos
Usados
Booleanos
Booleanos
Booleanos
Booleanos

Tipos
Resultantes
Booleano
Booleano
Booleano
Booleano

Negao
E
OU
OU
Coincidente
(Exclusivo)
Shift para a
esquerda
Shift para a
direita

Operadores Booleanos
Operado
r
Not
And
Or
Xor

Operao
Negao
E
OU
OU
coincidente

Operadores Relacionais
Operado
r
=

Operao

Tipos Usados

Igual

Tipos simples compatveis, de


classe, referencia de classe,
ponteiros, conjunto, string ou
string empacotado.

Operado
r
<>

Operao

Tipos Usados

Diferente
de

Tipos simples compatveis, de


classe, referencia de classe,
ponteiros, conjunto, string ou
string empacotado.

Tipos
Resultantes
Booleano

Tipos
Resultantes
Booleano

105

<

>

<=

>=

<=
>=
In

Is

Menor que Tipos


simples
compatveis,
strings ou string empacotado ou
Pchar
Maior que Tipos
simples
compatveis,
strings ou string empacotado ou
Pchar
Menor ou Tipos
simples
compatveis,
igual
strings ou string empacotado ou
Pchar
Maior ou Tipos
simples
compatveis,
igual
strings ou string empacotado ou
Pchar
Subconjunt Tipos de conjuntos compatveis
o de
Superconju Tipos de conjuntos compatveis
nto de
Membro de Operando da esquerda, qualquer
tipo ordinal;
Operando da direita, conjunto
cuja base seja compatvel com o
operando da esquerda
Compatvel Tipos
de
conjuntos,
mais
a
especificamente classes

Booleano

Booleano

Booleano

Booleano

Booleano
Booleano
Booleano

Booleano

Operadores Especiais
Operado
r
@
As

Operao
Atribuio
Relao

Tipos
Usados
Qualquer
Classes

Tipos
Resultantes
Ponteiro
Classe

Precedncia dos Operadores


Precednci Operadores
a
Primeiro
@, not, -(unrio)
Segundo
*,/, div, mod, and, shl, shr,
as
Terceiro
+,-,or, xor
Quarto
=, <, >, <=, >=, in, is

Comandos de seleo
If Then
O if a estrutura de seleo mais simples que existe, e est presente
em todas as linguagem de programao. Nele, uma condio testada, se for

106

verdadeira ira executar um conjunto de comandos, se for falsa, poder ou no


executar um outro conjunto de comandos. A sua estrutura bsica :
If condio Then
Begin
Comandos executados se a condio for verdadeira;
End
Else
Comandos serem executados se a condio for falsa;
Ex.:
If x=0 Then
Write(x zero);

If x=0 Then
Write(x zero);
Else
Write(x no zero);
A utilizao dos marcadores de incio e fim (Begin e End), e considerada
opcional, se for executado apenas um nico comando. O If ainda permite o
encadeamento de Ifs.
Ex.:
If x=0 Then
Write(X zero);
Else
If x>0 Then
Write(X positivo);
Else
Write(X negativo);

Case
A instruo case consiste em uma expresso usada para selecionar um
valor em uma lista de possveis valores, ou de faixa de valores. Estes valores
so constantes e devem ser nicos e de tipo ordinal. Finalmente pode haver
uma instruo else que ser executada se nenhum dos rtulos corresponder ao
valor do seletor. O seu formato bsico :
Case Seletor of
Const1: Begin
Comandos referentes a constante 1.
End;
Const2: Begin
Comandos referentes a constante 2.
End;
Faixa1..Faixa2: Begin
Comandos referentes a Faixa de valores.
End;
Else
Comandos referentes ao else
End;

107

Ex.:
Case Numero of
1: texto := um;
2: texto := dois;
3: texto := trs;
end;

Case MeuChar of
+: Texto := Sinal de mais;
-: Texto := Sinal de Menos;
0..9: Texto := Nmeros;
else
Begin
Texto := Caracter desconhecido;
Meuchar := ?;
End;

A utilizao dos marcadores de incio e fim (Begin e End), e considerada


opcional, se o caso for executar apenas um nico comando. O case ainda pode
ser encadeado, ou seja um case dentro do outro.

Comandos de repetio
For
O loop for no Pascal baseia-se estritamente em num contador, o qual
pode ser aumentado ou diminudo cada vez que o loop for executado. O
contador inicializado, e o loop ir se repetir enquanto o contador no chegar
ao fim da contagem. O seu formato bsico :
For contador := inicio_da_contagem to fim_da_contagem do
Begin
Comandos;
End;
Ex. aumentando:
K := 0;
For i:=1 to 10 do
K := K + i;

Ex. diminuindo:
K := 0;
For i:=10 downto 1 do
K := K + i;

A utilizao dos marcadores de incio e fim do loop (Begin e End), e


considerada opcional, se o loop for executar apenas um nico comando. O for
ainda pode ser encadeado, ou seja um for dentro do outro:
Ex.:
K := 0;
W:= 0;
For i:=1 to 10 do
For j:=1 to 10 do
K := K + i * j;

108

While
O while um comando de repetio que no possui controle de um
contador e que testa a condio antes de executar o prximo loop. Este loop ir
se repetir enquanto a condio for verdadeira. A sua forma bsica :
While condio
Begin
Comandos;
End;
Ex.:
I:=10;
J:=0;
While I>J do
Begin
I := I 1;
J := J + 1;
End;
No caso do while, as regras do for para os marcadores de incio e fim do
loop e a do encadeamento, tambm so vlidas.

Repeat Until
O Repeat um comando de repetio que no possui controle de um
contador e que testa a condio depois de executar o loop. Este loop ir se
repetir at que a condio seja verdadeira. A sua forma bsica :
Repeat
Comandos;
Until condio
Ex.:
I:=10;
J:=0;
Repeat
I := I 1;
J := J + 1;
Until J>I;
No caso do Repeat, as regras do for para os marcadores de incio e fim
do loop e a do encadeamento, tambm so vlidas.

Procedimentos e funes
Um conceito importante que integra linguagens como o Pascal, e
consequentemente o Object Pascal do Delphi, o da sub-rotina. No Pascal as
subrotinas podem assumir duas formas diferentes: procedimentos ou funes.
A nica diferena real entre as duas, que as funes tm um valor de retorno,
enquanto os procedimentos no. Abaixo est a sintaxe do Pascal para
procedimentos e funes:

109

Procedure ola;
Begin
ShowMessage( Ol !);
End;

Function Dois: Integer;


Begin
Result := 2;
End;

Os procedimentos e funes podem ainda ter parmetros de entrada de


qualquer tipo definido.
Procedure
ImprimeMensagem Function Duplo (valor: Integer): Integer;
(Mens: string);
Begin
Begin
Result := valor * 2;
ShowMessage(Mens);
End;
End;
Estes parmetros de entrada, podem ainda ser de passagem por valor,
como o visto nos exemplos acima, ou de passagem por referncia, como o
visto abaixo:
Procedure ImpMens (Var Mens: Function Duplo (Var valor: Integer):
string);
Integer;
Begin
Begin
ShowMessage(Mens);
Duplo := valor * 2;
End;
Valor := 0;
End;

Definies bsicas da Orientao ao Objetos


Se voc olhar o mundo real, nosso idioma tem dois componentes
principais: substantivos (objetos) e verbos(operaes). Para que nossas
aplicaes reproduzam a realidade, nossa linguagem de computador precisa
fazer o mesmo. A maioria das linguagens tradicionais tem uma grande
variedade de operaes que pode efetuar, mas um pequeno conjunto de
substantivos para descrever os objetos.
Como voc define um objeto? Um objeto uma entidade que tem um
estado; isto , tem algum valor. O comportamento de um objeto definido
pelas aes que ele sofre e vice-versa. Todo objeto , na verdade, uma
instncia de alguma classe de objetos.
O objetivo da Orientao a Objetos que cada mdulo do sistema
represente um objeto ou uma classe de objetos do mundo real. Um programa
que implementa um modelo de realidade pode, assim, ser visto como um
conjunto de objetos que interage com o outro. Voc pode projetar um sistema
usando essa mentalidade orientada a objetos, segundo estes passos:
1. Identificar os objetos e seus atributos
2. Identificar as operaes que afetam cada objeto, e as operaes que
cada objeto deve iniciar

110

3. Estabelecer a visibilidade de cada objeto em relao aos outros


objetos.
4. Estabelecer a interface de cada objeto.
5. Implementar cada objeto.

Classes e objetos
Estes so dois termos que freqentemente so erroneamente utilizados.
Esclarecendo isto, as suas definies so as seguintes:
Uma classe um tipo de dado definido pelo usurio, o qual tem um
estado,
uma
representao
e
algumas
operaes
ou
comportamentos. Uma classe tem alguns dados internos e alguns
mtodos, na forma de procedimentos e funes. Uma classe
usualmente descreve as caractersticas genricas e o comportamento
de uma srie de objetos muito semelhantes. As classes so usadas
pelo programador para organizar o cdigo fonte e pelo compilador
para gerar o aplicativo.
Um objeto uma instancia de uma classe, ou, usando outras
palavras, uma varivel do tipo de dados definido pela classe.
Objetos so entidades reais. Quando o programa executado, os
objetos ocupam parte da memria para a sua representao interna.

Propriedades, Mtodos e Eventos


Pela definio da orientao objetos de uma classe, ela pode conter
mtodos, propriedades, mtodos e eventos. As propriedades so os atributos
que definem a classe (so as variveis do Pascal). Os mtodos so as
operaes que a classe pode realizar, nas quais o programador tem o controle
de sua execuo (so os procedimentos e funes do Pascal). Os eventos so
as operaes que a classe pode realizar, nas quais o programador no tem o
controle sobre a sua execuo. A chamada da execuo de um evento feita
pelo prprio sistema operacional (Windows 95 ou NT). Cada classe pode
conter suas propriedades, mtodos e eventos especficos, mas nas classes
definidas pelo Delphi existem algumas propriedades e eventos, que so bem
comuns a grande maioria. Entre eles esto:

Propriedades genricas:
Propriedade
Caption

Color

Cursor
Enable
Font
Height

Descrio
String que se refere ao objetivo da classe.
Esta string mostrada no componente
relacionado a classe.
Cor atribuda a classe. Em alguns casos
ela est relacionada com a cor de fundo do
componente.
Tipo de cursor a ser mostrado quando o
mouse estiver sobre o componente
Se o componente esta habilitado ou no
Fonte de letra utilizado pela classe
Altura do componente, em relao ao Top

Valores
String

Cor

Cursor
True, False
Fonte de letra
Integer

111

Propriedade
Hint

Descrio
String que aparece sobre um componente,
quando o mouse fica algum tempo parado
sobre este.
Posio esquerda do componente. Se o
componente for um form, este ser em
relao a tela, se for outro qualquer, ser
em relao ao form aonde ele estiver.
Nome da propriedade para o cdigo
Habilita ou desabilita o Hint
Posio superior do componente. Se o
componente for um form, este ser em
relao a tela, se for outro qualquer, ser
em relao ao form aonde ele estiver.
Torna a classe visvel ou Invisvel
Largura do componente, em relao ao
Left.

Left

Name
ShowHint
Top

Visible
Width

Valores
String

Inteiro

Nome
True, False
Inteiro

True, False
Integer

Eventos genricos:
Evento
OnClick
OnClose
OnCreate
OnDblClick
OnExit
OnKeyPress
OnMouseMove
OnShow

Descrio
executado quando o mouse clicado encima do
componente
executado quando um form fechado
executado logo aps a criao do componente.
executado quando o mouse clicado duas vezes
consecutivas sobre o componente
executado no termino do programa.
executado quando o componente esta selecionado e
alguma tecla for apertada.
executado quando o mouse se movimenta sobre o
componente.
executado antes de exibir o componente

Cdigo bsico
unit Unit1;

// Nome da unidade

interface

// Inicio da unidade

uses
// Bibliotecas Adicionadas
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
// Tipos definidos
TForm1 = class(TForm) // Definio de uma Classe
private

112

{ Definio dos mtodos e propriedades privados unidade }


public
{ Definio dos mtodos e propriedades pblicos }
end;
var
// Variveis definidas
Form1: TForm1;
implementation // Incio do fonte dos mtodos da unidade
{$R *.DFM}

// Cdigo declara a existncia de um form relacionado ao cdigo


// da unidade. Este form ter o mesmo nome da unidade, mas

com
// a extenso DFM.
// Espao destinado ao cdigo fonte dos mtodos da unidade.
end.

// ltima linha da unidade

Relaes de uma Classe


Forma de uma classe no Object Pascal
Uma classe deve ser definida dentro da seo de tipos (Type). O cdigo
desta classe ser implementado dentro da seo (Implementation) da mesma
unidade. Nenhuma parte do cdigo desta classe pode estar em outra unidade.
Na definio dos mtodos e propriedades de uma classe, podemos
consider-los pblicos, privados ou protegidos. A finalidade disto a de tornar
a classe mais fcil de utilizar, pois estaremos escondendo aquele cdigo
auxiliar que desinteressante ao usurio da nossa classe, bem como traz
consigo tambm o aspecto segurana da classe, pois poderemos deixar visvel
somente as propriedades e mtodos que a nossa classe possu total controle.
Abaixo esta a forma com deve ser definida uma classe na linguagem Object
Pascal.
NomeDaClasse = class
public
{ Definio dos mtodos e propriedades pblicos }
private
{ Definio dos mtodos e propriedades privados unidade }
protected
{ Definio dos mtodos e propriedades protegidos }
end;

113

O construtor
O construtor o evento de uma classe que executado no momento da
criao do objeto. Este evento normalmente utilizado para a inicializao, e
pode ter qualquer quantidade de parmetros de entrada, e nenhum parmetro
de sada.
Ex.:
Data = Class
Dia, Mes, ano: Integer;
Constructor init(d, m, a: Integer);
Procedure Ledata(Var d,m,a: Integer);
Procedure gravadata(d,m,a: Integer);
End;
Um construtor pode ter qualquer nome, e cada classe pode ter apenas
um construtor.

O destrutor
O destrutor o evento de uma classe que executado no momento do
fechamento do objeto. Este evento normalmente utilizado para a liberao de
memria alocada dinamicamente pelo objeto. Ele no possui parmetros de
entrada ou sada:
Ex.:
Data = Class
Dia, Mes, ano: Integer;
Constructor init(d, m, a: Integer);
Procedure Ledata(Var d,m,a: Integer);
Procedure gravadata(d,m,a: Integer);
Destructor destroi;
End;

Mtodos estticos, dinmicos e virtuais


Os mtodos do Object Pascal usualmente baseia-se na ligao esttica.
Isto significa que uma chamada de mtodo resolvida pelo compilador e pelo
linkeditor. Eles Substituem a chamada por uma chamada localizao de
memria especfica em que a funo ou procedimento reside, a qual
conhecida como endereo da funo.
As linguagens orientadas a objetos, permitem o uso de outra forma de
ligao conhecida como ligao dinmica. Neste caso, o endereo de fato a ser
chamado determinado em tempo de execuo. A vantagem desta abordagem
conhecida como poliformismo, como veremos mais adiante.
Existem duas formas de se realizar esta ligao dinmica, a ligaes do
tipo dynamic e virtual. Elas so equivalentes sendo a sua nica diferena a
implementao da forma de chamada dos mtodos em tempo de execuo.
Esta diferena faz com que o mtodo virtual tenham um melhor desempenho
em termos da velocidade, que o do mtodo dynamic. Em contrapartida o
mtodo dynamic geram um cdigo executvel menor. Em modo geral o
mtodo virtual a forma mais eficiente para a implementao do poliformismo.
Mtodos do tipo dynamic so utilizados somente em situaes onde a classe

114

bsica declara um nmero muito grande de mtodos no estticos, e a


aplicao declara um nmero muito grande de classes descendentes com
pouca utilizao do poliformismo.

Relaes entre Classes


Uma classe pode acessar mtodos de outra classe, desde que estes
sejam do tipo pblico, colocando-se o nome completo, ou seja, o nome da
classe ponto o nome do mtodo (MinhaClasse.Meumetodo).

Herana
A herana um dos recursos mais poderosos de uma linguagem
orientada a objetos. Ela permite que as classes secundrias assumam as
propriedades de suas classes principais. Elas herdam propriedades, mtodos e
eventos de sua classe principal, a classe secundria pode acrescentar novos
componentes naqueles que herdam. Isso permite que voc peque uma classe
que tenha praticamente todas as partes fundamentais de que precisa, e insira
novos objetos que a personalizam exatamente de acordo com suas
necessidades.
Quando uma classe secundria herda propriedades de uma primria, a
classe secundria ter acesso a todas as propriedades, mtodos e eventos,
que forem pblicos ou protegidos.

Inherit
Esta uma palavra reservado do Object Pascal que utilizada antes de
um mtodo. Ela pode ser utilizada quando uma classe secundria, possui um
mtodo com o mesmo nome de um da classe primria. Neste caso se nos
quisermos acessar o mtodo da classe primria teremos que utilizar o Inherit
antes deste mtodo.

Override
Esta uma palavra reservada do Object pascal que utilizada aps um
mtodo quando em uma classe secundria, queremos redefinir uma funo
definida em uma classe primria. Baseado nas definies de override e das
ligaes dinmicas e que se define o poliformismo.

Poliformismo
O poliformismo um recurso das linguagens orientadas a objetos, que
literalmente indica a capacidade de um objeto assumir vrias formas. Em
outras palavras, o poliformismo permite que voc referencie propriedades e
mtodos de classes diferentes por meio de um mesmo objeto. Ele tambm
possibilita que voc execute operaes com esse objeto de diferentes
maneiras, de acordo com o tipo de dado e com a classe atualmente associada
a esse objeto.

115

Por exemplo, posso declarar um objeto genrico da classe caixa


(digamos Minhacaixa) e ento associar a ele objetos da classe
Tcaixadeferramentas ou Tcaixadedinheiro. Agora suponhamos que cada classe
tenha um procedimento Open, cada um deles com uma implementao
diferente. Esse mtodo deve usar a ligao dinmica, isso significa declar-la
na classe-pai como virtual ou dynamic e redefini-la como override na classefilha.
Quando voc aplica o mtodo Open a MinhaCaixa, o que acontece?
chamado o procedimento Open do tipo atual do objeto. Se Minhacaixa for
atualmente um objeto Tcaixadedinheiro, a caixa ser aberta mediante uma
senha secreta, se for Tcaixadeferramentas a caixa ser simplesmente aberta.

116

Descrio dos Principais Procedimentos e Funes Pr


definidas
procedure Beep;
Toca um beep
procedure ChDir(S: string);
Troca o diretrio corrente para o diretrio especificado em S.
Ex.:
begin
{$I-}
{ Muda para o diretrio especificado em Edit1 }
ChDir(Edit1.Text);
if IOResult <> 0 then
MessageDlg('Diretrio no encontrado', mtWarning, [mbOk], 0);
end;

function Chr(X: Byte): Char;


Retorna o caracter com o cdigo ASCII X
Ex.:
begin
Canvas.TextOut(10, 10, Chr(65));
end;

{ A letra 'A'}

function Concat(s1 [, s2,..., sn]: string): string;


Concatena as strings
Ex.:
var
S: string;
begin
S := Concat('ABC', 'DEF');
end;

{ 'ABCDE' }

function Copy(S: string; Index, Count: Integer): string;


Retorna uma substring de S, comeando a partir de Index e tendo Count
caracteres
Ex.:
var S: string;
begin
S := 'ABCDEF';
S := Copy(S, 2, 3); { 'BCD' }
end;

function CreateDir(const Dir: string): Boolean;


Cria um novo diretrio e retorna o sucesso da operao

117

function Date: TDateTime;


Retorna a Data atual
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := 'Hoje ' + DateToStr(Date);
end;

function DateToStr(Date: TDateTime): string;


Converte Data para String
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := DateToStr(Date);
end;

function DayOfWeek(Date: TDateTime): Integer;


Retorna o dia da semana especificado entre 1 e 7, onde domigo um e
Sbado 7
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
var
ADate: TDateTime;
begin
ADate := StrToDate(Edit1.Text);
Label1.Caption := IntToStr(DayOfWeek(ADate)) + ' dia da semana';
end;

procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word);


Quebra os valores especificados no parmetro Date em Year, Month e Day.
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
var
Present: TDateTime;
Year, Month, Day, Hour, Min, Sec, MSec: Word;
begin
Present:= Now;
DecodeDate(Present, Year, Month, Day);
Label1.Caption := 'Hoje ' + IntToStr(Day) + ' do Ms '
+ IntToStr(Month) + ' do Ano ' + IntToStr(Year);
DecodeTime(Present, Hour, Min, Sec, MSec);
Label2.Caption := 'A hora ' + IntToStr(Hour) + ' horas e '
+ IntToStr(Min) + ' minutos.';
end;

118

procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word);


Quebra os valores especificados em Time nos par6ametros Hour, Min, Sec e
MSec.
Ex.:
Procedure TForm1.Button1Click(Sender: TObject);
var
Present: TDateTime;
Year, Month, Day, Hour, Min, Sec, MSec: Word;
begin
Present:= Now;
DecodeDate(Present, Year, Month, Day);
Label1.Caption := 'Hoje ' + IntToStr(Day) + ' do Ms '
+ IntToStr(Month) + ' do Ano ' + IntToStr(Year);
DecodeTime(Present, Hour, Min, Sec, MSec);
Label2.Caption := 'A hora ' + IntToStr(Hour) + ' horas e '
+ IntToStr(Min) + ' minutos.';
end;

procedure Delete(var S: string; Index, Count:Integer);


Remove a substring de Count caracters da string S partir da posio Index
Ex.:
var
s: string;
begin
s := 'Delphi 3 - Client/Server';
Delete(s,8,4);
Canvas.TextOut(10, 10, s); { ' Delphi 3 - Client/Server ' }
end;

function DeleteFile(const FileName: string): Boolean;


Apaga o arquivo FileName do disco. Se o arquivo no puder ser apagado a
funo retorna False.
Ex.:
DeleteFile('TEMP0001.TMP');

function DirectoryExists(Name: string): Boolean;


Verifica se Name diretorio existe
Ex.:
function DiskFree(Drive: Byte): Integer;
Retorna o nmero de bytes livre no driver especificado em Drive.
Onde : 0 = Corrente, 1 = A, 2 = B,...
DiskFree retorna 1 se o driver for invlido
Ex.:
var
S: string;
begin
S := IntToStr(DiskFree(0) div 1024) + ' Kbytes livres.';
Canvas.TextOut(10, 10, S);
end;

119

function DiskSize(Drive: Byte): Integer;


Retorna o tamanho em bytes do driver especificado.
Onde : 0 = Corrente, 1 = A, 2 = B,...
DiskFree retorna 1 se o driver for invlido
Ex.:
var
S: string;
begin
S := 'Capacidade de ' + IntToStr(DiskSize(0) div 1024) + ' Kbytes.';
Canvas.TextOut(10, 10, S);
end;

function EncodeDate(Year, Month, Day: Word): TDateTime;


Retorna uma Data formada por Year, Month e Day
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
var
MyDate: TDateTime;
begin
MyDate := EncodeDate(83, 12, 31);
Label1.Caption := DateToStr(MyDate);
end;

function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;


Retorna a Hora formada por Hour, Min, Sec e MSec
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
var
MyTime: TDateTime;
begin
MyTime := EncodeTime(0, 45, 45, 7);
Label1.Caption := TimeToStr(MyTime);
end;

function ExtractFileDir(const FileName: string): string;


Retorna o diretrio adequado para ser passado para as funes CreateDir,
GetCurrentDir, RemoveDir e SetCurrentDir.
O resultado da funo uma string vazia se FileName no contiver um drive e
um caminho.
Function ExtractFileDrive(const FileName: string): string;
Retorna uma string contendo o drive do path de um arquivo.
Function ExtractFileExt(const FileName: string): string;
Retorna a extenso do arquivo FileName

120

function ExtractFileName(const FileName: string): string;


Retorna o nome do arquivo
Form1.Caption := 'Editando '+ ExtractFileName(FileName);

function ExtractFilePath(const FileName: string): string;


Retorna o Path de um arquivo
Ex.:
ChDir(ExtractFilePath(FileName));

function FileAge(const FileName: string): Integer;


Retorna a data e a hora de um arquivo num valor que pode ser convertido para
TDateTime atravs da funo FileDateToDateTime. Retorna 1 se o arquivo
no existir
function FileExists(const FileName: string): Boolean;
Retorna verdade se o arquivo existir
Ex.:
if FileExists(FileName) then
if MsgBox('Tem certeza que deseja excluir' + ExtractFileName(FileName)
+ '?'), []) = IDYes then DeleteFile(FileName);

function FileSize(var F): Integer;


Retorna o tamanho de um arquivo, para usar FileSize o arquivo deve esta
aberto. Se o arquivo estiver vazio FileSize(F) retorna 0. F uma variavel do
tipo arquivo. FileSize no pode ser usada com arquivo texto
Ex.:
var
f: file of Byte;
size : Longint;
S: string;
y: integer;
begin
if OpenDialog1.Execute then begin
AssignFile(f, OpenDialog1.FileName);
Reset(f);
size := FileSize(f);
S := 'Tamanho do arquivo em bytes: ' + IntToStr(size);
y := 10;
Canvas.TextOut(5, y, S);
y := y + Canvas.TextHeight(S) + 5;
S := 'Posicionando no meio do arquivo...';
Canvas.TextOut(5, y, S);
y := y + Canvas.TextHeight(S) + 5;
Seek(f,size div 2);
S := 'Posio agora ' + IntToStr(FilePos(f));
Canvas.TextOut(5, y, S);
CloseFile(f);
end;
end;

121

procedure FillChar(var X; Count: Integer; value: Byte);


Preenche um vetor com determinado caracter. Value pode ser um byte ou char
Ex.:
var
S: array[0..79] of char;
begin
{ preenche tudo com espaos}
FillChar(S, SizeOf(S), ' ');
end;

function FloatToStr(Value: Extended): string;


Converte um valor em ponto flutuante (real) para uma string
procedure ForceDirectories(Dir: string);
Cria multiplos diretrios de uma s vez
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
var
Dir: string;
begin
Dir := 'C:\SISTEMAS\VENDAS\DADOS';
ForceDirectories(Dir);
if DirectoryExists(Dir) then
Label1.Caption := Dir + ' foi criado'
end;

122

function FormatDateTime(const Format: string; DateTime: TDateTime): string;


Formata o valor DateTime usando o formato de Format.
Os especificadores de formato abaixo so vlidos
Especificador
Exibe
c
Exibe a data usando o formato definido da varivel global
ShortDateFormat, seguido pela hora se o formato definido pela varivel global
LongTimeFormat. A hora no exibida se a parte fracional de DateTime for
zero.
d
Exibe o dia como um nmero, sem zero esquerda (1-31).
dd
Exibe o dia como um nmero, com zero esquerda (01-31).
ddd Exibe o nome do dia abreviado (Sun-Sat) usando as strings definidas
pela variavel global ShortDayNames
dddd Exibe o nome do dia (Sunday-Saturday) usando as strings definidas pela
variavel global LongDayNames.
ddddd Exibe a data utilizando o formato definido na varivel global
ShortDateFormat.
dddddd
Exibe a data utilizando o formato definido na varivel global
LongDateFormat.
m
Exibe o ms como um nmero sem zeros a esquerda (1-12). Se o
especificador m for seguido de um especificador h ou hh, ser exibido os
minutos do ms.
mm Exibe o ms como um nmero com zeros a esquerda (01-12). Se o
especificador m for seguido de um especificador h ou hh, ser exibido os
minutos do ms.
mmm Exibe o ms de forma abreviada (Jan-Dec) usando as strings definidas
na varivel global ShortMonthNames.
mmmm
Exibe o ms por extenso (January-December) usando as strings
definidas na varivel global LongMonthNames.
yy
Exibe o ano com dois dgitos (00-99).
yyyy Exibe o ano com quatro dgitos (0000-9999).
h
Exibe a hora sem zero a esquerda (0-23).
hh
Exibe a hora com zero a esquerda (00-23).
n
Exibe o minuto sem zero a esquerda (0-59).
nn
Exibe o minuto com zero a esquerda (00-59).
s
Exibe o segundo sem zero a esquerda (0-59).
ss
Exibe o segundo com zero a esquerda (00-59).
t
Exibe a hora usando o formato definido na varivel global
ShortTimeFormat.
tt
Exibe a hora usando o formato definido na varivel global
LongTimeFormat.
am/pm
Exibe a hora no formato de 12 horas seguido de 'am' ou 'pm'.
a/p
Exibe a hora no formato de 12 horas seguido de 'a' ou 'p'.

123

ampm Exibe a hora no formato de 12 horas de acordo com o contedo das


variveis globais TimeAMString (se antes do meio dia) e TimePMString (se
depois do meio dia).
/
Exibe o caracter separador da data definido na varivel global
DateSeparator.
:
Exibe o caracter separador de hora definido na varivel global
TimeSeparator.
Obs: Caracteres dentro de aspas simples ou duplas ('xx'/"xx") so exibidos
como esto e no afetam a formatao.
Os especificadores de formato podem ser utilizados tanto em maisculo
quanto em minsculo - ambos produzem o mesmo resultado.
Se a string definida pelo parametro Format estiver vazia, os valores de
data e hora sero formatados como as if a 'c' format specifier had been given.
S := FormatDateTime('"The meeting is on" dddd, mmmm d, yyyy, ' +
'"at" hh:mm AM/PM', StrToDateTime('2/15/95 10:30am'));

124

function FormatFloat(const Format: string; Value: Extended): string;


Transforma um Float numa string usando a formatao contida em Format
Os especificadores de formato abaixo so vlidos
Especificador
Representa
0
Posio do dgito. Se o valor sendo formatado tem um digito na posio
que especificador '0' aparece na string de formatao, este dgito ser
copiado para a string de sada. Seno, um '0' armazenado nesta
posio na string de sada.
#
Se o valor sendo formatado tem um digito na posio que especificador
'#' aparece na string formatada, este dgito ser copiado para a string de
sada. Seno, nada ser arrmazenado na string de sada.
.
Ponto decimal. O primeiro caracter '.' na string de formatao determina
a localizao do ponto decimal no valor sendo formatado; quaisquer
caracteres '.' adicionais so ignorados. O caracter que ser utilizado
como separador decimal determinado pelo contedo da varivel global
DecimalSeparator. O valor padro de DecimalSeparator especificado
no Painel de Controle do Windows no cone Propriedades de
Configuraes Regionais, guia Nmero, tem Smbolo decimal.
,
Separador de milhar. Se a string de formatao contm um ou mais
caracteres ',' (vrgula), a sada ter caracteres separadores de milhar
inseridos entre os grupos de trs dgitos esquerda do ponto decimal. A
posio e o nmero de caracteres ',' na string de formatao no afetam
a sada, exceto para indicar que separadores de milhar so necessrios.
O caracter que ser utilizado como separador de milhar determinado
pelo contedo da varivel global ThousandSeparator. O valor padro de
ThousandSeparator especificado no Painel de Controle do Windows
no cone Propriedades de Configuraes Regionais, guia Nmero, tem
Smbolo decimal.
E+
Notao cientfica. Se qualquer uma das strings 'E+', 'E-', 'e+', ou 'e-'
estiverem contidas na string de formatao, o nmero formatado usando notao
cientfica. Um grupo de quatro caracteres '0' (zero) pode seguir imediatamente aps os
especificadores 'E+', 'E-', 'e+', ou 'e-' para determinar o nmero mnimo de dgitos no
expoente. Os especificadores 'E+' e 'e+' fazem com que o sinal do expoente (positivo
ou negativo) seja exibido. Os especificadores 'E-' e 'e-' fazem com que o sinal do
expoente seja exibido apenas quando o mesmo for negativo.

'xx'/"xx"
Caracteres entre aspas simples ou duplas, no afetam a
formatao.
;
Separa sees para nmeros positivos, negativos e o zero na string de
formatao.
Obs.: A localizao do '0' extremo esquerdo antes do ponto decimal e do 0
extremo direito aps o ponto decimalna string de formatao determinam a
faixa de dgitos sempre exibida na string de sada. O nmero sendo formatado
formatado sempre arredondado para o nmero de digitos definidos aps o
ponto decimal (com '0' ou '#'). Se a string de formatao no contm o ponto
decimal, o valor sendo formatado ser arredondado para o nmero mais
prximo.
Se o nmero sendo formatado possui mais dgitos a esquerda do separador
decimal que os definidos pelos especificadores de dgito na string de
formatao, digitos extras sero exibidos antes do primeiro especificador de
dgito.
Para definir formatao diferente para valores positivos, negativos, e zero,
a
125
string de formatao pode conter entre uma e trs sees separadas por ;
(ponto-e-vrgula).

Se a seo de valores positivos estiver vazia, ou se a string de formatao


estivar vazia, o valor formatado usando a formatao geral de nmeros de
ponto flutuante com 15 dgitos significativos, correspondendo a uma chamada a
FloatToStrF com o formato ffGeneral. Formatao geral de ponto flutuante
tambm usada quanto o valor tem mais de 18 digitos esquerda do ponto
decimal e a string de formatao no especifica formatao com notao
cientfica.
Exemplos de strings de formatao e valores resultantes:
0
1234
-1234
1
0.00
1234.00
-1234.00
#.##
1234
-1234
.5
#,##0.00
1,234.00
-1,234.00
#,##0.00;(#,##0.00) 1,234.00
(1,234.00) 0.50
#,##0.00;;Zero
1,234.00
-1,234.00
0.000E+00
1.234E+03 -1.234E+03 5.000E-01
#.###E-0
1.234E3
-1.234E3
5E-1

0
0.50

0.00

0.50

0.00
0.00

0.50
0.000E+00
0E0

Zero

function Frac(X: Real): Real;


Retorna a parte fracional do parmetro X
Ex.:
var
R: Real;
begin
R := Frac(234.567);
R := Frac(-234.567);
end;

{ 0.567 }
{ -0.567 }

function GetCurrentDir: string;


Retorna uma string contendo o diretrio corrente
procedure GetDir(D: Byte; var S: string);
Rerorna o diretrio corrente do drive especificado.
O onde D pode ser :
Valor
0
1
2
3

Drive
Corrente
A
B
C

Ex.:
var
s : string;
begin
GetDir(0,s); { 0 = drive corrente}
MessageDlg('Drive e diretrio atual: ' + s, mtInformation, [mbOk] , 0);
end;

126

procedure Inc(var X [ ; N: Longint ] );


Incrementa de uma ou N unidades o parmetro X
Ex.:
var
IntVar: Integer;
LongintVar: Longint;
begin
Inc(IntVar);
{ IntVar := IntVar + 1 }
Inc(LongintVar, 3; { LongintVar := LongintVar + 3}
end;

function IncMonth(const
TDateTime;

Date:

TDateTime;

NumberOfMonths:

Integer):

Retorna Date acrescido ou decrescido de NumberOfMonths meses.


function InputBox(const ACaption, Aprompt, ADefault: string): string;
Exibe uma Caixa de Entrada onde o usurio pode digitar uma string.
ACaption representa o ttulo do Input Box e APrompt o ttulo do edit e
ADefault representa o valor inicial do Edit.
Ex.:
uses Dialogs;
procedure TForm1.Button1Click(Sender: TObject);
var
InputString: string;
begin
InputString:= InputBox('Informe', 'Nome do arquivo a ser criado', 'MeuTexto.TXT');
end;

function InputQuery(const ACaption, APrompt: string; var Value: string):


Boolean;
Semelhante ao InputBox, sendo que retorna True se o usurio fechou a O
InputBox com OK e False se fechou com Cancel ou ESC. E Value armazena a
string digitada.
procedure TForm1.Button1Click(Sender: TObject);
var
NewString: string;
ClickedOK: Boolean;
begin
NewString := 'MeuTexto.TXT';
Label1.Caption := NewString;
ClickedOK := InputQuery('Informe, 'Nome do arquivo a ser criado', NewString);
if ClickedOK then
{ NewString contm nova string digitada.}
Label1.Caption := 'A nova string ''' + NewString + '''';
end;

127

procedure Insert(Source: string; var S: string; Index: Integer);


Insere uma string em outra a partir da posio Index
Ex.:
var
S: string;
begin
S := 'Delphi 3 /Server';
Insert('Client', S, 9);
end;

{ 'Delphi 3 Client/Server' }

function IntToHex(Value: Integer; Digits: Integer): string;


Converte o inteiro Value num Hexadecimal (Base 16). Digits indica o nmero
mnimo de dgitos Hexa a serem retornados
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := IntToHex(StrToInt(Edit1.Text), 6);
end;

function IntToStr(Value: Integer): string;


Transforma um Inteiro numa String
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
var
Value: Integer;
begin
Value := 1583;
Edit1.Text := IntToStr(Value);
end;

function IsValidIdent(const Ident: string): Boolean;


Indica se um identificador vlido para o Pascal
function Length(S: string): Integer;
Retorna o nmero de caracters usados na string S.
Ex.:
var
S: string;
begin
S := 'Curso de Programao em Delphi 3 - Object Pascal';
Canvas.TextOut(10, 10, 'Tamanho da String = ' + IntToStr(Length(S)));
end;

128

function MaxIntValue(const Data: array of Integer): Integer;


Retorna o maior inteiro de um vetor
function MaxValue(const Data: array of Double): Double;
Retorna o maior valor de um vetor
function Mean(const Data: array of Double): Extended;
Retorna a mdia aritmtica de um vetor
function MessageDlg(const Msg: string; AType: TMsgDlgType;
AButtons: TMsgDlgButtons; HelpCtx: Longint): Word;
Exibe uma Caixa de Mensagem e obtem uma resposta do usurio.
Onde
Msg : Mensagem a ser exibida.
AType : Tipo da caixa de mensagem
Valor
Significado
mtWarning
Uma caixa de mensagem contendo um ponto de
exclamao amarelo.
mtError
Uma caixa de mensagem contendo um smbolo de pare
vermelho.
mtInformation
Uma caixa de mensagem contendo um "i" azul.
mtConfirmation
Uma caixa de mensagem contendo um ponto de
interrogao verde.
mtCustom
Uma caixa de mensagem sem bitmap.
Obs.: O caption da caixa de mensagem o nome do arquivo executvel da
aplicao.
AButtons: Quais botes aparecero na caixa de mensagem.
Onde:
Valor
Significado
mbYes
Um boto com o texto 'Yes'
mbNo
Um boto com o texto 'No'
mbOK
Um boto com o texto 'OK
mbCancel
Um boto com o texto 'Cancel'
mbHelp
Um boto com o texto 'Help'
mbAbort
Um boto com o texto 'Abort'
mbRetry
Um boto com o texto 'Retry'
mbIgnore
Um boto com o texto 'Ignore'

129

mbAll
Um boto com o texto 'All'
mbYesNoCancel
Coloca os botes Yes, No, e Cancel na caixa de
mensagem
mbOkCancel
Coloca os botes OK e Cancel na caixa de mensagem
mbAbortRetryIgnore
Coloca os botes Abort, Retry, e Ignore na caixa de
mensagem
MessageDlg retorna o valor do boto selecionado. Os valores de retorno
possveis so:
mrNone mrAbort
mrYes
mrOk
mrRetry
mrNo
mrCancel mrIgnore
mrAll
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
begin
if MessageDlg('Deseja sair da aplicao agora ?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
MessageDlg('Tenha um bom dia...ject Pascal application.', mtInformation,
[mbOk], 0);
Close;
end;
end;

function MessageDlgPos(const Msg: string; AType: TMsgDlgType;


AButtons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer): Word;
Semelhante a MessageDlg exceto por permitir indicar a posio na qual a
janela ser exibida
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
begin
MessageDlgPos('Sair sem gravar alteraes ?',mtConfirmation, mbYesNoCancel, 0, 200,
200);
end;

function MinIntValue(const Data: array of Integer): Integer;


Retorna o menor inteiro do vetor
function MinValue(const Data: array of Double): Double;
Retorna o menor valor de um vetor

130

procedure MkDir(S: string);


Cria um novo diretrio
Ex.:
uses Dialogs;
begin
{$I-}
{ Pega o nome do diretrio de um controle Tedit }
MkDir(Edit1.Text);
if IOResult <> 0 then
MessageDlg('No posso criar o diretrio.', mtWarning, [mbOk], 0)
else
MessageDlg('Diretrio criado', mtInformation, [mbOk], 0);
end;

function Now: TDateTime;


Retorna a data e a hora corrente
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := 'Data e hora atual ' + Str(Now);
end;

function Ord(X): Longint;


Retorna a ordem de um valor ordinal
uses Dialogs;
type
Colors = (RED,BLUE,GREEN);
var
S: string;
begin
S := 'BLUE (Azul) tem um valor ordinal de ' + IntToStr(Ord(BLUE)) + #13#10;
S := 'O cdigo decimal ASCII para "p" ' + IntToStr(Ord('p'));
MessageDlg(S, mtInformation, [mbOk], 0);
end;

function Pi: Extended;


Retorna o valor de PI
3.1415926535897932385.
function Pos(Substr: string; S: string): Integer;
Procura por uma sub-string numa string e retorna a posio da primeira
ocorrncia ou zero se no encontrou
Ex.:
var S: string;
begin
S := '
123.5';
{ Converte espaos para zeros }
while Pos(' ', S) > 0 do
S[Pos(' ', S)] := '0';
end;

131

function Power(Base, Exponent: Extended): Extended;


Retorna a Potncia.
function Pred(X);
Retorna o predecessor de um ordinal
uses Dialogs;
type
Colors = (RED,BLUE,GREEN);
var
S: string;
begin
S := 'O predecessor de 5 ' + IntToStr(Pred(5)) + #13#10;
S := S + 'O sucessor de 10 ' + IntToStr(Succ(10)) + #13#10;
if Succ(RED) = BLUE then
S := S + 'Nos tipos de Cores, RED (Vermelho) o predecessor de BLUE (Azul).';
MessageDlg(S, mtInformation, [mbOk], 0);
end;

function Random [ ( Range: Integer) ];


Retorna um valor Randmico
0 <= X < Range.
var
I: Integer;
begin
Randomize;
for I := 1 to 50 do begin
{ Escreve na janela em posioes randomicas }
Canvas.TextOut(Random(Width), Random(Height), 'Ol!');
end;
end;

procedure Randomize;
Inicializa o modo Randomico. Deve ser utilizada antes de Random
function RemoveDir(const Dir: string): Boolean;
Remove um diretrio retornando True caso tenha conseguido e False caso
contrrio

132

procedure Rename(var F; Newname);


Altera o nome de um arquivo.
F uma varivel de arquivo (file). Newname uma expresso do tipo string ou
do tipo Pchar.
Ex.:
uses Dialogs;
var
f : file;
begin
OpenDialog1.Title := 'Escolha um arquivo... ';
if OpenDialog1.Execute then begin
SaveDialog1.Title := 'Renomear para...';
if SaveDialog1.Execute then begin
AssignFile(f, OpenDialog1.FileName);
Canvas.TextOut(5, 10, 'Renomeando ' + OpenDialog1.FileName + ' para ' +
SaveDialog1.FileName);
Rename(f, SaveDialog1.FileName);
end;
end;
end;

function RenameFile(const OldName, NewName: string): Boolean;


Renomeia arquivos e retorna o sucesso ou insucesso
Ex.:
{ O cdigo a seguir renomeia um arquivo }
if not RenameFile('OLDNAME.TXT','NEWNAME.TXT') then
ErrorMsg('Erro ao renomear arquivo!');

procedure RmDir(S: string);


Remove um diretrio
Ex.:
uses Dialogs;
begin
{$I-}
{ Pega o nome do diretrio de um controle TEdit }
RmDir(Edit1.Text);
if IOResult <> 0 then
MessageDlg('No posso remover o diretrio', mtWarning, [mbOk], 0)
else
MessageDlg('Diretrio removido', mtInformation, [mbOk], 0);
end;

function Round(X: Extended): Longint;


Arredonda um nmero real

133

function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx:


Longint):Boolean;
Exibe um Caixa de Dialogo para seleo de Diretrio. O Diretrio passado para
a funo aparece como diretrio corrente e o diretrio escolhido retonado no
mesmo Diretrio (Directory). O valor do diretrio corrente no alterado
Os valores abaixo podem ser adicionados ao parametro Options:

Valor
Significado
sdAllowCreate
Uma caixa de exio aparece para permitir ao usurio
digitar o nome do diretrio que no existe. Esta opo no cria o
diretrio, mas a aplicao pode acessar o parametro Directory
para criar o diretrio desejado.
sdPerformCreate Usado somente quando Options contm sdAllowCreate. Se
o usurio entrar com um diretrio que no existe, SelectDirectory
cria-o.
sdPrompt

Usado quando Options contm sdAllowCreate. Exibe uma caixa de mensagem que
informa o usurio quando o diretrio digitado no existe e pergunta se deseja cri-lo. Se
o usurio selecionar OK, o diretrio criado se Options contm sdPerformCreate. Se
Options no contm sdPerformCreate, o diretrio no criado: a aplicao precisa crio quando SelectDirectory retornar.

A funo retorna True se o usurio selecionar o diretrio e clicar em OK, e


False se o usurio selecionar Cancel ou fechar a caixa de dilogo sem
selecionar um diretrio.
Ex.:
uses FileCtrl;
procedure TForm1.Button1Click(Sender: TObject);
var
Dir: string;
begin
Dir := 'C:\MYDIR';
if SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt]) then
Label1.Caption := Dir;
end;

function SetCurrentDir(const Dir: string): Boolean;


Torna Dir o diretrio corrente e retorna o sucesso da operao
procedure SetLength(var S: string; NewLength: Integer);
Coloca um novo tamanho para uma string. O efeito similar ao cdigo abaixo:
S[0] := NewLength.

134

procedure ShowMessage(const Msg: string);


Exibe uma mensagem ao usurio
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('Ol !');
end;

function Sqr(X: Extended): Extended;


Retorna o quadrado de X
function Sqrt(X: Extended): Extended;
Retorna a raiz quadrada de X
function StrComp(Str1, Str2 : PChar): Integer;
Compara duas strings em case sensitivity (diferencia maisculas e minsculas)
Valor de retorno
<0
=0
>0

Condio
if Str1< Str2
if Str1= Str2
if Str1 > Str2

function StringOfChar(Ch: Char; Count: Integer): string;


Retorna uma string contendo Count caracteres Ch
Ex.:
S := StringOfChar('A', 10);
{sets S to the string 'AAAAAAAAAA'}

function StrToDate(const S: string): TDateTime;


Converte uma string em data
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
var
ADate: TDateTime;
begin
ADate := StrToDate(Edit1.Text);
Label1.Caption := DateToStr(ADate);
end;

135

function StrToDateTime(const S: string): TDateTime;


Converte uma string para o formato DateTime
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
var
AdateAndTime: TDateTime;
begin
AdateAndTime := StrToDateTime(Edit1.Text);
Label1.Caption := DateTimeToStr(ADateAndTime);
end;

function StrToFloat(const S: string): Extended;


Converte uma string num Float
function StrToInt(const S: string): Integer;
Converte uma string num inteiro
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
I: Integer;
begin
S := '22467';
I := StrToInt(S);
Inc(I);
Edit1.Text := IntToStr(I);
end;

function StrToTime(const S: string): TDateTime;


Converte uma string em hora
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
var
ATime: TDateTime;
begin
ATime := StrToTime(Edit1.Text);
Label1.Caption := TimeToStr(ATime);
end;

136

function Succ(X);
Retorna o sucessor de um ordinal
Ex.:
uses Dialogs;
type
Colors = (RED,BLUE,GREEN);
var
S: string;
begin
S := 'O predecessor de 5 ' + IntToStr(Pred(5)) + #13#10;
S := S + 'O sucessor de 10 ' + IntToStr(Succ(10)) + #13#10;
MessageDlg(S, mtInformation, [mbOk], 0);
end;

function Sum(const Data: array of Double): Extended register;


Calcula a soma de dos elementos de um vetor
function SumInt(const Data: array of Integer): Integer register;
Calcula a soma dos elementos de um vetor de inteiros
function Time: TDateTime;
Retorna a hora corrente
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := 'A hora ' + TimeToStr(Time);
end;

function TimeToStr(Time: TDateTime): string;


Converte hora para string
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := TimeToStr(Time);
end;

function Trim(const S: string): string;


Retira os espaos em brancos a esquerda e a direita da string S
function TrimLeft(const S: string): string;
Retira os espaos em brancos a esquerda da string S

137

function TrimRight(const S: string): string;


Retira os espaos em brancos a direita da string S
function Trunc(X: Extended): Longint;
Retorna a parte inteira de um nmero
function UpCase(Ch: Char): Char;
Converte o caracter Ch em maiscula
Ex.:
uses Dialogs;
var
s : string;
i : Integer;
begin
{ Pega a string de um controle TEdit }
s := Edit1.Text;
for i := 1 to Length(s) do
s[i] := UpCase(s[i]);
MessageDlg('Tudo em maisculo: ' + s, mtInformation, [mbOk], 0);
end;

function UpperCase(const S: string): string;


Converte a string S em maisculas
Ex.:
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
for I := 0 to ListBox1.Items.Count -1 do
ListBox1.Items[I] := UpperCase(ListBox1.Items[I]);
end;

Componentes - Propriedades, Eventos e Mtodos


Propriedades Comuns
Nome
Align
Caption
Cursor

Descrio
Determina como o componente ser alinhado no seu container
[alNone, alTop, alBottom, alLeft, alRight, alClient]
Legenda do componente (& indica a tecla de atalho)
Desenho que representa o cursor da mouse
[crDefault, crNone, crArrow, crCross
, crIBeam, crSize,
crSizeNESW,
crSizeNS, crSizeNWSE, crSizeWE, crUpArrow, crHourGlass,
crDrag,

138

Nome

Name
Left
Top
Height
Width
ComponentCo
unt
Components
Color
Font
Ctl3D
Enabled
Visible
Hint
ShowHint
PopupMenu
TabOrder
TabStop
HelpContext

Descrio
crNoDrop, crHSplit, crVSplit, crMultiDrag, crSQLWait, crNo,
crAppStart, crHelp, crHandPoint]
Nome da instncia do componente
Distncia em Pixel da borda esquerda do componente at a
borda esquerda do FORM
Distncia em pixel da borda superior do componente at a
borda superior do FORM
Altura em pixel do componente
Largura em pixel do componente
O nmero de componentes possudos por um componente
container
Uma matriz de componentes possudos por um componente
container
Indica a cor de fundo do componente
Fonte utilizada no componente
Define a aparncia 3D ou 2D de um componente
Define se o componente esta ou no ativo
Define se o componente esta ou no visvel
String utilizada na exibio de dicas instantneas
Define se o hint ser mostrado automaticamente
Menu que ser acionado com o boto direito do mouse
A ordem de tabulao do componente
Indica se o componente ser ponto de parada para a tecla
TAB
Nmero utilizado para chamar o help on-line sensvel ao
contexto

Eventos Comuns
Nome
OnChage
OnClick
OnDblClick
OnEnter
OnExit
OnKeyDown

Descrio
O contedo do componente alterado
O componente acionado (Mouse ou Enter)
Duplo-clique sobre o componente
O componente recebe o foco
O componente perde o foco
Tecla(s) so pressionada(s) inclusive teclas de controle
Parametros :
Key = Cdigo da tecla
Shift = conjunto que indica a(s) tecla(s) de controle pressionadas
(ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble)
OnKeyPress Uma tecla pressionada, onde Key contm o caracter
pressionado
OnKeyUp
Uma tecla solta

Mtodos Comuns
Nome
Create

Descrio
Cria uma nova instncia

139

Nome
Destroy
Show
Hide
SetFocus
Focused
BringToFron
t
SendToBack
ScaleBy

SetBounds

Descrio
Destri a instncia
Torna o componente visvel
Torna o componente invisvel
Coloca o foco no componente
Determina se o componente tem o foco
Coloca o componente na frente dos outros
Coloca o componente atrs dos outros
Gradua
o
componente
em
determina
escala.
Ex:
Button1.ScaleBy(90,100) altera o tamanho do boto para 90% do
tamanho original
Muda
a
posio
e
o
tamanho
do
componente
(ALeft,ATop,AWidth,AHeigh)

140

Componentes
Form - Elemento bsico no desenvolvimento Delphi formando o alicerce sobre,
o qual um aplicativo construdo.
Propriedades Descrio
Active
Indica quando o formulrio esta ativo.
ActiveControl Determina o controle que receber o foco quando o formulrio
ativado
AutoScroll
Adiciona barras de rolagens automaticamente quando um
formulrio redimensionado de forma a cobrir componentes
HorzScrollBar Adiciona Barra de rolagem Horizontais quando necessrio
VertScrollBar Adiciona Barra de rolagem Verticais quando necessrio
BorderIcons
Define quais cones de controle sero visveis
[biSystemMenu, biMinimize, biMaximize, biHelp]
BorderStyle
Estilo da borda da janela
[bsDialog, bsSingle, bsNone, bsSizeable, bsToolWindow,
bsSizeToolWin]
FormStyle
Tipo da janela
[fsNormalfs, MDIChild, fsMDIForm, fsStayOnTop]
Icon
cone da janela
Menu
Indica qual o componente menu do formulrio ser apresentado
Position
Permite controlar a posio e tamanho dos formulrios na
execuo
[poDesigned, poDefault, poDefaultPosOnly, poDefaultSizeOnly,
poScreenCenter]
WindowState Estado da janela (normal, minimizado ou maximizado)
Eventos
OnCreate
OnShow
OnCloseQuery
OnClose
OnActivate
OnDeactivate
OnResize
Mtodos
Show
ShowModal
Close
Refresh

Descrio
O formulrio criado
Antes de mostrar a janela
chamada para validar se a janela pode ser fechada
Ocorre quando a janela fechada
Ocorre quando a janela torna-se ativa
Ocorre quando a janela perde o foco
Ocorre quando a janela muda de tamanho

Descrio
Mostra uma janela no-modal
Ativa uma janela modal
Fecha a janela
Redesenha a Janela

Button - Componente utilizado para representar aes

141

Propriedades Descrio
Cancel
Dispara o evento OnClick do boto quando a tecla ESC
pressionada
Default
Dispara o evento OnClick do boto quando a tecla ENTER
pressionada
ModalResult Associa o boto a opo de fechamento de um Form modal

BitBtn - Boto contendo uma Legenda e um BitMap, possui as propriedades e


mtodos do SpeedButton
Propriedades
Kind
Style

Descrio
Seleciona um BitMap padro para o boto
Indica a aparncia do boto (win3.11, win95, winxx)

SpeedButton - Boto contendo um BitMap, normalmente utilizado na


construo de barra de ferramentas
Propriedades
Glyph
LayOut
Margin
Spacing
Down
GroupIndex
AllowAllUp

Mtodos
Click

Descrio
BitMap exibido pelo boto
Posio do BitMap no Boto
Indica o espao entre a borda do boto e o BitMap
Indica o espao entre o BitMap e o Texto do boto
Estado do boto (Pressionado ou no)
Indica quais botes pertencero ao mesmo grupo
Permite que todos os botes de um grupo possam estar no
pressionados

Descrio
Ativa o evento OnClick do boto

Label - Utilizado para exibir rtulos


Propriedades
Alignment
AutoSize

Descrio
Alinhamento do texto no componente
Define se o tamanho do componente ser automaticamente
ajustado ao tamanho da legenda
WordWrap
Retorno automtico
Transparent
Define se o componente ser transparente
FocusControl Nome do componente que receber o foco
ShowAccelCh Indica se & ser far ou no parte da legenda
ar

Edit - Utilizado para entrada de dados texto em uma nica linha.

142

Propriedades
Text
AutoSelect

Descrio
Armazena a entrada de dados
Indica se o texto ser ou no selecionado quando o
componente receber o foco
MaxLength
Nmero mximo de caracteres permitidos
CharCase
Define se as letras aparecero em maisculo, minsculo ou
normal
PasswordCha Caracter utilizado para esconder os dados digitados (Senhas)
r
ReadOnly
Define se ser permitido alterar o texto
SelLength
Comprimento da seleo
SelStart
Inicio da seleo
SelText
Texto selecionado

MaskEdit - Permite entrada de dados texto em uma linha, utilizando uma


mscara de edio. Possui todas as propriedades do componente Edit
Propriedades
EditMask

Descrio
Mscara de edio

A propriedade EditMask consiste em uma mscara de edio permitindo definir


quais os possveis caracteres e a formatao para a propriedade Text.
Essa mscara consiste de trs partes separadas por ;. A primeira parte a
mscara propriamente dita, a segunda parte indica se os caracteres literais
sero armazenados na propriedade text (0 - no armazena; 1 - armazena). A
terceira parte indica qual o caracter utilizado representar os espaos a serem
digitados no texto
Estes so os caracteres especiais que podem compor a mscara de edio
Caracter Descrio
!
Espaos em branco no aparecero
>
Todos os caracteres seguintes sero maisculos at que aparea o
caracter <
<
Todos os caracteres seguintes sero minsculos at que aparea o
caracter >
\
Indica um caracter literal
l
Somente caracter alfabtico
L
Obrigatoriamente um caracter alfabtico (A-Z, a-z)
a
Somente caracter alfanumrico
A
Obrigatoriamente caractere alfanumrico ( A-Z, a-z, 0-9)
9
Somente caracter numrico
0
Obrigatoriamente caracter numrico
c
permite um caracter
C
Obrigatoriamente um caracter
#
Permite um caracter numrico ou sinal de mais ou de menos, mas
no os requer.

143

:
/

Separador de horas, minutos e segundos


Separador de dias, meses e anos

Memo - Permite entrada de dados texto em mltiplas linhas.


Propriedades
Alignament
Lines
WantReturns
WantTab
WordWrap
ScrollBar

Descrio
Indica como ser o alinhamento do texto
Armazena as linhas de texto
Define se a tecla ENTER ser tratada pelo Formulrio ou pelo
Memo
Define se a tecla TAB ser tratada pelo Formulrio ou pelo
Memo
Indica se a linha digitada ser quebrada, automaticamente, de
acordo com o tamanho do componente
Indica se Memo ter barras de rolagem

Mtodos
Descrio
Clear
Limpa o memo
ClearSelection Limpa o texto selecionado no memo
Obs: Muitos componentes possuem propriedades do Tipo TStrings, essa
classe permite armazenar e manipular uma lista de Strings. Toda propriedade
do tipo TStrings permite acesso indexado aos itens da listas
(Propriedade[indce])
TString
Propriedades
Count

Descrio
Nmero de linhas

Mtodos
Add
Insert
Delete
Clear
IndexOf
LoadFromFile
SaveToFile

Descrio
Adiciona uma nova linha no final da lista
Insere uma nova linha numa posio especificada
Apaga uma linha
Apaga toda a lista
Retorna o ndice do item e -1 caso no encontre
Carrega de um arquivo texto
Salva para um arquivo texto

CheckBox - Utilizado para obter informaes lgicas independentes


Propriedades
AllowGrayed
Checked
State

Descrio
Determina se o checkbox ter duas ou trs possibilidades
Determina se o checkbox est selecionado
Estado atual do checkbox (cbUnchecked, cbChecked,
cbGrayed)

144

RadioButton - Utilizado para obter informaes lgicas mutuamente exclusivas


Propriedades
Checked

Descrio
Determina se o RadioButton esta selecionado

GroupBox - Utilizados para agrupar componentes, sobre determinado ttulo.

RadioGroup - Componente que agrupa e controla RadioButtons


Propriedades Descrio
Columns
Nmero de colunas de botes de rdio
Items
Valores dos botes de rdio. Items[n] acessa o n-simo
componente
ItemIndex
Item selecionado. (-1 nenhum, comea em 0)

Panel - Utilizados para agrupar componentes e criar barras de ferramentas.


Propriedades
BevelInner
BevelOuter
BevelWidth
BorderStyle
BorderWidth

Descrio
Estilo interno da superfcie do Panel
Estilo externo da superfcie do Panel
Distncia entre as superfcies externas e internas
Estilo da Borda
Largura da borda

ScrollBox - Semelhante ao componente GrupoBox, sendo que, possui barras


de rolagem
Propriedades
HorzScrollBar
VertScrollBar

Descrio
Barra Horizontal (Increment, Tracking e Visible)
Barra Vertical (Increment, Tracking e Visible)

Bevel - Define linhas, retngulos e molduras nas janelas.


Propriedades
Shape
Style

Descrio
Tipo de figura a ser desenhada
Define alto e baixo relevo

ListBox - Utilizado para escolher em uma lista grande de opes.

145

Propriedades
Columns
MultiSelect
ExtendedSele
ct
IntegralHeight
Items
ItemIndex
Selected
SelCount
Sorted

Descrio
Nmero de colunas da lista
Define se ser permitida a seleo de mltiplos itens
Define se a seleo poder ser estendida pelo uso das teclas
Shift e Ctrl
Define se os itens podero aparecer parcialmente ou somente
por completo
Valores dos itens da lista
Item selecionado. (-1 no existe item selecionado e o 1 0)
De acordo com o ndice indica se um item em particular esta
selecionado.
Indica quantos itens esto selecionado
Define se os itens aparecero ordenados

ComboBox - Rene as caractersticas de Edit e ListBox.


Propriedades
Items
DropDownCount
Text
Style

Sorted

Descrio
Valores a serem exibidos na lista
Nmero de itens visveis da lista
Contedo texto digitado na ComboBox
csDropDown - permite edio e exibe os itens mediante
solicitao
csDropDownList - no permite edio e mostra itens no edit
ao pressionar a 1 letra do item.
CsSimple - permite edio e exibe a lista
Define se os itens aparecero ordenados

CheckListBox Possui toda a funcionalidade do ListBox exibindo uma


CheckBox p/ cada item
Propriedades Descrio
Checked[n]
Retorna true se o item n estiver selecionado
State[n]
Retorna o estado do item n : [cvUnchecked, cbChecked,
cbGrayed]
Eventos
OnClickChecked

Descrio
Quando um item marcado ou desmarcado

ScrollBar - Permite a escolha de um valor numrico dentro de uma faixa.


Propriedades
Min
Max
Position

Descrio
Valor mnimo possvel
Valor mximo possvel
Posio Atual

146

Propriedades
LargeChange
SmallChange
Kind

Descrio
Incremento da posio quando o click na barra
Incremento da posio quando o click na seta
Se a barra vertical ou horizontal

Eventos
Descrio
OnEditMask Permite atribuir uma mscara a clula. A linha e a coluna da
clula editada so recebidas pelo evento e mascar
representada pelo parmetro Value

StringGrid e DrawGrid - Utilizado para entrada ou exibio de dados no


formato de tabela.
Propriedades
ColCount
RowCount
Col
Row
DefaultColWidth
DefaultRowHeig
ht
DefaultDrawing
FixedCol
FixedRow
GridLineWidth
Options
Cells[col,lin]

Descrio
Nmero de colunas
Nmero de linhas
Coluna corrente
Linha Corrente
Largura das colunas
Altura das linhas
Define se o desenho das clulas ser automtico ou manual
Quantidade de Linhas Fixas
Quantidade de colunas fixas
Espessura das Linhas divisrias
Define caractersticas do Grid. goEditing e goTabs
Permite acessar as clulas da Grid, por coluna e linha, sendo
que a primeira linha e coluna tm valores 0.

Image - Exibe uma imagem.


Propriedades
Picture
Center
Stretch
Transparent

Descrio
Arquivo Bitmap, cone ou Windows Metafile exibido
Centraliza a figura no componente
Define se o tamanho da figura deve ser ajustada ao do
componente
Torna o fundo visvel ou opaco

Shape - Exibe uma figura geomtrica


Propriedades
Brush
Pen
Shape

Descrio
Cor e preenchimeto da figura
Cor e preenchimento da borda
Figura geomtrica

147

Splitter Permite o redimensionamento de componente em tempo de


execuo
Propriedades
Beveled
MinSize

Descrio
Exibe o componente com aparncia 3D
Tamanho mnimo para os componentes

TabControl - Contem guias, as quais podem ser utilizadas para alterar outros
componentes
Propriedades
MultiLine
Tabs
TabPositon
HotTrack

Descrio
Permite mltiplas linhas para as guias
Guias
Posio das orelhas em cima ou embaixo
Destaca a orelha quando o curso do mouse esta em cima da
mesma
TabIndex
Guia ativa
ScrollOpposite Transfere as orelhas das linhas anteriores selecionada para
a outra extremidade do Componente
Eventos
OnChange

Descrio
Quando uma guia selecionada

PageControl - Contem pginas, as quais, podem possuir diversos


componentes. Para inserir uma nova pgina d um clique com o boto direito
do mouse e escolha NewPage. Cada pgina criada um objeto do tipo
TTabSheet e possui a seguintes propriedades : Caption, PageIndex e
TabVisible, onde PageIndex indica a ordem de apresentao de cada pgina e
TabVisible permite exibir ou ocultar as pginas.
Propriedades
MultiLine
ActivePage
PageIndex
Eventos
OnChange

Descrio
Permite mltiplas linhas para as pginas
Pgina ativa
ndice da pgina ativa
Descrio
Quando uma pgina selecionada

ImageList Representa uma coleo de imagens do mesmo tramanho, sua


principal funo armazenar imagens para outros componentes, onde cada
imagem pode ser refrenciada atravs de seu ndice no vetor de imagens.

148

Propriedades
Count

Descrio
Nmero de imagens na lista

RichEdit Componente para editar texto no formato Rich Text, esse


componente permite diferentes formataes para o seu texto, diferenciando-o
do componente Memo. Possui todas a propriedades do memo.
Propriedades Descrio
HideScrollBar Somente exibe as barras de rolagem quando necessrio
HideSelection Indica se o texto continuara com a indicao de selecionado
mesmo que o componente perca o foco
SelAttributes Formatao do Texto selecionado.
Color
- Cor dos caracteres
Name
- Nome da fonte usada
Size
- Tamanho da Fonte
Style
Estilo
da
Fonte
[fsBold,fsItalic,
fsUnderline,fsStrikeout]

TrackBar - Componente utilizado para seleo de valores inteiros dentro de


uma faixa
Propriedades
Orientation
Min
Max
Position
TickStyle
TickMarks
PageSize
LineSize
SelStart
SelEnd

Descrio
Orientao vertical ou horizontal
valor mnimo
valor mximo
Posio corrente
Estilo de exibio das marcaes
Aparncia do indicador
Determina o incremento que deve ser dado quando as teclas
PgUp e PgDn forem pressionadas
Determina o incremento que deve ser dado quando as setas
forem pressionadas
Posio de inicio do preenchimento
Posio de trmino do preenchimento

ProgressBar - Componente para indicar visualmente o andamento da


execuo de tarefas
Propriedades
Min
Max
Step
Position

Descrio
valor mnimo
valor mximo
incremento que deve ser dado a propriedade position em cada
mudana
Posio corrente

149

Mtodos
StepIt
StepBy

Descrio
Incrementa Position de Step unidades
Incrementa Position de n unidades

UpDown - Utilizado normalmente associado a outro componente para realizar


incremento em dados numricos
Propriedades Descrio
Associate
Indica o componente associado
AlignButton
Indica o alinhamento do UpDown em relao ao componente
associado (udLeft, udRight)
Min
Valor mnimo
Max
Valor mximo
Orientation
Orientao do componente (UdHorizontal, udVertical)
Wrap
Salto do valor mnimo para o mximo e vice-versa
Increment
Incremento dado ao componente associado
ArrowKeys
Indica que o componente recebe os incrementos das teclas de
SETAS
Positon
Valor corrente
Thousands
Indica se ir aparecer o separdor de milhar
Wrap
Salto altomtico de Max para Min e vice-versa

HotKey - Obtm em tempo de execuo teclas de atalho e podem ser


utilizadas para definir as teclas de atalho para outros componentes quem
tenham a propriedade ShortCut
Propriedades Descrio
HotKey
Combinao de teclas para a HotKey
InvalidKeys
Especifica as teclas invlidas para modificadores
[hcNone
, hcShift, hcCtrl, hcAlt, hcShiftCtrl, hcShiftAlt,
hcCtrlAlt, hcShiftCtrlAlt]
Modifiers
Teclas modifocadoras [hkShift, hkCtrl, hkAlt, hkExt]

Animate Componente capaz de exibir um AVI, o qual representa um formato


de arquivo multimdia com imagens e sons, mas este componente apenas
exibe as imagens.
Propriedades Descrio
Active
Indica se a animao esta sendo exibida ou no
AutoSize
Ajusta automaticamente o tamanho do componente ao tamanho
da imagem
Center
Centraliza a animao
FileName
Nome do arquivo AVi

150

Propriedades Descrio
FrameCount Nmero de Frames da animao
Repetitions
Nmero de repeties quando a animao for executada. O
valor zero indica repeties indefinidas

DateTimePicket Componente que permite a seleo visual de uma datas ou


horas
Propriedades
Time
Date
DateMode
DateFormat
Kind
ShowCheckbo
x
Check

Descrio
Hora selecionada
Data Selecionada
A forma como a data poder ser selecionada [dmComboBox,
dmUpDown]
Formato da Data [dfShort, dfLong]
Seleciona o componente para Data ou Hora [dtkDate, dtkTime]
Exibe um CheckBox
Indica se o CheckBox esta selecionado

TreeView - Permite exibio de dados em forma hierrquica. Este componente


possui mtodos e eventos que permitem controle e modificao da sua
estrutura em tempo de execuo.
Propriedades
Items
Ident
ShowLines
ShowRoot
ShowButtons
HideSelect
SortedType

Selected

Descrio
Define os itens da hierarquia.
Recuo dos sus-itens
Determina se haver uma linha ligando os sub-itens
Determina se haver uma linha ligando os itens razes
Indica se o boto a esquerda do item ser visvel
Indica se quando o componente perder o foco a seleo
continuar ativa
nsNone
no ordenado
nsData
os iten so ordenados quando os dados so
alterados
nsText
os itens so ordenados quando o Caption
alterado.
nsBoth
a ordenao e feita em ambos os casos
Item selecionado. Podemos acessar o contedo selecionado
atravs de Select.Text;

ListView - Componente que permite exibir de vrias maneiras uma lista de


itens.

151

Propriedades
ViewStyle

Descrio
Determina se os itens devem ser apresentados em colunas
com
cabealhos
e
sub-itens,
verticalmente
ou
horizontalmente, com cones grandes ou pequenos
LargeImages
Lista de Imagens (TImagesList) contendo a bitmaps a
serem exibidos e somente usada quando a propriedade
ViewStyle vsIcon
SmallImages
Lista de Imagens (TImagesList) contendo a bitmaps a
serem exibidos e somente usada quando a propriedade
ViewStyle vsSmallIcon
Items
Items a serem exibidos
Columns
Cabealhos das colunas da Lista
ShowColumnHea Exibe os cabealhos das colunas
ders
ColumnClick
Indica se os cabealhos das colunas tero a aparncia de
botes
IconOptions
Opes de exibio dos cones quando ViewStyle for
vsIcon ou vsSmallIcons
Arrangement alinhado no topo ou esquerda do ListView
AutoArrange os cones so alinhados automaticamente
WrapText
a propriedade caption ser quebrada
SortedType
nsNone
no ordenado
nsData
os iten so ordenados dados so
alterados
nsText
os itens so ordenados quando o
Caption alterada.
nsBoth
a ordenao e feita em ambos os casos
Selected
Item selecionado. Podemos acessar o contedo
selecionado atravs de Select.Captiont;

HeaderControl - Utilizado para exibir barra de ttulos ajustveis e cabealhos.


Podemos abrir o editor de sees atravs do boto direito do mouse.
Propriedades Descrio
Sections[n]
Cabealhos do componente, possuindo
as seguintes
propriedades : Text, With, Min, Max, Style, Alignment,
AllowClick e Index. Onde uma seo em particular pode ser
acessada atravs do seu ndice
HotTrack
Diferencia o cabelho quando o mouse esta sobre este
Eventos
OnSectionClick
OnSectionResize

Descrio
Clique sobre uma seo
A seo tem seu tamanho alterado

StatusBar - Utilizado para criar barra de Status para exibir informaes sobre a
aplicao. Podemos abrir o editor de paines atravs do boto direito do mose

152

Propriedades
SimplePanel
SimpleText
SizeGrip
Panels

Descrio
Indica se o StatusBar possuir um ou vrios panels
Texto exibido caso SimplePanel igual a TRUE
Indicador de tamanho padro do Windows
Painis do StatusBar, cada panel permite a exibio de
informao. Os painis so acessados como elementos de um
vetor (Panels[n]) e possuem as seguintes propriedades : Text,
Width, Style, Bevel, Alignment

ToolBar Componete utilizado para criar barras de ferramentas. Para


adicionar botes e sepradores usamos o boto direito do mouse. Este um
componente container e podemos colocar outros componentes no seu interior,
os quais sero automaticamente alinhados. Cada boto adicionado possui as
seguinte propriedades : ImageIndex, Style[tbsButton, tbsCheck, tbsDivide,
tbsDropDown, tbsSeparator] e Indeterminate
Propriedades
Flat
Images
Buttons[n]

Descrio
Os botes ficam tero a aparncia do Office 97
Componente ImageList que conter as figuras dos botes
Acessa os botes atravs do ndice n

CoolBar Componete utilizado para criar barras de ferramentas que podem


ser arrastadas e reposicionadas. Podemos editar as faixas atravs do boto
direito do mouse.
Propriedades
Bands
BandBorderSty
le
BitMap
FixedOrder
FixedSize
ShowText
Vertical
Images

Descrio
Armazenas as Faixas (Cool bands)
Indica o estilo da borda entre os CollBands
BitMap exibindo no fundo do componente
Indica se o usurio poder modificar a ordem dos CollBands
Indica se o usurio poder modificar o tamanho dos CollBands
Indica se o valor da propriedade Text de cada TollBand ser
exibido ao lado de sua faixa
Indica se os CollBand sero verticais
Coleo de desenhos exibidos ao lado de cada CoollBand

153

Dilogos Comuns
Grupo de caixas de dilogo comuns a muitos programas.
Parte integrante do Windows, so atualizadas com a atualizao do Windows.
Necessitam pouca ou nenhuma programao para serem utilizadas. Facilitam a
padronizao em tarefas comuns. Depois de serem executados os Dilogos
Comuns armazenam em suas propriedades as escolhas do usurio.
Mtodo
Execute

Descrio
Ativa a caixa de dilogo e retorna True caso o dialogo comum seja
encerrado com o boto OK.

OpenDialog, SaveDialog, OpenPictureDialog e SavePictureDialog - Caixas


de dilogo para abrir e salvar arquivo
Propriedades
FileName
DefaultExt
Filter
FilterIndex
InitialDir
Title
Options

Descrio
Nome do arquivo
Extenso padro para os arquivos
Define os tipos de arquivos que podem ser abertos ou salvos
Nmero do filtro default
Diretrio inicial
Ttulo da janela
Define caractersticas da janela de abrir ou salvar

FontDialog - Caixa de dilogo de escolha de fonte.


Propriedades Descrio
Device
Define se deve utilizar fontes para tela, impressora ou ambos
MinFontSize
Tamanho mnimo da fonte
MaxFontSize Tamanho mximo da fonte
Options
Define caractersticas das fontes
Evento
OnApply

Descrio
Ocorre aps o usurio pressionar o boto apply e antes da janela
fechar

ColorDialog - Caixa de dilogo para escolha de cor.


Propriedades
Descrio
Options
Define caractersticas da caixa de dilogo

PrintDialog - Caixa de dilogo de impresso.


Propriedades Descrio
Copies
Nmero de cpias inicial
PrintToFile
Define se a impresso ser direcionada para arquivo
PrintRange
Faixa de pginas a ser impressa (todas ou somente o

154

Propriedades Descrio
selecionado)
FromPage
Pgina inicial
ToPage
Pgina final
MinPage
Menor nmero de pgina que o usurio pode escolher
MaxPage
Maior nmero de pgina que o usurio pode escolher
Options
Define caractersticas da caixa de dilogo

PrintSetupDialog - D acesso caixa de dilogo de configurao de


impressora.

FindDialog e ReplaceDialog - Caixas de dilogo de pesquisa e substituio


de texto.
Propriedades
FindText
ReplaceText
Options
Evento
OnFind
OnReplace

Descrio
Texto a pesquisar
Texto a substituir (somente em ReplaceDialog)
Define caractersticas da caixa de dilogo
Descrio
Ocorre aps o usurio pressionar o boto Find Next
Ocorre quando o usurio pressiona o boto Replace (somente
em ReplaceDialog)

Mtodo
CloseDialog

Descrio
Fecha a caixa de dilogo

MainMenu e PopupMenu - Usado para criao de barras de menus, onde o


MainManu representa o Menu suspenso presente nos aplicativos e o
PopupMenu represnta o menu instatneo (boto direito do mouse) associado
aos componentes atravs da propriedade PopupMenu.
Propriedades
Items
Eventos
OnPopup

Descrio
Itens do menu, utiliza o MenuEditor

Descrio
Ocorre quando o menu popup ativado

MenuEditor - Utilizado para definio dos itens e sub-itens do menu


Operaes : Inserir, Deletar e Criar SubItems

MenuItem - Item do menu.

155

Propriedades
Caption
Checked
Visible
Enabled
ShortCut
Break
GroupIndex
RadioItem

Eventos
OnClick

Descrio
Texto do item
Se o item esta marcado ou no
Se o item esta visvel ou no
Se o item esta ativado ou desativado
Tecla de atalho
Indica quebra de coluna
Indica que o item do menu pertence a um grupo
Indica que o item de menu funcionra como um Radio, ou seja,
dentro do mesmo grupo apenas um item estr selecionado.

Descrio
Quando o item de menu selecionado, usado para executar a
funo do item

156

Respostas dos Exerccios

Capitulo 1
1) O que Delphi? uma ferramenta para o desenvolvimento rpido de
aplicativos (RAD), fortemente baseada na criao visual atravs de
componentes e na utilizao da Programao Orientada a Objetos
atravs da Linguagem Object Pascal.
2) O que IDE? Quais os itens que a compe? A IDE o Ambiente
Integrado de Desenvolvimento. formado pela Janela Principal (menu
do Delphi, SpeedBar e Component Palette), o Object Inspector e o
TreeView, o Code Editor (Editor de Cdigo) e um Debugger Integrado.
3) Para que serve o Object Inspector? Ele responsvel por permitir a
inspeo e modificao das propriedades e eventos associados a cada
objeto (componentes).
4) Quais so os principais arquivos de um projeto? O arquivo com
extenso .DPR, que gerencia todo o projeto e responsvel pela
criao do aplicativo executvel, arquivos .DFM dos formulrios (que
sempre possuem um arquivo .PAS) e os arquivos .PAS com cdigo
fonte em Object Pascal.
5) O que um evento? So rotinas ou procedimentos que so executados
como resposta a uma determinada ao ou acontecimento, com o
pressionamento de teclas, um clique ou movimento de mouse, etc.

Capitulo 2
1) O que so Classe e Objeto? Objeto uma estrutura que armazena tanto
dados (informaes) quanto funes (rotinas) para processa-los e/ou
manipula-los. A Classe uma definio genrica, uma espcie de
molde para a criao de um objeto.
2) O que so mtodo e propriedade? Mtodo so funes que manipulas
os dados de um objeto, propriedade so as caractersticas que um
objeto possui.
3) O que e para que serve o BDE? O BDE uma engine (ferramenta)
que fornece acesso a bancos de dados Desktop e Client-Server.
4) Qual a vantagem de se utilizar Alias? Permitir a alterao da base de
dados, tanto para um novo local como para uma nova arquitetura ou
banco de dados sem ter que modificar o aplicativo (executvel).

157

5) Qual a funo do Database Desktop? a ferramenta utilizada para a


criao/manuteno de tabelas de dados.

Capitulo 3
1) Qual a funo do Menu Editor? O Menu Editor permite a criao visual
de menus pulldown (mainmenu), o ajuste das propriedades dos itens de
menu e tambm o acesso aos eventos dos mesmos.
2) Qual a diferena entre aplicaes SDI e MDI? Qual tipo podemos criar
com o Delphi? Em uma aplicao SDI as janelas so independentes,
numa aplicao MDI temos uma janela principal (pai) que gerencia as
outras janelas (filhas). No Delphi podemos criar ambas, no entanto, por
padro so criadas aplicaes SDI.
3) Para que servem os componentes da Guia BDE? Eles permitem acessar
bancos de dados atravs da engine BDE.
4) Qual a funo dos componentes da Guia Data Controls? Eles permitem
construir janelas para visualizao e manuteno conectadas
diretamente a componentes de acesso a dados, executando as
operaes bsicas de leitura/gravao sem que seja necessrio
programao extra.
5) Qual a funo do componente DataSource? O DataSource liga os
componentes Data Controls aos componentes de acesso a dados, das
guias BDE, ADO, dbExpress e Interbase.

Capitulo 4
1) Qual a funo propriedade EditMask? Facilitar a digitao de dados
atravs de uma mscara de entrada de dados.
2) Qual o evento que devemos utilizar para inicializar valores num
campo? O evento OnNewRecord.
3) Para que serve a propriedade CharCase? Para especificar se a
digitao ser normal (da forma como for digitada) ou dever ser fixada
em maisculo ou minsculo.
4) Qual a utilizade do mtodo Locate? Localizar informaes nas tabelas
de dados.
5) Para que serve a funo InputQuery? Cria uma caixa de dilogo para a
entrada de informaes.

158

Capitulo 5
1) Para que serve a propriedade Glyph presente em alguns tipos de boto?
Ela permite que o boto apresente uma imagem alm do texto.
2) Como podemos ocultar os botes do DBNavigator? Desativando as subpropriedades da propriedade VisibleButtons.
3) Qual a melhor maneira para se inserir um determinado componente
em um Form vrias vezes? Pressionando-se a tecla Shift antes de
seleciona-lo. Depois clica-se quantas vezes se deseja que o
componente seja inserido e libera-se a duplicao clicando no cone de
seta na paleta de componentes.
4) Qual a finalizade de campos LookUp? Exibir informaes vindas de
outra tabela relacionadas atravs de um campo da tabela atual.
5) Qual a finalizade de campos Calculated? Criar campos calculados (com
frmulas) que so atualizados automaticamente, quando algum dos
seus itens modificado.

Captulo 6
1) Quais so os principais mtodos de pesquisa do componente Table?
So os mtodos FindKey / FindNearest e Locate.
2) Como podemos alterar dinamicamente o tamanho de um formulrio?
Modificando suas propriedades Height (altura) e Width (largura).
3) Qual a funcionalidade do componente PageControl? Ele permite a
criao de pginas que permitem separa itens na interface, como
acontece nas caixas de dilogo do Windows de propriedade de vdeo,
etc.
4) Para que serve as estruturas de controle de exceo try..finally..end?
Serve para criar uma proteo a execuo de uma rotina, garantindo
que os comandos escritos aps o finally sero executados mesmo que
ocorra algum erro nos comandos entre o try e o finally.
5) Qual o mtodo utilizado para sincronizar a posio de registro de dois
componentes Table configurados para acessar a mesma tabela? o
mtodo GotoCurrent.

Captulo 7
1) Para que serve o Componente ImageList? um continer (repositrio)
para o armazenamento de imagens que sero utilizadas por menus,
barras de ferramenta, etc.

159

2) Qual o Componente responsvel pela criao de relatrios? o


QuickReport da guia QReport.
3) Para que serve o componente QRExpr? Serve para a efetuar clculos,
somatria e contagem em relatrios.
4) Como so construdos os relatrios? Atravs de bands (QRBands)
responsveis por separar os dados que devem ser exibidos (detail) de
outras partes como cabealho, rodap e sumrio (totalizaes).
5) Para que serve a funo WinExec? Executa um programa externo.

160

Você também pode gostar