Escolar Documentos
Profissional Documentos
Cultura Documentos
Delphi 5
Delphi 5
Sumrio
INTRODUO
1.1.
1.2.
1.3.
1.4.
2.
2.10.
2.11.
3.
4.
A JANELA PRINCIPAL
OS FORMULRIOS
O OBJECT INSPECTOR
O EDITOR DE CDIGO
CODIFICANDO E COMPILANDO
SALVANDO O PROJETO
TRABALHANDO COM UMA APLICAO
CRIANDO UMA CONSOLE APPLICATION
CRIANDO UMA APLICAO GUI
2.9.1. CRIANDO E ALTERANDO APLICAO DEFAULT
2.9.2. UTILIZANDO WIZARDS
O ARQUIVO DE PROJETO
MANIPULANDO COM AS OPES DO PROJETO
9
10
12
16
23
24
26
27
30
31
32
32
33
35
AS UNITS
38
3.1.
38
38
49
50
51
OS FORMULRIOS
51
4.1.
51
51
52
53
53
54
55
56
57
4.2.
5.
CRIANDO FORMULRIOS
4.1.1. NOVOS FORMULRIOS
4.1.2. CONFIGURANDO O OBJECT REPOSITORY
EXIBINDO FORMULRIOS
4.2.1. MANIPULANDO COM PROPRIEDADES E MTODOS
4.2.2. NOMEANDO OBJETOS
4.2.3. FORMULRIOS MODAIS
4.2.4. FORMULRIOS NO MODAIS
4.2.5. FORMULRIOS MODAIS VERSUS NO MODAIS
COMANDOS DA LINGUAGEM
58
5.1.
5.2.
58
59
5.3.
5.4.
60
61
61
62
62
63
Pgina: 1
Delphi 5
5.5.
6.
7.
9.
10.
63
MANIPULANDO FORMULRIOS
64
6.1.
6.2.
6.3.
65
69
70
PRINCIPAIS PROPRIEDADES
PRINCIPAIS MTODOS
PRINCIPAIS EVENTOS
COMPONENTES DE INTERFACE
70
7.1.
70
70
71
72
73
74
74
74
74
75
7.2.
8.
DEPURANDO APLICAES
75
8.1.
8.2.
8.3.
8.4.
8.5.
8.6.
75
75
75
75
76
76
77
9.1.
9.2.
9.3.
77
77
78
79
10.1.
80
80
81
82
83
84
85
85
85
86
87
87
87
88
90
90
90
90
91
91
91
91
10.2.
10.3.
10.4.
10.5.
Pgina: 2
Delphi 5
10.6.
10.7.
11.
RELATRIO EM QUICKREPORT
11.1.
11.2.
11.3.
11.4.
11.5.
11.6.
11.7.
12.
COMPONENTES QR PRINCIPAIS
11.1.1. QUICKREP ( RELATRIO RPIDO, O PROPRIETRIO )
11.1.2. QRBAND ( COMPONENTES FAIXAS/PARTE )
COMPONENTES QR DE CONTEDO CONSTANTE
11.2.1. QRLABEL ( TEXTO ESTTICO/CONSTANTE )
11.2.2. QRMEMO ( MEMO ESTTICO )
11.2.3. QRIMAGE ( IMAGEM CONSTANTE )
11.2.4. QRSHAPE ( FORMAS )
COMPONENTES QR ESPECIAIS
11.3.1. QRSYSDATA ( INFORMAO DO SISTEMA)
11.3.2. QREXPR ( CONSTRUO DE EXPRESSO)
COMPONENTES QR DE BANCO DE DADOS
11.4.1. QRDBTEXT ( ACESSA CONTEDO NO-GRFICO)
11.4.2. QRDBIMAGE ( ACESSA CONTEDO GRFICO)
BANDS ESPECFICOS
11.5.1. QRGROUP (BANDA PARA FORMAO DE GRUPO)
11.5.2. QRCHILDBAND (BANDA FILHA PARA ACOMPANHAMENTO)
11.5.3. QRSUBDETAIL (BANDA FILHA PARA ACOMPANHAMENTO)
COMPOSIES DE RELATRIOS
OS RELATRIOS DO NOSSO APLICATIVO
11.7.1. RELATRIO DE CARGOS
11.7.2. RELATRIO DE DEPARTAMENTOS
11.7.3. RELATRIOS DE FUNCIONRIOS
92
92
93
93
94
95
95
96
97
97
98
98
98
99
99
99
99
100
100
100
100
100
100
101
101
101
101
101
101
101
102
102
103
103
ENTREGANDO A APLICAO
104
12.1.
12.2.
12.3.
12.4.
12.5.
12.6.
12.7.
12.8.
12.9.
12.10.
12.11.
12.12.
12.13.
12.14.
12.15.
12.16.
12.17.
105
105
105
107
109
111
113
115
117
119
120
121
121
121
122
123
123
O INSTALLSHIELD EXPRESS
INSTALANDO O INSTALLSHIELD
EXECUTANDO O INSTALLSHIELD PELA PRIMEIRA VEZ
A JANELA PRINCIPAL
AJUSTANDO O VISUAL DESIGN
SELECIONANDO OBJETOS DO INSTALLSHIELD PARA O DELPHI
ESPECIFICANDO COMPONENTES E ARQUIVOS
SELECIONANDO OS COMPONENTES DE INTERFACE COM O USURIO
MUDANDO O REGISTRY
ESPECIFICANDO FOLDERS E CONES
CONSTRUINDO OS DISCOS DE INSTALAO
TESTANDO A INSTALAO
DISTRIBUINDO O PRODUTO
CRIANDO MLTIPLAS CONFIGURAES
COMPONENTES
TIPOS DE INSTALAO
CONCLUSO
Pgina: 3
Delphi 5
Introduo
1.1.
Histria
Pgina: 4
Delphi 5
Uma interface mais amigvel ao usurio passou a ser utilizada. A utilizao de telas grficas ao
invs das tradicionais telas de entrada de texto passou a ser utilizada, eliminando um dos fatores
principais que mantinham as pessoas longe dos computadores, a sua dificuldade de uso. Agora, ao
invs de ter a tarefa de decorar inmeros comandos que possibilitavam a utilizao da mquina, o
usurio poderia operar o microcomputador de forma bem mais intuitiva e simplificada.
A padronizao dos programas tambm foi um outro fator de destaque para a aceitao do novo
ambiente. O Windows seguia um padro dentro de seus aplicativos e para que novos aplicativos
fossem desenvolvidos para esse ambiente, os padres tambm deveriam ser mantidos. Dessa forma,
o gasto com a adaptao a novos produtos seria feita de forma bem mais rpida, simplificada e
eficiente, estimulando assim a venda de produtos para esse novo ambiente. As empresas viam no
Windows a oportunidade de diminuir os elevados custos com o aprendizado de novas ferramentas e
aumentar a sua produtividade. Contudo uma dificuldade passou a existir, desta vez no mais para os
usurios dos computadores, mas sim para os desenvolvedores de software, a dificuldade de
programao.
Programar nesse novo ambiente era bastante complicado. Passa a existir um grande dilema
entre os programadores: continuar utilizando as linguagens mais antigas, mais simples de
programar mas que, no entanto, no seguiam qualquer tipo de padronizao e que, pouco a pouco,
vinham perdendo espao no mercado para os aplicativos desenvolvidos para o ambiente Windows
ou mudar para o desenvolvimento de aplicativos que seguissem a padronizao que estava
conquistando as empresas mas que, com relao tarefa de programao, era bem mais difcil e
complexa e que, por conseqncia, mais cara para se desenvolver.
Os analistas de sistemas e os programadores comearam a optar, mesmo com todas as
dificuldades, por desenvolver aplicativos para o ambiente Windows. Para a felicidade de todos, as
grandes empresas desenvolvedoras de linguagens de programao perceberam as dificuldades
existentes nesse processo. Gigantes como a Borland (atual Inprise Corporation) e a prpria
Microsoft comearam a procurar desenvolver novas ferramentas de programao que viessem
propiciar, de forma mais simplificada, o desenvolvimento de software para o ambiente Windows da
mesma forma como haviam feito com os ambientes Turbo para o sistema operacional DOS.
Vrias ferramentas tm sido colocadas, nos ltimos anos, disposio dos programadores
aumentando bastante o desenvolvimento de software para o ambiente Windows. Com o lanamento
do Microsoft Visual Basic, um dos Ambientes Visuais de Desenvolvimento pioneiros, um aumento
substancial de softwares produzidos foi observado. Outras empresas procuraram seguir o exemplo
da Microsoft lanando seus prprios Ambientes Visuais de Desenvolvimento para o ambiente
Windows. Contudo, o que so esses tais Ambientes Visuais de Desenvolvimento que tomaram toda
a industria de desenvolvimento de software? A resposta para essa pergunta daremos a seguir.
1.2.
Pgina: 5
Delphi 5
cdigo fonte provocaram o efeito desejado. Ao final desse imenso trabalho de estruturao da
interface, centenas, ou at mesmo, milhares de linha de cdigo haviam sido escritas para que tudo
estivesse de acordo com o planejado pela equipe de programadores visuais responsveis pelo
projeto da interface. Tendo como um de seus objetivos facilitar todo esse processo de
desenvolvimento de software, responsvel muitas vezes por grande parte do tempo gasto durante o
desenvolvimento, surgiram os chamados Ambientes Visuais de Desenvolvimento.
A grande popularidade desses ambientes veio do fato de que eles vieram a permitir o
desenvolvimento de programas simples e complexos com pouco, ou at mesmo nenhum, esforo de
programao. A dificuldade com o desenvolvimento das interfaces para os programas
desenvolvidos para o ambiente Windows praticamente deixou de existir. Para o programador,
deixou de existir a necessidade de conhecer, entre outras coisas, uma variedade de comandos para o
posicionamento dos diversos objetos que deveriam ser colocados nas janelas do Windows.
Agora, para o programador, o desenvolvimento da interface seria feito de forma to simples
quanto se ele estivesse desenhando a interface em sua prpria janela. O desenho da interface feito
colocando-se os componentes desejados nas janelas e ajustando suas propriedades como, por
exemplo, sua largura e altura, de tal forma que a interface tome o aspecto desejado sem a
necessidade de qualquer codificao por parte do programador. Por esse motivo, alguns autores
chamam esse tipo de desenvolvimento rpido de interfaces de WYSIWYG, sigla originria do
ingls What You See Is What You Get, que significa O que voc v o que voc obtm,
referenciando justamente a forma de desenvolvimento das interfaces nessas Ambientes Visuais de
Desenvolvimento. Devido a grande facilidade com que as interfaces dos aplicativos passaram a ser
desenvolvidas, uma grande parte do tempo gasto no seu desenvolvimento passou a ser
economizado. Por esse motivo, alguns autores chamam esse tipo de ambiente de desenvolvimento
de aplicaes de RAD, que significa Rapid Application Development, do ingls Desenvolvimento
Rpido de Aplicaes. A utilizao desses ambientes diminui consideravelmente o tempo e,
principalmente, o custo de desenvolvimento de aplicaes.
Como conseqncia dessas facilidades e praticidade de desenvolvimento de aplicaes para o
ambiente Windows, cada vez maior a procura e a aceitao de Ambientes Visuais de
Desenvolvimento como o Microsoft Visual Basic (um dos pioneiros), o PowerBuilder, o Centura
(antigo SQL Windows), alm, claro, do prprio Delphi.
Devemos observar que o simples fato do desenvolvimento da interface da aplicao no
finaliza a tarefa do desenvolvimento. Resta ainda ao programador escrever o cdigo que dever ser
executado quando o usurio tomar determinadas aes como, por exemplo, pressionar o boto de
sada do programa.
Sob esse novo modelo de desenvolvimento, os programas passam a ser desenvolvidos atravs
de um novo ponto de vista. Os programas passam a ser formados por objetos que vo sendo
colocados em suas janelas (trataremos do conceito de objetos posteriormente nesta apostila), pelo
ajuste de suas propriedades, para que esses objetos tenham as caractersticas desejadas pelos
desenvolvedores, e pelos eventos aos quais esses objetos iro responder isto , as possveis aes
realizadas pelos usurios do sistema ou pelo prprio sistema, como por exemplo, o clicar do mouse
sobre um boto.
A utilizao desse novo modelo , por muitas vezes, a parte mais difcil no processo de
migrao do desenvolvimento de programas das antigas linguagens procedurais para os novos
ambientes de desenvolvimento baseados em eventos. O programador no pode mais supor uma
ordem exata na execuo do seu cdigo fonte e deve passar a tratar isoladamente cada evento
relevante de sua aplicao.
Pgina: 6
Delphi 5
Por exemplo, suponhamos um programa de banco de dados que possua um cadastro de clientes.
Nesse programa temos uma tela onde o usurio do sistema dever cadastrar cada cliente que ir
pertencer ao banco de dados da aplicao. Nos sistemas mais antigos, no baseados no ambiente
Windows, o preenchimento de cada campo era feito de forma seqencial, verificando-se facilmente
se o valor para cada um deles estava sendo colocado corretamente. Alm disso, a verificao de
campos de preenchimento obrigatrio era facilmente efetuada uma vez que, para chegar ao local de
confirmao da incluso, o usurio deveria ter passado por todos os campos da tela de cadastro,
preenchendo-os corretamente. Contudo, com o desenvolvimento de aplicativos para o ambiente
Windows, no podemos mais fazer tais suposies. Agora, na janela de cadastro de clientes, o
usurio no mais obrigado a pressionar o boto de confirmao de incluso de um novo cliente
apenas aps o total preenchimento de seus campos. Cuidados adicionais devem ser tomados para
que isso no ocorra. Um outro exemplo bastante simples e que ocorre com freqncia cada vez
maior em nosso dia-a-dia est no prprio encerramento do programa. A maneira mais corriqueira de
se finalizar um aplicativo por parte do usurio atravs da escolha de uma opo de sada existente
na aplicao. Porm, qualquer usurio poderia finalizar o aplicativo atravs de um clique no cone
de sistema localizado no canto superior direito das janelas da aplicao. Um usurio mais
experiente do ambiente Windows poderia tambm pressionar as teclas de atalho ALT + F4
provocando o fechamento da janela da aplicao. Em cada um desses trs casos, funo do
desenvolvedor fornecer o mesmo tratamento para cada uma dessas aes do usurio.
Pudemos ver que os programas no iro mais seguir aquela ordem linear de execuo que
programas mais antigos seguiam, mas sim uma execuo baseada em eventos. A ordem de
execuo do programa ir seguir a ordem dos eventos que cada usurio do aplicativo desejar.
Devemos perceber que, internamente ao tratamento de cada evento, a execuo das instrues
contidas no cdigo do programa ainda continua, de certa forma, linear porm, a escolha de qual
desses cdigos ou seja, a execuo dos eventos por parte do usurio do aplicativo, a ser executado
que no mais linear.
Mesmo com essa aparente dificuldade, o desenvolvimento de aplicaes atravs de tais
ambientes , e continuar a ser durante muito tempo, o mtodo mais rpido e eficiente de
desenvolvimento de aplicaes para o ambiente Windows.
1.3.
O que o Delphi
Pgina: 7
Delphi 5
Vimos na seo anterior que o ambiente de programao Delphi utiliza, para a escrita de
cdigo fonte, a linguagem chamada Object Pascal. A linguagem de programao chamada Object
Pascal, que ser vista posteriormente nessa apostila, nada mais do que uma verso da j conhecida
linguagem Pascal, porm com suporte programao orientada a objetos. Mas ento por que
chamar este novo ambiente de Delphi ao invs de utilizar, por exemplo, o nome Object Pascal
verso X.X?
Muitos afirmam que essa mudana se deu por motivos financeiros e, principalmente, por
motivos psicolgicos. A linguagem Pascal foi, por muito tempo, considerada uma linguagem
utilizada para o ensino de prticas de programao e que, por esse motivo, seus compiladores
haviam sido desenvolvidos de tal forma a gerar cdigo executvel pouco eficiente. Esse rtulo
perseguiu as diversas verses do Pascal por muitos anos. Os programadores apesar de conhecerem a
linguagem Pascal, ensinada na maioria dos cursos de Cincia da Computao, no se aventuravam a
programar comercialmente nessa linguagem devido pouca eficincia de seu cdigo executvel.
A Borland, ao desenvolver seu novo ambiente de desenvolvimento utilizando uma nova verso
para a linguagem Pascal, chamada Object Pascal, decidiu utilizar um nome que no lembrasse em
nada a antiga, e pouco atrativa, linguagem Pascal. Essa estratgia trouxe bons resultados. O novo
ambiente incorporou melhorias em relao s verses anteriores do Pascal como, por exemplo,
gerao de cdigo executvel bem mais eficiente, utilizao de uma linguagem Orientada a Objetos
seguindo o mesmo padro de vrios outros Ambientes Visuais de Desenvolvimento. Qualquer
programador acostumado, por exemplo, a desenvolver seus aplicativos em Visual Basic no teria a
menor dificuldade de iniciar seu desenvolvimento em Delphi. Alm disso, o Delphi trazia consigo
uma vantagem em relao aos demais ambientes, utilizava como linguagem de programao o
Object Pascal, bastante semelhante linguagem Pascal conhecida pela grande maioria dos
programadores.
Desta forma, as software houses economizariam em treinamento aos seus profissionais,
beneficiando a todos. Os programadores agora possuam um ambiente veloz e eficiente que
permitiria o desenvolvimento rpido de aplicativos e as empresas economizariam em gastos com o
treinamento de seus programadores em uma nova linguagem de programao.
Pgina: 8
Delphi 5
Uma vez inicializada a IDE do Delphi surgiro, inicialmente, 4 janelas que iro permitir ao
desenvolvedor trabalhar e desenvolver suas aplicaes no Delphi, como ilustra a figura abaixo.
Barra de
Atalho
Barra de Ttulo
e Menus
Paleta de
Componentes
Object
Inspector
Formulrio
Editor de Cdigo
Existem ainda outras janelas que poderiam ser exibidas dentro da IDE do Delphi dependendo
das configuraes definidas pelo desenvolvedor, porm as 4 janelas exibidas acima constituem a
instalao e configurao bsicas do Delphi. Antes de aprendermos a linguagem Object Pascal
Pgina: 9
Delphi 5
devemos nos familiarizar com o ambiente no qual iremos trabalhar, ou seja, devemos aprender
como manipular a IDE do Delphi. Dessa forma, veremos cada uma das janelas que compe a IDE
mais detalhadamente a seguir.
2.1.
A Janela Principal
Delphi 5
Delphi 5
Os Formulrios
Pgina: 12
Delphi 5
diferenciado que ele exerce sobre a aplicao, dever receber uma ateno especial por parte dos
programadores para o ambiente Windows.
Ao iniciarmos o ambiente de desenvolvimento do
Delphi, nos apresentado um formulrio inicial, em
geral no contendo qualquer componente como
mostrado na figura. Esse formulrio inicial
exatamente o formulrio principal dessa nova
aplicao, porm essa caracterstica do formulrio
poder ser alterada posteriormente com o decorrer do
Delphi 5
Pgina: 14
Delphi 5
Pgina: 15
Delphi 5
O Object Inspector
Pgina: 16
Delphi 5
Inspector exibe apenas propriedades e eventos comuns a todos os componentes que estejam
selecionados naquele momento e, ao alterarmos o valor de qualquer propriedade ou evento,
estaremos alterando o valor dessa propriedade ou evento para todos os componentes selecionados.
Porm o que so as propriedades e os eventos de um componente? As propriedades de um
componente identificam as caractersticas dos componentes tais com altura, largura, cor e tipo da
fonte sendo utilizada pelo componente. Essas caractersticas, dentre outras divises, podem tanto
ser visveis como, por exemplo, a altura e largura do componente quanto no visveis como, por
exemplo, a definio do nome de qual tabela de um banco de dados o formulrio ir exibir
informaes. No devemos confundir os dados que esto sendo exibidos, que so informaes que
podemos visualizar, com o nome da tabela que foi selecionada para ter seus dados exibidos.
J os eventos identificam as aes que, tanto o usurio da aplicao quanto outros formulrios e
componentes, podem realizar durante a execuo do aplicativo sobre o componente selecionado,
por exemplo, um boto pode ser clicado, um formulrio pode ser redimensionado e assim por
diante. Durante a construo de cada programa, funo do programador identificar e codificar
cada evento necessrio ao funcionamento da aplicao. Dessa forma, podemos perceber que nem
todos os eventos de um componente sero codificados, podendo at mesmo no existir qualquer
codificao em um componente dentro de uma aplicao. Porm, no podemos pensar que caso um
determinado evento no seja codificado ele ir deixar de ser executado. O Windows envia todos os
eventos executados para suas respectivas aplicaes. Caso exista uma codificao associada ao
evento executado esse cdigo ser executado, caso contrrio a execuo da aplicao continua
normalmente. Veremos, a partir de agora, um pouco mais detalhadamente como manipular com as
propriedades e eventos de um componente.
A guia Properties est dividida em duas partes, do lado esquerdo esto listados os nomes, em
ordem alfabtica, de cada uma das propriedades do componente corrente e ao seu lado esquerdo
esto os valores atuais para essas propriedades. Na figura do Object Inspector, exibida
anteriormente, vemos as propriedades do formulrio chamado Form1. Esse formulrio possui vrias
propriedades, dentre elas a propriedade Caption possuindo o valor Form1.
Existem vrios tipos de propriedades dentre elas, como j mencionado, as visveis e as no
visveis, tambm chamadas de visuais e no visuais, respectivamente. Alm dessa diviso, podemos
citar propriedades disponveis em tempo de desenvolvimento e aquelas disponveis em tempo de
execuo. Ou seja, as primeiras so aquelas propriedades listadas no Object Inspector que esto
disponveis e podem ser modificadas em tempo de desenvolvimento pelo programador para possuir
os valores por ele definidos. Por outro lado, as ltimas so propriedades que no esto listadas no
Object Inspector. Para que o programador tome conhecimento da existncia dessas propriedades,
ele dever consultar a ajuda online do Delphi. Um vez conhecidas, essas propriedades s podero
ser manipuladas atravs de codificao uma vez que no aparecem no Object Inspector.
Apesar de visveis no Object Inspector, algumas propriedades disponveis em tempo de
desenvolvimento podem ser tanto alteradas em tempo de desenvolvimento quanto em tempo de
execuo atravs de codificao. J outras propriedades, chamadas read-only no podem ser
alteradas em tempo de execuo, podendo apenas ser lidas. Existe toda uma gama de combinaes
entre essas caractersticas das propriedades. Para obter conhecimento a respeito de quais
propriedades so visveis em tempo de desenvolvimento, em tempo de execuo ou em ambas, ou
quais propriedades so read-only ou no, o desenvolvedor Delphi deve consultar a documentao
online fornecida pela Inprise.
Uma vez que sabemos que as propriedades listadas no Object Inspector podem ter seus valores
alterados, resta-nos saber quais os valores podem ser atribudos a cada uma dessas propriedades.
Embora tenhamos uma quantidade muito grande de propriedades para cada componente existente
Pgina: 17
Delphi 5
Pgina: 18
Delphi 5
entre colchetes, as propriedade que apresentam seu contedo entre sinais de parnteses representam
objetos (veremos posteriormente a definio de classes e objetos). Essas propriedades representam
novos objetos contidos dentro do componente em questo, que por sua vez tambm um objeto.
Veremos toda essa idia de objetos posteriormente, por hora basta termos em mente que podem
existir propriedades que representam tanto Sets quanto objetos. A figura anterior mostra a
propriedade Font do formulrio. Essa propriedade ilustra dois aspectos com relao a propriedades
que representam objetos. Podemos observar que a propriedade Font possui, por sua vez, outras
propriedades. Ao contrrio do que acontecia com os Sets, cujos valores que podamos atribuir eram
apenas True ou False, as propriedades que aparecem abaixo de Font podem receber valores
inteiros, strings, Sets ou at mesmo novos objetos. Uma segunda observao est no fato da
existncia de um boto, ao lado do valor da propriedade Font. Ao clicarmos esse boto ser exibida
um caixa de dilogo que nos permite preencher de forma mais agradvel o valor das propriedades
que foram listadas, em nosso exemplo, a propriedade Font. A figura ao lado mostra a caixa de
dilogo que exibida ao clicarmos no boto da propriedade Font. Devemos ter em mente que a
caixa de dilogo mostrada no de exibio obrigatria, ou seja, podem existir propriedades dentro
de componentes do Delphi que representem objetos mas que no possuam uma caixa de dilogo
para permitir uma definio mais fcil dos valroes de suas propriedades. A existncia dessas caixas
depende das pessoas que construram, ou seja, programaram cada um desses componentes. uma
prtica de programao bastante comum dentro do ambiente Delphi que, as propriedades de
componentes que representem objetos deverm ter uma caixa de dilogo associada mas isso no
torna obrigatria a existncia dessas caixas de dilogo. Caso estejamos estudando o Delphi para
desenvolver novos componentes devemos lembrar que, caso exista um propriedade que contenha
um objeto em nosso componente, devemos desenvolver uma caixa de dilogo que permita o
preenchimento das informaes para esse objeto.
A segunda guia existente no Object Inspector responsvel pela
exibio dos Eventos aos quais o componente selecionado pode responder.
Esses eventos, da mesma forma como acontecia com as propriedades, so
especficos para cada componente, ou seja, podem existir eventos comuns
ou no aos diversos componentes existentes no Delphi. A figura ao lado
mostra os eventos aos quais um formulrio pode responder.
J sabemos que o Object Inspector, de forma semelhante ao que
acontece com as propriedades, exibe os eventos especficos para cada
componente selecionado. Porm, para que servem os eventos? Os eventos
formam uma das partes mais importantes na programao dentro do
ambiente Windows. atravs do disparo de eventos que existe a interao
entre o usurio e o cdigo escrito em cada programa. Eventos so disparados por aes do usurio
ou de outros programas, e esses eventos por sua vez, executam a codificao escrita pelos
programadores durante o seu desenvolvimento. No Delphi, a maneira mais simples de associarmos
que cdigo que ser executado quando cada um desses eventos ocorrer atravs do Object
Inspector. Por exemplo, caso quisssemos exibir uma mensagem quando o usurio clicasse no
formulrio, poderamos escrever o cdigo responsvel pela exibio da mensagem e associ-lo ao
disparo do evento OnClick do formulrio. Podamos tambm efetuar essa associao atravs da
prpria codificao porm deixamos a explanao de como isso pode ser feita para uma discusso
um pouco mais avanada dentro do Delphi. A guia Events est dividida de forma semelhante guia
Properties. Do lado esquerdo esto listados os nomes dos eventos enquanto que do lado direito est
o nome de qual trecho de cdigo dever ser executado quando o evento em questo for disparado.
Com o intuito de facilitar o trabalho do desenvolvedor, o nome de cada evento segue um padro de
nomenclatura, observe que dentro do Object Inspector cada evento tem seu nome composto do
prefixo On mais o evento que ir dispar-lo.
Pgina: 19
Delphi 5
Como citado anteriormente, o Object Inspector tem como uma de suas funes associar o
evento e o cdigo a ser executado quando esse evento for disparado. Dessa forma, podemos
perceber que no existe a obrigatoriedade de termos, para cada evento um cdigo a ser executado,
ou seja, podem existir eventos sem qualquer cdigo associado. Por exemplo, no precisamos
associar cdigo algum ao evento OnClick do formulrio. Mesmo que isso ocorra, como mencionado
anteriormente, o Windows continuar enviando uma mensagem ao formulrio toda vez que ele
sofrer um clique por parte do usurio, porm nada ser executado. Da mesma forma, tambm
podemos ter inmeros eventos apontando para o mesmo cdigo, como ilustra a figura abaixo. Na
figura abaixo vemos a existncia de trs eventos distintos que, ao serem disparados, executam o
mesmo trecho de cdigo dentro da aplicao.
Por exemplo, em nossa aplicao poderamos ter um boto e um item de menu que nos
permitam sair do programa. No necessitamos escrever dois cdigos idnticos e associa-los
respectivamente ao clique no boto e ao clique do item de menu. Basta criarmos uma nica
codificao e associ-la a ambos os eventos, ou seja, tanto ao clique do boto quanto ao do item de
menu. Isso muito importante uma vez que nos permite uma melhor codificao e manuteno do
cdigo escrito, diminuindo a quantidade de erros durante a fase de manuteno do aplicativo.
Uma vez que j sabemos que podemos associar cdigo aos diversos eventos existentes em cada
componente, resta-nos escrever esse cdigo e criar a associao entre o cdigo escrito e o evento
desejado. Apesar de poder parecer um pouco estranho, iremos comear no pela codificao, mas
sim pela associao entre o cdigo e os eventos. Essa inverso ficar clara no decorrer de nossa
explicao. Ento, veremos agora as quatro alternativas que o Delphi nos oferece para associar
cdigo aos eventos listados no Object Inspector.
Vamos iniciar com o mtodo mais comum de associao. Para isso, iremos construir nossa
primeira aplicao em Delphi. Inicialmente, essa
aplicao no ir conter qualquer componente, ou seja,
ela ser composta simplesmente da janela principal
como ilustrado ao lado. Para isso devemos selecionar a
opo Close All no menu File e em seguida a opo
New Application localizada nesse mesmo menu. Caso
tenhamos modificado a aplicao anterior o Delphi ir
nos perguntar se desejamos salvar as alteraes
efetuadas, por ora responderemos no. Suponha que
desejamos exibir uma mensagem quando esse
formulrio for clicado. J sabemos que o Object
Inspector sempre manipula o componente selecionado e por isso devemos selecionar o formulrio
Pgina: 20
Delphi 5
que, nada mais do que o componente ao qual desejamos criar a associao entre a codificao e o
evento. Para selecionarmos o formulrio basta que efetuemos um clique simples no formulrio que
este se tornar o objeto selecionado no Object Inspector. Uma vez selecionado o componente,
devemos no Object Inspector, selecionar o evento que desejamos associar a codificao. Em nosso
exemplo, devemos selecionar o evento OnClick uma vez que queremos exibir uma mensagem
quando o formulrio for clicado. Uma vez que ainda no escrevemos codificao alguma, iremos
nos aproveitar de alguns recursos que o Delphi nos oferece para podermos criar tanto a codificao
inicial quanto a associao dessa codificao com o evento do formulrio. Para isso, vamos dar um
duplo clique na regio branca do lado direito do nome OnClick.
Ao fazermos isso, o Delphi abre o Editor de Cdigo, que ser visto no prximo tpico, e cria
um trecho de programa no qual podemos digitar o cdigo necessrio exibio da mensagem
quando o formulrio for clicado, como ilustrado na
figura. Esse trecho de cdigo chamado de
Procedimento de Evento, do ingls Event Procedure.
Alm da criao do trecho inicial da codificao a ser
realizada, o Delphi tambm alterou outros trechos de
cdigo dentro do prprio Editor. No iremos abordar
agora essas demais alteraes, apenas iremos salientar
que as demais alteraes feitas pelo Delphi so
importantes quando estivermos criando por conta
prpria procedimentos de eventos para as nossa
aplicaes. Apesar de no serem alteaes que um
programador iniciante estar fazendo dentro do Delphi elas devero ser observadas para um melhor
entendimento do funcionamento de um programa Delphi.
Uma outra alterao realizada pelo Delphi, facilmente perceptvel, encontra-se no Object
Inspector. Agora, ao lado do evento OnClick do formulrio, o Delphi criou a associao desse
evento com o trecho de cdigo que foi criado pelo pprio Delphi e listado no
Editor de Cdigo. Observe que essa associao criada nada mais do que a
informao de qual Procedimento de Evento ser executado quando o evento
OnClick for disparado. De forma semelhante poderamos fazer com que o
Delphi criasse qualquer Procedimento de Evento e fizesse a associao entre o
procedimento e o respectivo evento. A figura ao lado mostra como ficou o
Object Inspector aps a associao entre o Procedimento de Evento criado e o
evento OnClick do formulrio.
O Delphi, ao criar o Procedimento de Evento, forneceu a ele um nome
inicial default, formado pelo nome do componente que ir sofrer o evento, em
nosso exemplo o formulrio, juntamente com o evento que ir disparar a
execuo do procedimento, no exemplo o evento Click. Apesar do Delphi
fornecer um nome default para os procedimentos, muitas vezes podemos querer utilizar um outro
nome para o procedimento, de tal forma que se torne mais clara a finalidade daquele trecho de
cdigo a ser executado. Por exemplo, ao invs de chamarmos o procedimento de FormClick
poderamos querer que o procedimento viesse a ser chamado de ExibirMensagem.
Essa alterao pode ser facilmente realizada. Basta que mudemos o nome da associao no
Object Inspector e teclemos ENTER, que ela ser automaticamente refletida
tambm no Editor de Cdigo. Observe, no entanto, que para fornecermos o nome
desejado ao Procedimento de Evento tivemos de criar um procedimento com o
nome default e posteriormente muda-lo para o nome que desejvamos. Porm
poderamos ter criado o procedimento diretamente com o nome desejado. Essa
Pgina: 21
Delphi 5
justamente a segunda maneira que possumos para criar um Procedimento de Evento dentro do
Delphi. Ao selecionarmos o evento desejado podemos, no Object Inspector, ao invs de dar um
duplo clique no evento desejado, temos a opo de digitar diretamente o nome que desejamos
atribuir ao Procedimento de Evento e em seguida, ao darmos um ENTER, O Delphi ir criar o
procedimento da mesma forma como havia criado anteriormente, porm com o nome que definimos
ao invs de utilizar o nome default. Apesar dessa segunda opo de criao de um procedimento ser
mais clara em relao finalidade do procedimento sendo criado, ela no to utilizada em relao
primeira, por questes muitas vezes de agilidade no desenvolvimento da aplicao.
A terceira opo para criarmos procedimentos de eventos apoia-se no fato de
podermos associar diversos eventos execuo de um mesmo trecho de cdigo
fonte. A associao bastante simples. Para associarmos um evento a um
Procedimento de Evento previamente escrito basta que selecionemos, a partir do
combo box ao lado do evento que desejamos fazer a nova associao, o nome do
Procedimento de Evento previamente criado. A figura ao lado mostra a exibio no
combo box da propriedade OnDestroy o Procedimento de Evento ExibirMensagem
criado anteriormente para o evento OnClick do formulrio. Ao criarmos essa
associao, o mesmo trecho de cdigo ser executado por nossa aplicao tanto
quando o formulrio for clicado como quando ele for destrudo.
importante fazermos uma pequena observao com relao a essa
possibilidade de associarmos Procedimentos de Eventos previamente criados a outros eventos
dentro de nossa aplicao. No Combo Box dos eventos nem sempre estaro
listados todos os Procedimentos de Eventos que j foram criados em uma
aplicao. Esse fato est ilustrado na figura a seguir. Como podemos observar, o
Procedimento de Evento ExibirMensagem foi criado previamente e est
associado ao evento OnClick do formulrio. Contudo esse procedimento no
aparece no Combo Box exibido ao lado do evento OnCloseQuery do formulrio.
Fato semelhante aconteceria em vrios outros combo boxes de eventos. A
recproca tambm aconteceria se tivssemos criado inicialmente um
procedimento de evento associado ao evento OnCloseQuery do formulrio e,
posteriomente tentssemos associar esse mesmo procedimento ao evento
OnClick do formulrio.
Ao contrrio do que poderamos pensar inicialmente, isso no um bug do
Delphi e, uma vez que no se trata de um bug, existe obviamente uma
explicao para essa situao. O entendimento dessa situao facilmente observado quando
criamos um Procedimento de Evento, por qualquer um dos mtodos vistos anteriormente, e o
associamos ao evento OnCloseQuery. Ao fazermos isso, o Delphi ir exibir o Editor de Cdigo e
deixar disponvel os procedimentos criados tanto para o evento OnClick quanto para o evento
OnCloseQuery, como ilustrado na figura abaixo. Observe que esses procedimentos, apesar de serem
criados pelo Delphi de forma semelhante eles so diferentes em suas declaraes.
Pgina: 22
Delphi 5
O Editor de Cdigo
O Editor de Cdigo, at a verso 3 do Delphi, nada
mais era do
que
uma
janela
dotada dos
recursos
Pgina: 23
Delphi 5
mais comuns nos editores de texto tais como o WordPad. Nessa janela podiam ser exibidos um ou
vrios arquivos de cdigo fonte. Cada um desses arquivos podia ser acessado atravs de uma guia
contendo o nome do arquivo sendo exibido. Alm disso no Editor de Cdigo eram exibidas
informaes a respeito da compilao dos programas tais como erros e warnings detectados pelo
compilador Delphi. A partir da verso 4 do Delphi, o Editor de Cdigo trouxe uma outra janela,
chamada de Code Explorer, capaz de identificar e exibir de forma mais organizada informaes a
respeito do arquivo fonte sendo exibido, tais como declaraes de constantes e variveis.
O Editor de Cdigo possui recursos que permitem a busca e substituio de trechos de cdigo,
atravs do menu Search. No entraremos em detalhe a respeito da utilizao desses recursos por se
tratarem de recursos comuns maioria dos editores de texto. Alm desses recursos de busca, o
Editor de Cdigo nos fornece a possibilidade de configur-lo de tal forma a atender melhor as
nossas necessidades. Para isso, devemos acessar a caixa de dilogo Editor Properties localizada no
menu Tools atravs da opo Editor Options. Essa caixa de dilogo possui 5 guias das quais as
quatro primeiras (General, Display, KeyMappings e Color) possibilitam a configurao visual do
Editor de Cdigo tais como a fonte e as cores que sero utilizadas. J a guia Code Insight permite a
configurao do recurso de mesmo nome existente no Delphi, veremos o Code Insight
posteriormente.
Uma observao que deve ser feita
ao utilizarmos o Editor de Cdigo
refere-se manipulao dos arquivos
que so exibidos. Uma vez que no
desejarmos mais que um determinado
arquivo seja exibido no deveremos
simplesmente clicar no cone de
sistema localizado no canto superior
direito do Editor. Caso faamos isso
estaremos fechando todo o Editor de
Cdigo e no apenas o arquivo selecionado. Para fecharmos apenas o
arquivo fonte selecionado devemos clicar com o boto secundrio do
mouse por sobre o Editor de Cdigo. Ao fazermos isso ser exibido um
menu popup que permite um acesso mais rpido a diversas opes do
Editor de Cdigo, entre elas a opo Close Page, responsvel for fechar
a pgina corrente.
Como dito anteriormente, o Editor de Cdigo, apesar de poder exibir arquivos genricos de
texto, ele a janela do Delphi responsvel pela exibio, principalmente, de arquivos que
contenham cdigo fonte escrito dentro do Delphi. Neste tpico falamos de forma genrica do Editor
de Cdigo sem nos preocuparmos com os arquivos fonte propriamente ditos. Veremos esses
arquivos com bem mais detalhe no tpico abordando as units.
2.5.
Codificando e Compilando
Pgina: 24
Delphi 5
Pgina: 25
Delphi 5
Como pudemos observar, esses erros ocorreram por que o Delphi fez uma srie de modificaes
automaticamente no cdigo fonte de nossa aplicao ao permitirmos que ele criasse o Procedimento de
Evento. Dessa forma, para evitarmos que esses erros ocorram, devemos tambm permitir que o Delphi
remova essas alteraes automaticamente para ns. E isso to simples de conseguirmos como foi para que
essasincluses de cdigo fossem feitas para ns. O Delphi remove automaticamente todas os
Procedimentos de Eventos e suas respectivas referencias sempre que salvamos ou tentamos compilar
nossas aplicaes desde que no exista nenhum cdigo ou comentrio dentro do corpo do procedimento, ou
seja, entre as palavras reservadas begin e end; existentes na codificao do procedimento no dever existir
qualquer tipo de codificao nem mesmo um comentrio.
Aps termos alterado o nosso primeiro programa, deixando apenas o procedimento associado ao evento
OnClick do boto, podemos compilar a aplicao para verificar se ela faz
realmente o que espervamos. Para que possamos compilar a aplicao devemos
selecionar a opo Compile Project1 existente no menu Run. Caso j tivssemos
salvo a aplicao com um nome qualquer a opo de compilao apareceria com o
nome que tivssemos dado aplicao ao invs no nome Project1. Uma vez
compilada a aplicao, podemos execut-la e ver o resultado de sua codificao.
Para isso basta selecionarmos, no menu Run, a opo Run. A aplicao ser
executada e ao clicarmos no boto colocado no formulrio, ser exibida a
mensagem ao lado. Nenhum outro evento provocar qualquer atividade uma vez que removemos todos os
procedimentos exceto o evento associado ao clique do boto.
Devemos nos lembrar sempre que, ao executarmos a aplicao por dentro do Delphi entramos
automaticamente em modo de depurao, ou seja, caso faamos uma nova alterao no cdigo fonte
teremos de encerrar a execuo antes que possamos compilar a aplicao novamente. Dessa forma, para
sairmos do modo de depurao basta fecharmos a janela principal da aplicao que, dessa forma, seremos
levados de volta IDE do Delphi.
2.6.
Salvando o Projeto
Uma vez que terminamos o nosso primeiro aplicativo vamos salv-lo de forma a podermos futuramente
trabalhar novamente nele em nosso prprio equipamento ou em outro qualquer. Para isso, a maneira mais
rpida clicarmos no boto Save All localizado na Barra de Ferramentas. Ao fazermos isso, o Delphi ir
salvar todos os arquivos que foram criados para o desenvolvimento de nosso aplicativo.
O primeiro arquivo a ser salvo pelo Delphi, quando selecionamos a opo Save All, refere-se unit que
contm o cdigo do formulrio principal do nosso aplicativo (veremos as units mais detalhadamente
posteriormente). Devemos fornecer um nome
significativo para a unit, uma vez que esse
nome ser utilizado pelo Delphi no restante do
decorrer do desenvolvimento da aplicao.
Uma observao a ser feita que, com a
prtica poderemos comear a trabalhar com
vrios formulrios dentro de nossa aplicao
deixando para salv-los depois de j termos
escrito uma quantidade relativa de cdigo.
Essa prtica desaconselhada por alguns
motivos entre eles a possibilidade de um queda
de energia que poderia levar a perda de todo o
trabalho desenvolvido, alm de que, ao
clicarmos no boto Save All, o Delphi inicia o
processo de gravao de todas as units
contidas em nossa aplicao e, caso exista um nmero relativamente grande de units ficar cada vez mais
complicado de, no momento da gravao, identificar cada uma dessa units de tal forma a fornecer,
corretamente, seus respectivos nomes. Iremos fornecer no tpico a seguir uma explicao mais detalhada a
Pgina: 26
Delphi 5
cerca dos principais arquivos salvos pelo Delphi bem como fornecer o relacionamento existente entre eles.
No momento basta termos o conhecimento de que devemos fornecer nomes distintos para cada arquivo a
ser salvo de tal forma a identific-los de forma simplificada tanto dentro de nosso aplicativo quanto
externamente ao Delphi no momento de realizarmos backup dos mesmos.
Uma vez que tenhamos salvo a unit referente ao
formulrio principal de nossa aplicao, ou no caso
de estarmos trabalhando com vrios formulrios e
tenhamos salvo todas as units referentes a esses
formulrios, o Delphi ir permitir que ns salvemos o
arquivo, chamado de arquivo de projeto, referente
nossa aplicao como ilustrado na figura ao lado. O
arquivo de projeto um dos mais importantes dentro
de uma aplicao Delphi e ele dever ser salvo com
um nome nico dentro dessa aplicao, no podendo
por isso, ter o mesmo nome que o de uma unit
qualquer pertencente ao projeto (mesmo esses
arquivos possuindo extenses distintas como
veremos posteriormente).
2.7.
USES
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
BEGIN
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Pgina: 27
Delphi 5
A exibio dos arquivos de projeto no feita de modo imediato, ou seja, ao iniciarmos o desenvolvimento
de um novo aplicativo, o arquivo de projeto no exibido pelo Editor de Cdigo. Para que possamos
visualizar o arquivo de projeto devemos, no menu Project, selecionar a opo View Source. Existe uma
explicao para que o arquivo de projeto no seja exibido diretamente. Por se tratar de um arquivo muito
importante, o Delphi encarrega-se de fazer a maioria das alteraes necessrias nesse arquivo, de forma
automtica, ao selecionarmos as devidas opes contidas nos diversos menus da IDE do Delphi. No
devemos alterar diretamente o arquivo de projeto a menos que tenhamos certeza absoluta das alteraes
que estejamos fazendo uma vez que isso poder acarretar o funcionamento incorreto ou, at mesmo o no
funcionamento da aplicao.
O Delphi permite o desenvolvimento de diversos tipos de aplicativos tanto executveis quanto de DLLs.
Dentre aquelas aplicaes executveis podemos distinguir dois tipos principais: as console applications e
as aplicaes GUI (Graphical User Interface), que so as aplicaes tradicionais
do ambiente Windows que possuem um ambiente grfico para interagir com o
usurio. Apesar de no muito comum podemos ter um programa Delphi escrito
apenas no arquivo de Projeto. Essas aplicaes, que em sua grande maioria
constituem as chamadas console applications, no possuem uma interface grfica
associada a eles e so executados como antigos programas DOS. J as demais
aplicaes para o ambiente Windows apresentam, em geral, uma interface grfica
coma a qual o usurio poder interagir com o aplicativo em questo.
Independentemente de qual tipo de aplicao estejamos desenvolvendo, termos de
salvar vrios tipos de arquivos durante o desenvolvimento de nossas aplicaes e
aprender a correlao entre eles. Para isso veremos rapidamente as opes
disponveis no menu File. Atravs dessas opes podemos manipular os diversos
arquivos que iro compor as nossas aplicaes. As opes dispostas nesse menu
esto divididas de acordo com a funcionalidade de cada opo. O primeiro grupo
de opes permite a criao de uma nova aplicao, atravs da opo New
Application, bem como de novos formulrios e frames, atravs das opes New
Form e New Frame. Existe ainda, nesse grupo de itens de menu, a opo New que
permite a criao auxiliada de novas aplicaes e formulrios atravs do Object Repository que ser visto
posteriormente. O segundo grupo de opes permite a abertura de projetos e outros arquivos salvos
anteriormente. Lembramos que no caso de no existir nenhum projeto aberto e atravs da opo Open,
abramos um formulrio, no sero possveis a compilao e execuo desse arquivo! Isso decorre do fato
de termos aberto um formulrio e no um projeto. O terceiro grupo de opes permite que salvemos os
arquivos de projeto e demais arquivos de trabalho que estejam abertos na IDE. Devemos ressaltar que o
nome dado ao arquivo de projeto ser o nome que ser dado ao arquivo executvel da aplicao aps a sua
compilao. O quarto grupo de opes, composto apenas pela opo Use Unit, ser visto posteriormente
quando estivermos detalhando o conceito de units. O ltimo conjunto de opes responsvel pela
impresso tanto grfica dos formulrios quanto do cdigo fonte escrito nas units. A ltima opo permite
que fechemos o Delphi. No caso de existir qualquer alterao feita no cdigo do projeto que esteja aberto,
o Delphi, antes de ser finalizado, exibir uma caixa de dilogo confirmando se as alteraes devem ou no
ser salvas.
J sabemos que as console applications so desenvolvidas utilizando simplesmente o arquivo de projeto,
porm, a grande maioria dos aplicativos a serem desenvolvidos no sero console applications, mas sim
aplicaes que iro conter uma interface grfica que ir interagir com os usurios dessas aplicaes. por
isso que, para esse segundo tipo de aplicativo, existiro outros arquivos alm do arquivo de projeto. Dentre
esses outros arquivos podemos destacar aqueles cuja extenso dfm os quais iro conter todas as
definies grficas de cada formulrio contido na aplicao. Ou seja, para cada formulrio que colocarmos
em nosso aplicativo ser salvo um arquivo de extenso dfm associado. Alm do arquivo dfm existir,
associado a ele, um arquivo de extenso pas que ir conter tanto todo o cdigo fonte referente aos eventos
desse formulrio quanto qualquer outro cdigo fonte que tenhamos escrito para esse formulrio. Esse
arquivo, chamado de unit, exibido no Editor de Cdigo do Delphi para que o programador possa
desenvolver o aplicativo.
Alm das units associadas aos arquivos de formulrios, a aplicao poder conter units isoladas. Essas
units que no esto associadas a qualquer formulrio so utilizadas principalmente para declarao de
funes, variveis e constantes de uso global dentro da aplicao. Alm desses arquivos apresentados at
aqui, o Delphi, ao salvarmos o nosso aplicativo, salva alguns arquivos adicionais contendo aspectos de
Pgina: 28
Delphi 5
configurao do ambiente bem como de configurao do prprio compilador Delphi de tal forma a permitir
que, ao levarmos o aplicativo que estamos desenvolvendo para um outro computador, possamos continuar
o desenvolvimento sem termos de configurar novamente todo o ambiente para atender as nossas
necessidades. Mostramos a seguir um resumo das principais extenses de arquivos salvos pelo ambiente do
Delphi ilustrando tambm o seu papel.
Extenso
Bpg
Dpr
Dfm
Pas
Res
Dof
Cfg
Descrio
Arquivo que contm a indicao de quais projetos compe um Project Group bem como
as diretrizes a serem utilizadas no momento de suas compilaes.
Arquivo que contm as declaraes de cada aplicativo desenvolvido no Delphi. atravs
desse arquivo que o compilador pode identificar quais units pertencem ao aplicativo bem
como a forma com a qual o aplicativo ser inicializado.
Esse arquivo contm o cdigo responsvel pela definio de cada formulrio dentro da
aplicao, ou seja, nesse arquivo que se encontra a indicao da localizao de cada
componente do formulrio bem como os valores a eles atribudos dentro do Object
Inspector.
Os arquivos com essa extenso contm cdigo fonte escritos em Object Pascal. Esses
arquivos podem ou no estar associados a arquivos dfm.
Os arquivos com essa extenso contm diversos recursos que sero ou podero ser
utilizados pela aplicao tais como o cone da aplicao e bitmaps entre outros.
O arquivo de opes do Delphi (Delphi Options File) contm a configurao atual do
projeto. Tais configuraes podem ser exibidas ao selecionarmos a opo Options listada
no menu Project.
O arquivo de extenso cfg gravado para possibilitar a compilao de um projeto Delphi
a partir da linha de comando, sem ser necessrio que o projeto seja aberto dento da IDE
do Delphi.
Alm dos arquivos com as extenses listadas acima, o Delphi pode gerar outros arquivos de outras
extenses dependendo do tipo de aplicao que esteja sendo desenvolvido ou da configurao que tenha
sido feita na IDE do Delphi. A seguir mostramos uma figura representativa de alguns dos relacionamentos
existentes entre os arquivos gerados pelo Delphi.
A figura acima ilustra o relacionamento existente entre os arquivos de grupo, de projeto, dmf e pas no
desenvolvimento de um aplicativo Delphi. Podemos observar que as units no precisam estar vinculadas a
um arquivo de formulrio, porm o inverso no acontece. Ou seja, para cada formulrio que colocarmos
em nosso aplicativo existir uma unit e um arquivo de formulrio associado.
Pgina: 29
Delphi 5
2.8.
Devemos fazer uma pequena observao com relao ao nome da aplicao escrito logo aps a palavra
reservada program. J mencionamos o fato de que , quando trabalhamos com o arquivo de projeto no
devemos fazer alteraes manualmente uma vez que o Delphi faz as devidas alteaes quando necessrias.
Essa observao tambm vlida quando estamos trabalhando com aplicaes console. Devemos evitar
alterar o nome da aplicao diretamente no cdigo fonte de nossa aplicao uma vez que o Delphi ir fazer
isso sem acarretar qualquer problema. Caso desejemos alterar o nome do aplicativo devemos faz-lo
salvando-o com o nome que desejamos atravs da opo Save Project as localizada no menu File. O
Delphi, ao salvar o aplicativo ele alterar tanto o nome do programa contido no fonte do arquivo dpr
quanto ir alterar o nome fsico do arquivo.
Pgina: 30
Delphi 5
Com o objetivo de ilustrar o desenvolvimento de uma aplicao console, vamos escrever o cdigo
necessrio para executar o mais tradicional exemplo de programa, o Al Mundo. Para isso, no lugar do
comentrio Insert user code here, devemos escrever o cdigo abaixo.
Writeln(Al Mundo);
2.9.
Pgina: 31
Delphi 5
Object Repository. Vamos abordar inicialmente a criao de uma aplicao default e mostrar a
funcionalidade de cada arquivo criado nesse processo.
O segundo listbox exibe quais objetos esto localizados na guia selecionada. Ao selecionarmos um objeto,
os dois ltimos botes ficam habilitados para que possamos tanto editar quanto remover do repositrio esse
objeto. Alm dos botes, encontram-se nessa caixa de dilogo trs checkboxes, habilitados alternadamente,
que permitem tanto a escolha de qual formulrio ser definido como default, ou seja qual formulrio ser
criado ao selecionarmos a opo New Form contida no menu File, quanto qual formulrio ser definido
como o formulrio principal default, ou seja, ao selecionarmos a opo New Application qual ser o
formulrio criado inicialmente. Alm disso, temos a opo de definir qual o projeto default, ou seja, qual
ser o formato da aplicao default a ser criada quando selecionarmos a opo New Application.
Pgina: 32
Delphi 5
aplicaes. Atravs da seleo da opo Application Wizard o Delphi ir construir um novo aplicativo
utilizando-se para isso de respostas que o desenvolvedor for fornecendo a uma srie de caixas de dilogo a
ele apresentadas.
Uma vez terminado o processo de construo inicial da aplicao atravs do Wizard, o Delphi disponibiliza
para o desenvolvedor uma aplicao com sua interface e, at mesmo, algum cdigo pronto para que seja
dado incio codificao efetiva. Apesar da utilizao do wizard proporcionar um ganho inicil no tempo de
desenvolvimento, sua utilizao efetiva dentro do desenvolvimento de novas aplicaes relativamente
pequena. Essa pouca utilizao deve-se principalmente ao fato de que o idioma no qual o formulrios e
demais componentes so construdos o ingls, o que no ajuda muito quando o desenvolvimento involve
um aplicativo para ser executado utilizando-se de um outro idioma.
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
Pgina: 33
Delphi 5
Podemos observar que existem dois tipos de declaraes dentro da seo uses exibida acima. A primeira
delas contm uma referncia a uma unit (a unit Forms) que, a princpio, no est includa em nosso
aplicativo enquanto que a segunda a unit associada ao formulrio inicial de nosso aplicativo (a unit
Unit1). A declarao da unit Forms no arquivo de projeto importante uma vez que nessa unit que esto
as declaraes de funes e variveis necessrias ao funcionamento inicial do aplicativo e no deve ser
removida. J a segunda declarao indica a existncia da Unit1 dentro do projeto. A medida em que novas
units vo sendo adicionadas ao projeto as suas respectivas declaraes vo sendo colocadas na nessa seo
uses automaticamente pelo Delphi.
Outro ponto importante a ser mencionado a forma com que o Delphi declara essas units dentro da seo
uses. Observe que a declarao da unit no utiliza a sua extenso. Essa a razo pela qual, no momento em
que salvamos o projeto, ele no deve ter um nome que j tenha sido previamente atribudo a uma unit. Uma
vez que, dessa forma, o compilador Delphi no teria como distinguir quando o programador estivesse
fazendo referncia a uma unit ou ao projeto.
Um ltimo ponto a ser discutido aqui, porm tambm de fundamental importncia a localizao das units
em disco. O Delphi, ao tentar abrir qualquer unit para compilao ou simplesmente para a sua exibio no
Editor de Cdigo, ir procurar no diretrio onde o projeto foi salvo, ou no path definido dentro do arquivo
de projeto. Caso tenhamos salvo uma unit dentro de um diretrio diferente daquele no qual o projeto foi
salvo, essa informao ficar armazenada no arquivo de projeto e, quando tentarmos abrir esse projeto em
um outro computador, o Delphi ir procurar por essa unit na localizao onde ele havia sido salvo.
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in '../Unit2.pas' {Form2},
Unit3 in 'Unit3.pas';
No exemplo acima, temos trs units contidas no projeto, as duas primeiras referentes aos formulrios 1 e 2,
e a ltima uma unit que no est vinculada a qualquer formulrio. Observe que a unit2 no foi salva no
mesmo diretrio que o projeto e sua localizao est indicada atravs do seu caminho relativo em relao
ao qual o projeto foi salvo. Devemos ter cuidado uma vez que, ao salvarmos as units em diretrios
diferentes daquele no qual o projeto foi salvo estamos, tambm, dificultando o processo de backup dos
arquivos fonte pertencentes a esses projetos.
Uma outra definio colocado no arquivo de projeto refere-se a qual arquivo de recursos ser utilizado
pela aplicao sendo desenvolvida. Em geral esse arquivo possui o mesmo nome que o arquivo de projeto
porm com a extenso RES. Essa informao passada ao compilador por intermdio da diretiva de
compilao $R conforme mostrado abaixo.
{$R *.RES}
O asterisco colocado nessa diretiva indica que o arquivo de recursos ir possuir o mesmo nome que o
arquivo de projeto. No caso de desejarmos incluir um arquivo com nome diferente bastaria que, no lugar do
asterisco, fosse informado o nome desse arquivo.
O ltimo trecho do arquivo de projeto, definido pelas palavras reservadas begin e end indica, como
acontecia com as aplicaes console, o cdigo a ser executado inicialmente pelo aplicativo. Porm, o
cdigo escrito nessa seo manipulado diretamente pelo Delphi e no devemos mexer diretamente com
ele a menos que tenhamos certeza absoluta do que estamos fazendo uma vez que, uma alterao
equivocada nesse trecho do programa poder provocar seu mal funcionamento ou, at mesmo, a
impossibilidade de sua execuo.
Em uma aplicao grfica, como a exibida acima, o cdigo escrito entre o begin e o end poder conter o
cdigo responsvel pela alocao de memria dos formulrios e a execuo real da aplicao. Veremos
posteriormente como podemos criar formulrios dinamicamente durante a execuo de nosso aplicativo.
Nesses casos, a alocao de memria para esses formulrios no ser feita mais no arquivo de projeto mas
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
Pgina: 34
Delphi 5
sim em algum ponto antes do qual ser necessria a exibio desse formulrio.
Pgina: 35
Delphi 5
A segunda observao refere-se aos listboxes apresentados nessa caixa de dilogo. Ao criarmos uma
aplicao dentro do Delphi e definirmos um ou mais formulrios, o Delphi tem, por definio, a criao
automtica de todos esses formulrios, ou seja, ao executarmos o aplicativo, antes dele comear a sua
execuo real exibindo a sua janela principal, ser alocada memria para todos esses formulrios. Esse
comportamento tem tanto seu lado positivo quanto seu lado negativo. O lado positivo est no fato de que,
ao tentarmos exibir qualquer formulrio definido em nosso projeto, sua exibio ser feita de forma mais
rpida uma vez que ele j foi construdo em memria. Porm, uma vez que j alocamos memria para todos
os formulrios da aplicao, poderemos estar reservando recursos do computador que nunca sero
utilizados, no caso por exemplo de um formulrio pouco exibido, o que no muito bom. Para evitar esses
dois extremos o Delphi permite-nos selecionar quais formulrios devero ser criados ou no
automaticamente durante o incio da execuo do programa. Para ilustrarmos os efeitos de termos um
formulrio criado automaticamente ou no no arquivo de projeto vamos, em nosso exemplo, mover o
formulrio Form3 do listbox Auto-create forms para o listbox Available forms. Ao fazermos isso, podemos
perceber que a linha referente a criao do
begin
formulrio Form3, contida no arquivo de projeto,
Application.Initialize;
foi removida conforme ilustrado ao lado. Da
Application.CreateForm(TForm2, Form2);
mesma forma, poderamos ter feito essa alterao
Application.CreateForm(TForm1, Form1);
diretamente no arquivo de projeto sem termos de
Application.Run;
alterar essa informao na caixa de dilogo Project
end.
Options, como havia acontecido com a definio do
formulrio principal de nossa aplicao.
A princpio poderamos pensar que a alterao
de definio entre aqueles formulrios criados
automaticamente e aqueles que esto
disponveis para o uso do desenvolvedor no
traria qualquer problema para a programao,
porm isso no verdade. Para demostrarmos
esse problema, bastante comum quando ainda
procedure TForm2.Button2Click(Sender: TObject);
no temos muita experincia em programao
begin
principalmente para o ambiente Windows,
Form3.Show;
vamos criar dois procedimentos, cujo cdigo
end;
estamos apresentando ao lado, associados
respectivamente, ao evento OnClick em cada um dos botes colocados no formulrio principal de nosso
aplicativo, o Form2. Observe que no devemos escrever todo o cdigo, mas sim as linhas contidas entre o
begin e o end de cada procedimento.
procedure TForm2.Button1Click(Sender: TObject);
begin
Form1.Show;
end;
Pgina: 36
Delphi 5
invocarmos um de seus mtodos (o mtodo Show que veremos posteriormente), isso ir provocar um
acesso ilegal memria do Windows. Para evitarmos que isso ocorra, devemos nos preocupar em alocar
memria para esses objetos antes de podermos utiliz-los e, posteriormente sua utilizao, devemos
tambm desalocar essa memria, liberando-a para outros objetos tanto dessa quanto de outras aplicaes.
A prxima guia da caixa de dilogo Project Options que iremos
abordar a guia Application. Atravs dessa guia, exibida ao lado, o
programador pode definir algumas caractersticas prprias da
aplicao. Nela temos a opo de definir um ttulo para a aplicao,
ttulo esse que ser exibido quando a aplicao for minimizada, o
nome do arquivo de ajuda que ser associado ao aplicativo e o cone a
ser exibido quando a aplicao for minimizada. Por fim, temos a
opo de indicar qual a extenso a ser atribuda ao arquivo a ser
gerado pela compilao do cdigo fonte de nossa aplicao. Devemos
observar que aplicaes de extenso exe no necessitam do
preenchimento dessa opo. J ao desenvolvermos DLLs ou arquivos
ActiveX, a extenso desejada para o arquivo compilado, seja dll ou ocx, dever ser indicada nessa opo.
Uma outra guia cujo contedo vale a pena ser abordado a guia Directories/Conditionals. Vimos
anteriormente que uma aplicao Delphi capaz de gerar diversos arquivos cada um com a sua respectiva
extenso. Porm s vimos algumas das extenses que o Delphi capaz
de gerar. Alm daquelas extenses relativas a arquivos de cdigo fonte,
ao compilarmos nossas aplicaes o Delphi gera novos arquivos de
cdigo objeto. O comportamento default do ambiente Delphi gerar
esses arquivos de cdigo objeto no mesmo diretrio onde se encontra o
arquivo de projeto. No caso de desejarmos efetuar backups de nossas
aplicaes isso no muito desejvel j que o backup s necessita ser
feito para os arquivos de cdigo fonte uma vez que os arquivos de
cdigo objeto so gerados a partir deles. O ideal que esses arquivos
fossem gerados em outros diretrios. Essa uma das finalidades da guia
Directories/Conditionals, ou seja, definir os diretrios nos quais
arquivos de cdigo objeto sero gerados. A figura ao lado mostra a guia Directories/Conditionals definido
os diretrios nos quais os arquivos compilados e os executveis sero gerados. Caso nada for colocado,
ser assumido o diretrio aonde foi salvo o projeto.
Por fim vamos falar da guia Packages. Devemos ter muito cuidado ao manipular com os elementos desta
guia, pois isso poder afetar toda a instalao do Delphi. A guia Packages permite ao desenvolvedor
definir quais os pacotes instalados que podero ser utilizados durante o desenvolvimento de uma aplicao
bem como se a aplicao gerada ir ou no utilizar pacotes (packages) em tempo de execuo. Pacotes so
arquivos especiais do Delphi que iro conter, entre outras coisas, todas
as definies das classes e componentes que podem ser utilizados
assemelhando-se a uma DLL. Atravs da seleo dos Design Packasges
podemos definir quais os pacotes que esto disponveis dentro da IDE
do Delphi. Devemos tomar cuidado ao remover pacotes pois, ao
fazermos isso, poderemos estar removendo guias inteiras da Paleta de
Componentes. Uma vez removido o pacote, para que os componentes
removidos reapaream temos de acrescentar o pacote novamente. J a
opo Build with runtime packages indica ao compilador Delphi que o
executvel do aplicativo utilizar pacotes em tempo de execuo. Ao
selecionarmos essa opo passamos a gerar arquivos executveis com
um tamanho menor, porm passamos a ter a necessidade de levar, junto com os arquivos da aplicao, os
pacotes de componentes que foram utilizados durante o desenvolvimento desse projeto. Lembre-se que
esses pacotes, por possurem todo um conjunto de componentes dentro deles, no so arquivos pequenos o
que poder tornar uma desvantagem ter de leva-los junto com o executvel do projeto. funo do
desenvolvedor identificar a opo a ser adotada.
Agora que j temos um bom nmero de informaes a respeito de um projeto sendo desenvolvido em
Delphi, podemos nos concentrar nos demais arquivos de cdigo fonte que iro compor as aplicaes que
iremos desenvolver. Dessa forma, vamos comear o nosso estudo a respeito das units, sua composio e do
Editor de Cdigo.
Pgina: 37
Delphi 5
3.As Units
As units formam, principalmente nas aplicaes grficas, o corao de toda a aplicao. nas units que
todo o cdigo fonte da aplicao escrito. Nela encontram-se tanto definies a respeito de variveis e
constantes quanto a implementao dos procedimentos e funes existentes na aplicao.
Toda unit composta de pelo menos duas palavras reservadas utilizadas para indicar compilador o incio e
o trmino da unit. Essas palavras reservadas so unit e end.
unit Unit1;
Conforme o cdigo escrito ao lado, podemos observar que a
palavra reservada unit utilizada para indicar o incio de uma
interface
unit. Ao lado direito da palavra unit est a indicao de seu
nome. Observe que esse nome igual ao nome do arquivo salvo
implementation
em disco, porm sem a extenso pas. No devemos alterar
manualmente o nome da unit e sim utilizar a opo Save As
end.
localizada no menu File. Observe tambm que a unit finalizada
pela palavra reservada end, seguida por um ponto. Devemos
observar que a palavra reservada end ir aparecer em diversos outros trechos de cdigo dentro das units,
porm o nico local onde ela ir ocorrer, seguida de um ponto, no final da unit. No devemos alterar essa
estrutura da unit uma vez que esse end indica o final da unit. Programadores inexperientes na programao
utilizando o Delphi trocam frequentemente o ponto por ponto-e-vrgula o que faz com que a compilao do
aplicativo no mais possa ser feita.
3.1.
Interface
Implementation
Initialization
Finalization
As duas primeiras sees da unit apresentadas acima, as sees interface e implementation, so obrigatrias
quando do desenvolvimento de uma nova unit enquanto que as duas ltimas sees, initialization e
finalization, so opcionais. Dentro do cdigo de uma unit, as sees so escritas na seqncia em que
apresentamos acima, ou seja, a primeira seo existente dentro de uma unit a seo interface, enquanto
que a ltima a seo finalization. Nesta seo vamos nos detalhar um pouco mais nas sees interface e
finalization uma vez que essas duas so as mais utilizadas durante o desenvolvimento de um novo projeto.
Pgina: 38
Delphi 5
comparao s demais sees que podem estar contidas em uma unit. Esse comportamento idntico
independentemente das units pertencerem ao mesmo projeto ou estarem contidas em projetos distintos.
J sabemos que a seo interface utilizada para tornar diversos tipos de declaraes disponveis para
outras units. Porm, no basta apenas escrevermos na seo interface o cdigo que desejamos compartilhar
com outras units para que esse compartilhamento ocorra. Para que isso seja possvel, algumas aes por
conta do programador devem ser realizadas. Veremos agora, as clusulas nas quais a seo interface est
dividida e como poderemos utiliza-las para declarar cdigo e tornar esse cdigo compartilhado com outras
units.
Pgina: 39
Delphi 5
Tipo Bsico
Faixa de valores
Byte
0 .. 255
Word
0 .. 65535
Integer
2147483648 .. 2147483647
Cardinal
0 .. 4294967295
Real
Extended
Currency
922337203685477.5808.. 922337203685477.5807
Char
Um caractere
String
Boolean
TDateTime
Data e hora
3.1.1.3.Declaraes de tipos
Alm dos tipos bsicos apresentados acima e ainda, aqueles que mesmo no tendo sido exibidos acima
compe os tipos bsicos do Delphi, o desenvolvedor ainda dispe da possibilidade de criar seus prprios
tipos de dados. Uma vez que esses novos tipos de dados forem criados, eles podem ser utilizados
normalmente como se fossem tipos bsicos da linguagem, podendo ser declaradas variveis e constantes a
partir deles.
Existem cinco possibilidades de criarmos novos tipos de dados dentro do Delphi, so elas:
Tipos simples
Conjutnos (Sets)
Tipos Enumerados
Registros
Classes
Colocamos nessa definio a possibilidade de criarmos classes como um novo tipo de dado por duas razes
bsicas. A primeria delas deve-se ao fato de que a localizao de suas declaraes a mesma dos demais
tipos de dados vistos, todos esto
localizados na clusula type da unit. A
unit UExemplo1;
segunda razo devido a forma de
utilizao das mesmas, ou seja, uma vez
interface
declarada uma classe ela pode ser utilizada
na declarao de variveis, que no caso de
type
estarmos trabalhando com classes sero
nome = string[50];
chamados de objetos, que pertenam a ela
funcionario = record
entre outras coisas. Independentemente do
fnome : nome;
fato de estarmos trabalhando com classes ou
idade : byte;
qualquer outro novo tipo de dados, ao ser
end;
declarado, ele ser sempre colocado no
TForm1 = class (TForm)
mesmo trecho da unit, ou seja, em sua seo
End;
type, seo responsvel por conter todas as
Pgina: 40
Delphi 5
incio da prxima clusula. Dessa forma no necessria a cada nova definio de tipo a colocao da
palavra reservada type.
O segundo ponto que devemos observar a prpria declarao de novos tipos de dados. No exemplo
apresentado acima so declarados trs novos tipos. O primeiro deles refere-se criao de um tipo simples,
j o segundo a um registro enquanto que o terceiro refere-se a uma classe.
Sintaxe
NomeNovoTipo = TipoBasico;
Exemplo
Nome = string[50];
Como podemos observar na sintaxe apresentada acima, a declarao de novos tipos de dados simples
restringe-se basicamente atribuio de um novo nome a um tipo de dados bsico ou que tenha sido
previamente definido na clusula type. Podemos ento perguntar qual a finalidade de declararmos um tipo
de dados simples! A resposta mais semntica do que prtica. Uma vez que criemos um novo tipo de
dados simples, como o tipo de dados nome criado no exemplo anterior, torna-se muito mais simples o
entendimento da funcionalidade das variveis desse novo tipo do que no caso de sua no existncia, ou
seja, ao declararmos uma varivel pertencente a esse tipo de dados fica clara a sua finalidade, a de estar
manipulando um nome.
Uma outra vantagem em estar trabalhando com um tipo de dados simples est na manuteno do cdigo
fonte criado. Caso desejemos alterar o tamanho das variveis do tipo nome basta que o faamos em um
nico lugar que essa alterao ser refletida em todas os pontos do programa onde variveis desse tipo
haviam sido declaradas.
3.1.1.3.2.Conjutos
Uma segunda maneira de declararmos novos tipos de dados dentro do Delphi atravs da declarao de
conjuntos (sets). Um conjunto funciona de forma semelhante um array (a declarao de arrays ser vista
posteriormente dentro da declarao de variveis) podendo conter uma srie de valores simultaneamente
dentro de sua definio. A seguir apresentamos a sintaxe e alguns exemplos relacionados declarao de
um tipo de dados conjunto.
Sintaxe
NomeNovoTipo = set of TipoBasico
Exemplo
Respostas = set of char;
Resultados = set of 1..50;
A declarao de conjuntos permite que sejam criadas variveis que iro conter um conjunto de valores
vlidos dentro daqueles fornecidos atravs da declarao do novo tipo. No exemplo acima, a declarao do
tipo de dados Respostas ir permitir que variveis desse novo tipo armazenem um conjunto de caracteres,
bem como o tipo de dados Resultados ir permitir o armazenamento de um conjunto de valores de 1 50.
Apesar de ainda no termos mostrado como feita a declarao de variveis dentro do Delphi, o exemplo a
seguir ilustra a atribuio de valores variveis dos tipos criados no exemplo acima. Para obter
informaes a respeito da declarao de variveis, o leitor deve consultar a prxima seo deste captulo.
Pgina: 41
Delphi 5
Exemplo
Resp1 := [ a, g, e, d];
Resul1 := [1, 34, 44, 3];
Como podemos observar, na atribuio de valores variveis do tipo conjunto, utilizados os sinais de [
e ]. Entre esses sinais, so colocados os valores atribudos varivel em questo. Um outro ponto a ser
observado refere-se a no existncia de ordenao nem de duplicidade dentro dos valores atribudos ao
conjunto. Podemos observar algumas propriedades do tipo conjunto no Object Inspector. Uma dessas
propriedades a BorderIcons pertencente ao formulrio. No Object Inspector a manipulao dos valores
que esto contidos no conjunto feita de forma muito mais simples, atribuindo-se o valor true queles
valores que desejamos que estejam no conjunto e false caso contrrio. No caso de desejarmos modificar
esses valores via codificao, devemos seguir a sintaxe apresentada acima.
Alm da atribuio de valores variveis do tipo conjunto, operaes de manipulao desses valores
podem ser efetuadas durante a codificao de nosso aplicativo, observe o seguinte exemplo.
Exemplo
Resp1 := [c, g] + [d, c];
Resul1 := Resul1 [34, 12];
if e in Resp1 then
ShowMessage(Valor j atribudo);
Os exemplos mostrados acima ilustram dois pontos importantes a serem observados com relao as
variveis do conjunto. O primeiro ponto refere-se s operaes de adio e subtrao de elementos de um
conjunto. Como podemos observar essas duas operaes so bastante intuitivas e funcionam de forma
semelhante quela vista na matemtica. Ao somarmos dois conjuntos, como mostrado no primeiro
exemplo, o resultado formado por um nico conjunto composto pelos caracteres c, g, d, atribudo
varivel Resp1. Observe que no existem duas ocorrncias do caractere c, ou seja, elementos repetidos
so eliminados do conjunto permanecendo apenas uma cpia de cada elemento. Fato semelhante ocorre no
segundo exemplo ao tentarmos subtrair um conjunto de outro. A tentativa de remover um elemento
inexistente de um conjunto no provoca erro. Alm disso, podemos utilizar a prpria varivel na qual
desejamos colocar o resultado da operao como um dos elementos que iro comp-la. Nesse exemplo,
estamos removendo os elementos 34 e 12 do conjunto Resul1. Por fim, o terceiro exemplo ilustra a
utilizao do operador in. Esse operador utilizado para verificar a existncia ou no de um elemento em
um conjunto. Caso o elemento exista, o resultado da operao o valor booleano true, caso contrrio o
resultado ser false.
3.1.1.3.3.Tipos enumerados
Alm da possibilidade de declararmos tipos de dados simples e conjuntos, uma outra possibilidade de
declarao de tipos de dados a declarao de tipos enumerados. Uma maneira simplificada de definirmos
tipos enumerados que um tipo enumerado composto por uma listagem de possveis valores a serem
atribudos a uma varivel do tipo sendo definido. Um exemplo tpico de um tipo enumerado, o tipo de
dados boolean. Quando declaramos uma varivel desse tipo j sabemos quais os valores que podem ser
atribudos a ela: true ou false. Observe que esses valores no so strings, so valores tratados de maneira
idntica a valores como os nmeros e por isso no vem entre aspas durante uma atribuio. Uma vez que
declaremos uma varivel booleana, qualquer outro valor que tentemos atribuir resultar em um erro de
sintaxe e a aplicao no poder ser compilada. A seguir apresentamos a sintaxe para a declarao de tipos
enumerados.
Sintaxe
NomeNovoTipo = (Valor1, Valor2, ..., ValorN);
Exemplo
Cores = (Verde, Vermelho, Azul, Amarelo);
Naipes = (Ouro, Copas, Espadas, Paus);
Pgina: 42
Delphi 5
Observe os exemplos acima. Neles podemos perceber que quando criamos um tipo de dados enumerado,
estamos definindo quais valores podem ser atribudos variveis desse novo tipo. No exemplo dado acima,
caso desejssemos criar uma varivel do tipo de dados chamado cores, os nicos valores que poderiam ser
atribudos a essa varivel seria um dos seguintes valores: Verde, Vermelho, Azul ou Amarelo. importante
observar que ao tentarmos atribuir qualquer um desses valores a uma varivel, o valor deveria ser atribudo
diretamente, como mencionado anteriormente, uma vez que o valor no uma string e sim um valor
especfico para um tipo enumerado. Ilustramos essa observao a seguir atravs da atribuio de um valor
varivel UmaCor. Essa varivel foi previamente declarada como sendo do tipo Cores apesar de no exemplo
esse fato no estar sendo mostrado. Mostraremos como declarar variveis posteriormente nesse captulo.
Exemplo
UmaCor := Azul; {Atribuio correta}
UmaCor := Azul; {Atribuio errada, no uma string}
UmaCor := Branco; {Atribuio errada, no existe o valor Branco}
Um outro ponto a ser mencionado quando trabalhamos com tipos enumerados refere-se ao fato de que a
definio dos valores que iro compor o tipo enumerado tambm estabelece uma ordenao sobre eles. Ou
seja, a cada valor definido para o tipo enumerado est associada a sua posio em relao aos demais
valores. No exemplo dado anteriormente, o valor Vermelho possui valor de ordenao menor do que o
valor Azul, sendo considerado portanto menor do que o Azul, que, por sua vez, possui um valor de
ordenao menor do que o valor Amarelo. Dessa forma, perfeitamente possvel a escrita de cdigo
comparativo entre esses valores como mostrado a seguir.
Exemplo
if UmaCor <= Vermelho then
Nesse exemplo mostramos a comparao do valor contido na varivel UmaCor com um dos valores do tipo
de dados enumerado Cor. Esse tipo de operao bem como qualquer outra que envolva a necessidade de
comparao entre os elementos de um tipo enumerado pode ser efetuado sem qualquer problema.
3.1.1.3.4.Registros
At agora vimos como declarar novos tipos de dados que, de uma certa forma, podem ser considerados
como novos tipos de dados simples. A partir de agora vamos ver como podemos declarar tipos de dados
que sejam mais complexos do que os que vimos at ento. A primeira forma que podemos declarar esses
tipos mais elaborados atravs da declarao de um tipo de dados registro. Um tipo de dados registro
composto por declaraes de vrios tipos de dados diferentes em uma nica declarao, onde cada um
desses tipos chamado de um campo dentro do registro. Mostramos abaixo a sintaxe para a declarao de
um registro.
Sintaxe
NomeNovoTipo = record
Campo1 : TipoCampo;
...
CampoN : TipoCampo;
end;
Exemplo
TFuncionario = record
Nome : string[50];
Idade : byte;
Cargo, Setor : string[30];
Pgina: 43
Delphi 5
end;
Observe que ao declararmos o tipo de dados TFuncionario estamos, antes de tudo, respeitanto um padro
adotado no desenvolvimento de novos registros, e posteriormente como iremos observar, como tambm de
novas classes, iniciando o nome de cada novo tipo com a letra T. Uma vez feita essa observao com
relao ao nome do tipo de dados, voltemos explicao do exemplo propriamente dito. Nesse exemplo,
podemos observar a existncia de quatro campos dentro do tipo TFuncionario, so eles: os campos Nome,
Cargo e Setor do tipo string e o campo Idade que armazena um valor inteiro. Devemos observar tambm
que poderamos ter criado campos de qualquer tipo de dados, at mesmo de tipos de dados Record desde
que eles tivessem sido previamente declarados.
A declarao de tipos de dados registro til devido a possibilidade de podermos agrupar valores dentro de
uma nica declarao. Quando, por exemplo, declararmos uma varivel desse tipo de dados estaremos
colocando todas as informaes a respeito de um funcionrio em um nico lugar, permitindo o acesso
rpido a cada um desses campos por intermdio de uma nica varivel.
Exemplo
Func.Nome := Jos da Silva;
Func.Idade := 18
Func.Cargo := Analista de Sistemas;
X := Func.Idade;
Os exemplos acima ilustram a utilizao de uma varivel do tipo de dados TFuncionario declarado
anteriormente. Neles vemos como podemos atribuir e ler valores dos campos de um record. O acesso a
cada campo do record feito atravs da utilizao do operador ponto. Para tanto basta que o valor que
esteja sendo atribudo, bem como a varivel na qual o valor esteja sendo colocada a partir de um campo do
record possuam o mesmo tipo de dados.
3.1.1.3.5.Classes
O ltimo tipo de dados que iremos abordar refere-se ao conceito de classes. O Delphi, por ser uma
linguagem que suporta os conceitos da programao orientada a objetos permite a declarao tanto de
novas classes quanto de objetos. A declarao de objetos ser vista na prxima seo. Feita essa
observao vamos comear nosso estudo em relao declarao de classes dentro do Delphi. A
declarao de classes bastante semelhante declarao de um tipo de dados record vista anteriormente.
Sintaxe
NomeNovaClasse = class
Declaraes da Classe
end;
Exemplo
TClasseFuncionario = class
Nome : string[50];
Salario : currency;
Procedure Aumento(pct : real);
end;
Apesar de estarmos apresentando neste momento a sintaxe para a declarao de uma classe, essa sintaxe
no est completa. Basicamente, o que ilustramos aqui a sintaxe bastante semelhante da declarao de
um record, onde a diferena encontrada at este momento entre as duas declaraes, a substituio da
palavra reservada record pela palavra reservada class. No exemplo dado, podemos perceber pelo menos
mais uma grande diferena entre as declaraes de records e classes no que diz respeito possibilidade de
declararmos mtodos dentro da declarao de uma classe, fato esse que no pode ocorrer dentro da
Pgina: 44
Delphi 5
definio de um record. No entanto, deixaremos para depois a descrio mais detalhada da sintaxe da
declarao de uma classe.
3.1.1.4.Declaraes de variveis
Uma vez que j conhecemos alguns dos tipos bsicos existentes dentro do Delphi e tambm sabemos como
criar novos tipos de dados a partir desses tipos bsicos, vamos explorar a principal razo da existncia de
tipos de dados dentro de uma linguagem de programao, a declarao de variveis.
unit Unit2;
interface
interface
type
TNome = string[50];
var
Nome : TNome;
var
Nome : TNome;
type
TNome = string[50];
implementation
implementation
end.
end.
Pgina: 45
Delphi 5
Sintaxe
NomeVar : array [PosIni..PosFin] of Tipo;
NomeVar : array [PosIni1..PosFin1, ..., PosIniN..PosFinN] of Tipo;
Exemplo
Gabarito : array [1..20] of char;
Provas : array [1..16, 1..20] of char;
A sintaxe apresentada acima ilustra dois tipos possveis de declaraes de arrays. A primeira delas referese declaraes de arrays unidimensionais enquanto que a segunda mostra como podemos declarar arrays
multidimensionais. No primeiro exemplo, a declarao da varivel gabarito que pode conter vinte
caracteres cada um deles nas posies de 1 a 20 do array, respectivamente. J no segundo exemplo, a
varivel gabarito representa um array bidimensional, semelhante a uma tabela contendo 16 linha com 20
colunas em cada uma delas, onde em cada campo desta tabela podemos colocar um caractere.
Algumas observaes fazem-se necessrias em relao declarao de arrays bem como o acesso aos
valores neles contidos. A primeira observao diz respeito a sintaxe da declarao do array. Como
mostrado acima, na declarao do array estabelecida tanto a posio inicial quanto a final dos elementos
do array. Atravs dessa definio fica tambm estabelecida a quantidade de elementos que podero estar
contidos nesse array. Para esses valores podemos estabelecer qualquer numerao, porm as numeraes
mais comuns para a posio inicial do array a posio 0 ou a posio 1, como feito nos exemplos
anteriores. Apesar disso, fica a critrio do desenvolvedor a definio de quais sero as faixas de valores a
serem utilizadas.
A segunda observao refere-se ao acesso aos valores contidos no array. Para acessarmos cada elemento
contido no array devemos fazer referncia a posio em que esse elemento ocorre dentro do array. O
exemplo abaixo ilustra algumas das diversas formas que podemos utilizar para fazer referncia a uma
posio especfica do array.
Exemplo
Gabarito[12] := d;
Provas [5, 20] := c;
Provas [5] [20] := c;
Os exemplos acima ilustram como acessar um elemento de um array unidimensional bem como exibe duas
maneiras de acessarmos o mesmo elemento em um array bidimensional.
3.1.1.5.Declaraes de constantes
Um outro tipo de declarao bastante comum em muitas
linguagens de programao a declarao de constantes.
Como no poderia deixar de ser, o Delphi tambm permite
a declarao de constantes que podero ser utilizadas em
seu cdigo fonte. Como vem acontecendo com outros
tipos de declaraes, a declarao de constante tambm
possui um local especial na qual elas ocorrem, a clusula
const. A figura ao lado exemplifica a declarao de
constantes dentro de uma unit do Delphi. A sintaxe da
declarao de constantes semelhante quela vista para a
declarao de variveis. Devemos colocar o nome da
constante a ser declarada seguida no sinal de igualdade e o
valor a ser atribudo. Essa a sintaxe a ser utilizada na
maioria das declaraes de constantes. Porm, como
veremos a seguir, existem algumas excees a essa
sintaxe.
unit Unit2;
interface
const
DiasNaSemana = 7;
Companhia = 'Ibratec';
SalarioMinimo = 151.00;
HorasNoDia = byte(24);
DiasDoAno : integer = 365;
implementation
end.
Pgina: 46
Delphi 5
sendo declarada dever possuir. Podemos informar o tipo de dados desejado apenas para constantes de
tipos de dados ordinais. Caso no informemos o tipo de dados para constantes ordinais ou de qualquer
outro tipo de dados, o Delphi possui uma srie de regras que iro determinar o tipo de dados ao qual a
constante ir pertencer. Para uma melhor definio das regras a respeito da atribuio de tipos de dados a
constantes declaradas dentro do Delphi, o leitor dever consultar a ajuda do prprio Delphi.
O segundo ponto que devemos observar a declarao de constantes tipadas. Uma constante tipada
assemelha-se bastante declarao de variveis at mesmo em sua sintaxe. A constante DiasDoAno
representa esse tipo de declarao de constantes. Alm da diferena de sintaxe entre a declarao de
constantes tipadas e aquelas que no so tipadas, existe uma importante diferena comportamental entre
elas. As constantes tipadas, ao contrrio do que acontece com as constantes no tipadas, tambm chamadas
de constantes verdadeiras, podem ter seus valores modificados durante a execuo da aplicao. Esse
comportamento faz com que as constantes tipadas assemelhem-se ainda mais a variveis.
Sintaxe
procedure NomeProcedure;
proceudre NomeProcedure (argumentos );
function NomeFunction : TipoRetorno;
function NomeFunction (argumentos ) : TipoRetorno;
Exemplo
procedure UmaProcedure;
procedure ExibeMsg (Msg : string; Qtd : byte);
function VarificaCamposObrigatorios : boolean;
function VerificaCPF (CPF, Dgt : string) : boolean;
Como podemos observar nas sintaxes apresentadas acima, ao declararmos uma funo ou um procedimento
temos a possibilidade de passar ou no argumentos para eles. No caso de no passarmos qualquer
argumento, a utilizao dos parnteses no deve ser feita, ao contrrio do que ocorre em outras linguagens
de programao. J quando desejamos passar argumentos para qualquer funo ou procedimento, devemos
passar cada um dos argumentos e seus respectivos tipos de dados separados por um ponto e vrgula. Nesses
casos, os argumentos devem vir com seus tipos indicados como na declarao de variveis de um unit, ou
seja, separados de seus tipos atravs de um sinal de dois pontos.. Opcionalmente, quando da declarao de
dois ou mais argumentos de mesmo tipo, esses argumentos podem vir separados por vrgula como tambm
acontecia nas declaraes de variveis. Quando tratamos com funes devemos tambm indicar o tipo de
dados a ser retornado quando da execuo da funo. Observe que indicamos um nico tipo de dados a ser
retornado uma vez que uma funo poder retornar apenas um nico valor.
Um outro aspecto importante que devemos observar est no fato de que apenas declaramos os
procedimentos e as funes, ou seja, seus cabealhos. Veremos posteriormente como e onde declarar o
corpo desses procedimentos e funes alm de como poderemos indicar o valor a ser retornado por cada
uma das funes declaradas.
Pgina: 47
Delphi 5
Exemplo
Passagem por valor
X := 3;
X := 3;
ProcExemplo (X);
ProcExemplo(X);
Sintaxe
Passagem por valor
Procedure NomeProcedure (Argumento : TipoDeDados);
Passagem por referncia
Procedure NomeProcedure (var Argumento : TipoDeDados);
As sintaxes apresentadas acima, apesar de tratar apenas das declaraes de procedimentos podem ser
utilizadas nas declaraes de funes. Observe que, para declararmos um argumento como sendo passado
por valor no devemos fazer uso de qualquer palavra reservada. J em declaraes de argumentos passados
por referncia devemos utilizar a palavra reservada var. Devemos observar que necessrio declarar a
palavra reservada var antes de cada argumento que desejamos definir como sendo passado por referncia.
Sintaxe
procedure NomeProcedure (const Argumento : TipoDeDado);
Pgina: 48
Delphi 5
Exemplo
procedure ProcExemplo (const Argumento : integer);
Quando declaramos um argumento como sendo um parmetro constante, estamos indicando que o
argumento passado para a funo ou procedimento no pode
ser alterado no corpo do procedimento. Caso tentssemos
alterar o valor do argumento dentro do corpo da funo ou
procedimento, ao compilarmos a aplicao o Delphi iria
acusar um erro como mostra a figura ao lado. Esse
comportamento assemelha-se ao que seria esperado se
tivssemos declarado uma varivel local ao procedimento ou
funo. A grande vantagem em relao declarao de uma
constante local est no fato de, ao passarmos como
argumento para a funo, estaremos criando uma
constante dinamicamente, uma vez que o valor da
constante atribudo no momento da chamada da funo ou procedimento.
Sintaxe
procedure NomeProc (Argumentos : TipoDeDados);
Begin
Cdigo do procedimento
Pgina: 49
Delphi 5
end;
Exemplo
procedure ExibeMsg(Msg : string);
begin
ShowMessage(Msg);
end;
Observe que ao escrevermos o corpo de cada procedimento ou funo devemos repetir todo o cabealho
antes de colocarmos as palavras reservadas begin e end. Entre essas duas palavras reservadas que iremos
escrever efetivamente o cdigo a ser executado.
Uma vez que j sabemos tanto como declarar funes quanto como escrever o corpo de cada uma delas,
devemos nos lembrar que as funes diferenciam-se dos procedimentos pelo fato de retornarem um valor
para o ponto de onde elas foram chamadas. Por isso resta-nos mostrar, dentro do corpo da funo, como
podemos indicar qual valor deve ser retornado, ao local da chamada da funo.
Sintaxe
Result := ValorRetorno;
NomeFuncao := ValorRetorno;
Exemplo
Result := True;
VerificaCPF := True;
if x < 3 then
Result := true
Else
Result := False;
Observe que existem duas maneiras de retornarmos um resultado para a funo. A primeira delas atravs
da utilizao da palavra reservada result. Result nada mais do que um argumento implcito contido no
cabealho de cada uma das funes que declaramos. Ao atribuirmos valores palavra reservada result
estamos informando ao Delphi quais valores desejamos retornar ao ponto em que a funo foi chamada. A
segunda maneira atravs da qual podemos retornar resultados de funes atravs da atribuio do valor
desejado ao prprio nome da funo. No exemplo acima, o valor true atribudo ao prprio nome da
funo VerificaCPF.
Pgina: 50
Delphi 5
initialization ser executado automaticamente no incio da execuo do programa, enquanto que, para
executarmos outros procedimentos deveramos chamar esses procedimentos para que o cdigo associados a
eles sejam executados.
4.Os Formulrios
Uma vez que j possumos conhecimento suficiente a respeito do ambiente Delphi, podemos iniciar nosso
aprendizado naqueles itens que mais sero utilizados no desenvolvimento de nossos aplicativos. Como no
poderia deixar de ser, vamos iniciar esse processo atravs do estudo dos formulrios que, dentro das
aplicaes desenvolvidas para o ambiente Windows, iro estar presentes em sua grande maioria.
4.1.
Criando formulrios
J sabemos que por estar contido na maioria das aplicaes desenvolvidas para o ambiente Windows, ao
iniciarmos o Delphi ou um novo projeto, um novo formulrio ser criado e definido como o novo
formulrio principal para a nossa aplicao. Esse formulrio principal no ser, muito provavelmente, o
nico formulrio que estar contido nessa aplicao. Alm disso, podero existir situaes em que o
desenvolvedor deseja definir um novo padro para o formulrio principal de novas aplicaes,
diferentemente daquele formulrio, sem qualquer componente, conforme definido pela instalao padro
do Delphi. At mesmo para os novos formulrios que iremos criar, podemos desejar que esse padro seja
alterado. Antes de mostrarmos como alterar o comportamento padro, ns vamos mostrar as trs principais
formas atravs das quais podemos criar novos formulrios dentro do ambiente do Delphi.
Pgina: 51
Delphi 5
formulrios que foram desenvolvidos nessa aplicao de tal forma a permitir sua reutilizao em outros
formulrios desse mesmo projeto e no formulrios pr-definidos instalados junto com o Delphi. Para
criarmos um novo formulrio a partir do Object Repository podemos selecionar tanto o formulrio padro
contido na guia New como qualquer outro formulrio contido nas demais guias do Object Repository.
A figura acima ilustra a guia New contida no Object Repository. Nessa guia podemos observar a existncia
de um cone, responsvel pela criao de um novo formulrio, chamado Form. Ao selecionarmos esse
cone e clicarmos no boto Ok o Delphi ir criar um novo formulrio default. Para alterarmos o formulrio
default que criado pelo Delphi deveremos modificar a configurao do Object Repository.
Pgina: 52
Delphi 5
Alm de podermos escolher o formulrio que ser criado quando da escolha de uma opo de criao de
novo formulrio, temos ainda a opo de determinar qual o formulrio a ser criado como sendo o
formulrio principal da aplicao. Para isso basta seguirmos o mesmo procedimento descrito anteriormente,
porm ao invs de selecionarmos o checkbox relativo opo New Form devemos selecionar o checkbox
relativo opo Main Form.
Alm de podermos definir qual o comportamento para os formulrios de nossa aplicao, temos ainda a
opo de alterar o comportamento default associado criao de novas aplicaes. Ao selecionarmos um
objeto que represente novas aplicaes, como por exemplo, aqueles exibidos no item Projects contido no
listview Pages ao invs de objetos associados a formulrios, exibido no canto inferior direito o checkbox
New Project. Ao marcarmos esse checkbox estaremos determinando qual objeto ser utilizado no momento
da criao de um novo projeto.
4.2.
Exibindo Formulrios
Uma vez que tenhamos criado novos formulrios dentro de nossa aplicao devemos definir quando eles
sero exibidos para que possamos escrever o cdigo necessrio exibio dos mesmos. A definio do
momento em que cada formulrio ir ser exibido depende, nica e exclusivamente, das definies do
desenvolvedor. Em relao ao cdigo necessrio a exibio do formulrio, o Delphi permite duas maneiras
de exibirmos esses formulrios.
Sintaxe
Objeto.Propriedade := valor;
Objeto.Mtodo;
Exemplo
Button1.Caption := Ok;
Form1.Font.Size := 12;
Form1.BorderIcons.biSystemMenu := true; //Errado
Table1.Open;
Vamos observar a sintaxe apresentada no quadro acima. Observe que cada vez que desejamos manipular
com uma propriedade ou mtodo fazemos referncia inicialmente ao objeto e depois ao mtodo ou
propriedade que desejamos manipular. A referncia ao objeto feita atravs de seu nome. Uma vez que a
propriedade que esteja sendo manipulada possua subpropriedades, elas tambm podero ser manipuladas
atravs do operador ponto como ilustrado no exemplo acima. Contudo, devemos ter cuidado para no
tentarmos manipular com propriedades do tipo set como se elas fossem objetos, como o caso da
propriedade BorderIcons pertencente aos formulrios.
Pgina: 53
Delphi 5
Exemplo
Formulario_Principal.ButtonOK.Caption = OK;
FormCadCliente.ButtonOK.Caption := Confirma;
Observe no quadro acima os cdigos que poderiam ter sido escritos em um procedimento de evento
qualquer. Neles vemos a atribuio de valores propriedade caption de dois componentes distintos que
possuem o mesmo nome. Isso possvel uma vez que esses componentes esto localizados em formulrios
distintos. O exemplo dado acima tambm proveitoso para mostrar como podemos alterar valores de
propriedades de componentes localizados em outros formulrios que no aquele no qual o componente foi
colocado. Quando estamos escrevendo cdigo queira alterar propriedades ouexecutar mtodos de
componentes contidos no prprio formulrio no qual o procedimento de evento foi criado, opcional a
Pgina: 54
Delphi 5
colocao do nome do formulrio antecedendo o nome do componente que se deseja manipular. J quando
desejamos manipular com componentes contidos em outros formulrios, essa referncia obrigatria.
Exemplo
ButtonOK.Caption := OK; //Escrito no prprio formulrio
Formulario_Principal.ButtonOK.Caption = OK; //Escrito em outro.
ButtonOK.Caption := Confirma; //Escrito no prprio formulrio
FormCadCliente.ButtonOK.Caption := Confirma; //Escrito em outro.
Caption := Ttulo;
O ltimo exemplo mostra uma atribuio a uma propriedade sem referenciar o nome de qualquer
componente. Esse cdigo ir compilar e executar normalmente caso ele tenha sido escrito dentro de um
procedimento de evento associado a qualquer formulrio ou componente a ele pertencente. Nesse caso,
como no foi colocado a que componente ele est associado, o Delphi interpreta que o desenvolvedor est
fazendo referncia ao prprio formulrio para o qual o cdigo foi escrito. Ou seja, atravs desse cdigo
estaramos alterando o caption do formulrio. O motivo pelo qual o Delphi interpreta a codificao dessa
maneira melhor compreendida quando trabalharmos com os conceitos de Orientao a Objetos, por ora
devemos apenas nos lembrar das regras de atribuio de nomes aos componentes e de como podemos
utilizar esses nomes para escrever a codificao de nossos aplicativos.
Pgina: 55
Delphi 5
se qualquer um dos mtodos descritos anteriormente e por isso no ser, de agora em diante, explicitado.
Em relao aos nomes dos componentes, por questes de praticidade, sero mantidos, porm, caso seja de
desejo do desenvolvedor alter-los essas alteraes devero ser feitas agora antes do incio da codificao
como foi discutido anteriormente. A codificao final para o procedimento de evento ser a mostrada a
seguir.
Antes de compilarmos e executarmos a aplicao vamos observar o cdigo acima. Nele podemos observar
um ponto importante relativo chamada do mtodo ShowModal. Uma vez que esse cdigo foi escrito a
partir de um procedimento de evento pertencente ao formulrio
Form1, ao fazermos referncia a um mtodo de um outro formulrio,
o Form2, essa referncia teve de ser feita utilizando-se a referncia
completa ao mtodo, incluindo o nome do formulrio que teria seu
mtodo executado, ou seja, o Form2. Caso no tivssemos colocado a
referncia ao Form2, a aplicao poderia ser compilada sem
problema algum, porm, ao invs de exibir o segundo formulrio ao
clicarmos no boto Button1, o aplicativo iria exibir o prprio Form1,
o que, em nosso caso particular iria provocar um erro que explicaremos posteriormente. Por ora vamos
apenas compilar a nossa aplicao.
Ao tentarmos compilar a nossa aplicao uma
mensagem de erro ser exibida como mostrado ao
lado. Esse erro ocorreu por uma razo bem simples
que, por incrvel que possa parecer, j foi explicada
anteriormente. Apesar de toda a codificao estar
correta esquecemos de um pequeno detalhe. No
procedimento de evento que acabamos de escrever tentamos executar um mtodo de um objeto que no
est localizado na unit corrente. Vimos que, todas as vezes que desejarmos utilizar qualquer definio
localizada em uma outra unit que no na que estamos codificando, uma referncia unit na qual essas
definies esto localizadas dever ser feita na clusula uses da unit sendo codificada. Foi exatamente isso
que aconteceu. Estamos nos referenciando a um objeto, o Form2, definido na unit2 a partir da unit1 sem ter
feito referncia a essa unit. Devemos ento adicionar unit2 clusula uses da unit1. Quando nos
referenciamos formulrios o Delphi exibe a caixa de dilogo mostrada ao lado permitindo que ele prprio
efetue essas alteraes para ns. No devemos, no entanto, nos habituar com isso, pois o Delphi s ir nos
ajudar nessas situaes, nas demais deveremos nos preocupar em incluir as units na clusula uses. Aps
clicarmos no boto Yes para adicionarmos a unit2 clusula uses da unit1 podemos compilar e executar a
aplicao e verificar o comportamento dos formulrios ao clicarmos no boto. Agora que j sabemos como
podemos exibir formulrios de forma modal vamos estudar como o Delphi capaz de exibir formulrio de
forma no modal.
Pgina: 56
Delphi 5
Delphi 5
Poderamos esperar que ambos os cdigos funcionassem da mesma maneira, porm isso no acontece. O
cdigo escrito para o evento OnClick do boto Button1 exibe o segundo formulrio e logo em seguida
exibe uma caixa de mensagem co o texto Ol. J o segundo procedimento, tambm exibe o segundo
formulrio mas s ir exibir a caixa de mensagem quando o Form2 for fechado. Podemos concluir que o
mtodo show no prende a execuo do programa uma vez que a caixa de texto exibida atravs do
procedimento ShowMessage foi executado antes mesmo do segundo formulrio ter sido fechado. No
entando, quando exibimos o segundo formulrio utilizando o mtodo ShowModal, a execuo do cdigo
relativo ao procedimento ShowMessage s executado ao fecharmos a caixa de mensagem.
5.Comandos da linguagem
Comeamos nossa caminhada no aprendizado do mundo Delphi atravs do estudo dos formulrios. J
temos conhecimento de uma propriedade do formulrio, a propriedade name, e de dois mtodos, show e
showmodal, responsveis pela exibio dos formulrios. No entanto, para continuarmos o nosso estudo e
sermos apresentados a outras propriedades e mtodos devemos aprender os principais comandos da
linguagem Object Pascal. Essa apresentao faz-se necessria principalmente para podermos ilustrar com
exemplos mais teis cada uma dessas propriedades e mtodos.
5.1.
Observe que, no exemplo dado, existem trs comandos simples, todos eles dentro do mesmo procedimento.
Devemos sempre nos lembrar que as instrues dentro do cdigo Object Pascal, independentemente de
serem simples ou compostas, devem ser escritas dentro de procedimentos ou funes, portanto no
podendo ocorrer espalhadas no meio da unit.
O segundo tipo de instruo, as intrues compostas, possuem em geral mais de uma instruo simples
associada a ela. Apesar de no ser muito comum, instrues compostas podem conter uma nica instruo
simples em seu corpo. As instrues compostas so delimitadas por um bloco composto pelas palavras
reservadas begin e end e finalizadas por um ; (ponto-e-vrgula) de forma semelhante delimitao de
um procedimento de evento visto no exemplo acima. No entanto, uma instruo composta vem no corpo
desses procedimentos como se fosse uma instruo simples conforme o exemplo a seguir.
procedure TForm1.Button1Click(Sender: TObject);
begin
x := x + 1;
begin
Form2.ShowModal;
ShowMessage(Ol);
end;
end;
Pgina: 58
Delphi 5
Como podemos observar, uma instruo composta possui em seu corpo uma ou vrias instrues simples e,
pode at mesmo, possuir outras instrues compostas. Apesar de no ser to perceptvel nesse momento a
finalidade de estarmos utilizando instrues compostas elas so muito teis no desenvolvimento de
aplicaes uma vez que as intrues, simples ou no, contidas em uma instruo composta, so
consideradas pelo compilador como uma nica instruo simples. As instrues compostas so largamente
utilizadas no isoladamente como no exemplo anterior mas como parte de intrues mais complexas,
compondo as instrues condicionais e de laos, ou de repetio, que sero vistas a seguir.
5.2.
Instrues Condicionais
As instrues condicionais so aquelas que determinam o fluxo de execuo do programa atravs da
verificao de uma condio booleana. No Delphi existem dois tipos de instrues booleanas, a instruo if
e a instruo case.
5.2.1. If
A instruo if uma das instrues mais comuns nas linguagens de programao existindo at na
linguagem assembler e, como no poderia deixar de ser, tambm existe no Object Pascal. No quadro
abaixo ilustramos as duas formas bsicas que o comando if pode aparecer um um programa escrito em
Object Pascal acompanhado de alguns exemplos.
Sintaxe
If <condio> then <instruo> ;
if <condio> then <instruo> else <instruo>;
Exemplos
if x >= y then ShowMessage(Limite ultrapassado) ;
if odd(x) then ShowMessage(O nmero mpar)
else ShowMessage(O nmero par);
if (x > 0) and (x < 10) then x := x + 1;
If (x > 3) and (y <= 5 ) then
Begin
x := x 1;
y := y + 1;
End
Else
x := x + 1;
If x >= y then
If x = y then
ShowMessage(X igual a Y)
Else
ShowMessage(X maior do que Y)
Else
ShowMessage(X menor do que Y);
Como podemos observar no quadro acima, a instruo if possui, basicamente, duas formas. A primeira
delas constituda apenas da instruo if seguida da instruo a ser realizada no caso da condio booleana
a ser testada resulte em um valor verdadeiro enquanto que a segunda permite que tanto uma intruo seja
realizada no caso do resultado da condio ser verdadeira quanto no caso dela ser falsa. Um detalhe
extremamente importante relacionado com a instruo if e que resulta em muitos erros principalmente para
Pgina: 59
Delphi 5
pessoas inexperientes com o Delphi que a instruo que precede o else no deve ser terminada com um
ponto-e-vrgula ao contrrio do que acontece com as demais instrues da linguagem.
Um segundo ponto a ser observado no exemplo acima a possibilidade de termos comandos if aninhados,
ou seja, uns dentro dos outros conforme mostrado no ltimo exemplo dado acima. Um outro ponto que
pode ser observado atravs dos exemplos que a instruo a ser executada tanto pelo comando if no caso
da condio ser verdadeira quanto pelo else no caso dela ser falsa, pode ser tanto uma instruo simples
quanto ums instruo composta. Observe o exemplo a seguir.
Exemplos
if (x >= y) and (y < 10) then
x := x - 1;
y := y + 1;
if (x >= y) and (y < 10) then
begin
x := x - 1;
y := y + 1;
end;
5.2.2. Case
A medida em que vamos escrevendo instrues ifs aninhadas elas vo tendo seu entendimento cada vez
mais complexo, dificultando o desenvolvimento e a manuteno do cdigo escrito. Em substituio
escrita de ifs aninhados, o Object Pascal oferece a instruo case. A instruo case permite, da mesma
maneira que a instruo if, o controle condicional relativo ao fluxo do programa, porm esse controle
feito de forma mais clara e, em muitos compiladores, de forma mais eficiente em relao ao cdigo gerado.
Sintaxe
Case <Seletor>
<Rtulo 1> :
<Rtulo 2> :
<Rtulo n> :
Then
<Instruo 1> ;
<Instruo 2> ;
<Instruo n> ;
end;
Case <Seletor> Then
<Rtulo 1> : <Instruo 1> ;
<Rtulo 2> : <Instruo 2> ;
<Rtulo n> : <Instruo n> ;
else
<InstruoOutroCaso>;
end;
Exemplos
Case Caractere Then
a : ShowMessage(Caractere invlido) ;
b, c, d : begin
x := x + 1;
Soma := x + y;
Pgina: 60
Delphi 5
end;
e..z :;
end;
Case Nota Then
0 : Texto := Reprovado ;
1..5 : Texto := Recuperao ;
6..9 : Texto := Aprovado ;
10 : Texto := Parabens;
end;
Observemos o quadro anterior. Nele est sendo mostrado as duas sintaxes possveis para a escrita de uma
instruo case dentro de um programa em Object Pascal. Em ambos os casos, a instruo case utilizada
para executar uma instruo, simples ou composta, dependendo do valor do seletor passado. O seletor ser,
na grande maioria dos casos, uma varivel cujo valor deseja-se ser testado. Um detalhe a ser observado na
utilizao da instruo case est na restrio da utilizao de tipos de variveis como seletores para uma
instruo case. O Object Pascal s permite que sejam utilizados seletores de tipos de dados ordinais. Dessa
forma, no so permitidos, por exemplo, a utilizao de seletores do tipo string nem de ponto flutuante.
Um fato interessante relacionado instruo case aparece nos rtulos que podem ser utilizados dentro da
instruo. Nos exemplos fornecidos podemos observar que podem ser utilizados desde valores simples,
valores mltiplos, ou at mesmo uma faixa de valores a serem testados. Caso nenhum dos valores definidos
pelos rtulos do comando case represente o valor fornecido pelo seletor da instruo poder ser definido
dentro da instruo, um rtulo else que ser executado nessas situaes. Ou seja, o else dentro de uma
instruo case identifica as instrues a serem executadas no caso de nenhum dos rtulos fornecidos. O
else opcional dentro de uma instruo case.
5.3.
Estruturas de Repetio
As instrues que vimos at agora so bastante teis durante o desenvolvimento de uma aplicao. No
entanto existem ainda algumas outras instrues que permitem o controle do fluxo de execuo do
programa de forma repetitiva e no s de forma sequncial baseada em uma condio booleana como
acontecia com as instrues condicionais. Por isso, iremos dar incio ao estudo das instrues do Object
Pascal responsveis pelo controle do fluxo de execuo de um programa atravs da repetio de suas
instrues com base em condies booleanas.
5.3.1. For
A primeira instruo de repetio que iremos estudar a instruo for. Essa instruo amplamente
utilizada quando desejamos repetir uma ou um conjunto de intrues por um determinado nmero fixo de
vezes. Por esse motivo, a intruo for utiliza-se de um contador para determinar se essa quantidade de
interaes que o lao dever realizar j foi atingido ou no.
Sintaxe
for <Contador := <Valor1nicial> to <ValorFinal> do
<Instruo>;
for <Contador := <Valor1nicial> downto <ValorFinal> do
<Instruo>;
Exemplos
for Cont := 1 to 10 do
Acum := Acum + Cont;
for Cont := 10 downto 1 do
Acum := Acum + Cont;
for Cont := 1 to 10 do
begin
Acum := Acum + Cont;
ShowMessage(IntToStr(Acum));
End;
for Cont := 1 to 10 do
Cont := Acum + Cont; //Errado
O quadro acima mostra as duas sintaxes possveis para a instruo for. As duas funcionam da mesma
maneira diferenciando-se uma da outra unicamente pela forma como o contador utilizado. Na primeira
sintaxe apresentada, o contador incrementado a cada interao do lao. J na segunda, o contador
Pgina: 61
Delphi 5
decrementado. Os exemplos apresentados permitem verificar que podem compor a instruo for tanto
instrues simples quanto compostas. Essa caracterstica se repete para as demais instrues de repetio e
por isso no mais repetiremos essa afirmao a menos que exista alguma diferena de comportamento.
Dois pontos importantes dever ser observados em ambas as sintaxes utilizadas para a instruo if. O
primeiro deles que o contador utilizado no lao uma varivel local ao procedimento no qual o lao est
sendo executado. O segundo ponto importante que a varivel a ser utilizada como contador para o lao
for no pode ser alterada dentro do lao como mostrado no exemplo. A tentativa de alterar o seu contedo
resulta em erro durante a compilao do aplicativo, funo do prprio Object Pascal incrementar ou
decrementar o contador deixando o desenvolvedor livre dessa preocupao.
5.3.2. While
A segunda instruo de repetio que iremos estudar a instruo while. Essa instruo, de forma
semelhante ao que acontecia com a instruo for tem sua execuo controlada por uma condio booleana
s que, ao invs da condio ser analisada em relao a um contador, a condio booleana a ser avaliada
pode ser uma expresso booleana qualquer.
Sintaxe
while <Condio> do
<Instruo>;
Exemplos
while Cont < 10 do
Cont := Acum + Cont;
while Cont < 10 do
Acum := Acum + Cont; //Cuidado -> Loop infinito
while Cont < 10 do
begin
Acum := Acum + Cont;
Cont := Cont + 1;
end;
A sintaxe utilizada pela instruo while bastante simples como pode ser observado no quadro acima. Para
que o fluxo de execuo do programa passe a executar a intruo do lao while basta que a condio
declarada seja verdadeira. Uma vez em execuo, as instrues contidas no lao s deixaram de ser
executadas quando a condio do lao se tornar falsa. Uma vez que a varivel de controle do lao no
mais controlada automaticamente, funo do desenvolvedor evitar que erros ocorram em relao
atualizao dessa varivel. No exemplo acima, mostramos a ocorrncia de um loop infinito. Caso o
desenvolvedor escreva equivocadamente o cdigo apresentado, uma vez que o lao comece a ser executado
ele nunca ser finalizado, o que muito provavelmente estar errado. O ltimo exemplo mostra que sempre
devemos alterar, de alguma forma, o valor das variveis que controlem o lao while, para garantir que esse
termine e o processamento do aplicativo continue normalmente.
5.3.3. Repeat
A ltima instruo de repetio que iremos estudar a instruo repeat. Essa instruo assemelha-se
bastante instruo while vista anteriormente salvo algumas diferenas que sero vistas posteriormente.
Vamos, ento, observar a sintaxe utilizada para a instruo repeat juntamente com alguns exemplos.
Sintaxe
Repeat
<Instruo>;
Until <Condio>;
Exemplos
Repeat
Acum := Acum + Cont;
Cont := Cont + 1;
Until Cont >= 10;
Repeat
Acum := Acum + Cont;
Until Cont >= 10; //Cuidado -> Pode ser um lao infinito
Cont := 1;
Repeat
Acum := Acum + Cont;
Pgina: 62
Delphi 5
Until Cont >= 10; //Cuidado -> Lao infinito
A instruo repeat tambm possibilita a execuo de instrues tendo como base uma condio booleana.
No entanto, ao contrrio do que acontecia com a instruo while, as instrues contidas na instruo repeat
permanecero em execuo enquanto a condio do lao permanecer falsa, ou seja, o lao termina quando
a condio testada passa a retornar o valor verdadeiro. Essa exatamente a primeira diferena existente
entre a instruo repeat e a instruo while. Uma segunda diferena entre esses dois comando est na
necessidade da determinao de um bloco de comando para que mltiplas instrues sejam executadas
dentro do lao. Quando utilizamos a instruo while devemos utilizar begin e end para determinar o bloco
de comandos a serem executados dentro dessa instruo. J com o comando repeat isso no necessrio. A
prpria instruo repeat tem seu trmino determinado pela palavra reservada until indicando quais
instrues devem ser executadas pelo lao. Por fim, uma outra diferena entre essas duas instrues est no
fato da instruo repeat ser sempre executada pelo menos uma vez enquanto que a instruo while poder
ou no ser executada. Esse comportamento deve-se ao fato da condio da instruo while ser testada no
incio do lao enquanto que a condio da instruo repeat s ser testada no final.
Os exemplos acima mostram tanto a correta utilizao da instruo repeat quanto alguns erros que podem
acontecer ao utilizarmos essa instruo. Por se tratar de uma instruo de repetio semelhante instruo
while, devemos tambm nos preocupar com a manipulao das variveis que controlam a sua execuo
para evitar a ocorrncia de um lao infinito.No segundo exemplo, a instruo repeat poder provocar a
execuo de um lao infinito dependendo do valor que foi atribudo inicialmente varivel cont. J no
ltimo exemplo, um lao infinito ir ocorrer devido ao fato do valor inicial que foi atribudo varivel no
ser alterado durante a execuo do lao.
5.4.
5.5.
BREAK: Este comando serve para forar a sada de qualquer estrutura de repetio.
Independentemente da condio ou do valor do contador, no momento em que a execuo do
aplicativo atinge esta instruo, o fluxo de execuo passa para a primeira instruo aps o lao.
CONTINUE : Age, tambm no lao, de maneira oposta a Break, levando o fluxo de processamento
de volta primeira linha da estrutura de repetio. Porm, ao chegar nessa linha o contador,
no caso de um lao for incrementado e, logo em seguida, o teste responsvel pelo controle do
lao novamente testado de tal forma a verificar se ele deve ou no ser executado mais uma vez.
EXIT : O comando exit semelhante ao comando break visto anteriormente, porm ao contrrio de
forar o fluxo de execuo a sair do lao no qual ele se encontrava, o comando exit utilizado
para forar a sada de um procedimento ou funo. O fluxo de execuo ao invs de ser
passado para a instruo seguinte ao lao ele passado para o procedimento ou funo
chamadora de onde ele foi chamado.
HALT : necessrio muito cuidado com o uso deste comando uma vez que ao ser executado, o
comando halt encerra o aplicativo imediatamente, deixando, por exemplo, ainda abertos quaisquer
arquivos que tenham sido abertos pela aplicao entre outras.
Sintaxe
Pgina: 63
Delphi 5
with <objeto/varivel> do
<Instruo>;
Exemplos
Funcionario.Nome := Andr;
Funcionario.Idade := 26;
Funcionario.Cargo = Analista de Sistemas;
Form1.Font.Size := 16;
x := x + 1;
Form1.Font.Style := [ ];
Form1.Font.Color := clBlue;
with Funcionario do
begin
Nome := Andr;
Idade := 26;
Cargo = Analista de Sistemas;
End;
with Form1.Font do
begin
Size := 16;
x := x + 1;
Style := [ ];
Color := clBlue;
end;
O quadro acima mostra a sintaxe que deve ser utilizada quando desejarmos utilizar a instruo with.
Observe que, como parte da instruo, podemos utilizar tanto um objeto quanto uma varivel. Essas duas
possibilidade tambm esto ilustradas no quadro acima. No primeiro exemplo temos a utilizao de uma
varivel, previamente declarada na seo var, chamada Funcionrio. Essa varivel tem como seu tipo
TFuncionario, declarado anteriormente quando explicamos o tipo de dados Record. No exemplo temos
tanto o cdigo utilizado sem a instruo with como com ela. Observe que, ao utilizarmos a instruo with
no precisamos colocar, antes de cada campo da estrutura, a varivel que estava sendo manipulada.
Alm da utilizao de variveis do tipo record, mostrada no primeiro exemplo, a instruo with tambm
pode ser utilizada com objetos. O segundo exemplo apresentado, ilustra essa situao. Nele manipulamos
com propriedades do objeto Font, que por sua vez pertence ao objeto Form1. Com esse exemplo podemos
tambm observar que podemos, dentro da instruo with, manipular com vrios nveis de definies de
objetos. Tambm nesse ltimo exemplo podemos observar que nem todas as intrues contidas na
instruo with necessitam obrigatoriamente tratar com propriedades ou campos pertencentes ao objeto, ou
varivel, sendo manipulado. Nesse exemplo, temos uma intruo responsvel pelo incremento da varivel
x, declarada anteriormente em uma seo var. O compilador duarnte a fase de compilao do aplicativo,
identifica que essa varivel no pertence ao objeto sendo manipulado e verifica se existe uma varivel x
que tenha sido declarada anteriormente. Caso exista, a compilao feita normalmente, caso contrrio uma
mensagem de erro retornada na parte inferior do Editor de Cdigo informando o erro conforme ilustrado
na figura abaixo.
6.Manipulando Formulrios
Iniciamos os nossos estudos trabalhando com os formulrios. Vimos como eles podem ser exibidos atravs
de dois de seus mtodos e as diferenas entre a exibio de formulrios modais e no modais. No entanto,
demos uma parada nesse estudo de tal forma a aprendermos alguns dos comandos existentes no Delphi
responsveis pela determinao do fluxo de execuo de nossos aplicativos. Essa para foi de extrema
importncia uma vez que, no decorrer de nosso aprendizado do Delphi, necessitaremos desses comandos
para podermos escrever aplicativos que faam algo mais do que simplesmente exibir uma caixa de dilogo
ou um formulrio. De agora comearemos a aprender um pouco mais sobre os formulrios aprendendo
novas propriedades, mtodos e eventos teis. Devemos ressaltar que no iremos abordar, no decorrer de
nosso estudo, todas as propriedades que os componentes que iremos estudar apresentam uma vez que, se
isso fosse feito, seria impossvel terminarmos esse estudo. Essa mesma observao tambm vlida tanto
para os mtodos quanto para os eventos de cada componente a ser estudado. Alm disso, alguns
componentes apresentam propriedades em comum, nesses casos no iremos abordar essas propriedades
todas as vezes que elas ocorrerem, apenas em sua primeira ocorrncia.
Pgina: 64
Delphi 5
6.1.
Principais propriedades
Vamos ser apresentados agora s principais propriedades de um formulrio. Antes de comearmos
devemos saber que j conhecemos a propriedade name que aparece em todos os componentes do Delphi e
que, a alterao do valor dessa propriedade, uma das primeiras coisas a ser feita ao iniciarmos o
desenvolvimento de uma aplicao, no caso da propriedade name do formulrio, ou ao colocarmos um
componente qualquer no formulrio.
Com o objetivo de ilustrarmos a funcionalidade das principais propriedades do formulrio, ns iremos
construir um pequeno aplicativo, no incio com pouca ou mesmo nenhuma funcionalidade, apenas para que
possamos observar o comportamento de cada propriedade a ser estudada. Em seguida, vamos resumir a
utilizao de cada propriedade em um quadro ilustrativo. Dessa forma, vamos comear uma nova aplicao
atravs da seleco da opo New Application, localizada no menu File. Caso tenhamos feito alguma
alterao na aplicao atual, o Delphi ir nos perguntar se desejamos salvar ou no essas alteraes. Para
salvarmos basta selecionarmos o boto Yes e darmos nomes tanto s units quanto prpria aplicao como
j visto anteriormente.
Uma vez que tenhamos criado uma nova aplicao vamos colocar alguns componentes em seu formulrio
principal. Ser necessrio um componente button e
dois componentes edit conforme mostrado na figura ao
lado. Podemos observar que colocamos um dos
componentes edit, propositadamente, em um local que
ele no possa ser visto completamente dentro do
formulrio, isso no tem importncia agora uma vez
que estamos simplesmente querendo ilustrar algumas
das propriedades do formulrio. Uma vez que
tenhamos colocado esses componentes vamos alterar
algumas das propriedades do formulrio e depois
vamos criar dois procedimentos, o primeiro associado
ao evento OnClick desse formulrio e no do boto
como poderamos pensar inicialmente, e o segundo
associado ao evento OnClick do boto. Comecemos pela alterao de algumas das propriedades do
formulrio.
A primeira propriedade que iremos modificar a propriedade AutoScroll, trocando o valor true pelo valor
false. Ao fazermos isso podemos observar uma mudana no visual do formulrio. Agora, a barra de
rolagem que existia no rodap do formulrio desapareceu. A propriedade AutoScroll responsvel por
definir se o formulrio ir ou no exibir automaticamente barras de rolagem no caso de serem colocados
componentes em regies fora da rea de exibio de um formulrio. Essa propriedade importante quando
queremos desenvolver aplicaes que possuam uma quantidade excessiva de componentes em seus
formulrios. Um fato importante que pudemos observar que, ao alterarmos o valor da propriedade
AutoScroll, o efeito da alterao refletido direta e imediatamente na aplicao sendo desenvolvida,
mesmo estando ainda em sua fase de desenvolvimento dentro da IDE do Delphi. Devemos ter cuidado
porque muitas outras propriedades, ao terem seus valores alterados, s permitem a visualizao dos efeitos
da alterao durante a execuo do aplicativo e no dentro da prpria IDE.
A segunda propriedade que iremos alterar a propriedade BorderIcons. Observe que essa propriedade do
tipo set e apresenta como itens quatro valores distintos: biSystemMenu, biMinimize, biMaximize e biHelp.
Vamos alterar essa propriedade de tal forma que ela s possua os elementos biSystemMenu e biHelp ativos,
ou seja, com valor true atribudo a esses itens enquanto que as demais iro possuir o valor false. Ao
contrrio do que aconteceu com a propriedade AutoScroll, ao alterarmos a propriedade BorderIcons no
observamos qualquer alterao no formulrio. Isso porque as alteraes realizadas na propriedade
BorderIcons s so percebidas quando a aplicao estiver sendo executada e no dentro da IDE do Delphi.
Esse comportamento tambm bastante comum entre as propriedades no s do formulrio mas tambm de
muitos outros componentes.
Uma outra propriedade que iremos alterar neste nosso exemplo a propriedade BorderStyle. Observe que
essa propriedade uma propriedade que possui uma srie de valores possveis a serem atribudos a ela, so
eles: bsDialog, bsSingle, bsNone, bsSizeable, bsToolWindow e bsSizeToolWin. Esses so os valores
possveis, definidos a partir de um tipo de dados enumerado chamado TFormBorderStyle, criado no Delphi
conforme mostra a ajuda on-line mostrada ao lado. Com isso j sabemos que, no caso de desejarmos alterar
o valor dessa propriedade em tempo de execuo, ou seja, atravs de cdigo escrito utilizando Object
Pgina: 65
Delphi 5
Pascal, a atribuio dever ser feita diretamente utilizando-se um desses valores, no podendo, portanto, ser
utilizadas aspas ou qualquer outro delimitador. Daremos um exemplo posteriormente de como poderemos
fazer tal codificao. Por ora vamos alterar o valor dessa propriedade para bsSingle.
A propriedade Caption a propriedade do formulrio mais alterada no desenvolvimento de aplicaes.
Vamos alter-la tambm de tal forma a ela possuir o valor Meu primeiro exemplo. Observe que a medida
em que vamos digitando, o texto contido na barra de ttulo do formulrio vai se modificando de tal forma a
conter exatamente o texto sendo digitado. Antes mesmo de executarmos a aplicao j sabemos qual a
finalidade dessa propriedade dentro de um formulrio.
Por fim vamos alterar os valores contidos em trs propriedades do formulrio. So elas a propriedade
FormStyle, a propriedade Icon e a propriedade WindowState. A propriedade Icon contm um objeto do tipo
TIcon e por isso sua atribuio dentro do Editor de Cdigo do Delphi no pode ser feita de modo to
imediato quanto pode ser feito com valores de tipos bsicos, sets ou mesmo enumerados. So necessrios
alguns cuidados adicionais como a criao do objeto entre outros, que sero vistos posteriormente quando
estivermos trabalhando com os conceitos de orientao a objetos. Porm, quando definimos os valores para
essas propriedades atravs do Object Inspector, o Delphi encarrega-se desses detalhes para o
desenvolvedor. Para selecionarmos um valor para a propriedade Icon devemos clicar o boto que aparece
no Object Inspector ao selecionarmos essa
propriedade. Ser exibida a caixa de dilogo Picture
Editor,
mostrada ao lado, que ir permitir que selecionemos
um arquivo
que contm um cone a ser exibido para este
formulrio.
Para definirmos o cone a ser utilizado devemos
clicar
o
boto Load, selecionar o arquivo e, em seguida clicar
no boto
Ok. Em nosso exemplo vamos selecionar o arquivo
factory.ico, localizado no diretrio c:\Arquivos de
Programas\Arquivos
Comuns\Borland
Shared\Images\Icons. Observe que ao selecionarmos
o arquivo e
clicarmos o boto Ok na caixa de dilogo Picture
Editor, o
cone localizado no canto superior esquerdo do
formulrio
alterado para exibir o cone selecionado. Devemos lembrar que ao alterarmos o cone do formulrio,
mesmo que esse cone seja o cone do formulrio principal da aplicao, no estamos alterando o cone da
aplicao, que mostrado quando a minimizamos, mas sim o cone do prprio formulrio. Para alterarmos
o cone da aplicao devemos faz-lo atravs da caixa de dilogo Project Options mostrada anteriormente.
J as duas outras propriedades, FormStyle e WindowState, so propriedades de tipos enumerados que
possuem os valores fsMDIChild, fsMDIForm, fsNormal e fsStayOnTop para a primeira propriedade e
wsMaximized, wsMinimized e wsNormal para a segunda. A propriedade FormStyle responsvel pela
definio do tipo de formulrio a ser exibido pela aplicao. Dependendo de qual o valor atribudo a essa
propriedade o formulrio ter um comportamento diferente dentro da aplicao. Dos valores possveis o
mais comum fsNormal que indica um comportamento normal para o formulrio, ou seja, indica que o
formulrio pertence a uma aplicao SDI (Simple Document Interface), tais como o prprio Delphi por
exemplo. Alm das aplicaes SDI temos tambm as aplicaes MDI (Multiple Document Interface) como,
por exemplo, o Microsoft Word at a sua verso para o Office 97. Vamos alterar o valor da propriedade
FormStyle para fsStayOnTop. Novamente no observamos qualquer alterao no formulrio dentro da IDE
do Delphi.
A ltima propriedade que iremos abordar pertencente ao formulrio a propriedade WindowState.
Podemos perceber a funcionalidade dessa propriedade sem ao menos alter-la uma vez que os valores que
podemos atribuir a ela j nos do uma idia de sua funcionalidade. Essa propriedade responsvel pela
definio do estado do formulrio, determinando se ele est minimizado, maximizado ou normal. Para
ilustrarmos a utilizao dessa propriedade vamos criar um procedimento de evento associado ao evento
OnClick do boto. Esse procedimento dever ter o cdigo mostrado abaixo.
procedure TForm1.Button1Click(Sender: TObject);
begin
WindowState := wsMaximize;
end;
O cdigo acima ilustra dois pontos importantes da programao utilizando o Object Pascal. O primeiro
refere-se a atribuio de valores a variveis de tipos enumerados. Como j havia sido mencionado
anteriormente, a atribuio feita diretamente, sem a utilizao de aspas ou qualquer outro identificador. O
Pgina: 66
Delphi 5
segundo ponto est na atribuio do um valor a uma propriedade que aparentemente no pertence a
nenhum objeto. Como isso possvel uma vez que vimos que para manipularmos tanto com propriedades
quanto mtodos de objeto deveramos fazer uso do operador pornto? Em nosso exemplo isso no est
sendo feito. No informamos que WindowState uma propriedade do objeto Form1, porm veremos que
tanto o Delphi ir compilar a aplicao quanto ir execut-la corretamente.
Alm de criarmos um procedimento de evento para o evento OnClick do boto tambm iremos criar um
outro para o evento OnClick do formulrio como j havia sido informado no incio desta seo. Esse
procedimento ter por finalidade mostrar o funcionamento de duas das propriedades do formulrio vistas
nesta seo. Ao criarmos o procedimento deveremos escrever o cdigo mostrado a seguir.
procedure TForm1.FormClick(Sender: TObject);
begin
ShowMessage(ActiveControl.Name);
if BorderStyle = High(BorderStyle) then
BorderStyle := Low(BorderStyle)
else
BorderStyle := Succ(BorderStyle);
end;
Observe que o cdigo escrito acima faz uso de um procedimento e de uma funo. O procedimento
ShowMessage, como j sabemos, exibe uma caixa de dilogo contendo a string passada como parmetro.
Em nosso exemplo, passamos como parmetro a string definida na propriedade name do objeto contido na
propriedade ActiveControl do formulrio. Parece complicado? Pode parecer, mas na realidade bastante
simples e ficar mais simples ainda quando compilarmos e executarmos o nosso exemplo. Por ora vamos
falar das funes Succ, High e Low que tambm utilizamos no cdigo acima. Essas funes so utilizadas
para manipularmos com variveis e propriedades de tipos ordinais. Lembre-se que tipos ordinais possuem
esse nome por determinarem uma ordenao sobre os valores que constituem esse tipo. A funo succ no
faz nada mais do que retornar o prximo valor de uma varivel ou propriedade de um tipo ordinal. J as
funes high e low so utilizadas para informar os maiores e menores valores de um tipo ordinal qualquer.
O quadro abaixo mostra algumas das funes existentes para a manipulao de tipos ordinais.
Funo
Parmetro
Finalidade
Ord
Expresso ordinal
Pred
Expresso ordinal
Succ
Expresso ordinal
High
Tipo ordinal
Low
Tipo ordinal
Uma vez que j falamos rapidamente a respeito do cdigo escrito para esse aplicativo vamos compil-lo e
executa-lo para que possamos entender melhor tanto o cdigo escrito quanto as propriedades que ele
manipula. Para isso ou selecionamos a opo Run
contida no menu Run, ou utilizamos o speedbutton
contido na Barra de Ferramentas do Delphi, ou ainda
utilizamos a tecla de atalho F9. Ao executarmos a
aplicao, o formulrio principal da aplicao ir
aparecer na tela como mostra a figura ao lado.
Lembre-se que ns codificamos alguns eventos dessa
aplicao e por isso vamos testar o que cada um desses
eventos ir fazer quando for disparado. Vamos
comear pelo evento associado ao clique do boto. Ao
clicarmos o boto o formulrio maximizado. Isso
ocorre devido a atribuio do valor wsMaximize a essa
propriedade. Neste exemplo fizemos uma atribuio
propriedade WindowState, contudo poderamos ter apenas consultado esse valor para realizarmos uma
outra operao qualquer.
Pgina: 67
Delphi 5
O primeiro evento que vimos nesse exemplo no tinha muita utilidade, servia apenas para ilustrar uma
atribuio de um valor a uma propriedade em tempo de execuo. J o segundo evento que foi tratado
mais interessante. Antes de clicarmos no formulrio para testarmos o segundo evento, vamos retornar o
formulrio para seu tamanho original. Porm em nossa aplicao no existe o boto para que a janela
retorne ao seu tamanho normal. Isso acontece devido alterao que fizemos na propriedade BordeIcons
do formulrio. Cada item dessa propriedade identifica quais sero os botes que estaro disponveis em
tempo de execuo para o formulrio em questo. Em nosso exemplo disponibilizamos apenas os botes de
sistema (biSystemMenu) e de ajuda (biHelp).
Uma observao importante necessria ao tratarmos com a propriedade BorderIcons. Lembre-se que esta
propriedade do tipo set, ou seja, ela pode possuir uma seqncia de valores de forma arbitrria. Os
valores que ela ir conter indicam quais o botes que estaro disponveis no formulrio, porm mesmo que
todos os botes seja colocados disposio nem todos eles estaro visveis ao mesmo tempo como poderia
ser esperado. Por exemplo, caso removamos o boto biSystemMenu, nenhum outro boto ficar visvel no
formulrio independentemente deles estarem ou no definidos na propriedade. Um outro exemplo o boto
biHelp. Esse boto s ficar visvel no caso de tanto o boto biMaximize quanto biMinimize estarem
desabilitados. Essa foi exatamente a situo de nossa aplicao. Alm disso, outras propriedade afetam a
exibio desses botes como o caso da propriedade BorderStyle como ser visto adiante.
Uma vez que no temos o cone para retornar o formulrio ao seu tamanho
original, devemos dar um duplo clique em sua barra de ttulo. Agora sim, que j
estamos com o formulrio em seu tamanho original, podemos continuar a
manipular o nosso aplicativo. Vamos clicar no formulrio de tal forma a executar
o procedimento de evento associado. Ao fazermos isso, uma caixa de dilogo
exibida mostrando o nome do componente Button1 conforme mostra a figura ao
lado. A exibio do nome Button1 ocorre pois esse era o componente que estava
selecionado no formulrio quando ele foi clicado. Se o componente selecionado
fosse a caixa de texto Edit1, esse seria o nome exibido na caixa de dilogo. Isso
ocorre uma vez que a propriedade ActiveControl do formulrio contm o componente que est ativo no
formulrio naquele instante. Observe que a propriedade ActiveControl um objeto que, por sua vez,
tambm possui propriedades e mtodos e, por isso, pudemos exibir o contedo de sua propriedade name.
Atravs da utilizao da propriedade ActiveControl tambm poderamos alterar qual o componente ativo do
formulrio a qualquer instante, para isso seria necessria apenas a atribuio do nome do componente
propriedade conforme exemplificado a seguir.
Exemplo
/* Cdigo escrito */
ActiveControl := Edit1;
/* Cdigo escrito */
O cdigo escrito acima bastante simples. Trata-se de uma atribuio direta do nome do objeto
propriedade ActiveControl do formulrio. Devemos observar que no atribuda uma string, que
contedo da propriedade name do componente, mas sim o prprio objeto Edit1. Ao executar essa linha,
componente que passa a estar ativo no formulrio, ou seja, que passa a ter o foco da aplicao
componente Edit1.
o
o
o
Agora que j sabemos o que faz a primeira linha de cdigo escrita no procedimento associado ao evento
OnClick do formulrio, podemos continuar clicando no boto OK da caixa de mensagem que foi exibida.
Uma vez que a caixa fechada podemos perceber que o formulrio modificado. O que aconteceu? A
borda do formulrio foi alterada! Essa alterao exatamente o que o prximo comando que havamos
definido proporciona. A funo succ faz com que seja atribuda propriedade BorderStyle do formulrio
um novo valor, o valor seguinte quele atualmente atribudo propriedade BorderStyle. Porm no
utilizamos simplesmente a funo succ uma vez que quando chegssemos ao final dos valores do tipo
enumerado a atribuio seria sempre para o ltimo valor possvel. Para evitar isso, foi colocada uma
instruo condicional que testa se a propriedade BorderStyle j possui o maior valor possvel. No caso do
teste ser verdadeiro ser atribudo o menor valor possvel a essa propriedade, caso contrrio a funo succ
a que ficar encarregada de definir qual o valor a ser atribudo propriedade BorderStyle. Observe tambm
que dependendo do tipo de borda que esteja sendo atribuda ao formulrio, nem todos os botes relativos
propriedade BorderIcons so exibidos. Conforme havamos mencionado anteriormente, a propriedade
BorderStyle tem influncia sobre a exibio ou no desses botes. Com isso devemos ter cuidado tanto
Pgina: 68
Delphi 5
com o tipo de borda que estejamos atribuindo ao nosso formulrio bem como com os valores que tenhamos
colocado na propriedade BorderIcons, pois caso tenhamos removido o cone de sistema o usurio no ter
como fechar o formulrio a menos que utilize as teclas ALT + F4 ou finalize a tarefa utilizando o
gerenciador de tarefas do Windows.
Antes de fecharmos a aplicao e retornarmos para a IDE do Delphi vamos observar o efeito de uma outra
propriedade do formulrio que alteramos no Object Inspector. Vamos tentar alternar entre as aplicaes
que estejam em execuo utilizando as teclas ALT + TAB. Ao fazermos isso, podemos perceber que
conseguimos alternar entre as aplicaes porm o nosso aplicativo Delphi sempre permaneceu por sobre as
demais janelas. Isso ocorreu devido a alterao feita na propriedade FormStyle. Ao colocarmos o valor
fsStayOnTop fizemos com que esse formulrio sempre permanecesse sobre as demais aplicaes
independentemente de qual aplicao esteja sendo manipulado naquele momento.
O ltimo ponto que vamos observar antes de fecharmos a aplicao se refere posio como o formulrio
foi exibido. A menos de uma coincidncia fantstica o formulrio no deve ter sido exibido no centro da
tela como poderamos querer que tivesse acontecido. Se observarmos melhor, o formulrio foi exibido
exatamente na mesma posio em que ele se encontrava quando estvamos desenvolvendo-o na IDE do
Delphi. Isso ocorre graas a uma propriedade do formulrio que define tanto a posio como, em alguns
casos, o tamanho do formulrio com que ele exibido pela primeira vez. Vamos fechar a aplicao e
retornar IDE do Delphi. No Object Inspector podemos observar uma propriedade chamada position
pertencente ao formulrio. Essa a propriedade responsvel por essa definio. Observe que o valor
default para ela poDesigned, ou seja, de acordo com que foi definido quando estava na IDE. Caso
desejssemos que o formulrio fosse exibido no centro da tela bastaria alterarmos o valor dessa
propriedade para poScreenCenter. Verifique na ajuda do Delphi os possveis valores para essa propriedade
e o que cada um deles faz.
Um ponto que pode ser observado nas propriedades sets e de tipos enumerados do Delphi que os valores
seguem um padro de nomeao. As duas primeiras letras de cada valor identifica, de alguma maneira, a
propriedade a qual ele pertence. Por exemplo, os valores da propriedade BorderIcons comeam pelas letra
bi, j os valores para a propriedade Position comeam pelas letras p e assim sucessivamente. Caso
desejemos desenvolver novos tipos devemos seguir esse padro para que outros desenvolvedores consigam
trabalhar com esses tipos de forma mais amigvel.
O quadro a seguir traz um resumo das principais propriedades vistas at aqui.
Propriedade
6.2.
Valores
Finalidade
ActiveControl
Componentes do Form
BorderIcons
biSystemMenu, biMaximize,
biMinimize, biHelp
BorderStyle
Caption
String qualquer
FormStyle
fsNormal,
fsMDIChild,
fsMDIForm, fsStayOnTop
Icon
Position
poDesigned,
poDefault,
poDefaultPosOnly,
poDefaultSizeOnly,
poScreenCenter,
poDesktopCenter,
poMainFormCenter,
poOwnerFormCenter
WindowState
wsNormal,
wsMinimized,
wsMaximized
Principais mtodos
Uma vez que vimos as principais propriedades da classe formulrio podemos dar incio ao estudo de seus
principais mtodos. Durante o nosso estudo sobre formulrios modais e no modais j fomos apresentados
Pgina: 69
Delphi 5
a dois desses mtodos: show e showmodal. Como vimos esses mtodos so responsveis pela exibio de
formulrios dentro de nossas aplicaes. Alm desses, existem outros mtodos dentro da classe formulrio
que devem ser estudados. J que sabemos como exibir formulrios comear o nosso estudo a respeito dos
principais mtodos dos formulrios sendo apresentados ao mtodo responsveis por fech-lo.
De forma semelhante ao que foi feito para ilustrar as principais propriedades do formulrio, iremos
construir uma pequena aplicao para ilustrar tanto os principais mtodos quanto os principais eventos
existentes para um formulrio. Dito isso, vamos comear a nossa nova aplicao, salvando a aplicaio
anterior se necessrio. Desta vez, vamos criar a aplicao manipulando com as propriedades que j foram
vistas na seo anterior, por exemplo, alterando os nomes dos formulrios e componentes que forem sendo
criados.
6.3.
Principais eventos
7.Componentes de Interface
7.1.
MAINMENU
(Menu Principal)
P r o p r i e d a d e s
Items
P r o p r i e d a d e s
d e
c a d a
I T E M
(do menu)
Checked
Marcado ou No-Marcado ?
ShortCut
GroupIndex
RadioItem
Nota.:
Voc quer que quando o usurio der um click pressionando o boto da direita aparea um menu flutuante
(Local/Rpido/Suspenso)? No tem o que fazer! A maioria dos componentes possuem um propriedade
chamada PopUpMenu s nela voc indicar o name do componente PopUpMenu disponvel que voc
preparou. Abaixo temos o componente PopUpMenu em estudo:
Pgina: 70
Delphi 5
P r o p r i e d a d e s
AutoPopUp
Charmar automaticamente?
Alingment
7.1.2. Botes
BUTTON (Boto de Comando)
Pgina de Componentes: Standard Classe: TButton
P r o p r i e d a d e s
Caption
Name
Default
Cancel
ShowHint
Hint
ModalResult
Visible
Visvel ou Invisvel ?
Enabled
Habilitar ou desabilitar ?
Top
Left
Height
Width
TabStop
TabOrder
Figura 6 - Boto
Enabled = False
Name = 'ButtonAlterar'
(Obs.: Visto apenas na execuo)
Caption = 'Alterar Tamanho'
Enabled = True
Left = 280
Top = 96
Width = 105
Height = 25
Hint = 'Um click para alterar o tamanho'
ShowHint = True
TabStop = True
Procedure TForm1. ButtonAlterarClick (Sender:
comTabOrder
Dica = 1
TObject);
OnClick = ButtonAlterarClick
begin
Figura 7 - Desabilitado
Pgina: 71
Delphi 5
P r o p r i e d a d e s
d e
E v e n t o s
OnClick
OnEnter
OnExit
NumGlyphs
Kind
LayOut
ModalResult
SPEEDBUTTON
(Boto Ferramenta)
Glyph
GroupIndex
Down
AllowAllUp
Spacing
LayOut
7.1.3. Labels
LABEL (Etiqueta/Rtulo para Descrio)
Pgina de Componentes: Standard Classe: TLabel
Dicas
P r o p r i e d a d e s
Align
Alignment
Alinhamento do Texto:
Esquerda,Centro ou direita
LayOut
ShowAccelCha
Pgina: 72
Delphi 5
r
(&)
FocusControl
WordWrap
. ShowAccelChar
Color
AutoSize
ReadOnly
BorderStyle
Ctl3D
MaxLength
Text
Texto do Objeto
Font
AutoSelect
PassWordChar
P r o p r i e d a d e s
d e
E v e n t o s
OnChange
OnDblClick
MASKEDIT
P r o p r i e d a d e s
Text
Texto do Componente
EditMask
: e /
Obrigatrio: A e C - Opcional: a e c
Qualquer Caracter
Pgina: 73
Delphi 5
Obrigatrio: L
- Opcional: l
Obrigatrio: 0
- Opcional: 9
<>
>
<
;1
;_
7.2.
7.2.1.
Melhorando a interface
PANEL
(Painel)
Pgina de Componentes: Standard Classe Tpanel
P r o p r i e d a d e s
Align
BevelInner
BevelOuter
BevelWidth
7 . 2 . 2 . CHECKBOX
Dicas
Nas propriedades BevelInner,
BevelOuter & BevelWidth voc
poder dar um efeito 3D muito
interessante ao Painel. Cuidado para
no exagera!
(Caixa de Seleo)
7.2.3.
Checked
Marcado ou No-Marcado ?
Alignment
Alinhamento do Texto
State
AllowGrayed
RADIOBUTTON
State
cbChecked
cbGrayed
cbUnChecked
(Boto de Rdio)
Pgina: 74
Delphi 5
P r o p r i e d a d e s
7.2.4.
Checked
Marcado ou No-Marcado ?
Alignment
Alinhamento do Texto
RADIOGROUP
ItemIndex
Items
8.Depurando aplicaes
Depois do projeto compilado h sempre a necessidade, para teste ou por problemas de resultado, do
desenvolvedor querer depurar o seu programa procurando o(s) erro(s) ou apenas testando o fluxo do
programa. Ento nesta aula vamos estudar o depurador integrado do ambiente.
E aprender a fazer
pontos de parada, verificar valores dos identificadores e entender as categorias de informaes de
depurao no Delphi. Temos que ter em mente, primeiramente, que o depurador interno (integrado)
chamado toda vez que voc executa um programa no ambiente Delphi & outra coisa importantssima o
Delphi uma ferramenta de programao visual para aplicaes Windows (ambiente grfico) e, sendo
como tal, os seus programas no so uma seqncia de comandos executados um a um, como em qualquer
linguagem de ambiente caracter (Clipper, Cobol, Fortran, C...). Entretanto, so baseados em mensagens
(eventos), no existindo a possibilidade de executar passo a passo cada linha do cdigo-fonte. Sendo
assim, devemos marcar pontos de parada (interrupo) nos trechos de cdigo que voc quer depurar.
8.1.
8.2.
Step Into,
8.3.
Da execuo depurao
Execute o Projeto (boto Run ou F9);
D uma Pausa (boto Pause da SpeedBar ou Menu Run-Program Pause);
Depurao Passo a Passo (Step Over ou Step Into);
Obs.: Leia sempre a barra de ttulo principal do Delphi para ver o estado do depurador interno
(Running [executando programa] ou Stopped [aguardando: F7, F8 ou F9]
8.4.
Pgina: 75
Delphi 5
Solicite o Reset da Execuo (Run-Program Reset)
Obs.: Para depurar tambm o Mdulo "Program" do Projeto (arquivo DPR) selecione
na Caixa de Dilogo "Environment Option" na guia (pgina) "Preferences" o item "Step Program Block"
8.5.
8.6.
Pgina: 76
Delphi 5
Depois de configurada a monitorao o nome da varivel estar em uma lista. Para remove-la basta
selecionar e pressionar a tecla [Del].
Lista de Monitorao
9.1.
9.2.
Pgina: 77
Delphi 5
Except
[ on { NomeDoTipoDeExceo } do [ NomeDeUmSubRotinaPersonalizada; ]
< ou Instrues em um bloco begin-end para tratar e/ou Informar Erros >
[ else ]
{ Para todos os outros tipos de Erros }
End
H vrias maneiras de voc usar essa estrutura de bloco depois da palavra Except:
1.
Apenas de forma generalizada (para qualquer tipo de erro) com uma ou mais instrues:
... Except
begin
ShowMessage('Ocorre um erro! Repita a operao, por favor.');
{ . . . outras instrues . . . };
end; ...
2.
Focalizando Tipos de Erros em particular que podem acontecer ao cdigo protegido e indicar uma
Sub-rotina personalizada , uma instruo ou algumas instrues, para cada:
... Except
on EDivByZero
do TratarErroDeDivisao;
on EConvertError do ShowMessage('Erro de Converso!!!');
on EDatabaseError do
begin
ShowMessage('Erro na manipalao dos Dados');
Edit1.Text := '';
end; ...
Ateno! A recepo do erro seqencial. Ocorrendo um erro no vai ser verificado o prximo tipo
de erro da seqncia informada no except.
9.3.
{ Fim do bloco:
Pgina: 78
Delphi 5
Havendo erro ou no sero executadas... >
End; { Fim do Try ... Finally }
Delp hi
BDE
ODBC
SQL Links
Paradox
dBase
ASCii
FoxPro
Access
9
DB2
InterBase
Oracle
Informix
SysBase
Arquivo Texto
Access
Arquivos Excel
Oracle
InterBase
MS-SQL Server e Outros
MS-SQL Server
Interface de Dados & Formatos de Dados:
1. Formatos Nativos:
1.1. BDE d acesso direto a vrios formatos, como:
dBase (.dbf), Paradox (.db), ASCII(.txt), FoxPro(.dbf) e Access (.mdb);
1.2. BDE + SQL Links acesso para servidores remotos, formatos:
Oracle, DB2, Informix, InterBase, Sybase e MS-SQL Server;
2. ODBC (Conectividade de Banco de Dados Aberta) da Microsoft, formatos:
Access, Arquivos Excel, Oracle, InterBase, SQL Server, arquivo de Texto e etc... .
Com certeza voc j est ciente desta terminologia, mas no custa relembrar:
Pgina: 79
Delphi 5
Pgina: 80
Delphi 5
Tipo
Alpha (A)
Number (N)
Money ($)
Short (S)
FORMATO PARADOX
Tamanho
Nota
1 - 255
Alfanumrico
Ponto Flutuante
Formato Moeda
Numerico curto
Pgina: 81
Delphi 5
0 - 32
1 - 240
0 - 240
0 - 240
0 - 240
0 - 240
1 - 255
Numerico Longo
Ponto-flutuante Especial
Data
Hora
Hora & Data
memorando
*.MB
Def. Tamanho Opcional
Def. Tamanho Opcional
Booleano
Auto-incremento
Def. Tamanho Opcional
Byte
FORMATO DBASE
Tipo
Tamanho
Character ( C )
1 - 254
Float (F)
1 - 20
Number (N) {BCD}
1 - 20
Date (D)
Logical (L)
Memo (M)
OLE (O)
Binary (B)
-
Nota
Caracter
Ponto Flutuante
Numerico
Data
Booleano
Memorando
OLE
Grfico
Visualizar Imagem/Memo
Pgina: 82
Delphi 5
Funcionrio
N
Cargo
CodFunc
Dependente
CodDepend
Departamento
CodCargo
CodDepart
Chave Primria
Chave Estrangeira
Chave Estrangeira Parte da Chave Primria
4. No DabaBase DeskTop crie as Tabelas e salve-as no Alias do nosso Banco de Dados com as estruturas a
seguir:
4.1. Tabela de Funcionrios (nome do arquivo: Funcionario.DB):
Campo
Tipo
Alpha
CodFunc
NomeFunc
Alpha
DataDeNascFunc
Date
EndFunc
Alpha
UfFunc
Alpha
CodCargo
Alpha
CodDepart
Alpha
FotoFunc
Graphic
NotaFunc
Memo
Tamanho
3
45
65
2
2
2
20
Pgina: 83
Delphi 5
4.2. Tabela de Dependentes (nome do arquivo: Dependente.DB):
Campo
CodDepend
NomeDepend
DataDeNascFunc
CodFunc
Tipo
Alpha
Alpha
Date
Alpha
Tipo
Alpha
Alpha
Tamanho
3
25
Ch. Primria
X
ndice Secundrio
X
Tipo
Alpha
Alpha
Tamanho
3
25
Ch. Primria
X
ndice Secundrio
X
Tipo
Short
Short
Memo
Tamanho
20
Obs.: CodUF substituir o campo UfFunc
2.
3.
Tipo
Short
Tamanho
Ch. Primria
X
ndice Secundrio
5.
4.
Tipo
Short
Short
Alpha
Date
Tipo
Short
Tamanho
Ch. Primria
X
ndice Secundrio
Pgina: 84
Delphi 5
Campo
CodUF
NomeEstado
SiglaUF
Tipo
Short
Alpha
Alpha
Tamanho
Ch. Primria
X
ndice Secundrio
25
2
Obs.: obvio que h uma soluo de manipulao de UF que no armazenado no BD, porm optamos por essa para usarmos um
componente de BD com essa tabela.
Funcionrio
UF's
CodUF
APLICATIVO DELPHI
DBEditCodigo
DBEditNome
DBEditReferencia
DBEditCodPedido
DBEditDataPedido
BDE
Arquivo(s) Fsico(s)
Pgina: 85
Delphi 5
Name
DataBaseName
TableName
Exclusive
ReadOnly
MasterSouce
MasterField
IndexFieldNames
IndexName
Active
RecordCount
P r o p r i e d a d e s
Nome Identificador do componente
Nome do Banco de Dados ou Alias
Nome da tabela fsica do banco de dados
DataSet no compartilhado (exclusivo)?
DataSet apenas de Leitura?
Nome Identificador do DataSource da Tabela Mestre
Campo da Tabela Mestre
Nome do Campo que se quer indexar
Nome do Index (ndice secundrio) que se quer indexar
Abrir o DataSet ?
Apenas em Tempo de Execuo possui a quantidade de "Registros" do DataSet.
Ex.: LabelQuantDeRegistros.Caption := IntToStr ( Table1.RecordCount );
M t o d o s
MUDANA DE ESTADO DO DATASET
Open
Abrir um DataSet (Table ou Query).
Ex.: Table1.Open;
Close
Fechar um DataSet.
Ex.: Query2.Close;
Edit
Ativa o modo de Alterao para o "registro" corrente do DataSet
Insert
Inserir um "registro" vazio e torn-o corrente no DataSet
Post
Grava o "registro" atual no DataSet
Cancel
Aborta ou Cancela uma Alterao (Edit) ou Incluso (Insert)
Delete
Apaga o "registro" corrente do DataSet
Refresh
Atualiza o DataSet de uma Table
Append
Anexa um "registro" vazio no final e torn-o corrente no DataSet de uma Table
PESQUISA
SetKey
Preparar o DataSet indexado de uma Table para Pesquisa
KeyFieldCount
Quando um ndice composto por mais de um campo voc deve atribuir o
nmero do campo pelo qual quer basear sua pesquisa.
Ex.: Table1.KeyFieldCount := 0; {Explicao: vai baseado no primeiro campo}
GotoKey
Retorna "True" se a pesquisa exata teve xito.
If Table.GotoKey Then ShowMessage (' Cdigo j existe!');
GotoNearest
Retorna "True se a pesquisa aproximada ou inexata teve xito.
If Table.GotoNearest Then ShowMessage ('Iniciais encontradas!!!');
POSICIONAMENTO
First
Ao primeiro
Last
Ao ltimo
Next
Ao prximo
Prior
Ao Anterior
MoveBy ( )
Mova-se "n" "registros".
Ex. 1o: 5 registro frente: Table1.MoveBy(5);
Ex. 2o: 5 registro para trs: Table1.MoveBy(-5);
Pgina: 86
Delphi 5
10.4.4. QUERY (Consulta ou Viso construda Via SQL)
Pgina de Componentes: DataAccess Classe: TQUERY
Constri uma tabela virtual com base em uma ou mais tabelas de um certo Banco de dados por meio de
cdigo SQL, formando-se um DataSet. J que usamos a verso Client/Server vamos construir o cdigo
SQL com a ajuda de um utilitrio chamado de "Query Builder", no devido momento iremos conhec-lo.
No pode ser utilizada diretamente pelos "outros componentes", necessitando de um componente
intermediador (DataSource).
Ateno!!! As propriedade esto posicionada na ordem que devem ser setadas (configuradas).
Name
SQL
DataBaseName
Active
Params
DataSource
RecordCount
P r o p r i e d a d e s
Nome Identificador do componente
Cdigo SQL que vai ser executado quando a Query for aberta
Nome do Banco de Dados ou Alias. Geralmente automaticamente setado por
causa do cdigo SQL.
Abrir o DataSet ?
Quando a query tem vnculo com uma tabela necessrio informar o nome do
campo de relacionamento (que passado como parmetro)
Name do DataSource que possibilitar o vnculo da query com a tabela "mestre"
Apenas em Tempo de Execuo possui a quantidade de "Registros" do DataSet.
Name
DataSet
Enabled
P r o p r i e d a d e s
Nome Identificador do componente
Name de uma Table ou Query que servir como uma "fonte de Dados"
Ativar ou Desativar ?
No ambiente Delphi abra o nosso aplicativo e insira um DataModule (Menu File - New Data Module);
2.
O DataModule ser apresentado e nele voc colocar uma Table para cada Tabela do Nosso Banco de Dados, e
para cada Table coloque um DataSource (no DataSet indique a Table);
3.
Set tudo na seqncia correta, como indicado no posicionamento das propriedades e como ministrado pelo
instrutor.
No esquea de denominar "names" sugestivos;
Pgina: 87
Delphi 5
DataBaseName
= "indique o Alias criado "
TableName = Funcionario.DB
IndexFieldNames = CodFunc
DataSet = TableFunc
DataBaseName
= "indique o Alias criado "
TableName = Dependente.DB
IndexName = IdxCodFunc
MasterSource
= DataSourceFunc
MasterFields = CodFunc *
DataBaseName
= "indique o Alias criado "
TableName = Departamento.DB
IndexName = IdxNomeDepart
4.
DataBaseName
= "indique o Alias criado "
TableName = Cargo.DB
IndexName = IdxNomeCargo
DataBaseName
= "indique o Alias criado "
TableName = EstadosUF.DB
IndexName = IdxNomeEstado
Ateno! A Table para a tabela de Dependentes ter uma "configurao" diferenciada das outras Table. Pois
teremos que relacion-la com uma Table Mestre (Master). E a Table Mestre ser a de Funcionrios (TableFunc).
Acompanhe a seqncia a seguir:
4.1. Depois que colocar o componente Table e sua DataSource e fizer as setagem normais (Name, DataBaseName,
TableName ... ). V para a propriedade MasterSource e indique o "Name" do DataSource da TableFunc;
4.2. D Duplo-clique para setar a propriedade MasterField. Aparecer, ento, uma caixa de Dilogo de nome
"Field Link Designer";
4.2.1. Escolha na Caixa de Combinao o ndice secundrio baseado no
cdigo do funcionrio disponvel para a tabela de dependendes;
4.2.2. Aparecer na lista "Detail Fields" o nome de campo CodFunc, selecione-o;
4.2.3. Selecione na lista "Master Fields" o nome de campo CodFunc, tambm;
4.2.4. Pressione o boto de Ttulo "Add" que est ao centro da Caixa de Dilogo;
4.2.5. Pronto agora use o boto "Ok" para confirma a unio pelo campos indicados.
Pgina: 88
Delphi 5
Esses componentes no tem acesso direto a tabela fsica, necessitam de um DataSource que indique um
certo DataSet (Table ou Query).
1.
2.
3.
4.
5.
6.
Antes de entrarmos no componentes de Controle de Dados (data-aware). Vamos nos lembrar do que j
fizemos no Nosso Aplicativo:
Formulrio Principal com Menu;
Formulrio de Entrada (Splash) com som;
Formulrio Sobre;
Formulrios Secundrios chamados pelas opes do Menu Entretenimento (Multimdia);
O Banco de Dados (as tabelas paradox em um diretrio) e seu Alias;
O Mdulo de Dados (DataModule) referenciando as tabelas do Nosso Alias;
Bem, s falta os Cadastros: Funcionrios e Dados Gerais (Departamentos e Cargos ) e os relatrios.
Vamos dar uma olhada na interface final dos formulrios envolvidos nos cadastros:
1
Em um s formulrio os cadastros de
As pginas
departamentos e cargos.
possuem a mesma interface.
Nesse formulrio existir: incluso,
excluso e alterao, s que trabalharemos
sem cdigo.
Voc vai ver como isso
funciona.
2
Neste formulrio temos o cadastro
de funcionrio. A interface muda um
pouco quando estamos em uma das
operaes.
Nesse formulrio existir: incluso,
excluso e alterao, agora usando um
pouco de cdigo Object Pascal.
3
Este formulrio ser apresentado quando
pressionarmos o boto Lista Dependentes do
cadastro de funcionrio.
Ele um Cadastro
simples sem cdigo algum para os dependentes,
porm automaticamente so relacionados ao
funcionrio atual (corrente). Isso por causa das
propriedades: MasterSource e MasterFields da
Table dos Dependentes.
Pgina: 89
Delphi 5
Agora que j fomos apresentados aos formulrios de cadastro vamos continuar com o assunto e no momento
adequado iremos trabalhar em cada um neles.
DataSource
DataField
Pgina: 90
Delphi 5
10.5.5. DBCHECKBOX (Caixa de Seleo para Banco de Dados)
Pgina de Componentes: DataControls Classe: TDBCHECKBOX
Extenso do componente CheckBox para vnculo com um campo Lgico de um DataSet.
Items
Values
DataSource
Hints
VisibleButtons
ConfirmDelete
OnClick
Propriedades Particulares
Name do DataSource relacionado ao DataSet (Table ou Query) controlar
Descrio no idioma do usurio para cada boto do componente de navegao
Apresentar este boto ?
Sempre perguntar antes de apagar ?
Propriedade de Evento
Quando for clicado um dos botes.
Pode-se no procedimento de Evento
verificar qual foi o boto clicado.
Botes: nbInsert, nbEdit, nbPost,
nbCancel ...
Exemplo de um caso: No queremos que na tabela de funcionrios guarde-se o nome do estado pois
criaria um redundncia (repetio) de Dados, ento na tabela funcionrio guardaremos um cdigo
identificador que represente aquele estado e conseqntemente teremos uma segunda tabela que ter todos
os estados. Bem, agora temos outro problema pois o usurio no vai querer decorar o cdigo de cada
estado, ento teremos que baseados no cdigo do estado achar o nome do estado correspondente e
apresent-lo. Isso bem natural! Porm ser necessrio escrever algumas linhas de cdigo e gasta-se
Pgina: 91
Delphi 5
um pouco de tempo. Entretanto no ser necessrio pois existe esse componente que esse que estamos
estudando que facilitar nossas vidas e tornar o desenvolvimento mais rpido.
DataSource
DataField
KeyField
ListSource
ListField
Propriedades Particulares
Name do DataSource relacionado ao DataSet (Table ou Query) Mestre
Name do campo do DataSet Mestre que ser o nosso alvo de alterao
Name do campo do DataSet Secundrio que efetivar a unio dos DataSets
Name do DataSource relacionado ao DataSet (Table ou Query) Secundrio
Name(s) do(s) campo(s) do DataSet secundrio que ser (ro) exibido(s).
Obs.: O separador do "names" ser o ";" (ponto-e-vrgula).
Ex.: NomeEstado;SiglaUf
DataSource
Columns
Options
Propriedades Particulares
Name do DataSource relacionado ao DataSet (Table ou Query) requerido
Propriedade que permiti tratamento individual para cada coluna da Grade. Por
padro a Grade ter a quantidade de colunas baseada na quantidade de campos do
DataSet vinculado (ou conectado), isso automaticamente.
Propriedade que permiti setar o comportamento da Grade
Pgina: 92
Delphi 5
4. Deletar todos os dados da Table: IsEmptyTable
Ex.: TableProduto.EmptyTable;
5. Referir-se a um certo campo da Table:
FieldByName ( )
Ex.: TableUnidade.FiedByName(Sigla_Unidade).Value;
6. Para ler ou gravar um valor do campo ser necessrio, quando usar FieldByName ( ) , a propriedade AsString
ou AsInteger para converter os contedo do campo para o tipo compatvel.
Observe abaixo outras
propriedades de converso de contedo de campo:
AsFloat, AsDateTime e AsBoolean.
Ex.:
MinhaVariavel := TablePedido.FieldByName(ValorTotal).AsFloat;
TablePedido.FieldByName(Cod_Pedido).AsString := MaskEditCodPed.Text;
DataEmissao := TablePedido.FieldByName(Data_Emissao).AsString;
Obs. 1: Voc pode usar o mtodo de acesso direto do mesmo modo do anterior, mas no legvel. Fields [ ] .
Ex.: CodPedido := TablePedido.Fields[1].AsString;
Obs. 2: Para ler ou gravar uma informao em um campo que foi adicionado pelo Editor de Campos voc pode
usar os mtodos de converso, acima citados, ou a propriedade Value.
7.
8.
10.7.
Nessa aula iremos trabalhar naqueles formulrios que nos foram apresentados na aula anterior, um a um, e
aprenderemos mais recurso de banco de Dados, passo a passo.
Ateno! Em todos os formulrios que apresentam dados iremos abrir o(s) DataSet(s) quando o formulrio for
apresentado (OnShow) e fech-los quando o formulrio for fechado (OnClose).
Etapa I:
1.
2.
3.
4.
Pgina: 93
Delphi 5
PageControl
DBNavigator
H um DbText aqui ser
exibido sempre na
consulta
Aqui temos um MaskEdit
que ser exibido e usado
apenas na incluso
Bevel
Etapa II:
1.
2.
3.
4.
5.
6.
2a
Etapa I:
1.
2.
3.
4.
5.
Chamar o formulrio
de Pesquisa
Um DBNavigator
Pgina: 94
Delphi 5
Bem, creio que voc j montou uma interface como a da figura acima. Ento vamos aos detalhes das Querys
uma para o nome do Cargo e a outra para o nome do Departamento, informaes que constam em outras tabelas.
Iremos utilizar o "Query Builder" utilitrio que encontrado na verso Client-Server. Ele vai nos ajudar a construir o
cdigo SQL que necessrio aos componentes do tipo Query.
3.
4.
5.
6.
Pgina: 95
Delphi 5
Repita os passos: Montagem do Cdigo SQL da Query & Indicao do parmetro da Query, para as
outras Querys (UF e Nome do Departamento), escolhendo as tabelas e campos correspondentes a informaes
necessrias;
9 Quando a parte de consulta tudo pronto. Agora vamos trabalhar na interface para incluir & alterar. E depois
voc poder colocar as instrues necessrias para os botes de comando (novo, alterar, apagar...).
Etapa II:
Instrues para Incluso:
1.
2.
3.
4.
Figura - Interface da incluso
DBLoopUpComboBoxs
Pgina: 96
Delphi 5
Instrues Gerais:
1.
2.
3.
Instrues Gerais:
MaskEdit
(Aqui o Evento OnChange acionar a busca)
RadioGroups Comuns
(Aqui o Evento OnClick acionar a busca)
DBGrid ligado a Query de Busca
1.
2.
No "DataModule" coloque uma Query para a Busca que no usar parmetro e um DataSource;
Na verdade a busca ser montada num cdigo SQL de uma Query. E o seu DataSet ser o resultado da nossa
busca ou pesquisa;
Pgina: 97
Delphi 5
3.
4.
5.
6.
Ateno! Como a propriedade SQL da Query do Tipo TString, assim tambm como a propriedade
Lines do componente Memo, ento podemos usar os mtodos, como: Clear e Add, para montar em tempo de
execuo o nosso cdigo SQL;
A montagem do Cdigo SQL e a abertura do DataSet da Query ir acontecer quando o usurio digitar uma ou
algumas letras no MaskEdit ou quando clicar um dos botes de rdio;
Quando o usurio d duplo-clique em um funcionrio que est na grade, a janela de procura fechar e
voltaremos ao cadastro de funcionrio j posicionados no funcionrio escolhido;
Quando o usurio fechar a janela de Procura e na grade de resultado da busca s encontrar-se um funcionrio.
Ser fechada a janela de procura e voltaremos ao cadastro de funcionrio posicionados neste funcionrio,
automaticamente. Para isto use a propriedade "RecordCount" e veja se igual a 1.
Uma possibilidade de contedo da propriedade SQL da Query, em tempo de execuo, ser:
11.Relatrio em QuickReport
Os componentes QuickReport so produtos, de uma empresa da Noruega chamada QSD
AS, com total compatibilidade com o Delphi. Assim como voc monta as interfaces nos
formulrios para o usurio interagir, voc montar relatrios que sero exibidos na tela ou
listados na impressora.
As diferenas so as seguintes: primeiro, quando criamos um
QuickReport
relatrio de forma visual ns no vemos os componentes, em tempo de execuo, apenas
veremos o resultado por eles gerados; Segundo, No necessrio DataSource para os componentes
QuickReport enxergarem os dados de um DataSet & terceiro, voc no montar o relatrio diretamente
em um formulrio, mas num componente QuickReport (Pai, proprietrio), que ser colocado no formulrio,
que muito parecido com o prprio formulrio, pois nele colocaremos e posicionaremos outros
componentes QuickReport menores para formar o relatrio. Um Relatrio QuickReport na verdade um
LayOut onde as informaes iro se posicionar, em tempo de execuo, nos devidos lugares indicados por
voc.
Ns sabemos que um relatrio se compe de partes como, por exemplo, as enumeradas abaixo:
1.
2.
3.
4.
5.
Cabealho da Pgina;
Cabealho das Colunas;
rea de Dados (os detalhes);
Rodap da Pgina &
rea de Sumrio
Essas partes, acima citadas, em QuickReport as chamaremos de Bands (Bandas/Faixas) e cada uma ser de
um tipo para que aja a identificao, separao e reproduo dessas partes no relatrio gerado. Bem,
antes de comearmos, realmente na prtica, iremos conhecer os componentes QuickReport e suas
principais propriedades.
DataSet
Propriedades
Informar o Name da Table ou Query que o relatrio ir usar
Pgina: 98
Delphi 5
ShowProgress
Print
Preview
Mtodos
Imprimi o relatrio.
Apresenta a visualizao de impresso.
Description
Bands
Ex.: RelatorioProdutos.Print;
Ex.: RelatorioProdutos.Preview;
Zoom In
Zoom Out
Preview
Report Setting
BandType
ForceNewPage
FooterBand
HasChild
ParentBand
Propriedade
Informar o Tipo dessa Banda
Forar um quebra de pgina ?
Name da Band que o rodap desse componente Band
Essa Band tem uma QRChildBand ? (Tem um Band que a acompanha (filha) ? )
Se essa Band for do Tipo QRChildBand indica-se o Name do Pai dela
Alignment
AlignToBand
Caption
Propriedade
Alinhamento do Ttulo
Alinhar o componente dentro da Banda ?
(Se True, ento ele usar a contedo da propriedade Alignment, tambm)
Texto esttico que ser exibido
Pgina: 99
Delphi 5
11.2.3. QRIMAGE ( Imagem constante )
Pgina de Componentes: QReport Classe: TQRIMAGE
Componente que colocaremos em uma Banda e o usaremos como usamos um componente Image em um
formulrio.
Shape
Pen
Propriedade
Possibilita escolher entre as formas disponveis (linha vertical, retngulo ... )
Possibilita: mudar a espessura (With) e a Cor da Linha (Color)
Data
Expression
Mask
Master
Propriedade
Expresso que ser executada na gerao do relatrio.
(Ex.1: Copy(Company,1,1)
ou
Ex.2: Pedido nr.: + CodPed
Mascara de apresentao da informao
Name do QuickReport que possui o Daztaset para atualizao dessa expresso
DataSet
DataField
Pgina: 100
Delphi 5
11.4.1. QRDBTEXT ( Acessa contedo no-Grfico)
Pgina de Componentes: QReport Classe: TQRDBTEXT
Componente que colocaremos em uma Banda de Detelhes ou Sub-detalhes para apresentar o contedo de um
campo tipo: alfanumrico, numrico ou memo.
Expression
ForceNewPage
FooterBand
Propriedade
O grupo quebrado toda vez que o resultado da expresso mudar
Forar um quebra de pgina ?
Name da Band que o rodap desse componente Band de Grupo
ParentBand
Propriedade
Name do Pai (Parent)
Bands
Propriedade
Para indicar se h bandas rodap e cabealho
Pgina: 101
Delphi 5
3.
4.
5.
6.
4.
5.
6.
7.
8.
Pgina: 102
Delphi 5
4.
5.
6.
7.
8.
9.
Faa os passos que voc executou anteriormente, para montar o relatrio simples de departamentos, para montar o
relatrio, simples em lista, dos funcionrios;
Verticalmente aumente a banda dos detalhes e alm dos campos de cdigo e nome do funcionrio coloque os
seguintes campos: foto, sexo, endereo, data de nascimento e nota, como na interface abaixo:
Pgina: 103
Delphi 5
Relatrio Mestre-Detalhes
Passos para implementao do relatrio no nosso projeto:
1.
2.
3.
4.
5.
6.
7.
8.
9.
No mesmo formulrio do relatrio de lista para os funcionrio coloque um componente QuickReport para
montarmos o nosso relatrio mestre-detalhes;
Sete as seguintes propriedades do QuickReport:
2.1. DataSet ter o name da Table principal (TableFunc) do relatrio;
2.2. Bands solicite uso das seguintes: Ttulo, Cabealho dos campos e detalhes, por enquanto;
Coloque a partir da pgina de componentes uma Banda SubDetail, sete-a da seguinte forma:
3.1. DataSet ter o name da Table de detalhes (TableDepend);
Coloque a partir da pgina de componentes uma banda e sete-a como abaixo:
4.1. Na propriedade BandType indique-a como rbGroupFooter
4.2. O seu name como GroupFooter1;
4.3. A propriedade HasChild = True;
Selecione a Banda Child que apareceu e altere um pouco a altura dela, assim ela dar um espao entre os grupos;
Volte a Banda SubDetail e sete-a da seguinte forma:
6.1. FooterBand = GroupFooter1 (indicando que o rodap para totais do grupo essa banda);
Na propriedade Bands do QuickReport solicite uso da Banda de rodap de pgina;
Na banda de Rodap do grupo (GroupFooter1) voc dever colocar uma expresso para contar a quantidade de
dependentes que foram listados no grupo, como voc v na figura abaixo;
Coloque os elementos necessrios ao relatrio, como na figura abaixo, e para testar abra as tabelas antes de ver o
Preview.
Detail
Sub-Detail
GroupFooter
12.Entregando a aplicao
Uma das etapas mais importantes no desenvolvimento de qualquer software sua entrega e instalao na
mquina de nossos clientes. Em diversas linguagens de programao essa etapa tem tornado-se uma
verdadeira dor de cabea para os desenvolvedores que, alm de ter tido todo o trabalho de desenvolvimento
ainda tem que se preocupar com a configurao da mquina na qual seu software est sendo instalado.
Pgina: 104
Delphi 5
Na verso 1.0 do Delphi essa preocupao tambm existia. Apesar do desenvolvedor contar com
caractersticas que facilitavam a instalao de seus produtos como, por exemplo, a utilizao de um alias
no desenvolvimento de aplicativos para a rea de banco de dados, o processo de instalao ainda era
trabalhoso. Como parte integrante do Delphi 1.0 estavam includos os discos de instalao do DBE, caso o
aplicativo sendo instalado fizesse acesso um banco de dados, e do runtime do ReportSmith, caso o
aplicativo gerasse relatrios desenvolvidos por ele. Apesar da instalao e configurao desses produtos ser
feita de forma bastante simplificada, ainda era um trabalho a mais que deveria ser realizado pelo
desenvolvedor na hora da instalao de seu produto na mquina de seu cliente.
Com lanamento do Windows 95, um novo padro de instalao de software, atravs do uso de entradas
em registros do sistema operacional, passou a ser utilizado permitindo um melhor gerenciamento dos
produtos correntemente instalados, facilitando o processo de desinstalao.
O InstallShield Express, de agora em diante chamado apenas de InstallShield, foi desenvolvido pela
Stirling Technologies com o objetivo de proporcionar aos desenvolvedores de software uma ferramenta
capaz de facilitar o processo de distribuio de seus produtos. Desde a primeira verso do Delphi para o
ambiente Windows95, o Delphi 2.0, a Borland j forneceu juntamente com seu produto uma cpia do
InstallShield para facilitar ainda mais seus usurios. Passaremos agora a realizar um estudo sobre essa
ferramenta, em sua verso lanada para acompanhar o Delphi 5.0, o InstallShield Express Delphi Edition,
verso 1.11a.
Pgina: 105
Delphi 5
exibida toda vez que o InstallShield for inicializado a menos que a opo Dont display this screen again
seja assinalada. Uma vez que tenhamos criado o nosso primeiro projeto a opo de abrir o nosso ltimo
projeto ficar disponvel para seleo. Iniciemos, ento, escolhendo a opo para Criar um novo projeto de
instalao e, em seguida, pressionemos o boto OK.
Aps clicarmos o boto OK, uma seqncia de caixas de dilogo apresentada para que possamos criar um
projeto de instalao de software. A primeira dessas
caixas de dilogo mostrada ao lado. Essa utilizada
para identificar o projeto que est sendo
desenvolvido. Devemos, atravs do Directory List
Box selecionar o diretrio no qual sero armazenados
os arquivos a serem criados para o novo projeto. Caso
ainda no exista o subdiretrio no qual desejamos
colocar o nosso projeto, poderemos especific-lo no
New Subdirectory Edit Box. Na figura acima, caso
desejssemos colocar o nosso projeto num diretrio
chamado ProjectX localizado no diretrio IS Express
Delphi Edition, bastaramos colocar ProjectX no Subdiectory Edi Box.
Devemos, ainda, dar um nome ao nosso projeto. Para isso, basta colocarmos no Project Name Edit Box o
nome desejado. Convencionalmente, dado ao projeto o nome da aplicao que foi desenvolvida. Observe
que o nome que o nome dado ao projeto automaticamente colocado no texto acima do Directory List Box,
com a extenso iwz (do ingls InstallShield Wizard).
Existe ainda a possibilidade da criao de uma instalao mltipla. Esse tipo de instalao bastante
comum em aplicaes comerciais onde dada ao usurio a oportunidade de escolher entre vrios tipos de
instalao. Com a verso do InstallShield fornecida com o Delphi 5.0 possvel escolher entre 3 tipos de
instalao:
Tpica
Compacta
Customizada
Utilizado para fornecer informaes a respeito de objetos do Delphi tais como o BDE a serem
utilizados pela aplicao
Fornece informaes a respeito dos arquivos a serem instalados, bem como os diversos tipos de
instalao existentes
Pgina: 106
Delphi 5
Utilizado para informar quais alteraes sero efetuadas nos registros do sistema
Fornece informaes a respeito dos cones e das pastas que sero utilizadas na instalao
Cria as imagens dos discos de instalao baseadas nas informaes fornecidas nos passos anteriores
File
Contm opes tais como Abrir e Salvar alm de uma lista dos projetos usados mais recentemente
View
Checklist
Fornece uma maneira alternativa de se acessar os diversos passos para a criao dos discos de
instalao do projeto corrente
Help
Test Run
Explorer
About
New
Build
Open
Copy To Floppy
Help
Pgina: 107
Delphi 5
New
Open
Save
Build
Test Run
Copy To Floppy
Explorer
About
Help
Executa a ajuda sensvel ao contexto. Ao clicar nesse boto, o ponteiro do mouse muda de formato.
Clique sobre um elemento qualquer para obter ajuda especfica para esse elemento.
importante observar que, da mesma maneira como acontece com o Delphi, o InstallShield capaz de
trabalhar apenas com um nico projeto por vez. Caso esteja-se trabalhando em um projeto e escolha-se a
opo Abrir e um outro projeto seja selecionado, o projeto corrente ser fechado automaticamente para que
o outro seja aberto. O mesmo acontece caso um novo projeto seja criado.
Com o objetivo de fornecer alguma ajuda na hora de selecionar um dos botes mostrados acima, existe um
statusbar na parte inferior
da
janela
principal,
mostrado ao lado.
A medida em que o se passa o ponteiro do mouse por sobre os botes do speedbar, uma ajuda rpida sobre
a funcionalidade desse boto exibia no statusbar.
Alm dos botes contidos no speedbar e do statusbar, a janela principal do InstallShield composta por
uma janela contendo um checklist das opes existentes, mencionadas anteriormente, para a criao de uma
instalao.
Item
Concludo
Passos
Itens
Pgina: 108
Delphi 5
Checklist. Aps a concluso de cada item do checklist um marcador de concluso aparecer do lado
esquerdo do item concludo. Veremos adiante a funcionalidade de cada um desses itens.
Existe ainda a opo de ir para uma segunda pgina, clicando-se com o mouse por sobre a pequena dobra
de pgina existente no canto inferior direito do checklist. Essa segunda pgina mostra algumas informaes
de como entrar em contato com os desenvolvedores do InstallShield para enviar comentrios, sugestes e
problemas encontrados com o produto.
Application Name
Contm o nome da aplicao. O nome da aplicao pode conter, no mximo, 80 caracteres e preenchido,
por default, com o nome do projeto que est sendo criado no InstallShield
Application Executable
Indica o arquivo executvel primrio da aplicao. A escolha do arquivo executvel pode ser feita atravs
do boto browse. Aps a seleo desse arquivo, apresentado, na caixa de texto, a localizao desse
arquivo, por exemplo, da seguinte forma:
[Program Files]\Controle.exe
O especificador [Program Files] utilizado pelo InstallShield para identificar um grupo dentro do processo
de instalao, ou seja, um diretrio selecionado pelo usurio no momento da instalao. Essa noo ficar
bem mais clara adiante, quando mostrarmos como criar Grupos de Componentes para uma instalao
Version
Indica qual a verso do produto a ser instalado
Company
Indica o nome da companhia desenvolvedora do produto
Default Destination Directory
Especifica o diretrio default para a instalao do produto. O padro a ser seguido o seguinte:
<ProgramFilesDir>\<Companhia>\<Aplicao>
Pgina: 109
Delphi 5
Existem diversos outros especificadores que podem ser utilizados no InstallShield para customizar ainda
mais todo o processo de instalao, para uma explanao mais detalhada desses especificadores verificar na
ajuda do InstallShield, sob o ttulo de Express Directory Specifiers.
Aps o preenchimento dos campos acima temos 3 opes a seguir: clicar o boto OK, confirmando os
valores colocados (o sinal de verificao aparecer do lado esquedo do item Applicaion Information), clicar
o boto Cancel, cancelando a operao ou, por fim, selecionar uma das tabs restantes para continuar
preenchendo as informaes para a instalao.
Vamos clicar no segundo tab, chamado de Main Window, existente na caixa de dilogo Set the Visual
Design para continuarmos a fornecer informao sobre a nossa instalao.
Main Title
Existem duas opes a serem seguidas neste ponto, a escolha de um
texto, com no mximo 80 caracteres, ou a escolha de um bitmap, com no mximo 16 cores, para ser
colocado como ttulo na janela principal do aplicativo de instalao. Por default, a opo selecionada a de
colocao de um texto, porm podemos selecionar um bitmap mudando o radio button para a opo de
bimap. Para escolhermos qual bitmap a ser exibido, podemos utilizar o boto Browse. Um detalhe a ser
observado que, para selecionarmos a opo de bitmap, no basta apenas clicarmos no boto Browse,
devemos ainda escolher o radio button correspondente para que essa seja a opo escolhida. Caso
contrrio, ser exibido como ttulo a localizao (path) do arquivo selecionado. O ttulo, ou bitmap,
selecionado ser exibido no canto superior esquerdo da janela.
Logo Bitmap
Essa opo utilizada para escolher um bitmap como, por exemplo, a logomarca da empresa que
desenvolveu o sistema a ser instalado, na janela principal da instalao. O processo de seleo desse bitmap
exatamente igual ao mencionado anteriormente.
Uma vez selecionado qual o bitmap a ser utilizado, dever ser feita a escolha da posio na qual ele ser
colocado na janela principal. Existem trs posies possveis: centralizada, canto superior esquerdo e canto
superior direito. Caso seja escolhido o canto superior esquerdo, o bitmap para a logomarca ser sobreposto
pelo bitmap do ttulo da janela caso este exista.
Background Color
Aqui temos a opo de escolher a cor que ser utilizada como cor de fundo para a janela principal do
aplicativo de instalao. O default Dithered Blue, o azul utilizado na maioria dos programas de instalao
existentes.
Pgina: 110
Delphi 5
eseja marcada. Dessa forma, as modificaes criadas automaticamente pelo InstallShield, por exemplo, nos
registrados do sistema operacional, podem ser feitas automaticamente por um programa de desinstalao.
Terminamos a primeira etapa de configurao de nosso programa de instalao, ajustando pequenas
propriedades que sero utilizadas pelo InstallShield para gerar o incio da instalao do produto em
questo. At agora, todas as informaes fornecidas no so influenciadas sobre qual a plataforma de
desenvolvimento utilizada, se Delphi ou qualquer outra porm, a partir de agora, vamos comear a ver
detalhes que facilitam a instalao de produtos desenvolvidos com o Delphi.
Pgina: 111
Delphi 5
Temos nessa caixa de dilogo a opo de criar os aliases que sero utilizados na aplicao, bem como
remover aqueles que porventura tenham sido colocados por engano. Para que possamos criar um alias
devemos clicar no boto New. Com isso, exibida a caixa de dilogo a seguir, solicitando o fornecimento
do nome do alias a ser criado.
Podemos colocar o nome do alias que desejamos criar e em
seguida, clicar o boto OK. Devemos observar que, os nomes
dos aliases que iremos criar na instalao devem ser os
mesmos que esto sendo utilizados pelo programa sendo
instalado.
Aps clicarmos
no boto OK, o alias colocado no listbox da caixa de dilogo
mostrada anteriormente. Uma vez que todos os aliases que sero utilizados na aplicao sejam criados
podemos passar ao passo seguinte da configurao do BDE clicando no boto Next.
A caixa de dilogo seguinte permite especificar se o arquivo de configurao do BDE deve ser salvo de tal
forma que tanto aplicaes de 32 bits quanto as de 16 bits possam acess-lo. Para que isso seja possvel, o
checkbox mostrado deve ser assinalado. A seguir mostramos a caixa de dilogo citada anteriormente.
Caso o checkbox no seja assinalado, apenas a verso de 32 bits ser salvo. Podemos clicar no boto
Avanar para continuar a configurao do BDE. A caixa de dilogo responsvel pelo terceiro passo no
processo de configurao do BDE mostrada a seguir.
A caixa de dilogo mostrada acima permite a configurao de
cada um dos aliases a ser criado no processo de instalao.
Para isso, devemos escolher no combobox Alias Name o alias
a ser configurado. Para cada um desses aliases, deveremos
especificar sua localizao, bem como o driver que ser
utilizado por ele.
Na caixa de texto
Path, devemos colocar o caminho a ser utilizado para o
armazenamento das tabelas pertencentes ao alias em questo.
Podemos utilizar como parte do caminho, os especificadores
definidos no InstallShield. No exemplo acima, foi utilizado o especificador <INSTALLDIR> para
identificar o diretrio de instalao no qual o aplicativo foi instalado.
Alm da definio do diretrio no qual os dados sero colocados, necessria tambm a especificao de
qual driver ser utilizado no acesso a esses dados. Os drivers disponveis so listados no combobox Type.
Tanto o caminho quanto o tipo de driver so de preenchimento obrigatrio, no devendo, portanto, serem
deixados em branco.
Uma vez preenchidas todas as informaes com relao aos aliases a serem utilizados pela aplicao,
podemos clicar no boto Avanar para chegarmos ltima caixa de dilogo de configurao do BDE,
mostrada a seguir.
A caixa de dilogo mostrada acima finaliza o processo de configurao do BDE a ser instalado na mquina
do cliente. Para que essas configuraes sejam utilizadas devemos clicar o boto OK. Para mudarmos
posteriormente, qualquer uma dessas configuraes, devemos clicar o boto Settings na caixa de dilogo
Select InstallShield Components for Delphi.
O segundo componente do InstallShield para o Delphi que
pode ser selecionado o SQL Links. Caso o programa a ser
instalado faa uso de qualquer um dos links existentes,
devemos assinalar essa opo. Um detalhe importante a ser
observado que, para se utilizar o componente SQL Links,
devemos tambm utilizar o componente BDE mencionado
anteriormente.
Aps assinalarmos a opo para o componente do SQL Links, a
seguinte caixa de dilogo de configurao ser exibida
automaticamente.
Atravs da caixa de dilogo mostrada acima, podemos escolher
Pgina: 112
Delphi 5
quais os drivers que devem ser instalados juntamente com o aplicativo. Por default todos os drivers esto
assinalados.
O InstallShield, no processo de instalao, instalar todos os arquivos necessrios e far todas as alteraes
nos registradores do sistema operacional para os drivers assinalados para a instalao. Devemos lembrar
que, a escolha de drivers alm do necessrio no acarreta em problema algum para a instalao, o nico
aspecto negativo est no fato da instalao e consequente diminuio do espao livre em disco, com
arquivos desnecessrios.
Uma vez configurados os componentes do InstallShield para o Delphi em seus aspectos gerais podemos
avanar para a aba Advanced. Devemos observar que o contedo dessa aba depender das opes
selecionadas na aba General. A seguir mostramos a aba Advanced.
Como pode ser observado na figura acima, a aba Advanced tem a
finalidade de exibir informaes a respeito dos arquivos que, de
acordo com as opes feitas na aba General, foram selecionados
para instalao. Nesse ponto no podemos adicionar ou remover
elementos. Para adicionarmos elementos, devemos faz-lo na aba
General, enquanto que a remoo de arquivos em particular poder
ser feita na caixa de dilogo Groups and Files que ser vista a
seguir. Para cada arquivo selecionado so exibidas informaes a
respeito da data, tamanho e verso do arquivo.
Uma vez definidos e configurados os componentes que sero
utilizados pelo InstallShield no processo de instalao, estamos prontos para seguir adiante. Podemos clicar
no boto OK e passar para o prximo passo no processo de criao de nossa instalao descrito a seguir.
O processo de configurao dos arquivos a serem instalados pelo InstallShield est baseado no conceito de
grupos. A idia de grupo bastante simples de ser entendida e utilizada, principalmente para instalaes
que no envolvam mltiplas configuraes como o caso da qual estamos correntemente desenvolvendo.
Um grupo pode ser visto como uma coleo de arquivos relacionados como, por exemplo, os arquivos de
banco de dados de uma aplicao. A cada grupo associada uma localizao (path) que ser utilizado no
momento da instalao dos arquivos pertencentes a esses grupos na mquina do cliente.
A criao de grupos, a especificao dos arquivos pertencentes a eles e a determinao de seu local de
instalao dos grupos associados a cada uma das instalaes desenvolvidas pelo InstallShield realizada
atravs da aba Groups na caixa de dilogo Specify Components and Files mostrada a seguir.
Pgina: 113
Delphi 5
Nesse ponto podemos comear a organizar os arquivos que sero instalados estabelecendo sua localizao
relativa na mquina do cliente. aconselhvel que esses arquivos j estejam agrupados na prpria mquina
de desenvolvimento para que o processo de montagem dos grupos seja feito de forma mais fcil e rpida.
Inicialmente j existe pelo menos um grupo a ser instalado, chamado Program Files, que possui o arquivo
executvel principal da aplicao. Por default esse arquivo ser instalado no especificador
<INSTALLDIR> que identifica o diretrio selecionado pelo cliente no momento da instalao.
Dependendo de quais componentes tenham sido selecionados na caixa de dilogo Select InstallShield
Components for Delphi existiro outros grupos definidos automaticamente para instalao, como mostrado
na figura acima. Nesse momento podemos modificar a localizao desses grupos clicando o boto Modify
Group. Devemos observar que, em relao aos grupos do BDE criados automaticamente, a modificao de
sua localizao no aconselhvel. Essa observao advm do fato de que, caso j exista uma aplicao na
mquina do cliente que utilize o BDE e, consequentemente, possua seus arquivos instalados no diretrio
default indicado pelo InstallShield, a instalao atual ir instalar uma nova cpia do BDE em um local
diferente, ocupando espao desnecessrio e podendo, inclusive, causar problemas durante a execuo dos
aplicativos que o utilizem. Ao clicar-se no boto Modify Group, a caixa de dilogo a seguir exibida.
Pgina: 114
Delphi 5
capaz de gerar os discos de instalao. Aps a gerao desses discos, tanto a remoo quanto a alterao da
localizao desses arquivos pode ser feita normalmente.
A remoo de um grupo tambm feita de forma bem simples e intuitiva. Para que um grupo seja
removido basta selecionarmos o grupo em questo e pressionarmos a tecla del. O InstallShield abre uma
caixa de dilogo questionando se desejamos realmente remover o grupo selecionado e, caso esse seja
realmente o nosso desejo, o grupo ser removido. Caso existam arquivos no grupo selecionado esses
tambm sero removidos da instalao. De forma semelhante podemos remover os arquivos, basta que
selecionemos o arquivo desejado e pressionemos a tecla del. O arquivo em questo ser removido da
instalao. A diferena entre a remoo de um grupo ou de um arquivo est na confirmao da remoo.
No caso da remoo de arquivos no existe um pedido de confirmao, o arquivo removido
imediatamente aps pressionarmos a tecla del, enquanto que ao removermos um grupo, existe o pedido
pela confirmao da remoo.
O boto File Details exibe informaes a respeito do arquivo correntemente selecionado. Um exemplo da
caixa de dilogo com as informaes de um arquivo mostrado a seguir.
Uma observao que deve ser feita em relao
instalao de um software que utilize arquivos gravados
no diretrio do Windows. Quaisquer arquivos que se
tente copiar, tanto para o diretrio do Windows quanto
para o diretrio System, que j possuam nesses diretrios
da mquina do cliente verses mais recentes do que
aquelas que a instalao est tentando gravar, no sero
copiados.
No processo de desenvolvimento de instalaes simples, que no envolvam mltiplas configuraes como
mencionado anteriormente, a nica caixa de dilogo a ser preenchida a de Groups. Deixaremos de lado,
momentaneamente, o preenchimento das duas outras abas, Components e Setup Types, que sero vistas
posteriormente quando falarmos a respeito de instalaes mltiplas. Podemos seguir adiante pressionando a
o boto OK.
Welcome Bitmap
Permite a exibio de um bitmap logo aps a exibio da caixa de dilogo de inicializao da instalao
mas antes de qualquer outra caixa de dilogo. Um exemplo de uma caixa de dilogo de inicilizazao
mostrado a seguir.
Pgina: 115
Delphi 5
A aba Settings para esse item permite a escolha de qual bitmap deseja-se exibir.
Welcome Message
Exibe uma mensagem ao usurio dando as boas vindas ao programa de instalao e fornecendo instrues
ao usurio para que esse feche todos os aplicativos que estejam correntemente em execuo antes de
continuar o processo de instalao. Um breve aviso sobre direitos autorais tambm fornecido.
O nome fornecido na caixa de dilogo Application Information colocado automaticamente no topo dessa
caixa de dilogo.
No existe a aba Settings para esta caixa de dilogo.
Software License Agreement
Exibe uma caixa de dilogo contendo o Acordo para Licena de Uso do software que est sendo instalado.
A aba Settings permite indicar o arquivo texto que contm o texto a ser exibido na caixa de dilogo citada
acima.
Readme Information
Essa caixa de dilogo utilizada para exibir um arquivo texto do tipo Leiame. importante observar que o
texto a ser exibido nessa caixa de dilogo no formatado automaticamente. Para que o texto seja
completamente exibido na caixa de dilogo, ele deve ser formatado com retorno de carro em cada linha de
acordo com a formatao desejada.
User Information
Utilizada para coletar informaes a respeito do usurio tais como nome, companhia e, opcionalmente, o
nmero serial do produto sendo instalado.
A aba Settings permite a definio de quais informaes podem ser fornecidas pelo usurio. Existem duas
opes, a primeira sem a opo para o nmero serial e a segunda, com o nmero serial.
Choose Destination Location
Atravs dessa caixa de dilogo o usurio pode escolher a localizao na qual ele deseja que o aplicativo
seja instalado. O diretrio escolhido pelo usurio ir substituir o especificador <INSTALLDIR>, nos locais
nos quais ele tenha sido utilizado no processo de criao da instalao.
A aba Settings utilizada para definir o diretrio default a ser exibido para o usurio no momento da
instalao. Pode-se ser utilizado qualquer especificador existente no InstallShield para compor o diretrio
default porm, no aconselhada a utilizao do especificador <INSTALLDIR>. Caso isso seja feito, no
momento da gerao dos discos de instalao, o InstallShield fornecer um warning alertando sobre a
utilizao desse especificador em um local no apropriado. O default utilizado pelo InstallShield para o
diretrio default de instalao segue o padro:
<ProgramFilesDir>\<Companhia>\<Aplicao>
Onde companhia e aplicao so substitudos pelas informaes fornecidas na caixa de dilogo Application
Information.
Setup Type
Permite ao usurio escolher qual o tipo de instalao desejada. Para que essa caixa de dilogo possa ser
exibida, faz-se necessrio que tenham sido criados os tipos de instalao correspondentes.
No existe a aba Settings para esta caixa de dilogo.
Custom Setup
Essa caixa de dilogo ser exibida apenas se o usurio escolher a opo de instalao customizada na caixa
de dilogo Setup Type.
Permite a escolha de quais componentes o usurio deseja instalar. Os componentes constantes nessa caixa
de dilogo devem ter sido previamente determinados na caixa de dilogo Components.
Pgina: 116
Delphi 5
No existe a aba Settings para esta caixa de dilogo.
Select Program Folder
Permite a escolha do nome do folder no qual os cones do aplicativo sendo instalado sero colocados. Por
default, o nome do folder utilizado o mesmo dado ao projeto no InstallShield.
A aba Settings permite a definio do nome que ser dado ao folder.
Start Copying Files
Permite ao usurio verificar as informaes fornecidas por ele ao programa de instalao antes do incio da
cpia dos arquivos para a mquina cliente.
No existe a aba Settings para esta caixa de dilogo.
Progress Indicator
Fornece ao usurio uma visualizao rpida do progresso da instalao. indicado o percentual de
progresso, bem como o arquivo correntemente sendo copiado.
No existe a aba Settings para esta caixa de dilogo.
Billboards
Utilizada para exibir um bitmap, ou um arquivo do tipo Windows Metafile, contendo informaes diversas
como, por exemplo, a respeito de outros produtos da empresa.
A aba Settings utilizada para escolher qual o arquivo bitmap ou metafile a ser exibido.
Online Registration
Essa caixa de dilogo utilizada para permitir o registro on-line do produto adquirido.
A aba Settings utilizada para definir o nmero de telefone a ser utilizado para a conexo, bem como o
login de acesso para se efetuar o registro.
Setup Complete
Essa caixa de dilogo utilizada ao final do processo de instalao. Atravs dela permitido tanto a
execuo imediata da aplicao, a leitura de um arquivo do tipo Leiame ou ainda o reboot da mquina do
cliente.
A aba Settings permite a escolha da opo de exibio da caixa de dilogo para dar um reboot na mquina
cliente atravs da marcao do checkbox Always show reboot computer dialog box. Podemos ainda indicar
a localizao do arquivo a ser executado automaticamente ao final da instalao, bem como os parmetros
a serem utilizados, ou ainda indicar qual o arquivo texto a ser exibido caso a opo de exibir o arquivo
readme seja selecionada.
Pgina: 117
Delphi 5
aos registradores do sistema operacional no momento da instalao do software. O contedo dessa aba est
intimamente ligado ao contedo da segunda aba existente nessa caixa de dilogo onde, os valores exibidos
na segunda aba so relativos chave correntemente selecionada na primeira aba.
Inicialmente, a aba Registry Keys possui seis chaves previamente definidas como mostrado na figura
anterior. Essas chaves, chamadas de root keys, no podem ser removidas ou alteradas por serem utilizadas
pelo programa de desinstalao. As root keys servem como base para outras chaves a serem adicionadas ao
programa de instalao. Para maiores informaes a respeito das root keys consultar o tpico de ajuda
Registry Key Automatic Entry. Cada nova chave a ser adicionada deve, portanto, ser descendente de uma
chave j existente.
O boto Modify Key no est inicialmente habilitado uma vez que no possvel a alterao de qualquer
uma das root keys. Uma vez que uma nova chave for adicionada e selecionada, esse boto passar a estar
habilitado e poder ser utilizado normalmente. Para adicionarmos uma chave devemos primeiramente
escolher e selecionar sob qual root key desejamos adicionar a nossa chave. Em seguida devemos clicar o
boto Add Key para que a seguinte caixa de dilogo aparea.
Devemos preencher o campo New Key com o nome
da nova chave a ser criada. Durante a composio do
nome da nova chave, podem ser utilizados mais de
um nvel de chaves, sendo essas separadas por uma
barra invertida como mostrado na figura acima. Uma
vez definida a nova chave, podemos clicar o boto
OK para que a nova chave seja criada e exibida como
uma ramificao sob a root key indicada no campo
Sub Key of da caixa de dilogo Registry New Key
mostrada acima.
A modificao de uma chave existente tambm feita de forma bastante simplificada. Para isso, basta que
a chave a ser modificada seja escolhida e seja pressionado o boto Modify Key. Uma vez pressionado o
boto Modify Key, uma caixa de dilogo semelhante mostrada acima exibida contendo a chave a ser
alterada. Para alterarmos a chave baste que a nova chave seja digitada no lugar da chave atual. Para
finalizar a alterao basta que o boto OK seja clicado. Uma observao a ser feita est no fato de que, ao
selecionarmos uma chave que possua subchaves, apenas a chave selecionada ser alterada enquanto que as
subchaves permanecero inalteradas.
A remoo de uma chave, da mesma forma que a alterao, bastante simples e intuitiva. Para que uma
chave seja removida basta que ela seja selecionada e a tecla del seja pressionada. No caso da seleo de
uma chave que possua subchaves a remoo feita da mesma forma porm as subchaves tambm sero
removidas juntamente com a chave inicialmente selecionada. Uma observao a ser feita est no fato da
no solicitao de uma confirmao antes da remoo de uma chave. Devemos, portanto, Ter bastante
cuidado antes de remover alguma chave para evitarmos qualquer possibilidade de re-trabalho.
O boto Registry Editor utilizado para exibir o Editor de Registro do Windows95. Para maiores
informaes a respeito do Editor de Registro, consultar a ajuda do prprio editor.
A segunda aba da caixa de dilogo Make Registry Changes, a aba Registry - Values, utilizada para
fornecer valores para as chaves especificadas na aba Registry Keys. A caixa de dilogo Registry Values
mostrada a seguir.
O valor especificado nessa aba refere-se chave selecionada
anteriormente na aba Registry Keys. Na figura acima, por
exemplo, o valor a ser definido refere-se chave Versao. A chave
para o qual ser especificado o valor encontra-se exibida na caixa
de texto Registry Key. Para escolhermos uma nova chave, devemos
voltar aba Registry Keys e escolhermos um novo valor. Essa
alterao no pode ser feita diretamente na caixa de texto.
Para que um novo valor seja adicionado chave correntemente
escolhida devemos clicar o boto Add Value. Ao fazermos isso, a
caixa de dilogo Registry Value ser exibida como mostrado a
seguir.
Pgina: 118
Delphi 5
Devemos primeiramente especificar o tipo de valor a ser colocado atravs
dos radio buttons existentes, bem como o nome para o valor que ser
colocado como tambm o prprio valor a ser colocado. Uma vez
preenchido esses campos pode-se clicado o boto OK para que esses
valores sejam aceitos.
Alm da adio de novos valores, podemos alterar valores previamente
colocados. Para isso, devemos selecionar o valor a ser alterado e em
seguida pressionar o boto Modify Value. Ao fazermos isso, a caixa de dilogo Registry Value, mostrada
acima, novamente exibida, de tal forma a podermos alterar os valores previamente definidos, colocando
os novos valores nos campos desejados.
Por fim, podemos ainda remover valores previamente estipulados. Para isso, basta selecionarmos o valor a
ser removido e pressionarmos a tecla del. No exibida nenhuma caixa de dilogo pedindo a confirmao
da remoo para evitar uma remoo acidental. Devemos observar no entanto que, a valor default no ser
removido, independentemente de pressionarmos a tecla del com este valor selecionado.
Ao finalizarmos a definio dos valores a serem atribudos s chaves que sero utilizadas pelo sistema a ser
instalado, podemos clicar o boto OK para podermos continuar com o processo de desenvolvimento de
nossa instalao.
Pgina: 119
Delphi 5
Para modificarmos os atributos de um cone j existente, basta que faamos as alteraes nos campos
desejados e, para que as alteraes sejam efetivadas, o boto Modify Icon seja clicado.
Da mesma forma como mostrado com as chaves, os cones selecionados podem ser removidos ao
pressionamos a tecla del. A remoo aqui tambm feita sem que seja exibida qualquer caixa de dilogo
solicitando uma confirmao por parte do usurio.
A segunda aba pertencente caixa de dilogo Specify Folrders and Icons, chamada Advanced, propicia a
configuraes de caractersticas avanadas dos cones (programas) previamente selecionados. A figura a
seguir mostra a aba Advanced.
Como mostrado acima, a aba Advanced composta por diversas
caixas de texto, cada uma das quais contendo valores para o cone
correntemente selecionado. A primeira caixa de texto, Working
Directory, indica qual o diretrio que ser utilizado como diretrio
de trabalho para o cone selecionado. Por default, o diretrio de
trabalho o mesmo diretrio onde encontra-se o aplicativo.
importante observar que, para que quaisquer alteraes efetuadas
no aplicativo sejam efetivadas, necessrio clicar o boto Modify
Info, caso contrrio as alteraes no tero efeito.
A seguir, podemos definir um cone para o aplicativo. Para isso,
devemos clicar o boto contendo reticncias ao lado da caixa de texto Icon. Feito isso, surgir a caixa de
dilogo Setup Files Browser, mostrada anteriormente. Podemos escolher um cone contido em um arquivo
do tipo ICO ou constante de uma DLL. Devemos ter, contudo, includo o arquivo desejado previamente em
nosso projeto.
A ltima caixa de texto a ser
preenchida, denominada Short Cut
Key, determina a tecla de atalho
que ser associada ao aplicativo
selecionado. Para associarmos
uma tecla, ou combinao de
teclas, ao aplicativo, devemos
selecionar o aplicativo e, com o
foco colocado na caixa de texto
Short Cut Key, pressionar a
combinao de teclas desejada.
Caso desejemos cancelar a
associao devemos pressionar a
tecla del para apagar as teclas
associadas.
Resta-nos ainda a possibilidade de colocarmos o aplicativo no menu Inciar Programas. Para que isso seja
feito basta que o checkbox Place icon on Start Programs menu seja marcado. Essa atitude s
recomendada para instalaes onde existam apenas um nico cone sendo instalado, onde no haveria a
necessidade da criao de um grupo para o aplicativo.
Pgina: 120
Delphi 5
720KB at o CD-ROM. O tamanho do disco dever ser selecionado atravs do combobox Disk Size.
Uma vez definido qual o tamanho dos discos a serem gerados, podemos dar incio ao processo de gerao
das imagens dos discos de instalao. Para isso, basta clicarmos o boto Build. Feito isso, dado incio ao
processo de gerao, que pode ser acompanhado atravs da barra de progresso existente acima dos botes
de Build, Close e Help, ou atravs do componente memo, chamado Feedback.
Ao final da gerao das imagens, um pequeno resumo resumo exibido na no memo Feedback e os
discos gerados so exibidos no list view Disk Images. A seguir mostramos o resultado da gerao das
imagens dos discos de instalao do aplicativo.
Podemos clicar o boto Close para sairmos da caixa de dilogo Build. J de posse das imagens dos discos
de instalao temos duas opes: testar a instalao que acabamos de criar ou gerar efetivamente os discos
de instalao, copiando as imagens geradas para os discos que sero utilizados na distribuio do produto.
Pgina: 121
Delphi 5
Uma vez iniciado o primeiro projeto no InstallShield, a caixa de dilogo que exibida no incio de toda
seo de trabalho com o InstallShield passa a disponibilizar mais uma opo como mostrado a seguir.
A partir de agora temos a opo de abrir o ltimo projeto no qual
estvamos trabalhando. Esta opo agiliza a utilizao do
InstallShield a medida em que trabalhamos com um projeto. Essa
passa a ser a opo default exibida todas as vezes em que iniciamos
o InstallShield.
Os passos para a criao de uma instalao com mltiplas
configuraes bastante semelhante ao descrito anteriormente. Devemos iniciar um novo projeto para que
a caixa de dilogo New Project seja exibida, como mostrado a seguir.
Devemos preencher todas as opes como mostrado
anteriormente. Neste ponto, o nico detalhe a ser
observado est no fato de que, por tratar-se do
desenvolvimento de uma instalao com mltiplas
configuraes, o checkbox Include a custom setup type
deve estar assinalado como mostrado na figura acima.
Podemos clicar o boto Create para dar incio ao
processo de criao da instalao.
A janela principal do InstallShield exibida
exatamente da mesma maneira como durante o
processo de desenvolvimento de uma instalao simples. As mesmas opes so exibidas no checklist, cada
uma delas devendo ser preenchida como foi mostrado nos tpicos anteriores desse manual. O processo de
desenvolvimento segue da mesma forma como mostrado anteriormente at o momento em que chegamos
na caixa de dilogo Components, a qual deixamos de explicar anteriormente mas que trataremos a seguir.
12.15. Componentes
A caixa de dilogo Components utilizada para definirmos os componentes que fazem parte de uma
instalao. Da mesma forma com que podemos criar grupos no InstallShield, onde um grupo composto
por um ou mais arquivos de forma a facilitar a organizao fsica dos arquivos em disco no processo de
instalao, podemos definir componentes. Um componente uma unidade lgica da instalao, cada um
dos quais contendo um ou mais grupos de arquivos a serem instalados. A caixa de dilogo Components
mostrada a seguir.
Atravs da caixa de dilogo Components possvel a criao de
novos componentes bem como a modificao de componentes j
existentes, alm da adio dos grupos criados anteriormente
componentes especficos. Como podemos ver, a caixa de dilogo
Components est dividida basicamente em duas partes. Do lado
esquerdo temos a indicao de todos os componentes atualmente
inclusos no processo de instalao, juntamente com os grupos
que os compe. J do lado direito, temos todos os grupos.
Para podermos criar novos componentes instalao, devemos
clicar o boto Add Component para que a caixa de dilogo Add
Component, mostrada a seguir, seja exibida.
Como mostrado na figura, devemos entrar com os valores que sero
utilizados como nome do componente a ser criado bem como uma breve
descrio. Uma vez clicado o boto OK, o novo componente ser adicionado
lista de componentes da instalao. Atravs do clique do boto Modify
Component podemos modificar tanto o nome como a descrio do
componente selecionado. J a remoo de um componente feita ao
pressionarmos a tecla del. O componente selecionado removido sem
nenhum pedido de remoo, independentemente da existncia de grupos associados a ele ou no.
Pgina: 122
Delphi 5
Um componente no tem qualquer finalidade a menos que exista um grupo ou grupos de arquivos
associados ele. Para associarmos um grupo a um componente basta selecionarmos do lado esquerdo o
componente ao qual desejamos selecionar um grupo e, do lado direito, selecionar o grupo que desejamos
associar. Logo em seguida, para realizarmos a associao basta clicarmos o boto Add to Application
Component. Uma vez criados todos os componentes necessrios ao desenvolvimento de nossa instalao
podemos clicar o boto OK para que nossas alteraes seja efetivadas.
12.17. Concluso
Como pudemos verificar, o InstallShield um software bastante simples de ser utilizado mas que fornece
uma poderosa ferramenta para a gerao de instalaes, dando uma aparncia profissional aos softwares
desenvolvidos por qualquer empresa.
Para maiores esclarecimentos, enviar correio eletrnico para o endereo mostrado na prpria janela
principal do InstallShield, visitar o site da InstallShield ou mesmo consultar o Help On-Line do produto.
Pgina: 123