Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Delphi 5
Delphi 5
Sumário
INTRODUÇÃO 4
1.1. POR QUE O WINDOWS? ERRO! INDICADOR NÃO DEFINIDO.
1.2. O QUE SÃO AMBIENTES VISUAIS DE DESENVOLVIMENTO? 5
1.3. O QUE É O DELPHI 7
1.4. POR QUE DELPHI? 8
2. O AMBIENTE DE DESENVOLVIMENTO DO DELPHI 9
2.1. A JANELA PRINCIPAL 10
2.2. OS FORMULÁRIOS 12
2.3. O OBJECT INSPECTOR 16
2.4. O EDITOR DE CÓDIGO 23
2.5. CODIFICANDO E COMPILANDO 24
2.6. SALVANDO O PROJETO 26
2.7. TRABALHANDO COM UMA APLICAÇÃO 27
2.8. CRIANDO UMA CONSOLE APPLICATION 30
2.9. CRIANDO UMA APLICAÇÃO GUI 31
2.9.1. CRIANDO E ALTERANDO APLICAÇÃO DEFAULT 32
2.9.2. UTILIZANDO WIZARDS 32
2.10. O ARQUIVO DE PROJETO 33
2.11. MANIPULANDO COM AS OPÇÕES DO PROJETO 35
3. AS UNITS 38
3.1. AS SEÇÕES DE UMA UNIT 38
3.1.1. A SEÇÃO INTERFACE 38
3.1.2. A SEÇÃO IMPLEMENTATION 49
3.1.3. A SEÇÃO INITIALIZATION 50
3.1.4. A SEÇÃO FINALIZATION 51
4. OS FORMULÁRIOS 51
4.1. CRIANDO FORMULÁRIOS 51
4.1.1. NOVOS FORMULÁRIOS 51
4.1.2. CONFIGURANDO O OBJECT REPOSITORY 52
4.2. EXIBINDO FORMULÁRIOS 53
4.2.1. MANIPULANDO COM PROPRIEDADES E MÉTODOS 53
4.2.2. NOMEANDO OBJETOS 54
4.2.3. FORMULÁRIOS MODAIS 55
4.2.4. FORMULÁRIOS NÃO MODAIS 56
4.2.5. FORMULÁRIOS MODAIS VERSUS NÃO MODAIS 57
5. COMANDOS DA LINGUAGEM 58
5.1. INSTRUÇÕES SIMPLES E COMPOSTAS 58
5.2. INSTRUÇÕES CONDICIONAIS 59
5.2.1. IF 59
5.2.2. CASE 60
5.3. ESTRUTURAS DE REPETIÇÃO 61
5.3.1. FOR 61
5.3.2. WHILE 62
5.3.3. REPEAT 62
5.4. COMANDOS DE DESVIO DE FLUXO PADRÃO 63
Página: 1
Delphi 5
Página: 2
Delphi 5
Página: 3
Delphi 5
Introdução
1.1. História
A história da ciência da computação, ao contrário da grande maioria das ciências existentes
atualmente, é bem curta. Apesar dessa ciência não ter uma vida tão longa quanto as demais, a
velocidade com que as mudanças e as descobertas ocorrem são, sem dúvida alguma, muito maiores.
No início da história da computação, devido à pouca tecnologia existente, os computadores eram
bem mais difíceis de se programar. Os programas deveriam ser escritos da forma mais otimizada
possível. Não existia quantidade de memória suficiente para os programas funcionarem o que
tornava a programação de computadores uma verdadeira arte e poucos eram os artistas capazes de
dominar essa arte. A rápida evolução tecnológica fez com que computadores mais poderosos
viessem a surgir, facilitando a vida dos programadores.
Com o advento dos circuitos integrados, computadores cada vez memores e mais poderosos
surgiram no mercado. Os computadores pessoais tornaram-se cada vez mais populares criando um
mercado maior e mais amplo para a programação. Agora não só as grandes empresas tinham
condições de terem computadores para gerenciar seus negócios mas também as pequenas empresas
podiam contar com essa tecnologia.
Com o crescimento do mercado de informática veio o surgimento de novas linguagens de
programação que tinham por objetivo fornecer um ambiente propício para o desenvolvimento de
aplicativos comerciais. A utilização de programas de computador aumentou cada vez. Porém um
problema assustador parecia despontar no horizonte. A variedade de programas existentes no
mercado acabava por acarretar gastos cada vez maiores para as empresas, gastos esses que haviam
diminuído graças aos avanços tecnológicos dos equipamentos de informática (hardware).
Cada programador ou equipe de programadores era responsável pelo desenvolvimento de seu
aplicativo. A escolha da linguagem de programação, o desenho da interface com o usuário e a
própria implementação eram feitas por esses grupos independentemente. Cada programa funcionava
e se apresentava para os usuários de forma independente. Por exemplo, poderíamos ter programas
que, para efetuar a saída do sistema, fosse necessário escolher um item de menu, enquanto que em
outro, essa opção deveria ser efetuada através do acionamento de uma seqüência de teclas de atalho,
como o pressionar das teclas <CTRL> + <S> simultaneamente, por exemplo. Isso era um péssimo
negócio para as empresas que após a escolha e aquisição do programa (software) ainda eram
obrigadas a gastar uma substancial quantia de dinheiro com treinamento de pessoal para a sua
utilização. O gasto era ainda maior caso uma migração entre sistemas fosse necessária. Além dos
gastos naturais com treinamento e aquisição do equipamento, existia um gasto indireto com a
adaptação dos usuários ao novo sistema. Essas dificuldades, principalmente as financeiras,
obrigavam o surgimento de algo que viesse a melhorar essa situação incômoda em que se
encontrava a informática.
Com todos esses problemas em mente, heis que surge um novo ambiente de trabalho no
mercado. Surge o ambiente Windows, da empresa americana Microsoft. Mas o que é que houve de
tão especial com esse ambiente para que ele fosse considerado a salvação para esse verdadeiro caos
em que se encontrava a informática nessa época? Duas palavras “mágicas” são capazes de
responder a essa pergunta: padronização e facilidade de uso. É bem verdade que elas estão bem
relacionadas uma com a outra mas mesmo assim, elas foram as responsáveis por uma verdadeira
reviravolta no ramo da informática. Foi através do Windows que uma quantidade cada vez maior de
pessoas passou a usar o microcomputador. Não só no trabalho, mas também em suas residências as
pessoas passaram a conhecer e tirar proveito da potencialidade da tecnologia que estava em suas
mão.
Página: 4
Delphi 5
Uma interface mais amigável ao usuário passou a ser utilizada. A utilização de telas gráficas ao
invés 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
invés de ter a tarefa de decorar inúmeros comandos que possibilitavam a utilização da máquina, o
usuário poderia operar o microcomputador de forma bem mais intuitiva e simplificada.
A padronização dos programas também foi um outro fator de destaque para a aceitação do novo
ambiente. O Windows seguia um padrão dentro de seus aplicativos e para que novos aplicativos
fossem desenvolvidos para esse ambiente, os padrões também deveriam ser mantidos. Dessa forma,
o gasto com a adaptação a novos produtos seria feita de forma bem mais rápida, 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 não mais para os
usuários dos computadores, mas sim para os desenvolvedores de software, a dificuldade de
programação.
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, não seguiam qualquer tipo de padronização e que, pouco a pouco,
vinham perdendo espaço no mercado para os aplicativos desenvolvidos para o ambiente Windows
ou mudar para o desenvolvimento de aplicativos que seguissem a padronização que estava
conquistando as empresas mas que, com relação à tarefa de programação, era bem mais difícil e
complexa e que, por conseqüência, mais cara para se desenvolver.
Os analistas de sistemas e os programadores começaram 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 programação perceberam as dificuldades
existentes nesse processo. Gigantes como a Borland (atual Inprise Corporation) e a própria
Microsoft começaram a procurar desenvolver novas ferramentas de programação 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.
Várias ferramentas têm sido colocadas, nos últimos anos, à disposição dos programadores
aumentando bastante o desenvolvimento de software para o ambiente Windows. Com o lançamento
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 lançando seus próprios Ambientes Visuais de Desenvolvimento para o ambiente
Windows. Contudo, o que são esses tais Ambientes Visuais de Desenvolvimento que tomaram toda
a industria de desenvolvimento de software? A resposta para essa pergunta daremos a seguir.
Página: 5
Delphi 5
código fonte provocaram o efeito desejado. Ao final desse imenso trabalho de estruturação da
interface, centenas, ou até mesmo, milhares de linha de código haviam sido escritas para que tudo
estivesse de acordo com o planejado pela equipe de programadores visuais responsáveis pelo
projeto da interface. Tendo como um de seus objetivos facilitar todo esse processo de
desenvolvimento de software, responsável 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, esforço de
programação. 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 tão simples
quanto se ele estivesse desenhando a interface em sua própria 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 codificação por parte do programador. Por esse motivo, alguns autores
chamam esse tipo de desenvolvimento rápido de interfaces de WYSIWYG, sigla originária do
inglês What You See Is What You Get, que significa “O que você vê é o que você obtém”,
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 aplicações de RAD, que significa Rapid Application Development, do inglês “Desenvolvimento
Rápido de Aplicações”. A utilização desses ambientes diminui consideravelmente o tempo e,
principalmente, o custo de desenvolvimento de aplicações.
Como conseqüência dessas facilidades e praticidade de desenvolvimento de aplicações para o
ambiente Windows, é cada vez maior a procura e a aceitação de Ambientes Visuais de
Desenvolvimento como o Microsoft Visual Basic (um dos pioneiros), o PowerBuilder, o Centura
(antigo SQL Windows), além, é claro, do próprio Delphi.
Devemos observar que o simples fato do desenvolvimento da interface da aplicação não
finaliza a tarefa do desenvolvimento. Resta ainda ao programador escrever o código que deverá ser
executado quando o usuário tomar determinadas ações como, por exemplo, pressionar o botão de
saída do programa.
Sob esse novo modelo de desenvolvimento, os programas passam a ser desenvolvidos através
de um novo ponto de vista. Os programas passam a ser formados por objetos que vão sendo
colocados em suas janelas (trataremos do conceito de objetos posteriormente nesta apostila), pelo
ajuste de suas propriedades, para que esses objetos tenham as características desejadas pelos
desenvolvedores, e pelos eventos aos quais esses objetos irão responder isto é, as possíveis ações
realizadas pelos usuários do sistema ou pelo próprio sistema, como por exemplo, o clicar do mouse
sobre um botão.
A utilização desse novo modelo é, por muitas vezes, a parte mais difícil no processo de
migração do desenvolvimento de programas das antigas linguagens procedurais para os novos
ambientes de desenvolvimento baseados em eventos. O programador não pode mais supor uma
ordem exata na execução do seu código fonte e deve passar a tratar isoladamente cada evento
relevante de sua aplicação.
Página: 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 usuário do sistema deverá cadastrar cada cliente que irá
pertencer ao banco de dados da aplicação. Nos sistemas mais antigos, não baseados no ambiente
Windows, o preenchimento de cada campo era feito de forma seqüencial, verificando-se facilmente
se o valor para cada um deles estava sendo colocado corretamente. Além disso, a verificação de
campos de preenchimento obrigatório era facilmente efetuada uma vez que, para chegar ao local de
confirmação da inclusão, o usuário deveria ter passado por todos os campos da tela de cadastro,
preenchendo-os corretamente. Contudo, com o desenvolvimento de aplicativos para o ambiente
Windows, não podemos mais fazer tais suposições. Agora, na janela de cadastro de clientes, o
usuário não é mais obrigado a pressionar o botão de confirmação de inclusão de um novo cliente
apenas após o total preenchimento de seus campos. Cuidados adicionais devem ser tomados para
que isso não ocorra. Um outro exemplo bastante simples e que ocorre com freqüência cada vez
maior em nosso dia-a-dia está no próprio encerramento do programa. A maneira mais corriqueira de
se finalizar um aplicativo por parte do usuário é através da escolha de uma opção de saída existente
na aplicação. Porém, qualquer usuário poderia finalizar o aplicativo através de um clique no ícone
de sistema localizado no canto superior direito das janelas da aplicação. Um usuário mais
experiente do ambiente Windows poderia também pressionar as teclas de atalho ALT + F4
provocando o fechamento da janela da aplicação. Em cada um desses três casos, é função do
desenvolvedor fornecer o mesmo tratamento para cada uma dessas ações do usuário.
Pudemos ver que os programas não irão mais seguir aquela ordem linear de execução que
programas mais antigos seguiam, mas sim uma execução baseada em eventos. A ordem de
execução do programa irá seguir a ordem dos eventos que cada usuário do aplicativo desejar.
Devemos perceber que, internamente ao tratamento de cada evento, a execução das instruções
contidas no código do programa ainda continua, de certa forma, linear porém, a escolha de qual
desses códigos ou seja, a execução dos eventos por parte do usuário do aplicativo, a ser executado é
que não é mais linear.
Mesmo com essa aparente dificuldade, o desenvolvimento de aplicações através de tais
ambientes é, e continuará a ser durante muito tempo, o método mais rápido e eficiente de
desenvolvimento de aplicações para o ambiente Windows.
Página: 7
Delphi 5
Página: 8
Delphi 5
Uma vez inicializada a IDE do Delphi surgirão, inicialmente, 4 janelas que irão permitir ao
desenvolvedor trabalhar e desenvolver suas aplicações no Delphi, como ilustra a figura abaixo.
Paleta de
Componentes
Object
Inspector Formulário
Editor de Código
Existem ainda outras janelas que poderiam ser exibidas dentro da IDE do Delphi dependendo
das configurações definidas pelo desenvolvedor, porém as 4 janelas exibidas acima constituem a
instalação e configuração básicas do Delphi. Antes de aprendermos a linguagem Object Pascal
Página: 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 compõe a IDE
mais detalhadamente a seguir.
Página: 10
Delphi 5
Página: 11
Delphi 5
2.2. Os Formulários
A grande maioria das aplicações desenvolvidas para o sistema operacional Windows,
excetuando-se em alguns casos, por exemplo, as DLLs ou aplicativos desenvolvidos para trabalhar
em modo “DOS”, é composta de uma ou mais janelas, também chamadas de formulários. Dessa
forma, como não poderia deixar de ser, a grande maioria das aplicações que iremos desenvolver
serão compostas de um ou vários formulários. Em aplicações que possuam mais do que um
formulário, devemos observar que existirá sempre um formulário responsável pela execução da
aplicação. Enquanto esse formulário permanecer “aberto”, nossa aplicação permanecerá em
execução. Esse formulário é chamado de formulário principal da aplicação e, devido ao papel
Página: 12
Delphi 5
diferenciado que ele exerce sobre a aplicação, deverá receber uma atenção especial por parte dos
programadores para o ambiente Windows.
Ao iniciarmos o ambiente de desenvolvimento do
Delphi, nos é apresentado um formulário inicial, em
geral não contendo qualquer componente como
mostrado na figura. Esse formulário inicial é
exatamente o formulário principal dessa nova
aplicação, porém essa característica do formulário
poderá ser alterada posteriormente com o decorrer do
Página: 13
Delphi 5
Página: 14
Delphi 5
Página: 15
Delphi 5
Página: 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.
Porém o que são as propriedades e os eventos de um componente? As propriedades de um
componente identificam as características dos componentes tais com altura, largura, cor e tipo da
fonte sendo utilizada pelo componente. Essas características, dentre outras divisões, podem tanto
ser visíveis como, por exemplo, a altura e largura do componente quanto não visíveis como, por
exemplo, a definição do nome de qual tabela de um banco de dados o formulário irá exibir
informações. Não devemos confundir os dados que estão sendo exibidos, que são informações que
podemos visualizar, com o nome da tabela que foi selecionada para ter seus dados exibidos.
Já os eventos identificam as ações que, tanto o usuário da aplicação quanto outros formulários e
componentes, podem realizar durante a execução do aplicativo sobre o componente selecionado,
por exemplo, um botão pode ser clicado, um formulário pode ser redimensionado e assim por
diante. Durante a construção de cada programa, é função do programador identificar e codificar
cada evento necessário ao funcionamento da aplicação. Dessa forma, podemos perceber que nem
todos os eventos de um componente serão codificados, podendo até mesmo não existir qualquer
codificação em um componente dentro de uma aplicação. Porém, não podemos pensar que caso um
determinado evento não seja codificado ele irá deixar de ser executado. O Windows envia todos os
eventos executados para suas respectivas aplicações. Caso exista uma codificação associada ao
evento executado esse código será executado, caso contrário a execução da aplicação 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 estão listados os nomes, em
ordem alfabética, de cada uma das propriedades do componente corrente e ao seu lado esquerdo
estão os valores atuais para essas propriedades. Na figura do Object Inspector, exibida
anteriormente, vemos as propriedades do formulário chamado Form1. Esse formulário possui várias
propriedades, dentre elas a propriedade Caption possuindo o valor Form1.
Existem vários tipos de propriedades dentre elas, como já mencionado, as visíveis e as não
visíveis, também chamadas de visuais e não visuais, respectivamente. Além dessa divisão, podemos
citar propriedades disponíveis em tempo de desenvolvimento e aquelas disponíveis em tempo de
execução. Ou seja, as primeiras são aquelas propriedades listadas no Object Inspector que estão
disponíveis e podem ser modificadas em tempo de desenvolvimento pelo programador para possuir
os valores por ele definidos. Por outro lado, as últimas são propriedades que não estão listadas no
Object Inspector. Para que o programador tome conhecimento da existência dessas propriedades,
ele deverá consultar a ajuda online do Delphi. Um vez conhecidas, essas propriedades só poderão
ser manipuladas através de codificação uma vez que não aparecem no Object Inspector.
Apesar de visíveis no Object Inspector, algumas propriedades disponíveis em tempo de
desenvolvimento podem ser tanto alteradas em tempo de desenvolvimento quanto em tempo de
execução através de codificação. Já outras propriedades, chamadas read-only não podem ser
alteradas em tempo de execução, podendo apenas ser lidas. Existe toda uma gama de combinações
entre essas características das propriedades. Para obter conhecimento a respeito de quais
propriedades são visíveis em tempo de desenvolvimento, em tempo de execução ou em ambas, ou
quais propriedades são read-only ou não, o desenvolvedor Delphi deve consultar a documentação
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 atribuídos a cada uma dessas propriedades.
Embora tenhamos uma quantidade muito grande de propriedades para cada componente existente
Página: 17
Delphi 5
Página: 18
Delphi 5
entre colchetes, as propriedade que apresentam seu conteúdo entre sinais de parênteses representam
objetos (veremos posteriormente a definição de classes e objetos). Essas propriedades representam
novos objetos contidos dentro do componente em questão, que por sua vez também é um objeto.
Veremos toda essa idéia 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 formulário. Essa propriedade ilustra dois aspectos com relação a propriedades
que representam objetos. Podemos observar que a propriedade Font possui, por sua vez, outras
propriedades. Ao contrário do que acontecia com os Sets, cujos valores que podíamos 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 observação está no fato da
existência de um botão, ao lado do valor da propriedade Font. Ao clicarmos esse botão será exibida
um caixa de diálogo que nos permite preencher de forma mais agradável o valor das propriedades
que foram listadas, em nosso exemplo, a propriedade Font. A figura ao lado mostra a caixa de
diálogo que é exibida ao clicarmos no botão da propriedade Font. Devemos ter em mente que a
caixa de diálogo mostrada não é de exibição obrigatória, ou seja, podem existir propriedades dentro
de componentes do Delphi que representem objetos mas que não possuam uma caixa de diálogo
para permitir uma definição mais fácil dos valroes de suas propriedades. A existência dessas caixas
depende das pessoas que construíram, ou seja, programaram cada um desses componentes. É uma
prática de programação bastante comum dentro do ambiente Delphi que, as propriedades de
componentes que representem objetos deverm ter uma caixa de diálogo associada mas isso não
torna obrigatória a existência dessas caixas de diálogo. 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 diálogo que permita o
preenchimento das informações para esse objeto.
A segunda guia existente no Object Inspector é responsável pela
exibição dos Eventos aos quais o componente selecionado pode responder.
Esses eventos, da mesma forma como acontecia com as propriedades, são
específicos para cada componente, ou seja, podem existir eventos comuns
ou não aos diversos componentes existentes no Delphi. A figura ao lado
mostra os eventos aos quais um formulário pode responder.
Já sabemos que o Object Inspector, de forma semelhante ao que
acontece com as propriedades, exibe os eventos específicos para cada
componente selecionado. Porém, para que servem os eventos? Os eventos
formam uma das partes mais importantes na programação dentro do
ambiente Windows. É através do disparo de eventos que existe a interação
entre o usuário e o código escrito em cada programa. Eventos são disparados por ações do usuário
ou de outros programas, e esses eventos por sua vez, executam a codificação escrita pelos
programadores durante o seu desenvolvimento. No Delphi, a maneira mais simples de associarmos
que código que será executado quando cada um desses eventos ocorrer é através do Object
Inspector. Por exemplo, caso quiséssemos exibir uma mensagem quando o usuário clicasse no
formulário, poderíamos escrever o código responsável pela exibição da mensagem e associá-lo ao
disparo do evento OnClick do formulário. Podíamos também efetuar essa associação através da
própria codificação porém deixamos a explanação de como isso pode ser feita para uma discussão
um pouco mais avançada dentro do Delphi. A guia Events está dividida de forma semelhante à guia
Properties. Do lado esquerdo estão listados os nomes dos eventos enquanto que do lado direito está
o nome de qual trecho de código deverá ser executado quando o evento em questão for disparado.
Com o intuito de facilitar o trabalho do desenvolvedor, o nome de cada evento segue um padrão de
nomenclatura, observe que dentro do Object Inspector cada evento tem seu nome composto do
prefixo On mais o evento que irá dispará-lo.
Página: 19
Delphi 5
Como citado anteriormente, o Object Inspector tem como uma de suas funções associar o
evento e o código a ser executado quando esse evento for disparado. Dessa forma, podemos
perceber que não existe a obrigatoriedade de termos, para cada evento um código a ser executado,
ou seja, podem existir eventos sem qualquer código associado. Por exemplo, não precisamos
associar código algum ao evento OnClick do formulário. Mesmo que isso ocorra, como mencionado
anteriormente, o Windows continuará enviando uma mensagem ao formulário toda vez que ele
sofrer um clique por parte do usuário, porém nada será executado. Da mesma forma, também
podemos ter inúmeros eventos “apontando” para o mesmo código, como ilustra a figura abaixo. Na
figura abaixo vemos a existência de três eventos distintos que, ao serem disparados, executam o
mesmo trecho de código dentro da aplicação.
Por exemplo, em nossa aplicação poderíamos ter um botão e um item de menu que nos
permitam sair do programa. Não necessitamos escrever dois códigos idênticos e associa-los
respectivamente ao clique no botão e ao clique do item de menu. Basta criarmos uma única
codificação e associá-la a ambos os eventos, ou seja, tanto ao clique do botão quanto ao do item de
menu. Isso é muito importante uma vez que nos permite uma melhor codificação e manutenção do
código escrito, diminuindo a quantidade de erros durante a fase de manutenção do aplicativo.
Uma vez que já sabemos que podemos associar código aos diversos eventos existentes em cada
componente, resta-nos escrever esse código e criar a associação entre o código escrito e o evento
desejado. Apesar de poder parecer um pouco estranho, iremos começar não pela codificação, mas
sim pela associação entre o código e os eventos. Essa inversão ficará clara no decorrer de nossa
explicação. Então, veremos agora as quatro alternativas que o Delphi nos oferece para associar
código aos eventos listados no Object Inspector.
Vamos iniciar com o método mais comum de associação. Para isso, iremos construir nossa
primeira aplicação em Delphi. Inicialmente, essa
aplicação não irá conter qualquer componente, ou seja,
ela será composta simplesmente da janela principal
como ilustrado ao lado. Para isso devemos selecionar a
opção Close All no menu File e em seguida a opção
New Application localizada nesse mesmo menu. Caso
tenhamos modificado a aplicação anterior o Delphi irá
nos perguntar se desejamos salvar as alterações
efetuadas, por ora responderemos não. Suponha que
desejamos exibir uma mensagem quando esse
formulário for clicado. Já sabemos que o Object
Inspector sempre manipula o componente selecionado e por isso devemos selecionar o formulário
Página: 20
Delphi 5
que, nada mais é do que o componente ao qual desejamos criar a associação entre a codificação e o
evento. Para selecionarmos o formulário basta que efetuemos um clique simples no formulário 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 codificação. Em nosso
exemplo, devemos selecionar o evento OnClick uma vez que queremos exibir uma mensagem
quando o formulário for clicado. Uma vez que ainda não escrevemos codificação alguma, iremos
nos aproveitar de alguns recursos que o Delphi nos oferece para podermos criar tanto a codificação
inicial quanto a associação dessa codificação com o evento do formulário. Para isso, vamos dar um
duplo clique na região branca do lado direito do nome OnClick.
Ao fazermos isso, o Delphi abre o Editor de Código, que será visto no próximo tópico, e cria
um trecho de programa no qual podemos digitar o código necessário à exibição da mensagem
quando o formulário for clicado, como ilustrado na
figura. Esse trecho de código é chamado de
Procedimento de Evento, do inglês Event Procedure.
Além da criação do trecho inicial da codificação a ser
realizada, o Delphi também alterou outros trechos de
código dentro do próprio Editor. Não iremos abordar
agora essas demais alterações, apenas iremos salientar
que as demais alterações feitas pelo Delphi são
importantes quando estivermos criando por conta
própria procedimentos de eventos para as nossa
aplicações. Apesar de não serem alteações que um
programador iniciante estará fazendo dentro do Delphi elas deverão ser observadas para um melhor
entendimento do funcionamento de um programa Delphi.
Uma outra alteração realizada pelo Delphi, facilmente perceptível, encontra-se no Object
Inspector. Agora, ao lado do evento OnClick do formulário, o Delphi criou a associação desse
evento com o trecho de código que foi criado pelo póprio Delphi e listado no
Editor de Código. Observe que essa associação criada nada mais é do que a
informação de qual Procedimento de Evento será executado quando o evento
OnClick for disparado. De forma semelhante poderíamos fazer com que o
Delphi criasse qualquer Procedimento de Evento e fizesse a associação entre o
procedimento e o respectivo evento. A figura ao lado mostra como ficou o
Object Inspector após a associação entre o Procedimento de Evento criado e o
evento OnClick do formulário.
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 formulário, juntamente com o evento que irá disparar a
execução 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
código a ser executado. Por exemplo, ao invés de chamarmos o procedimento de FormClick
poderíamos querer que o procedimento viesse a ser chamado de ExibirMensagem.
Essa alteração pode ser facilmente realizada. Basta que mudemos o nome da associação no
Object Inspector e teclemos ENTER, que ela será automaticamente refletida
também no Editor de Código. 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 desejávamos. Porém
poderíamos ter criado o procedimento diretamente com o nome desejado. Essa é
Página: 21
Delphi 5
justamente a segunda maneira que possuímos para criar um Procedimento de Evento dentro do
Delphi. Ao selecionarmos o evento desejado podemos, no Object Inspector, ao invés de dar um
duplo clique no evento desejado, temos a opção 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, porém com o nome que definimos
ao invés de utilizar o nome default. Apesar dessa segunda opção de criação de um procedimento ser
mais clara em relação à finalidade do procedimento sendo criado, ela não é tão utilizada em relação
à primeira, por questões muitas vezes de agilidade no desenvolvimento da aplicação.
Página: 22
Delphi 5
Página: 23
Delphi 5
mais comuns nos editores de texto tais como o WordPad. Nessa janela podiam ser exibidos um ou
vários arquivos de código fonte. Cada um desses arquivos podia ser acessado através de uma guia
contendo o nome do arquivo sendo exibido. Além disso no Editor de Código eram exibidas
informações a respeito da compilação dos programas tais como erros e warnings detectados pelo
compilador Delphi. A partir da versão 4 do Delphi, o Editor de Código trouxe uma outra janela,
chamada de Code Explorer, capaz de identificar e exibir de forma mais organizada informações a
respeito do arquivo fonte sendo exibido, tais como declarações de constantes e variáveis.
O Editor de Código possui recursos que permitem a busca e substituição de trechos de código,
através do menu Search. Não entraremos em detalhe a respeito da utilização desses recursos por se
tratarem de recursos comuns à maioria dos editores de texto. Além desses recursos de busca, o
Editor de Código nos fornece a possibilidade de configurá-lo de tal forma a atender melhor as
nossas necessidades. Para isso, devemos acessar a caixa de diálogo Editor Properties localizada no
menu Tools através da opção Editor Options. Essa caixa de diálogo possui 5 guias das quais as
quatro primeiras (General, Display, KeyMappings e Color) possibilitam a configuração visual do
Editor de Código tais como a fonte e as cores que serão utilizadas. Já a guia Code Insight permite a
configuração do recurso de mesmo nome existente no Delphi, veremos o Code Insight
posteriormente.
Uma observação que deve ser feita
ao utilizarmos o Editor de Código
refere-se à manipulação dos arquivos
que são exibidos. Uma vez que não
desejarmos mais que um determinado
arquivo seja exibido não deveremos
simplesmente clicar no ícone de
sistema localizado no canto superior
direito do Editor. Caso façamos isso
estaremos fechando todo o Editor de
Código e não apenas o arquivo selecionado. Para fecharmos apenas o
arquivo fonte selecionado devemos clicar com o botão secundário do
mouse por sobre o Editor de Código. Ao fazermos isso será exibido um
menu popup que permite um acesso mais rápido a diversas opções do
Editor de Código, entre elas a opção Close Page, responsável for fechar
a página corrente.
Como dito anteriormente, o Editor de Código, apesar de poder exibir arquivos genéricos de
texto, ele é a janela do Delphi responsável pela exibição, principalmente, de arquivos que
contenham código fonte escrito dentro do Delphi. Neste tópico falamos de forma genérica do Editor
de Código sem nos preocuparmos com os arquivos fonte propriamente ditos. Veremos esses
arquivos com bem mais detalhe no tópico abordando as units.
Porém, ao tentarmos compilar a aplicação novamente um erro irá ocorrer. A explicação para esse novo
erro, mostrado ao lado, também é bastante simples.
Quando removemos a implementação e a declaração
do procedimento não removemos todas as
ocorrências desse procedimento dentro do código
fonte de nossa aplicação Delphi. Lembre-se que,
quando trabalhamos com o Delphi, passamos a definir
dentro dos diversos eventos que um componente pode
sofrer quais executarão cada um dos procedimentos que
escrevemos. Sabemos ainda que vários procedimentos
podem estar relacionados a um único código fonte. Para
que isso seja possível, o Delphi é obrigado a
arqmazenar, em algum local de sua codificação, essa
informação. Ao removermos a códificação e a
declaração do procedimento, deixamos de lado a
remoção dessa indicação. Resta-nos então, remover as referências que haviam sido criadas pelo Object
Inspector. O Delphi reconhece essa situação e nos questiona se desejamos que essas referências sejam
removidas para que a aplicação seja compilada novamente.
Página: 25
Delphi 5
Como pudemos observar, esses erros ocorreram por que o Delphi fez uma série de modificações
automaticamente no código fonte de nossa aplicação ao permitirmos que ele criasse o Procedimento de
Evento. Dessa forma, para evitarmos que esses erros ocorram, devemos também permitir que o Delphi
remova essas alterações automaticamente para nós. E isso é tão simples de conseguirmos como foi para que
essasinclusões de código fossem feitas para nós. O Delphi remove automaticamente todas os
Procedimentos de Eventos e suas respectivas referencias sempre que salvamos ou tentamos compilar
nossas aplicações desde que não exista nenhum código ou comentário dentro do corpo do procedimento, ou
seja, entre as palavras reservadas begin e end; existentes na codificação do procedimento não deverá existir
qualquer tipo de codificação nem mesmo um comentário.
Após termos alterado o nosso primeiro programa, deixando apenas o procedimento associado ao evento
OnClick do botão, podemos compilar a aplicação para verificar se ela faz
realmente o que esperávamos. Para que possamos compilar a aplicação devemos
selecionar a opção Compile Project1 existente no menu Run. Caso já tivéssemos
salvo a aplicação com um nome qualquer a opção de compilação apareceria com o
nome que tivéssemos dado à aplicação ao invés no nome Project1. Uma vez
compilada a aplicação, podemos executá-la e ver o resultado de sua codificação.
Para isso basta selecionarmos, no menu Run, a opção Run. A aplicação será
executada e ao clicarmos no botão colocado no formulário, 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 botão.
Devemos nos lembrar sempre que, ao executarmos a aplicação por dentro do Delphi entramos
automaticamente em modo de depuração, ou seja, caso façamos uma nova alteração no código fonte
teremos de encerrar a execução antes que possamos compilar a aplicação novamente. Dessa forma, para
sairmos do modo de depuração basta fecharmos a janela principal da aplicação que, dessa forma, seremos
levados de volta à IDE do Delphi.
O primeiro arquivo a ser salvo pelo Delphi, quando selecionamos a opção Save All, refere-se à unit que
contém o código do formulário 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 aplicação.
Uma observação a ser feita é que, com a
prática poderemos começar a trabalhar com
vários formulários dentro de nossa aplicação
deixando para salvá-los depois de já termos
escrito uma quantidade relativa de código.
Essa prática é desaconselhada por alguns
motivos entre eles a possibilidade de um queda
de energia que poderia levar a perda de todo o
trabalho desenvolvido, além de que, ao
clicarmos no botão Save All, o Delphi inicia o
processo de gravação de todas as units
contidas em nossa aplicação e, caso exista um número relativamente grande de units ficará cada vez mais
complicado de, no momento da gravação, identificar cada uma dessa units de tal forma a fornecer,
corretamente, seus respectivos nomes. Iremos fornecer no tópico a seguir uma explicação mais detalhada a
Página: 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
formulário principal de nossa aplicação, ou no caso
de estarmos trabalhando com vários formulários e
tenhamos salvo todas as units referentes a esses
formulários, o Delphi irá permitir que nós salvemos o
arquivo, chamado de arquivo de projeto, referente à
nossa aplicação como ilustrado na figura ao lado. O
arquivo de projeto é um dos mais importantes dentro
de uma aplicação Delphi e ele deverá ser salvo com
um nome único dentro dessa aplicação, não podendo
por isso, ter o mesmo nome que o de uma unit
qualquer pertencente ao projeto (mesmo esses
arquivos possuindo extensões distintas como
veremos posteriormente).
program Project1;
USES
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
Página: 27
BEGIN
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Delphi 5
A exibição dos arquivos de projeto não é feita de modo imediato, ou seja, ao iniciarmos o desenvolvimento
de um novo aplicativo, o arquivo de projeto não é exibido pelo Editor de Código. Para que possamos
visualizar o arquivo de projeto devemos, no menu Project, selecionar a opção View Source. Existe uma
explicação para que o arquivo de projeto não seja exibido diretamente. Por se tratar de um arquivo muito
importante, o Delphi encarrega-se de fazer a maioria das alterações necessárias nesse arquivo, de forma
automática, ao selecionarmos as devidas opções contidas nos diversos menus da IDE do Delphi. Não
devemos alterar diretamente o arquivo de projeto a menos que tenhamos certeza absoluta das alterações
que estejamos fazendo uma vez que isso poderá acarretar o funcionamento incorreto ou, até mesmo o não
funcionamento da aplicação.
O Delphi permite o desenvolvimento de diversos tipos de aplicativos tanto executáveis quanto de DLLs.
Dentre aquelas aplicações executáveis podemos distinguir dois tipos principais: as console applications e
as aplicações GUI (Graphical User Interface), que são as aplicações tradicionais
do ambiente Windows que possuem um ambiente gráfico para interagir com o
usuário. Apesar de não muito comum podemos ter um programa Delphi escrito
apenas no arquivo de Projeto. Essas aplicações, que em sua grande maioria
constituem as chamadas console applications, não possuem uma interface gráfica
associada a eles e são executados como antigos programas DOS. Já as demais
aplicações para o ambiente Windows apresentam, em geral, uma interface gráfica
coma a qual o usuário poderá interagir com o aplicativo em questão.
Independentemente de qual tipo de aplicação estejamos desenvolvendo, termos de
salvar vários tipos de arquivos durante o desenvolvimento de nossas aplicações e
aprender a correlação entre eles. Para isso veremos rapidamente as opções
disponíveis no menu File. Através dessas opções podemos manipular os diversos
arquivos que irão compor as nossas aplicações. As opções dispostas nesse menu
estão divididas de acordo com a funcionalidade de cada opção. O primeiro grupo
de opções permite a criação de uma nova aplicação, através da opção New
Application, bem como de novos formulários e frames, através das opções New
Form e New Frame. Existe ainda, nesse grupo de itens de menu, a opção New que
permite a criação auxiliada de novas aplicações e formulários através do Object Repository que será visto
posteriormente. O segundo grupo de opções permite a abertura de projetos e outros arquivos salvos
anteriormente. Lembramos que no caso de não existir nenhum projeto aberto e através da opção Open,
abramos um formulário, não serão possíveis a compilação e execução desse arquivo! Isso decorre do fato
de termos aberto um formulário e não um projeto. O terceiro grupo de opções 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 executável da aplicação após a sua
compilação. O quarto “grupo de opções”, composto apenas pela opção Use Unit, será visto posteriormente
quando estivermos detalhando o conceito de units. O último conjunto de opções é responsável pela
impressão tanto gráfica dos formulários quanto do código fonte escrito nas units. A última opção permite
que fechemos o Delphi. No caso de existir qualquer alteração feita no código do projeto que esteja aberto,
o Delphi, antes de ser finalizado, exibirá uma caixa de diálogo confirmando se as alterações devem ou não
ser salvas.
Já sabemos que as console applications são desenvolvidas utilizando simplesmente o arquivo de projeto,
porém, a grande maioria dos aplicativos a serem desenvolvidos não serão console applications, mas sim
aplicações que irão conter uma interface gráfica que irá interagir com os usuários dessas aplicações. É por
isso que, para esse segundo tipo de aplicativo, existirão outros arquivos além do arquivo de projeto. Dentre
esses outros arquivos podemos destacar aqueles cuja extensão é dfm os quais irão conter todas as
definições gráficas de cada formulário contido na aplicação. Ou seja, para cada formulário que colocarmos
em nosso aplicativo será salvo um arquivo de extensão dfm associado. Além do arquivo dfm existirá,
associado a ele, um arquivo de extensão pas que irá conter tanto todo o código fonte referente aos eventos
desse formulário quanto qualquer outro código fonte que tenhamos escrito para esse formulário. Esse
arquivo, chamado de unit, é exibido no Editor de Código do Delphi para que o programador possa
desenvolver o aplicativo.
Além das units associadas aos arquivos de formulários, a aplicação poderá conter units isoladas. Essas
units que não estão associadas a qualquer formulário são utilizadas principalmente para declaração de
funções, variáveis e constantes de uso global dentro da aplicação. Além desses arquivos apresentados até
aqui, o Delphi, ao salvarmos o nosso aplicativo, salva alguns arquivos adicionais contendo aspectos de
Página: 28
Delphi 5
configuração do ambiente bem como de configuração do próprio 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 extensões de arquivos salvos pelo ambiente do
Delphi ilustrando também o seu papel.
Extensão Descrição
Bpg Arquivo que contém a indicação de quais projetos compõe um Project Group bem como
as diretrizes a serem utilizadas no momento de suas compilações.
Dpr Arquivo que contém as declarações de cada aplicativo desenvolvido no Delphi. É através
desse arquivo que o compilador pode identificar quais units pertencem ao aplicativo bem
como a forma com a qual o aplicativo será inicializado.
Dfm Esse arquivo contém o código responsável pela definição de cada formulário dentro da
aplicação, ou seja, é nesse arquivo que se encontra a indicação da localização de cada
componente do formulário bem como os valores a eles atribuídos dentro do Object
Inspector.
Pas Os arquivos com essa extensão contém código fonte escritos em Object Pascal. Esses
arquivos podem ou não estar associados a arquivos dfm.
Res Os arquivos com essa extensão contêm diversos recursos que serão ou poderão ser
utilizados pela aplicação tais como o ícone da aplicação e bitmaps entre outros.
Dof O arquivo de opções do Delphi (Delphi Options File) contém a configuração atual do
projeto. Tais configurações podem ser exibidas ao selecionarmos a opção Options listada
no menu Project.
Cfg O arquivo de extensão cfg é gravado para possibilitar a compilação de um projeto Delphi
a partir da linha de comando, sem ser necessário que o projeto seja aberto dento da IDE
do Delphi.
Além dos arquivos com as extensões listadas acima, o Delphi pode gerar outros arquivos de outras
extensões dependendo do tipo de aplicação que esteja sendo desenvolvido ou da configuração 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 não precisam estar vinculadas a
um arquivo de formulário, porém o inverso não acontece. Ou seja, para cada formulário que colocarmos
em nosso aplicativo existirá uma unit e um arquivo de formulário associado.
Página: 29
Delphi 5
Uma vez não existindo nenhum aplicativo temos dois caminhos a seguir: escolher a opção New Application
localizada no menu File e começar um novo aplicativo ou escolher a opção New localizada nesse mesmo
menu. Caso optemos pela primeira opção o Delphi irá propiciar o desenvolvimento de uma nova aplicação
padrão. Essa aplicação irá permitir, a menos que tenhamos
alterado a configuração inicial do Delphi, o desenvolvimento
de uma aplicação padrão para o ambiente gráfico e não uma
console application. Essa aplicação poderia ser modificada de
tal forma a permitir o desenvolvimento de uma console
application, porém essa não é a melhor alternativa,
principalmente para aquelas pessoas que estão iniciando o
processo de aprendizado dentro do Delphi. Dessa forma, resta-
nos partir para a segunda opção, a seleção da opção New
localizada no menu File. Ao fazermos isso, nos será
apresentada a caixa de diálogo New Items mostrada ao lado.
Através dessa caixa de diálogo podemos escolher dentre várias
opções de elementos contidos no Object Repository. Existe a opção de escolha desde formulários pré
definidos até wizards que irão facilitar o desenvolvimento de novas aplicações. Cada uma dessas opções
está dividida em guias de acordo com as suas finalidades. Para darmos início à nossa console application,
vamos selecionar o ícone Console Application localizado na guia New.
Uma vez selecionada essa opção, o Editor de Código do Delphi passa a exibir o código inicial de nossa
aplicação como mostrado na figura. Como podemos observar, uma aplicação console é composta,
inicialmente, pelo arquivo de projeto. Porém, ao
contrário do que acontecia com arquivos de
projeto comuns, existe no código apresentado
uma diretriz de compilação que indica ao
compilador Delphi que a aplicação sendo
desenvolvida trata-se de uma console
application e não uma aplicação com interface
gráfica tradicional. Excluindo essa diferença, o
restante do código apresentado no arquivo de
projeto é idêntico ao encontrado em aplicações
gráficas tradicionais, ou seja, é composto pela
palavra reservada program seguida pelo nome
da aplicação, uma seção indicada pela palavra uses que será vista posteriormente e, por fim, um bloco
begin e end que irá conter o código a ser executado pela aplicação.
Devemos fazer uma pequena observação com relação ao nome da aplicação escrito logo após a palavra
reservada program. Já mencionamos o fato de que , quando trabalhamos com o arquivo de projeto não
devemos fazer alterações manualmente uma vez que o Delphi faz as devidas alteações quando necessárias.
Essa observação também é válida quando estamos trabalhando com aplicações console. Devemos evitar
alterar o nome da aplicação diretamente no código fonte de nossa aplicação 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 através da opção 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 físico do arquivo.
Página: 30
Delphi 5
Com o objetivo de ilustrar o desenvolvimento de uma aplicação console, vamos escrever o código
necessário para executar o mais tradicional exemplo de programa, o Alô Mundo. Para isso, no lugar do
comentário Insert user code here, devemos escrever o código abaixo.
Writeln(‘Alô Mundo´);
Página: 31
Delphi 5
Object Repository. Vamos abordar inicialmente a criação de uma aplicação default e mostrar a
funcionalidade de cada arquivo criado nesse processo.
A caixa de diálogo Object Repository está dividida em dois listboxes. O primeiro deles exibe o nome das
guias que são apresentadas na caixa de diálogo New Items (exibida quando selecionamos a opção New
localizada no menu File visto anteriormente). Além das guias exibidas no Object Repository, a caixa de
diálogo New Items ainda exibe algumas guias adicionais como, por exemplo, uma guia que contém os
próprios formulários contidos na aplicação corrente. Os primeiros três botões contidos nessa caixa de
diálogo permitem ao programador criar novas guias, bem como, renomear e remover as guias já existentes.
O segundo listbox exibe quais objetos estão localizados na guia selecionada. Ao selecionarmos um objeto,
os dois últimos botões ficam habilitados para que possamos tanto editar quanto remover do repositório esse
objeto. Além dos botões, encontram-se nessa caixa de diálogo três checkboxes, habilitados alternadamente,
que permitem tanto a escolha de qual formulário será definido como default, ou seja qual formulário será
criado ao selecionarmos a opção New Form contida no menu File, quanto qual formulário será definido
como o formulário principal default, ou seja, ao selecionarmos a opção New Application qual será o
formulário criado inicialmente. Além disso, temos a opção de definir qual o projeto default, ou seja, qual
será o formato da aplicação default a ser criada quando selecionarmos a opção New Application.
Página: 32
Delphi 5
aplicações. Através da seleção da opção Application Wizard o Delphi irá construir um novo aplicativo
utilizando-se para isso de respostas que o desenvolvedor for fornecendo a uma série de caixas de diálogo a
ele apresentadas.
Uma vez terminado o processo de construção inicial da aplicação através do Wizard, o Delphi disponibiliza
para o desenvolvedor uma aplicação com sua interface e, até mesmo, algum código pronto para que seja
dado início à codificação efetiva. Apesar da utilização do wizard proporcionar um ganho inicil no tempo de
desenvolvimento, sua utilização efetiva dentro do desenvolvimento de novas aplicações é relativamente
pequena. Essa pouca utilização deve-se principalmente ao fato de que o idioma no qual o formulários e
demais componentes são construídos é o inglês, o que não ajuda muito quando o desenvolvimento involve
um aplicativo para ser executado utilizando-se de um outro idioma.
program Project1;
A próxima seção encontrada no arquivo de projeto é iniciada pela palavra reservada uses. Essa seção é
bastante importante uma vez que ela indica quais arquivos são necessários à compilação de nosso
aplicativo. Na maioria dos casos o Delphi irá manipular diretamente essa seção do arquivo de projeto a
medida em que formos incluindo ou excluindo formulários de nossa aplicação, porém, em algumas
situações poderemos querer acrescentar manualmente algum arquivo nessa seção.
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
Página: 33
Delphi 5
Podemos observar que existem dois tipos de declarações dentro da seção uses exibida acima. A primeira
delas contém uma referência a uma unit (a unit Forms) que, a princípio, não está incluída em nosso
aplicativo enquanto que a segunda é a unit associada ao formulário inicial de nosso aplicativo (a unit
Unit1). A declaração da unit Forms no arquivo de projeto é importante uma vez que é nessa unit que estão
as declarações de funções e variáveis necessárias ao funcionamento inicial do aplicativo e não deve ser
removida. Já a segunda declaração indica a existência da Unit1 dentro do projeto. A medida em que novas
units vão sendo adicionadas ao projeto as suas respectivas declarações vão sendo colocadas na nessa seção
uses automaticamente pelo Delphi.
Outro ponto importante a ser mencionado é a forma com que o Delphi declara essas units dentro da seção
uses. Observe que a declaração da unit não utiliza a sua extensão. Essa é a razão pela qual, no momento em
que salvamos o projeto, ele não deve ter um nome que já tenha sido previamente atribuído a uma unit. Uma
vez que, dessa forma, o compilador Delphi não teria como distinguir quando o programador estivesse
fazendo referência a uma unit ou ao projeto.
Um último ponto a ser discutido aqui, porém também de fundamental importância é a localização das units
em disco. O Delphi, ao tentar abrir qualquer unit para compilação ou simplesmente para a sua exibição no
Editor de Código, irá procurar no diretório onde o projeto foi salvo, ou no path definido dentro do arquivo
de projeto. Caso tenhamos salvo uma unit dentro de um diretório diferente daquele no qual o projeto foi
salvo, essa informação ficará armazenada no arquivo de projeto e, quando tentarmos abrir esse projeto em
um outro computador, o Delphi irá procurar por essa unit na localização 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 três units contidas no projeto, as duas primeiras referentes aos formulários 1 e 2,
e a última uma unit que não está vinculada a qualquer formulário. Observe que a unit2 não foi salva no
mesmo diretório que o projeto e sua localização está indicada através do seu caminho relativo em relação
ao qual o projeto foi salvo. Devemos ter cuidado uma vez que, ao salvarmos as units em diretórios
diferentes daquele no qual o projeto foi salvo estamos, também, dificultando o processo de backup dos
arquivos fonte pertencentes a esses projetos.
Uma outra definição colocado no arquivo de projeto refere-se a qual arquivo de recursos será utilizado
pela aplicação sendo desenvolvida. Em geral esse arquivo possui o mesmo nome que o arquivo de projeto
porém com a extensão RES. Essa informação é passada ao compilador por intermédio da diretiva de
compilação $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 aplicações console, o código a ser executado inicialmente pelo aplicativo. Porém, o
código escrito nessa seção é manipulado diretamente pelo Delphi e não devemos mexer diretamente com
ele a menos que tenhamos certeza absoluta do que estamos fazendo uma vez que, uma alteração
equivocada nesse trecho do programa poderá provocar seu mal funcionamento ou, até mesmo, a
impossibilidade de sua execução.
Em uma aplicação gráfica, como a exibida acima, o código escrito entre o begin e o end poderá conter o
código responsável pela alocação de memória dos formulários e a execução real da aplicação. Veremos
posteriormente como podemos criar formulários dinamicamente durante a execução de nosso aplicativo.
Nesses casos, a alocação de memória para esses formulários não será feita mais no arquivo de projeto mas
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2); Página: 34
Application.Run;
end.
Delphi 5
sim em algum ponto antes do qual será necessária a exibição desse formulário.
Página: 35
Delphi 5
A segunda observação refere-se aos listboxes apresentados nessa caixa de diálogo. Ao criarmos uma
aplicação dentro do Delphi e definirmos um ou mais formulários, o Delphi tem, por definição, a criação
automática de todos esses formulários, ou seja, ao executarmos o aplicativo, antes dele começar a sua
execução real exibindo a sua janela principal, será alocada memória para todos esses formulários. Esse
comportamento tem tanto seu lado positivo quanto seu lado negativo. O lado positivo está no fato de que,
ao tentarmos exibir qualquer formulário definido em nosso projeto, sua exibição será feita de forma mais
rápida uma vez que ele já foi construído em memória. Porém, uma vez que já alocamos memória para todos
os formulários da aplicação, poderemos estar reservando recursos do computador que nunca serão
utilizados, no caso por exemplo de um formulário pouco exibido, o que não é muito bom. Para evitar esses
dois extremos o Delphi permite-nos selecionar quais formulários deverão ser criados ou não
automaticamente durante o início da execução do programa. Para ilustrarmos os efeitos de termos um
formulário criado automaticamente ou não no arquivo de projeto vamos, em nosso exemplo, mover o
formulário Form3 do listbox Auto-create forms para o listbox Available forms. Ao fazermos isso, podemos
perceber que a linha referente a criação do begin
formulário Form3, contida no arquivo de projeto, Application.Initialize;
foi removida conforme ilustrado ao lado. Da Application.CreateForm(TForm2, Form2);
mesma forma, poderíamos ter feito essa alteração Application.CreateForm(TForm1, Form1);
diretamente no arquivo de projeto sem termos de Application.Run;
alterar essa informação na caixa de diálogo Project
end.
Options, como havia acontecido com a definição do
formulário principal de nossa aplicação.
A princípio poderíamos pensar que a alteração
procedure TForm2.Button1Click(Sender: TObject); de definição entre aqueles formulários criados
begin automaticamente e aqueles que estão
Form1.Show; disponíveis para o uso do desenvolvedor não
end; traria qualquer problema para a programação,
porém isso não é verdade. Para demostrarmos
procedure TForm2.Button2Click(Sender: TObject); esse problema, bastante comum quando ainda
begin não temos muita experiência em programação
Form3.Show; principalmente para o ambiente Windows,
end; vamos criar dois procedimentos, cujo código
estamos apresentando ao lado, associados
respectivamente, ao evento OnClick em cada um dos botões colocados no formulário principal de nosso
aplicativo, o Form2. Observe que não devemos escrever todo o código, mas sim as linhas contidas entre o
begin e o end de cada procedimento.
Uma vez que tenhamos escrito o código de cada procedimento
podemos compilar a aplicação. A tentativa de compilação irá resultar
em três erros conforme mostra a figura ao lado. A única opção que
temos nesse momento é pressionar o botão OK. Ao fazermos isso, uma
mensagem semelhante aquela apresentada abaixo é exibida. Por ora
não iremos fornecer uma explicação a respeito do significado dessa
mensagem. Apenas vamos clicar no botão Yes. Feito
isso uma segunda caixa de diálogo, desta vez
referente ao formulário Form3 será exibida e,
novamente, devemos clicar o botão Yes. O Delphi
retorna para o Editor de Código para que possamos
tentar compilar novamente a nossa aplicação. Desta
vez, a aplicação será compilada sem problemas, gerando o executável de nosso aplicativo. Podemos então
executá-lo dentro do ambiente Delphi como também fora dele.
Ao executarmos a aplicação, o formulário principal da
aplicação será exibido. Nele, como poderíamos esperar, estão
contidos dois botões que, ao serem clicados, irão executar o
código que escrevemos anteriormente. Ao clicarmos no
primeiro botão o formulário Form1 é exibido uma vez que
essa foi a função do código que escrevemos no evento OnClick do botão Button1. Porém, ao clicarmos no
botão 2 a mensagem de erro mostrada ao lado é exibida. A ocorrência desse erro deve-se justamente a não
criação automática do formulário pelo Delphi. Uma vez que ainda não criamos o formulário, ou seja,
nenhuma memória foi alocada para conter os valores atribuídos às suas propriedades e métodos, ao
Página: 36
Delphi 5
invocarmos um de seus métodos (o método Show que veremos posteriormente), isso irá provocar um
acesso ilegal à memória do Windows. Para evitarmos que isso ocorra, devemos nos preocupar em alocar
memória para esses objetos antes de podermos utilizá-los e, posteriormente à sua utilização, devemos
também desalocar essa memória, liberando-a para outros objetos tanto dessa quanto de outras aplicações.
A próxima guia da caixa de diálogo Project Options que iremos
abordar é a guia Application. Através dessa guia, exibida ao lado, o
programador pode definir algumas características próprias da
aplicação. Nela temos a opção de definir um título para a aplicação,
título esse que será exibido quando a aplicação for minimizada, o
nome do arquivo de ajuda que será associado ao aplicativo e o ícone a
ser exibido quando a aplicação for minimizada. Por fim, temos a
opção de indicar qual a extensão a ser atribuída ao arquivo a ser
gerado pela compilação do código fonte de nossa aplicação. Devemos
observar que aplicações de extensão exe não necessitam do
preenchimento dessa opção. Já ao desenvolvermos DLLs ou arquivos
ActiveX, a extensão desejada para o arquivo compilado, seja dll ou ocx, deverá ser indicada nessa opção.
Uma outra guia cujo conteúdo vale a pena ser abordado é a guia Directories/Conditionals. Vimos
anteriormente que uma aplicação Delphi é capaz de gerar diversos arquivos cada um com a sua respectiva
extensão. Porém só vimos algumas das extensões que o Delphi é capaz
de gerar. Além daquelas extensões relativas a arquivos de código fonte,
ao compilarmos nossas aplicações o Delphi gera novos arquivos de
código objeto. O comportamento default do ambiente Delphi é gerar
esses arquivos de código objeto no mesmo diretório onde se encontra o
arquivo de projeto. No caso de desejarmos efetuar backups de nossas
aplicações isso não é muito desejável já que o backup só necessita ser
feito para os arquivos de código fonte uma vez que os arquivos de
código objeto são gerados a partir deles. O ideal é que esses arquivos
fossem gerados em outros diretórios. Essa é uma das finalidades da guia
Directories/Conditionals, ou seja, definir os diretórios nos quais
arquivos de código objeto serão gerados. A figura ao lado mostra a guia Directories/Conditionals definido
os diretórios nos quais os arquivos compilados e os executáveis serão gerados. Caso nada for colocado,
será assumido o diretório 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 instalação do Delphi. A guia Packages permite ao desenvolvedor
definir quais os pacotes instalados que poderão ser utilizados durante o desenvolvimento de uma aplicação
bem como se a aplicação gerada irá ou não utilizar pacotes (packages) em tempo de execução. Pacotes são
arquivos especiais do Delphi que irão conter, entre outras coisas, todas
as definições das classes e componentes que podem ser utilizados
assemelhando-se a uma DLL. Através da seleção dos Design Packasges
podemos definir quais os pacotes que estão disponíveis 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 reapareçam temos de acrescentar o pacote novamente. Já a
opção Build with runtime packages indica ao compilador Delphi que o
executável do aplicativo utilizará pacotes em tempo de execução. Ao
selecionarmos essa opção passamos a gerar arquivos executáveis com
um tamanho menor, porém passamos a ter a necessidade de levar, junto com os arquivos da aplicação, os
pacotes de componentes que foram utilizados durante o desenvolvimento desse projeto. Lembre-se que
esses pacotes, por possuírem todo um conjunto de componentes dentro deles, não são arquivos pequenos o
que poderá tornar uma desvantagem ter de leva-los junto com o executável do projeto. É função do
desenvolvedor identificar a opção a ser adotada.
Agora que já temos um bom número de informações a respeito de um projeto sendo desenvolvido em
Delphi, podemos nos concentrar nos demais arquivos de código fonte que irão compor as aplicações que
iremos desenvolver. Dessa forma, vamos começar o nosso estudo a respeito das units, sua composição e do
Editor de Código.
Página: 37
Delphi 5
3.As Units
As units formam, principalmente nas aplicações gráficas, o coração de toda a aplicação. É nas units que
todo o código fonte da aplicação é escrito. Nela encontram-se tanto definições a respeito de variáveis e
constantes quanto a implementação dos procedimentos e funções existentes na aplicação.
Toda unit é composta de pelo menos duas palavras reservadas utilizadas para indicar compilador o início e
o término da unit. Essas palavras reservadas são unit e end.
Conforme o código escrito ao lado, podemos observar que a unit Unit1;
palavra reservada unit é utilizada para indicar o início de uma
unit. Ao lado direito da palavra unit está a indicação de seu interface
nome. Observe que esse nome é igual ao nome do arquivo salvo
em disco, porém sem a extensão pas. Não devemos alterar implementation
manualmente o nome da unit e sim utilizar a opção Save As
localizada no menu File. Observe também que a unit é finalizada end.
pela palavra reservada end, seguida por um ponto. Devemos
observar que a palavra reservada end irá aparecer em diversos outros trechos de código dentro das units,
porém o único local onde ela irá ocorrer, seguida de um ponto, é no final da unit. Não devemos alterar essa
estrutura da unit uma vez que esse end indica o final da unit. Programadores inexperientes na programação
utilizando o Delphi trocam frequentemente o ponto por ponto-e-vírgula o que faz com que a compilação do
aplicativo não mais possa ser feita.
Página: 38
Delphi 5
comparação às demais seções que podem estar contidas em uma unit. Esse comportamento é idêntico
independentemente das units pertencerem ao mesmo projeto ou estarem contidas em projetos distintos.
Já sabemos que a seção interface é utilizada para tornar diversos tipos de declarações disponíveis para
outras units. Porém, não basta apenas escrevermos na seção interface o código que desejamos compartilhar
com outras units para que esse compartilhamento ocorra. Para que isso seja possível, algumas ações por
conta do programador devem ser realizadas. Veremos agora, as cláusulas nas quais a seção interface está
dividida e como poderemos utiliza-las para declarar código e tornar esse código compartilhado com outras
units.
Página: 39
Delphi 5
3.1.1.3.Declarações de tipos
Além dos tipos básicos apresentados acima e ainda, aqueles que mesmo não tendo sido exibidos acima
compõe os tipos básicos do Delphi, o desenvolvedor ainda dispõe da possibilidade de criar seus próprios
tipos de dados. Uma vez que esses novos tipos de dados forem criados, eles podem ser utilizados
normalmente como se fossem tipos básicos da linguagem, podendo ser declaradas variáveis e constantes a
partir deles.
Existem cinco possibilidades de criarmos novos tipos de dados dentro do Delphi, são elas:
• Tipos simples
• Conjutnos (Sets)
• Tipos Enumerados
• Registros
• Classes
Colocamos nessa definição a possibilidade de criarmos classes como um novo tipo de dado por duas razões
básicas. A primeria delas deve-se ao fato de que a localização de suas declarações é a mesma dos demais
tipos de dados vistos, todos estão
localizados na cláusula type da unit. A unit UExemplo1;
segunda razão é devido a forma de
utilização das mesmas, ou seja, uma vez interface
declarada uma classe ela pode ser utilizada
na declaração de variáveis, que no caso de type
estarmos trabalhando com classes serão nome = string[50];
chamados de objetos, que pertençam 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 seção End;
type, seção responsável por conter todas as …
novas declarações de tipos dentro de uma
unit. O exemplo ao lado ilustra a declaração
de novos tipos de dados.
Dois pontos podem ser observados tendo em vista o exemplo dado. O primeiro ponto refere-se ao fato de
podermos ter várias declarações de novos tipos dentro de uma mesma cláusula type. Esse ponto que
estamos abordando agora não é válido apenas quando estamos definindo novos tipos de dados. Cada uma
das cláusulas até aqui apresentadas ou aquelas que ainda serão vistas possuem seu escopo definido até o
Página: 40
Delphi 5
início da próxima cláusula. Dessa forma não é necessária a cada nova definição de tipo a colocação da
palavra reservada type.
O segundo ponto que devemos observar é a própria declaração de novos tipos de dados. No exemplo
apresentado acima são declarados três novos tipos. O primeiro deles refere-se à criação 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 declaração de novos tipos de dados simples
restringe-se basicamente à atribuição de um novo nome a um tipo de dados básico ou que tenha sido
previamente definido na cláusula type. Podemos então perguntar qual a finalidade de declararmos um tipo
de dados simples! A resposta é mais semântica do que prática. 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 variáveis desse novo tipo do que no caso de sua não existência, ou
seja, ao declararmos uma variável 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 manutenção do código
fonte criado. Caso desejemos alterar o tamanho das variáveis do tipo nome basta que o façamos em um
único lugar que essa alteração será refletida em todas os pontos do programa onde variáveis desse tipo
haviam sido declaradas.
3.1.1.3.2.Conjutos
Uma segunda maneira de declararmos novos tipos de dados dentro do Delphi é através da declaração de
conjuntos (sets). Um conjunto funciona de forma semelhante à um array (a declaração de arrays será vista
posteriormente dentro da declaração de variáveis) podendo conter uma série de valores simultaneamente
dentro de sua definição. A seguir apresentamos a sintaxe e alguns exemplos relacionados à declaração de
um tipo de dados conjunto.
Sintaxe
NomeNovoTipo = set of TipoBasico
Exemplo
Respostas = set of char;
Resultados = set of 1..50;
A declaração de conjuntos permite que sejam criadas variáveis que irão conter um conjunto de valores
válidos dentro daqueles fornecidos através da declaração do novo tipo. No exemplo acima, a declaração do
tipo de dados Respostas irá permitir que variáveis 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 não termos mostrado como é feita a declaração de variáveis dentro do Delphi, o exemplo a
seguir ilustra a atribuição de valores à variáveis dos tipos criados no exemplo acima. Para obter
informações a respeito da declaração de variáveis, o leitor deve consultar a próxima seção deste capítulo.
Página: 41
Delphi 5
Exemplo
Resp1 := [ ‘a’, ‘g’, ‘e’, ‘d’];
Resul1 := [1, 34, 44, 3];
Como podemos observar, na atribuição de valores à variáveis do tipo conjunto, é utilizados os sinais de ‘[‘
e ‘]’. Entre esses sinais, são colocados os valores atribuídos à variável em questão. Um outro ponto a ser
observado refere-se a não existência de ordenação nem de duplicidade dentro dos valores atribuídos ao
conjunto. Podemos observar algumas propriedades do tipo conjunto no Object Inspector. Uma dessas
propriedades é a BorderIcons pertencente ao formulário. No Object Inspector a manipulação dos valores
que estão 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 contrário. No caso de desejarmos modificar
esses valores via codificação, devemos seguir a sintaxe apresentada acima.
Além da atribuição de valores à variáveis do tipo conjunto, operações de manipulação desses valores
podem ser efetuadas durante a codificação 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á atribuído);
Os exemplos mostrados acima ilustram dois pontos importantes a serem observados com relação as
variáveis do conjunto. O primeiro ponto refere-se às operações de adição e subtração de elementos de um
conjunto. Como podemos observar essas duas operações são bastante intuitivas e funcionam de forma
semelhante àquela vista na matemática. Ao somarmos dois conjuntos, como mostrado no primeiro
exemplo, o resultado formado por um único conjunto composto pelos caracteres ‘c’, ‘g’, ‘d’, é atribuído à
variável Resp1. Observe que não existem duas ocorrências do caractere ‘c’, ou seja, elementos repetidos
são eliminados do conjunto permanecendo apenas uma cópia 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 não provoca erro. Além disso, podemos utilizar a própria variável na qual
desejamos colocar o resultado da operação como um dos elementos que irão compô-la. Nesse exemplo,
estamos removendo os elementos 34 e 12 do conjunto Resul1. Por fim, o terceiro exemplo ilustra a
utilização do operador in. Esse operador é utilizado para verificar a existência ou não de um elemento em
um conjunto. Caso o elemento exista, o resultado da operação é o valor booleano true, caso contrário o
resultado será false.
3.1.1.3.3.Tipos enumerados
Além da possibilidade de declararmos tipos de dados simples e conjuntos, uma outra possibilidade de
declaração de tipos de dados é a declaração de tipos enumerados. Uma maneira simplificada de definirmos
tipos enumerados é que um tipo enumerado é composto por uma listagem de possíveis valores a serem
atribuídos a uma variável do tipo sendo definido. Um exemplo típico de um tipo enumerado, é o tipo de
dados boolean. Quando declaramos uma variável desse tipo já sabemos quais os valores que podem ser
atribuídos a ela: true ou false. Observe que esses valores não são strings, são valores tratados de maneira
idêntica a valores como os números e por isso não vem entre aspas durante uma atribuição. Uma vez que
declaremos uma variável booleana, qualquer outro valor que tentemos atribuir resultará em um erro de
sintaxe e a aplicação não poderá ser compilada. A seguir apresentamos a sintaxe para a declaração de tipos
enumerados.
Sintaxe
NomeNovoTipo = (Valor1, Valor2, ..., ValorN);
Exemplo
Cores = (Verde, Vermelho, Azul, Amarelo);
Naipes = (Ouro, Copas, Espadas, Paus);
Página: 42
Delphi 5
Observe os exemplos acima. Neles podemos perceber que quando criamos um tipo de dados enumerado,
estamos definindo quais valores podem ser atribuídos à variáveis desse novo tipo. No exemplo dado acima,
caso desejássemos criar uma variável do tipo de dados chamado cores, os únicos valores que poderiam ser
atribuídos a essa variável seria um dos seguintes valores: Verde, Vermelho, Azul ou Amarelo. É importante
observar que ao tentarmos atribuir qualquer um desses valores a uma variável, o valor deveria ser atribuído
diretamente, como mencionado anteriormente, uma vez que o valor não é uma string e sim um valor
específico para um tipo enumerado. Ilustramos essa observação a seguir através da atribuição de um valor à
variável UmaCor. Essa variável foi previamente declarada como sendo do tipo Cores apesar de no exemplo
esse fato não estar sendo mostrado. Mostraremos como declarar variáveis posteriormente nesse capítulo.
Exemplo
UmaCor := Azul; {Atribuição correta}
UmaCor := ‘Azul’; {Atribuição errada, não é uma string}
UmaCor := Branco; {Atribuição errada, não existe o valor Branco}
Um outro ponto a ser mencionado quando trabalhamos com tipos enumerados refere-se ao fato de que a
definição dos valores que irão compor o tipo enumerado também estabelece uma ordenação sobre eles. Ou
seja, a cada valor definido para o tipo enumerado está associada a sua posição em relação aos demais
valores. No exemplo dado anteriormente, o valor Vermelho possui valor de ordenação menor do que o
valor Azul, sendo considerado portanto menor do que o Azul, que, por sua vez, possui um valor de
ordenação menor do que o valor Amarelo. Dessa forma, é perfeitamente possível a escrita de código
comparativo entre esses valores como mostrado a seguir.
Exemplo
if UmaCor <= Vermelho then
Nesse exemplo mostramos a comparação do valor contido na variável UmaCor com um dos valores do tipo
de dados enumerado Cor. Esse tipo de operação bem como qualquer outra que envolva a necessidade de
comparação 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é então. A primeira forma que podemos declarar esses
tipos mais elaborados é através da declaração de um tipo de dados registro. Um tipo de dados registro é
composto por declarações de vários tipos de dados diferentes em uma única declaração, onde cada um
desses tipos é chamado de um campo dentro do registro. Mostramos abaixo a sintaxe para a declaração de
um registro.
Sintaxe
NomeNovoTipo = record
Campo1 : TipoCampo;
...
CampoN : TipoCampo;
end;
Exemplo
TFuncionario = record
Nome : string[50];
Idade : byte;
Cargo, Setor : string[30];
Página: 43
Delphi 5
end;
Observe que ao declararmos o tipo de dados TFuncionario estamos, antes de tudo, respeitanto um padrão
adotado no desenvolvimento de novos registros, e posteriormente como iremos observar, como também de
novas classes, iniciando o nome de cada novo tipo com a letra ‘T’. Uma vez feita essa observação com
relação ao nome do tipo de dados, voltemos à explicação do exemplo propriamente dito. Nesse exemplo,
podemos observar a existência de quatro campos dentro do tipo TFuncionario, são eles: os campos Nome,
Cargo e Setor do tipo string e o campo Idade que armazena um valor inteiro. Devemos observar também
que poderíamos ter criado campos de qualquer tipo de dados, até mesmo de tipos de dados Record desde
que eles tivessem sido previamente declarados.
A declaração de tipos de dados registro é útil devido a possibilidade de podermos agrupar valores dentro de
uma única declaração. Quando, por exemplo, declararmos uma variável desse tipo de dados estaremos
colocando todas as informações a respeito de um funcionário em um único lugar, permitindo o acesso
rápido a cada um desses campos por intermédio de uma única variável.
Exemplo
Func.Nome := ‘José da Silva’;
Func.Idade := 18
Func.Cargo := ‘Analista de Sistemas’;
X := Func.Idade;
Os exemplos acima ilustram a utilização de uma variável 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 através da utilização do operador ponto. Para tanto basta que o valor que
esteja sendo atribuído, bem como a variável 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 programação orientada a objetos permite a declaração tanto de
novas classes quanto de objetos. A declaração de objetos será vista na próxima seção. Feita essa
observação vamos começar nosso estudo em relação à declaração de classes dentro do Delphi. A
declaração de classes é bastante semelhante à declaração de um tipo de dados record vista anteriormente.
Sintaxe
NomeNovaClasse = class
Declarações 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 declaração de uma classe, essa sintaxe
não está completa. Basicamente, o que ilustramos aqui é a sintaxe bastante semelhante à da declaração de
um record, onde a diferença encontrada até este momento entre as duas declarações, é a substituição da
palavra reservada record pela palavra reservada class. No exemplo dado, podemos perceber pelo menos
mais uma grande diferença entre as declarações de records e classes no que diz respeito à possibilidade de
declararmos métodos dentro da declaração de uma classe, fato esse que não pode ocorrer dentro da
Página: 44
Delphi 5
definição de um record. No entanto, deixaremos para depois a descrição mais detalhada da sintaxe da
declaração de uma classe.
3.1.1.4.Declarações de variáveis
Uma vez que já conhecemos alguns dos tipos básicos existentes dentro do Delphi e também sabemos como
criar novos tipos de dados a partir desses tipos básicos, vamos explorar a principal razão da existência de
tipos de dados dentro de uma linguagem de programação, a declaração de variáveis.
interface interface
type var
TNome = string[50]; Nome : TNome;
var type
Nome : TNome; TNome = string[50];
implementation implementation
end. end.
Acima apresentamos dois exemplos de declaração de variáveis. O primeiro exemplo funciona
perfeitamente e pode ser compilado sem qualquer problema. Já o segundo exemplo, caso tentemos
compila-lo, irá resultar em erro de sintaxe. O erro ocorre uma vez que estamos tentando declarar a variável
Nome que supostamente é do tipo TNome. Para o Delphi, no momento da compilação da linha referente à
declaração da variável Nome, não existe definido nenhum tipo de dados chamado TNome. Dessa forma, as
declarações feitas no segundo exemplo apresentado acima não funcionam e resultam em erro de sintaxe.
Resta-nos fazer duas pequenas observações a respeito da declaração de variáveis dentro do Delphi. A
primeira refere-se à declaração de múltiplas variáveis. Quando desejamos declarar várias variáveis de um
mesmo tipo de dados podemos fazê-la separando cada variável por uma vírgula e, ao final das declarações
dos nomes das variáveis, colocamos o sinal de dois pontos e o tipo dessas variáveis. A Segunda observação
refere-se à possibilidade de declaração de várias cláusulas var dentro de uma mesma seção interface.
Apesar de podermos declarar várias dessas cláusulas, tal tipo de procedimento não é muito comum e deve
ser evitado por uma simples questão de estética e organização do código fonte.
Página: 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 possíveis de declarações de arrays. A primeira delas refere-
seà declarações de arrays unidimensionais enquanto que a segunda mostra como podemos declarar arrays
multidimensionais. No primeiro exemplo, a declaração da variável gabarito que pode conter vinte
caracteres cada um deles nas posições de 1 a 20 do array, respectivamente. Já no segundo exemplo, a
variável 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 observações fazem-se necessárias em relação à declaração de arrays bem como o acesso aos
valores neles contidos. A primeira observação diz respeito a sintaxe da declaração do array. Como
mostrado acima, na declaração do array é estabelecida tanto a posição inicial quanto a final dos elementos
do array. Através dessa definição fica também estabelecida a quantidade de elementos que poderão estar
contidos nesse array. Para esses valores podemos estabelecer qualquer numeração, porém as numerações
mais comuns para a posição inicial do array é a posição 0 ou a posição 1, como feito nos exemplos
anteriores. Apesar disso, fica a critério do desenvolvedor a definição de quais serão as faixas de valores a
serem utilizadas.
A segunda observação refere-se ao acesso aos valores contidos no array. Para acessarmos cada elemento
contido no array devemos fazer referência a posição em que esse elemento ocorre dentro do array. O
exemplo abaixo ilustra algumas das diversas formas que podemos utilizar para fazer referência a uma
posição específica 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.Declarações de constantes
Um outro tipo de declaração bastante comum em muitas unit Unit2;
linguagens de programação é a declaração de constantes.
Como não poderia deixar de ser, o Delphi também permite interface
a declaração de constantes que poderão ser utilizadas em
seu código fonte. Como vem acontecendo com outros const
tipos de declarações, a declaração de constante também DiasNaSemana = 7;
possui um local especial na qual elas ocorrem, a cláusula Companhia = 'Ibratec';
const. A figura ao lado exemplifica a declaração de SalarioMinimo = 151.00;
constantes dentro de uma unit do Delphi. A sintaxe da HorasNoDia = byte(24);
declaração de constantes é semelhante àquela vista para a DiasDoAno : integer = 365;
declaração de variáveis. Devemos colocar o nome da
constante a ser declarada seguida no sinal de igualdade e o implementation
valor a ser atribuído. Essa é a sintaxe a ser utilizada na
maioria das declarações de constantes. Porém, como end.
veremos a seguir, existem algumas exceções a essa
sintaxe.
No exemplo apresentado podemos observar dois pontos interessantes em relação à declaração de
constantes. O primeiro ponto refere-se a possibilidade de informarmos o tipo de dados ao qual a constante
Página: 46
Delphi 5
sendo declarada deverá possuir. Podemos informar o tipo de dados desejado apenas para constantes de
tipos de dados ordinais. Caso não informemos o tipo de dados para constantes ordinais ou de qualquer
outro tipo de dados, o Delphi possui uma série de regras que irão determinar o tipo de dados ao qual a
constante irá pertencer. Para uma melhor definição das regras a respeito da atribuição de tipos de dados a
constantes declaradas dentro do Delphi, o leitor deverá consultar a ajuda do próprio Delphi.
O segundo ponto que devemos observar é a declaração de constantes tipadas. Uma constante tipada
assemelha-se bastante à declaração de variáveis até mesmo em sua sintaxe. A constante DiasDoAno
representa esse tipo de declaração de constantes. Além da diferença de sintaxe entre a declaração de
constantes tipadas e aquelas que não são tipadas, existe uma importante diferença comportamental entre
elas. As constantes tipadas, ao contrário do que acontece com as constantes não tipadas, também chamadas
de constantes verdadeiras, podem ter seus valores modificados durante a execução da aplicação. Esse
comportamento faz com que as constantes tipadas assemelhem-se ainda mais a variáveis.
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 função ou um procedimento
temos a possibilidade de passar ou não argumentos para eles. No caso de não passarmos qualquer
argumento, a utilização dos parênteses não deve ser feita, ao contrário do que ocorre em outras linguagens
de programação. Já quando desejamos passar argumentos para qualquer função ou procedimento, devemos
passar cada um dos argumentos e seus respectivos tipos de dados separados por um ponto e vírgula. Nesses
casos, os argumentos devem vir com seus tipos indicados como na declaração de variáveis de um unit, ou
seja, separados de seus tipos através de um sinal de dois pontos.. Opcionalmente, quando da declaração de
dois ou mais argumentos de mesmo tipo, esses argumentos podem vir separados por vírgula como também
acontecia nas declarações de variáveis. Quando tratamos com funções devemos também indicar o tipo de
dados a ser retornado quando da execução da função. Observe que indicamos um único tipo de dados a ser
retornado uma vez que uma função poderá retornar apenas um único valor.
Um outro aspecto importante que devemos observar está no fato de que apenas declaramos os
procedimentos e as funções, ou seja, seus cabeçalhos. Veremos posteriormente como e onde declarar o
corpo desses procedimentos e funções além de como poderemos indicar o valor a ser retornado por cada
uma das funções declaradas.
Página: 47
Delphi 5
Exemplo
Passagem por valor Passagem por referência
X := 3; X := 3;
ProcExemplo (X); ProcExemplo(X);
Qual o valor de X após a execução? Qual o valor de X após a execução?
Definição do corpo do procedimento
procedure ProcExemplo(Argumento : integer);
begin
Argumento := Argumento + 1;
end;
Antes de tudo devemos ressaltar que iremos tratar mais detalhadamente a escrita de procedimentos e
funções posteriormente. Por enquanto, vamos tratar da diferença entre a passagem de valores por referência
ou por valor. Quando passamos valores por valor para uma função ou procedimento, esses valores
permanecem inalterados ao término da execução do procedimento ou da função, independentemente das
atribuições dentro deles. Já quando passamos valores por referência, ao alterarmos o argumento dentro da
função ou procedimento, esse será o valor após término da execução da função ou procedimento. No
exemplo acima, o valor da variável X após a execução do procedimento ProcExemplo quando da passagem
por valor permanecerá 3, enquanto que na passagem por referência será alterado para 4.
Uma vez que sabemos qual o comportamento de uma função ou procedimento com relação a passagem de
parâmetros por valor ou por referência, resta-nos saber como podemos indicar ao Delphi que queremos que
um argumento seja passado por valor ou por referência.
Sintaxe
Passagem por valor
Procedure NomeProcedure (Argumento : TipoDeDados);
Passagem por referência
Procedure NomeProcedure (var Argumento : TipoDeDados);
As sintaxes apresentadas acima, apesar de tratar apenas das declarações de procedimentos podem ser
utilizadas nas declarações de funções. Observe que, para declararmos um argumento como sendo passado
por valor não devemos fazer uso de qualquer palavra reservada. Já em declarações de argumentos passados
por referência devemos utilizar a palavra reservada var. Devemos observar que é necessário declarar a
palavra reservada var antes de cada argumento que desejamos definir como sendo passado por referência.
Sintaxe
procedure NomeProcedure (const Argumento : TipoDeDado);
Página: 48
Delphi 5
Exemplo
procedure ProcExemplo (const Argumento : integer);
Quando declaramos um argumento como sendo um parâmetro constante, estamos indicando que o
argumento passado para a função ou procedimento não pode
ser alterado no corpo do procedimento. Caso tentássemos
alterar o valor do argumento dentro do corpo da função ou
procedimento, ao compilarmos a aplicação o Delphi iria
acusar um erro como mostra a figura ao lado. Esse
comportamento assemelha-se ao que seria esperado se
tivéssemos declarado uma variável local ao procedimento ou
função. A grande vantagem em relação à declaração de uma
constante local está no fato de, ao passarmos como
argumento para a função, estaremos criando uma
“constante” dinamicamente, uma vez que o valor da
constante é atribuído no momento da chamada da função ou procedimento.
Sintaxe
procedure NomeProc (Argumentos : TipoDeDados);
Begin
Código do procedimento
Página: 49
Delphi 5
end;
Exemplo
procedure ExibeMsg(Msg : string);
begin
ShowMessage(Msg);
end;
Observe que ao escrevermos o corpo de cada procedimento ou função devemos repetir todo o cabeçalho
antes de colocarmos as palavras reservadas begin e end. Entre essas duas palavras reservadas é que iremos
escrever efetivamente o código a ser executado.
Uma vez que já sabemos tanto como declarar funções quanto como escrever o corpo de cada uma delas,
devemos nos lembrar que as funções 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 função, como
podemos indicar qual valor deve ser retornado, ao local da chamada da função.
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 função. A primeira delas é através
da utilização da palavra reservada result. Result nada mais é do que um argumento implícito contido no
cabeçalho de cada uma das funções que declaramos. Ao atribuirmos valores à palavra reservada result
estamos informando ao Delphi quais valores desejamos retornar ao ponto em que a função foi chamada. A
segunda maneira através da qual podemos retornar resultados de funções é através da atribuição do valor
desejado ao próprio nome da função. No exemplo acima, o valor true é atribuído ao próprio nome da
função VerificaCPF.
Página: 50
Delphi 5
initialization será executado automaticamente no início da execução do programa, enquanto que, para
executarmos outros procedimentos deveríamos chamar esses procedimentos para que o código associados a
eles sejam executados.
4.Os Formulários
Uma vez que já possuímos conhecimento suficiente a respeito do ambiente Delphi, podemos iniciar nosso
aprendizado naqueles itens que mais serão utilizados no desenvolvimento de nossos aplicativos. Como não
poderia deixar de ser, vamos iniciar esse processo através do estudo dos formulários que, dentro das
aplicações desenvolvidas para o ambiente Windows®, irão estar presentes em sua grande maioria.
Página: 51
Delphi 5
formulários que foram desenvolvidos nessa aplicação de tal forma a permitir sua reutilização em outros
formulários desse mesmo projeto e não formulários pré-definidos instalados junto com o Delphi. Para
criarmos um novo formulário a partir do Object Repository podemos selecionar tanto o formulário padrão
contido na guia New como qualquer outro formulário contido nas demais guias do Object Repository.
A figura acima ilustra a guia New contida no Object Repository. Nessa guia podemos observar a existência
de um ícone, responsável pela criação de um novo formulário, chamado Form. Ao selecionarmos esse
ícone e clicarmos no botão Ok o Delphi irá criar um novo formulário default. Para alterarmos o formulário
default que é criado pelo Delphi deveremos modificar a configuração do Object Repository.
Página: 52
Delphi 5
Além de podermos escolher o formulário que será criado quando da escolha de uma opção de criação de
novo formulário, temos ainda a opção de determinar qual o formulário a ser criado como sendo o
formulário principal da aplicação. Para isso basta seguirmos o mesmo procedimento descrito anteriormente,
porém ao invés de selecionarmos o checkbox relativo à opção New Form devemos selecionar o checkbox
relativo à opção Main Form.
Além de podermos definir qual o comportamento para os formulários de nossa aplicação, temos ainda a
opção de alterar o comportamento default associado à criação de novas aplicações. Ao selecionarmos um
objeto que represente novas aplicações, como por exemplo, aqueles exibidos no item Projects contido no
listview Pages ao invés de objetos associados a formulários, é exibido no canto inferior direito o checkbox
New Project. Ao marcarmos esse checkbox estaremos determinando qual objeto será utilizado no momento
da criação de um novo projeto.
Sintaxe
Objeto.Propriedade := valor;
Objeto.Método;
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 método fazemos referência inicialmente ao objeto e depois ao método ou à
propriedade que desejamos manipular. A referência ao objeto é feita através de seu nome. Uma vez que a
propriedade que esteja sendo manipulada possua subpropriedades, elas também poderão ser manipuladas
através do operador ponto como ilustrado no exemplo acima. Contudo, devemos ter cuidado para não
tentarmos manipular com propriedades do tipo set como se elas fossem objetos, como é o caso da
propriedade BorderIcons pertencente aos formulários.
Página: 53
Delphi 5
Exemplo
Formulario_Principal.ButtonOK.Caption = ‘OK’;
FormCadCliente.ButtonOK.Caption := ‘Confirma’;
Observe no quadro acima os códigos que poderiam ter sido escritos em um procedimento de evento
qualquer. Neles vemos a atribuição de valores à propriedade caption de dois componentes distintos que
possuem o mesmo nome. Isso é possível uma vez que esses componentes estão localizados em formulários
distintos. O exemplo dado acima também é proveitoso para mostrar como podemos alterar valores de
propriedades de componentes localizados em outros formulários que não aquele no qual o componente foi
colocado. Quando estamos escrevendo código queira alterar propriedades ouexecutar métodos de
componentes contidos no próprio formulário no qual o procedimento de evento foi criado, é opcional a
Página: 54
Delphi 5
colocação do nome do formulário antecedendo o nome do componente que se deseja manipular. Já quando
desejamos manipular com componentes contidos em outros formulários, essa referência é obrigatória.
Exemplo
ButtonOK.Caption := ‘OK’; //Escrito no próprio formulário
Formulario_Principal.ButtonOK.Caption = ‘OK’; //Escrito em outro.
ButtonOK.Caption := ‘Confirma’; //Escrito no próprio formulário
FormCadCliente.ButtonOK.Caption := ‘Confirma’; //Escrito em outro.
Caption := ‘Título’;
O último exemplo mostra uma atribuição a uma propriedade sem referenciar o nome de qualquer
componente. Esse código irá compilar e executar normalmente caso ele tenha sido escrito dentro de um
procedimento de evento associado a qualquer formulário ou componente a ele pertencente. Nesse caso,
como não foi colocado a que componente ele está associado, o Delphi interpreta que o desenvolvedor está
fazendo referência ao próprio formulário para o qual o código foi escrito. Ou seja, através desse código
estaríamos alterando o caption do formulário. O motivo pelo qual o Delphi interpreta a codificação dessa
maneira é melhor compreendida quando trabalharmos com os conceitos de Orientação a Objetos, por ora
devemos apenas nos lembrar das regras de atribuição de nomes aos componentes e de como podemos
utilizar esses nomes para escrever a codificação de nossos aplicativos.
Página: 55
Delphi 5
se qualquer um dos métodos descritos anteriormente e por isso não será, de agora em diante, explicitado.
Em relação aos nomes dos componentes, por questões de praticidade, serão mantidos, porém, caso seja de
desejo do desenvolvedor alterá-los essas alterações deverão ser feitas agora antes do início da codificação
como foi discutido anteriormente. A codificação final para o procedimento de evento será a mostrada a
seguir.
Antes de compilarmos e executarmos a aplicação vamos observar o código acima. Nele podemos observar
um ponto importante relativo à chamada do método ShowModal. Uma vez que esse código foi escrito a
partir de um procedimento de evento pertencente ao formulário
Form1, ao fazermos referência a um método de um outro formulário,
o Form2, essa referência teve de ser feita utilizando-se a referência
completa ao método, incluindo o nome do formulário que teria seu
método executado, ou seja, o Form2. Caso não tivéssemos colocado a
referência ao Form2, a aplicação poderia ser compilada sem
problema algum, porém, ao invés de exibir o segundo formulário ao
clicarmos no botão Button1, o aplicativo iria exibir o próprio Form1,
o que, em nosso caso particular iria provocar um erro que explicaremos posteriormente. Por ora vamos
apenas compilar a nossa aplicação.
Ao tentarmos compilar a nossa aplicação uma
mensagem de erro será exibida como mostrado ao
lado. Esse erro ocorreu por uma razão bem simples
que, por incrível que possa parecer, já foi explicada
anteriormente. Apesar de toda a codificação estar
correta esquecemos de um pequeno detalhe. No
procedimento de evento que acabamos de escrever tentamos executar um método de um objeto que não
está localizado na unit corrente. Vimos que, todas as vezes que desejarmos utilizar qualquer definição
localizada em uma outra unit que não na que estamos codificando, uma referência à unit na qual essas
definições estão localizadas deverá ser feita na cláusula 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 referência a essa unit. Devemos então adicionar à unit2 à cláusula uses da unit1. Quando nos
referenciamos à formulários o Delphi exibe a caixa de diálogo mostrada ao lado permitindo que ele próprio
efetue essas alterações para nós. Não devemos, no entanto, nos habituar com isso, pois o Delphi só irá nos
ajudar nessas situações, nas demais deveremos nos preocupar em incluir as units na cláusula uses. Após
clicarmos no botão Yes para adicionarmos a unit2 à cláusula uses da unit1 podemos compilar e executar a
aplicação e verificar o comportamento dos formulários ao clicarmos no botão. Agora que já sabemos como
podemos exibir formulários de forma modal vamos estudar como o Delphi é capaz de exibir formulário de
forma não modal.
Página: 56
Delphi 5
Poderíamos esperar que ambos os códigos funcionassem da mesma maneira, porém isso não acontece. O
código escrito para o evento OnClick do botão Button1 exibe o segundo formulário e logo em seguida
exibe uma caixa de mensagem co o texto Olá. Já o segundo procedimento, também exibe o segundo
formulário mas só irá exibir a caixa de mensagem quando o Form2 for fechado. Podemos concluir que o
método show não prende a execução do programa uma vez que a caixa de texto exibida através do
procedimento ShowMessage foi executado antes mesmo do segundo formulário ter sido fechado. No
entando, quando exibimos o segundo formulário utilizando o método ShowModal, a execução do código
relativo ao procedimento ShowMessage só é executado ao fecharmos a caixa de mensagem.
5.Comandos da linguagem
Começamos nossa caminhada no aprendizado do mundo Delphi através do estudo dos formulários. Já
temos conhecimento de uma propriedade do formulário, a propriedade name, e de dois métodos, show e
showmodal, responsáveis pela exibição dos formulários. No entanto, para continuarmos o nosso estudo e
sermos apresentados a outras propriedades e métodos devemos aprender os principais comandos da
linguagem Object Pascal. Essa apresentação faz-se necessária principalmente para podermos ilustrar com
exemplos mais úteis cada uma dessas propriedades e métodos.
Observe que, no exemplo dado, existem três comandos simples, todos eles dentro do mesmo procedimento.
Devemos sempre nos lembrar que as instruções dentro do código Object Pascal, independentemente de
serem simples ou compostas, devem ser escritas dentro de procedimentos ou funções, portanto não
podendo ocorrer espalhadas no meio da unit.
O segundo tipo de instrução, as intruções compostas, possuem em geral mais de uma instrução simples
associada a ela. Apesar de não ser muito comum, instruções compostas podem conter uma única instrução
simples em seu corpo. As instruções compostas são delimitadas por um bloco composto pelas palavras
reservadas begin e end e finalizadas por um “;” (ponto-e-vírgula) de forma semelhante à delimitação de
um procedimento de evento visto no exemplo acima. No entanto, uma instrução composta vem no corpo
desses procedimentos como se fosse uma instrução simples conforme o exemplo a seguir.
Página: 58
Delphi 5
Como podemos observar, uma instrução composta possui em seu corpo uma ou várias instruções simples e,
pode até mesmo, possuir outras instruções compostas. Apesar de não ser tão perceptível nesse momento a
finalidade de estarmos utilizando instruções compostas elas são muito úteis no desenvolvimento de
aplicações uma vez que as intruções, simples ou não, contidas em uma instrução composta, são
consideradas pelo compilador como uma única instrução simples. As instruções compostas são largamente
utilizadas não isoladamente como no exemplo anterior mas como parte de intruções mais complexas,
compondo as instruções condicionais e de laços, ou de repetição, que serão vistas a seguir.
5.2.1. If
A instrução if é uma das instruções mais comuns nas linguagens de programação existindo até na
linguagem assembler e, como não poderia deixar de ser, também existe no Object Pascal. No quadro
abaixo ilustramos as duas formas básicas que o comando if pode aparecer um um programa escrito em
Object Pascal acompanhado de alguns exemplos.
Sintaxe
If <condição> then <instrução> ;
Exemplos
if x >= y then ShowMessage(‘Limite ultrapassado’) ;
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 instrução if possui, basicamente, duas formas. A primeira
delas é constituída apenas da instrução if seguida da instrução a ser realizada no caso da condição booleana
a ser testada resulte em um valor verdadeiro enquanto que a segunda permite que tanto uma intrução seja
realizada no caso do resultado da condição ser verdadeira quanto no caso dela ser falsa. Um detalhe
extremamente importante relacionado com a instrução if e que resulta em muitos erros principalmente para
Página: 59
Delphi 5
pessoas inexperientes com o Delphi é que a instrução que precede o else não deve ser terminada com um
ponto-e-vírgula ao contrário do que acontece com as demais instruções 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 através dos exemplos é que a instrução a ser executada tanto pelo comando if no caso
da condição ser verdadeira quanto pelo else no caso dela ser falsa, pode ser tanto uma instrução simples
quanto ums instrução composta. Observe o exemplo a seguir.
Exemplos
if (x >= y) and (y < 10) then
x := x - 1;
y := y + 1;
Os exemplos apesar de semelhantes têm execuções diferentes. No primeiro exemplo, a primeira instrução
só será é executada no caso do resultado da expressão booleana for verdadeira enquanto que a segunda
instrução será executada independentemente do resultado da expressão booleana. Já no segundo exemplo,
ambas as instruções serão executadas apenas no caso do resultado ser verdadeiro. Essa é a principal
finalidade das instruções compostas, agrupar instruções a serem executadas em instruções condicionais e
de repetição.
5.2.2. Case
A medida em que vamos escrevendo instruções ifs aninhadas elas vão tendo seu entendimento cada vez
mais complexo, dificultando o desenvolvimento e a manutenção do código escrito. Em substituição à
escrita de ifs aninhados, o Object Pascal oferece a instrução case. A instrução case permite, da mesma
maneira que a instrução if, o controle condicional relativo ao fluxo do programa, porém esse controle é
feito de forma mais clara e, em muitos compiladores, de forma mais eficiente em relação ao código gerado.
Sintaxe
Case <Seletor> Then
<Rótulo 1> : <Instrução 1> ;
<Rótulo 2> : <Instrução 2> ;
<Rótulo n> : <Instrução n> ;
end;
Case <Seletor> Then
<Rótulo 1> : <Instrução 1> ;
<Rótulo 2> : <Instrução 2> ;
<Rótulo n> : <Instrução n> ;
else
<InstruçãoOutroCaso>;
end;
Exemplos
Case Caractere Then
‘a’ : ShowMessage(‘Caractere inválido’) ;
‘b’, ‘c’, ‘d’ : begin
x := x + 1;
Soma := x + y;
Página: 60
Delphi 5
end;
‘e’..’z’ :;
end;
Case Nota Then
0 : Texto := ‘Reprovado’ ;
1..5 : Texto := ‘Recuperação’ ;
6..9 : Texto := ‘Aprovado’ ;
10 : Texto := ‘Parabens’;
end;
Observemos o quadro anterior. Nele está sendo mostrado as duas sintaxes possíveis para a escrita de uma
instrução case dentro de um programa em Object Pascal. Em ambos os casos, a instrução case é utilizada
para executar uma instrução, simples ou composta, dependendo do valor do seletor passado. O seletor será,
na grande maioria dos casos, uma variável cujo valor deseja-se ser testado. Um detalhe a ser observado na
utilização da instrução case está na restrição da utilização de tipos de variáveis como seletores para uma
instrução case. O Object Pascal só permite que sejam utilizados seletores de tipos de dados ordinais. Dessa
forma, não são permitidos, por exemplo, a utilização de seletores do tipo string nem de ponto flutuante.
Um fato interessante relacionado à instrução case aparece nos rótulos que podem ser utilizados dentro da
instrução. Nos exemplos fornecidos podemos observar que podem ser utilizados desde valores simples,
valores múltiplos, ou até mesmo uma faixa de valores a serem testados. Caso nenhum dos valores definidos
pelos rótulos do comando case represente o valor fornecido pelo seletor da instrução poderá ser definido
dentro da instrução, um rótulo else que será executado nessas situações. Ou seja, o else dentro de uma
instrução case identifica as instruções a serem executadas no caso de nenhum dos rótulos fornecidos. O
else é opcional dentro de uma instrução case.
5.3.1. For
A primeira instrução de repetição que iremos estudar é a instrução for. Essa instrução é amplamente
utilizada quando desejamos repetir uma ou um conjunto de intruções por um determinado número fixo de
vezes. Por esse motivo, a intrução for utiliza-se de um contador para determinar se essa quantidade de
interações que o laço deverá realizar já foi atingido ou não.
Sintaxe
for <Contador := <Valor1nicial> to <ValorFinal> do
<Instrução>;
for <Contador := <Valor1nicial> downto <ValorFinal> do
<Instrução>;
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 possíveis para a instrução 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 interação do laço. Já na segunda, o contador é
Página: 61
Delphi 5
decrementado. Os exemplos apresentados permitem verificar que podem compor a instrução for tanto
instruções simples quanto compostas. Essa característica se repete para as demais instruções de repetição e
por isso não mais repetiremos essa afirmação a menos que exista alguma diferença de comportamento.
Dois pontos importantes dever ser observados em ambas as sintaxes utilizadas para a instrução if. O
primeiro deles é que o contador utilizado no laço é uma variável local ao procedimento no qual o laço está
sendo executado. O segundo ponto importante é que a variável a ser utilizada como contador para o laço
for não pode ser alterada dentro do laço como mostrado no exemplo. A tentativa de alterar o seu conteúdo
resulta em erro durante a compilação do aplicativo, é função do próprio Object Pascal incrementar ou
decrementar o contador deixando o desenvolvedor livre dessa preocupação.
5.3.2. While
A segunda instrução de repetição que iremos estudar é a instrução while. Essa instrução, de forma
semelhante ao que acontecia com a instrução for tem sua execução controlada por uma condição booleana
só que, ao invés da condição ser analisada em relação a um contador, a condição booleana a ser avaliada
pode ser uma expressão booleana qualquer.
Sintaxe
while <Condição> do
<Instrução>;
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 instrução while é bastante simples como pode ser observado no quadro acima. Para
que o fluxo de execução do programa passe a executar a intrução do laço while basta que a condição
declarada seja verdadeira. Uma vez em execução, as instruções contidas no laço só deixaram de ser
executadas quando a condição do laço se tornar falsa. Uma vez que a variável de controle do laço não é
mais controlada automaticamente, é função do desenvolvedor evitar que erros ocorram em relação à
atualização dessa variável. No exemplo acima, mostramos a ocorrência de um loop infinito. Caso o
desenvolvedor escreva equivocadamente o código apresentado, uma vez que o laço 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 variáveis que controlem o laço while, para garantir que esse
termine e o processamento do aplicativo continue normalmente.
5.3.3. Repeat
A última instrução de repetição que iremos estudar é a instrução repeat. Essa instrução assemelha-se
bastante à instrução while vista anteriormente salvo algumas diferenças que serão vistas posteriormente.
Vamos, então, observar a sintaxe utilizada para a instrução repeat juntamente com alguns exemplos.
Sintaxe
Repeat
<Instrução>;
Until <Condição>;
Exemplos
Repeat
Acum := Acum + Cont;
Cont := Cont + 1;
Until Cont >= 10;
Repeat
Acum := Acum + Cont;
Until Cont >= 10; //Cuidado -> Pode ser um laço infinito
Cont := 1;
Repeat
Acum := Acum + Cont;
Página: 62
Delphi 5
Sintaxe
Página: 63
Delphi 5
with <objeto/variável> do
<Instrução>;
Exemplos
Funcionario.Nome := ‘André’; with Funcionario do
Funcionario.Idade := 26; begin
Funcionario.Cargo = ‘Analista de Sistemas’; Nome := ‘André’;
Idade := 26;
Cargo = ‘Analista de Sistemas’;
End;
Form1.Font.Size := 16; with Form1.Font do
x := x + 1; begin
Form1.Font.Style := [ ]; Size := 16;
Form1.Font.Color := clBlue; x := x + 1;
Style := [ ];
Color := clBlue;
end;
O quadro acima mostra a sintaxe que deve ser utilizada quando desejarmos utilizar a instrução with.
Observe que, como parte da instrução, podemos utilizar tanto um objeto quanto uma variável. Essas duas
possibilidade também estão ilustradas no quadro acima. No primeiro exemplo temos a utilização de uma
variável, previamente declarada na seção var, chamada Funcionário. Essa variável tem como seu tipo
TFuncionario, declarado anteriormente quando explicamos o tipo de dados Record. No exemplo temos
tanto o código utilizado sem a instrução with como com ela. Observe que, ao utilizarmos a instrução with
não precisamos colocar, antes de cada campo da estrutura, a variável que estava sendo manipulada.
Além da utilização de variáveis do tipo record, mostrada no primeiro exemplo, a instrução with também
pode ser utilizada com objetos. O segundo exemplo apresentado, ilustra essa situação. Nele manipulamos
com propriedades do objeto Font, que por sua vez pertence ao objeto Form1. Com esse exemplo podemos
também observar que podemos, dentro da instrução with, manipular com vários níveis de definições de
objetos. Também nesse último exemplo podemos observar que nem todas as intruções contidas na
instrução with necessitam obrigatoriamente tratar com propriedades ou campos pertencentes ao objeto, ou
variável, sendo manipulado. Nesse exemplo, temos uma intrução responsável pelo incremento da variável
x, declarada anteriormente em uma seção var. O compilador duarnte a fase de compilação do aplicativo,
identifica que essa variável não pertence ao objeto sendo manipulado e verifica se existe uma variável x
que tenha sido declarada anteriormente. Caso exista, a compilação é feita normalmente, caso contrário uma
mensagem de erro é retornada na parte inferior do Editor de Código informando o erro conforme ilustrado
na figura abaixo.
6.Manipulando Formulários
Iniciamos os nossos estudos trabalhando com os formulários. Vimos como eles podem ser exibidos através
de dois de seus métodos e as diferenças entre a exibição de formulários modais e não modais. No entanto,
demos uma parada nesse estudo de tal forma a aprendermos alguns dos comandos existentes no Delphi
responsáveis pela determinação do fluxo de execução de nossos aplicativos. Essa para foi de extrema
importância uma vez que, no decorrer de nosso aprendizado do Delphi, necessitaremos desses comandos
para podermos escrever aplicativos que façam algo mais do que simplesmente exibir uma caixa de diálogo
ou um formulário. De agora começaremos a aprender um pouco mais sobre os formulários aprendendo
novas propriedades, métodos e eventos úteis. Devemos ressaltar que não 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 impossível terminarmos esse estudo. Essa mesma observação também é válida tanto
para os métodos quanto para os eventos de cada componente a ser estudado. Além disso, alguns
componentes apresentam propriedades em comum, nesses casos não iremos abordar essas propriedades
todas as vezes que elas ocorrerem, apenas em sua primeira ocorrência.
Página: 64
Delphi 5
Página: 65
Delphi 5
Pascal, a atribuição deverá ser feita diretamente utilizando-se um desses valores, não podendo, portanto, ser
utilizadas aspas ou qualquer outro delimitador. Daremos um exemplo posteriormente de como poderemos
fazer tal codificação. Por ora vamos alterar o valor dessa propriedade para bsSingle.
A propriedade Caption é a propriedade do formulário mais alterada no desenvolvimento de aplicações.
Vamos alterá-la também 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 título do formulário vai se modificando de tal forma a
conter exatamente o texto sendo digitado. Antes mesmo de executarmos a aplicação já sabemos qual a
finalidade dessa propriedade dentro de um formulário.
Por fim vamos alterar os valores contidos em três propriedades do formulário. São elas a propriedade
FormStyle, a propriedade Icon e a propriedade WindowState. A propriedade Icon contém um objeto do tipo
TIcon e por isso sua atribuição dentro do Editor de Código do Delphi não pode ser feita de modo tão
imediato quanto pode ser feito com valores de tipos básicos, sets ou mesmo enumerados. São necessários
alguns cuidados adicionais como a criação do objeto entre outros, que serão vistos posteriormente quando
estivermos trabalhando com os conceitos de orientação a objetos. Porém, quando definimos os valores para
essas propriedades através do Object Inspector, o Delphi encarrega-se desses detalhes para o
desenvolvedor. Para selecionarmos um valor para a propriedade Icon devemos clicar o botão que aparece
no Object Inspector ao selecionarmos essa
propriedade. Será exibida a caixa de diálogo Picture Editor,
mostrada ao lado, que irá permitir que selecionemos um arquivo
que contém um ícone a ser exibido para este formulário.
Para definirmos o ícone a ser utilizado devemos clicar o
botão Load, selecionar o arquivo e, em seguida clicar no botão
Ok. Em nosso exemplo vamos selecionar o arquivo
‘factory.ico’, localizado no diretório ‘c:\Arquivos de
Programas\Arquivos Comuns\Borland
Shared\Images\Icons’. Observe que ao selecionarmos o arquivo e
clicarmos o botão Ok na caixa de diálogo Picture Editor, o
ícone localizado no canto superior esquerdo do formulário
é alterado para exibir o ícone selecionado. Devemos lembrar que ao alterarmos o ícone do formulário,
mesmo que esse ícone seja o ícone do formulário principal da aplicação, não estamos alterando o ícone da
aplicação, que é mostrado quando a minimizamos, mas sim o ícone do próprio formulário. Para alterarmos
o ícone da aplicação devemos fazê-lo através da caixa de diálogo Project Options mostrada anteriormente.
Já as duas outras propriedades, FormStyle e WindowState, são 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 é responsável pela
definição do tipo de formulário a ser exibido pela aplicação. Dependendo de qual o valor atribuído a essa
propriedade o formulário terá um comportamento diferente dentro da aplicação. Dos valores possíveis o
mais comum é fsNormal que indica um comportamento normal para o formulário, ou seja, indica que o
formulário pertence a uma aplicação SDI (Simple Document Interface), tais como o próprio Delphi por
exemplo. Além das aplicações SDI temos também as aplicações MDI (Multiple Document Interface) como,
por exemplo, o Microsoft Word até a sua versão para o Office 97. Vamos alterar o valor da propriedade
FormStyle para fsStayOnTop. Novamente não observamos qualquer alteração no formulário dentro da IDE
do Delphi.
A última propriedade que iremos abordar pertencente ao formulário é 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 dão uma idéia de sua funcionalidade. Essa propriedade é responsável pela
definição do estado do formulário, determinando se ele está minimizado, maximizado ou normal. Para
ilustrarmos a utilização dessa propriedade vamos criar um procedimento de evento associado ao evento
OnClick do botão. Esse procedimento deverá ter o código mostrado abaixo.
O código acima ilustra dois pontos importantes da programação utilizando o Object Pascal. O primeiro
refere-se a atribuição de valores a variáveis de tipos enumerados. Como já havia sido mencionado
anteriormente, a atribuição é feita diretamente, sem a utilização de aspas ou qualquer outro identificador. O
Página: 66
Delphi 5
segundo ponto está na atribuição do um valor a uma propriedade que aparentemente não pertence a
nenhum objeto. Como isso é possível uma vez que vimos que para manipularmos tanto com propriedades
quanto métodos de objeto deveríamos fazer uso do operador pornto? Em nosso exemplo isso não está
sendo feito. Não informamos que WindowState é uma propriedade do objeto Form1, porém veremos que
tanto o Delphi irá compilar a aplicação quanto irá executá-la corretamente.
Além de criarmos um procedimento de evento para o evento OnClick do botão também iremos criar um
outro para o evento OnClick do formulário como já havia sido informado no início desta seção. Esse
procedimento terá por finalidade mostrar o funcionamento de duas das propriedades do formulário vistas
nesta seção. Ao criarmos o procedimento deveremos escrever o código mostrado a seguir.
High Tipo ordinal Maior valore referente ao tipo ordinal passado como parâmetro
Low Tipo ordinal Menor valore referente ao tipo ordinal passado como parâmetro
Uma vez que já falamos rapidamente a respeito do código escrito para esse aplicativo vamos compilá-lo e
executa-lo para que possamos entender melhor tanto o código escrito quanto as propriedades que ele
manipula. Para isso ou selecionamos a opção 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
aplicação, o formulário principal da aplicação irá
aparecer na tela como mostra a figura ao lado.
Lembre-se que nós codificamos alguns eventos dessa
aplicação e por isso vamos testar o que cada um desses
eventos irá fazer quando for disparado. Vamos
começar pelo evento associado ao clique do botão. Ao
clicarmos o botão o formulário é maximizado. Isso
ocorre devido a atribuição do valor wsMaximize a essa
propriedade. Neste exemplo fizemos uma atribuição à
propriedade WindowState, contudo poderíamos ter apenas consultado esse valor para realizarmos uma
outra operação qualquer.
Página: 67
Delphi 5
O primeiro evento que vimos nesse exemplo não tinha muita utilidade, servia apenas para ilustrar uma
atribuição de um valor a uma propriedade em tempo de execução. Já o segundo evento que foi tratado é
mais interessante. Antes de clicarmos no formulário para testarmos o segundo evento, vamos retornar o
formulário para seu tamanho original. Porém em nossa aplicação não existe o botão para que a janela
retorne ao seu tamanho normal. Isso acontece devido à alteração que fizemos na propriedade BordeIcons
do formulário. Cada item dessa propriedade identifica quais serão os botões que estarão disponíveis em
tempo de execução para o formulário em questão. Em nosso exemplo disponibilizamos apenas os botões de
sistema (biSystemMenu) e de ajuda (biHelp).
Uma observação importante é necessária ao tratarmos com a propriedade BorderIcons. Lembre-se que esta
propriedade é do tipo set, ou seja, ela pode possuir uma seqüência de valores de forma arbitrária. Os
valores que ela irá conter indicam quais o botões que estarão disponíveis no formulário, porém mesmo que
todos os botões seja colocados à disposição nem todos eles estarão visíveis ao mesmo tempo como poderia
ser esperado. Por exemplo, caso removamos o botão biSystemMenu, nenhum outro botão ficará visível no
formulário independentemente deles estarem ou não definidos na propriedade. Um outro exemplo é o botão
biHelp. Esse botão só ficará visível no caso de tanto o botão biMaximize quanto biMinimize estarem
desabilitados. Essa foi exatamente a situção de nossa aplicação. Além disso, outras propriedade afetam a
exibição desses botões como é o caso da propriedade BorderStyle como será visto adiante.
Uma vez que não temos o ícone para retornar o formulário ao seu tamanho
original, devemos dar um duplo clique em sua barra de título. Agora sim, que já
estamos com o formulário em seu tamanho original, podemos continuar a
manipular o nosso aplicativo. Vamos clicar no formulário de tal forma a executar
o procedimento de evento associado. Ao fazermos isso, uma caixa de diálogo é
exibida mostrando o nome do componente Button1 conforme mostra a figura ao
lado. A exibição do nome Button1 ocorre pois esse era o componente que estava
selecionado no formulário quando ele foi clicado. Se o componente selecionado
fosse a caixa de texto Edit1, esse seria o nome exibido na caixa de diálogo. Isso
ocorre uma vez que a propriedade ActiveControl do formulário contém o componente que está ativo no
formulário naquele instante. Observe que a propriedade ActiveControl é um objeto que, por sua vez,
também possui propriedades e métodos e, por isso, pudemos exibir o conteúdo de sua propriedade name.
Através da utilização da propriedade ActiveControl também poderíamos alterar qual o componente ativo do
formulário a qualquer instante, para isso seria necessária apenas a atribuição do nome do componente ã
propriedade conforme exemplificado a seguir.
Exemplo
/* Código escrito */
ActiveControl := Edit1;
/* Código escrito */
O código escrito acima é bastante simples. Trata-se de uma atribuição direta do nome do objeto à
propriedade ActiveControl do formulário. Devemos observar que não é atribuída uma string, que é o
conteúdo da propriedade name do componente, mas sim o próprio objeto Edit1. Ao executar essa linha, o
componente que passa a estar ativo no formulário, ou seja, que passa a ter o foco da aplicação é o
componente Edit1.
Agora que já sabemos o que faz a primeira linha de código escrita no procedimento associado ao evento
OnClick do formulário, podemos continuar clicando no botão OK da caixa de mensagem que foi exibida.
Uma vez que a caixa é fechada podemos perceber que o formulário é modificado. O que aconteceu? A
borda do formulário foi alterada! Essa alteração é exatamente o que o próximo comando que havíamos
definido proporciona. A função succ faz com que seja atribuída à propriedade BorderStyle do formulário
um novo valor, o valor seguinte àquele atualmente atribuído à propriedade BorderStyle. Porém não
utilizamos simplesmente a função succ uma vez que quando chegássemos ao final dos valores do tipo
enumerado a atribuição seria sempre para o último valor possível. Para evitar isso, foi colocada uma
instrução condicional que testa se a propriedade BorderStyle já possui o maior valor possível. No caso do
teste ser verdadeiro será atribuído o menor valor possível a essa propriedade, caso contrário a função succ é
a que ficará encarregada de definir qual o valor a ser atribuído à propriedade BorderStyle. Observe também
que dependendo do tipo de borda que esteja sendo atribuída ao formulário, nem todos os botões relativos à
propriedade BorderIcons são exibidos. Conforme havíamos mencionado anteriormente, a propriedade
BorderStyle tem influência sobre a exibição ou não desses botões. Com isso devemos ter cuidado tanto
Página: 68
Delphi 5
com o tipo de borda que estejamos atribuindo ao nosso formulário bem como com os valores que tenhamos
colocado na propriedade BorderIcons, pois caso tenhamos removido o ícone de sistema o usuário não terá
como fechar o formulário a menos que utilize as teclas ALT + F4 ou finalize a tarefa utilizando o
gerenciador de tarefas do Windows.
Antes de fecharmos a aplicação e retornarmos para a IDE do Delphi vamos observar o efeito de uma outra
propriedade do formulário que alteramos no Object Inspector. Vamos tentar alternar entre as aplicações
que estejam em execução utilizando as teclas ALT + TAB. Ao fazermos isso, podemos perceber que
conseguimos alternar entre as aplicações porém o nosso aplicativo Delphi sempre permaneceu por sobre as
demais janelas. Isso ocorreu devido a alteração feita na propriedade FormStyle. Ao colocarmos o valor
fsStayOnTop fizemos com que esse formulário sempre permanecesse sobre as demais aplicações
independentemente de qual aplicação esteja sendo manipulado naquele momento.
O último ponto que vamos observar antes de fecharmos a aplicação se refere à posição como o formulário
foi exibido. A menos de uma coincidência fantástica o formulário não deve ter sido exibido no centro da
tela como poderíamos querer que tivesse acontecido. Se observarmos melhor, o formulário foi exibido
exatamente na mesma posição em que ele se encontrava quando estávamos desenvolvendo-o na IDE do
Delphi. Isso ocorre graças a uma propriedade do formulário que define tanto a posição como, em alguns
casos, o tamanho do formulário com que ele é exibido pela primeira vez. Vamos fechar a aplicação e
retornar à IDE do Delphi. No Object Inspector podemos observar uma propriedade chamada position
pertencente ao formulário. Essa é a propriedade responsável por essa definição. Observe que o valor
default para ela é poDesigned, ou seja, de acordo com que foi definido quando estava na IDE. Caso
desejássemos que o formulário fosse exibido no centro da tela bastaria alterarmos o valor dessa
propriedade para poScreenCenter. Verifique na ajuda do Delphi os possíveis 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 padrão de nomeação. As duas primeiras letras de cada valor identifica, de alguma maneira, a
propriedade a qual ele pertence. Por exemplo, os valores da propriedade BorderIcons começam pelas letra
bi, já os valores para a propriedade Position começam pelas letras pó e assim sucessivamente. Caso
desejemos desenvolver novos tipos devemos seguir esse padrão para que outros desenvolvedores consigam
trabalhar com esses tipos de forma mais amigável.
O quadro a seguir traz um resumo das principais propriedades vistas até aqui.
Propriedade Valores Finalidade
ActiveControl Componentes do Form Definir o componente ativo de um formulário
BorderIcons biSystemMenu, biMaximize, Determinar quais botões estão disponíveis no canto superior
biMinimize, biHelp diretiro do formulário
BorderStyle bsDialog, bsSingle, bsNone, Determinar o tipo de borda que será utilizado pelo formulário.
bsSizeable, bsToolWindow,
bsSizeToolWin
Caption String qualquer Texto a ser exibido na barra de título do formulário
FormStyle fsNormal, fsMDIChild, Determina o tipo de formulário a ser exibido.
fsMDIForm, fsStayOnTop
Icon Objeto da classe TIcon Ícone a ser exibido no canto superior esquerdo do formulário.
Position poDesigned, poDefault, Determina a posição e tamanho pré-definidos para alguns
poDefaultPosOnly, tiupos de formulários.
poDefaultSizeOnly,
poScreenCenter,
poDesktopCenter,
poMainFormCenter,
poOwnerFormCenter
WindowState wsNormal, wsMinimized, Determina como o formulário será exibido na tela.
wsMaximized
Página: 69
Delphi 5
a dois desses métodos: show e showmodal. Como vimos esses métodos são responsáveis pela exibição de
formulários dentro de nossas aplicações. Além desses, existem outros métodos dentro da classe formulário
que devem ser estudados. Já que sabemos como exibir formulários começar o nosso estudo a respeito dos
principais métodos dos formulários sendo apresentados ao método responsáveis por fechá-lo.
De forma semelhante ao que foi feito para ilustrar as principais propriedades do formulário, iremos
construir uma pequena aplicação para ilustrar tanto os principais métodos quanto os principais eventos
existentes para um formulário. Dito isso, vamos começar a nossa nova aplicação, salvando a aplicaçãio
anterior se necessário. Desta vez, vamos criar a aplicação manipulando com as propriedades que já foram
vistas na seção anterior, por exemplo, alterando os nomes dos formulários e componentes que forem sendo
criados.
7.Componentes de Interface
7.1.1. Menus
Lembra-se como era penoso fazer um Menu em qualquer linguagem de ambiente caracter? Pois é! Na
programação delphi pode esquecer todo aquele tempo e esforço, pois é apenas alguns clicks e atribuir
nomes e títulos as opções/comandos e pronto o menu principal está pronto para uso.
P r o p r i e d a d e s
Items Chamar o Editor de Menu para inclusão de Itens
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 Não-Marcado ?
ShortCut Configurar tecla de Atalho
GroupIndex Se <> 0 indica que pertence a um grupo de Itens
RadioItem Só pode ter um item marcado no grupo?
Nota.: Para inserir um separador de Menu é só colocar no Caption de um item um “-” (hífen).
Você quer que quando o usuário der um click pressionando o botão da direita apareça um menu flutuante
(Local/Rápido/Suspenso)? Não tem o que fazer! A maioria dos componentes possuem um propriedade
chamada PopUpMenu é só nela você indicar o “name” do componente PopUpMenu disponível que você
preparou. Abaixo temos o componente PopUpMenu em estudo:
Página: 70
Delphi 5
P r o p r i e d a d e s
AutoPopUp Charmar automaticamente?
Alingment Exibir: no centro, esquerda ou direita do click?
Obs.: Propriedades do Item do PopUpMenu é igual ao do Menu Principal
7.1.2. Botões
BUTTON (Botão de Comando)
Página de Componentes: Standard — Classe: TButton
P r o p r i e d a d e s
Caption Título (Legenda) do objeto. Apenas para o usuário ler.
Name Nome do objeto quando referenciado na Unit. Utilizado no código-fonte.
Default Se Pressionar “Enter” esse botão será o acionado ?
Cancel Se pressionar “Esc” esse botão será acionado ?
ShowHint Apresentar o “H i n t ” (Dica de Ajuda flutuante) ?
Hint Texto da Descrição (Dica de Ajuda) flutuante. ShowHint = True para funcionar
ModalResult Retorno que o botão emitirá quando usado
Visible Visível ou Invisível ?
Enabled Habilitar ou desabilitar ?
Top Distância do Topo do Formulário
Left Distância da Esquerda do Formulário
Height Altura do Objeto (Tamanho Vertical)
Width Largura do Objeto (Tamanho Horizontal)
TabStop Receber foco com a tecla “TAB” ?
TabOrder Número de Ordem para receber o foco quando pressionada a tecla “TAB”
Página: 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 Quando o Objeto for Clicado chamará o Procedimento de Evento indicado
Dicas
Altere, primeiramente, o Tipo da
P r o p r i e d a d e s propriedade Kind e o componente
fará automaticamente as mudanças
Glyph Carregar a Imagem que o botão exibirá nas seguintes propriedades: Caption,
Name, Glyph e ModalResult.
NumGlyphs Quantidade de partes da Imagem Carregada
Kind Imagens de Tipo Padrão
LayOut Posicionamento da Imagem quanto ao Texto
ModalResult Retorno que o botão emitirá quando usado
SPEEDBUTTON (Botão Ferramenta)
Página de Componentes: Additional — Classe: TSPEEDBUTTON
Dicas
Para trabalhar com um grupo de
P r o p r i e d a d e s botões onde só um possa ter o estado
abaixado em um certo momento.
Flat Efeito Tipo ferramenta do Internet Explorer Siga os seguintes passos:
1. Selecione todos que formam o
Glyph Carregar a Imagem que o botão exibirá grupo;
GroupIndex Se <> 0 indica que pertence a um grupo de botões 2. Altere o GroupIndex para um
valor diferente de zero ;
Down Se = True o botão está abaixado (pressionado) 3. Altere AllowAllUp para True;
4. Tire a seleção e faça um teste
AllowAllUp Se = True indica que só pode ter um botão abaixado alterando o valor de Down dos
no Grupo de Botões. GroupIndex <> 0 botões, um de cada vez.
7.1.3. Labels
LABEL (Etiqueta/Rótulo para Descrição)
Página de Componentes: Standard — Classe: TLabel
Dicas
1a Para indicar a “HotKey” (Tecla
P r o p r i e d a d e s quente) basta, na propriedade
Caption, você antes da Letra
Align Posição do Objeto no formulário escolhida colocar um caracter “&”.
Ex.: ‘Sai&r’. E pronto ficará assim:
Alignment Alinhamento do Texto: Sair . Não esqueça de habitar
ShowAccelChar;
Esquerda,Centro ou direita 2a A etiqueta não pode receber
foco, mas pode passar o foco. Para
LayOut Posição do Texto na Etiqueta isso, indique a “Tecla quente” e utilize
ShowAccelCha “True” para permitir o uso de “Tecla Quente” a propriedade FocusControl
escolhendo um controle, como um
Objeto Edit.
Página: 72
Delphi 5
r (&)
FocusControl Passar o foco para ... . “ShowAccelChar”
deverá ser “True”
WordWrap Rolamento do Texto dentro da Etiqueta
P r o p r i e d a d e s d e E v e n t o s
OnChange Quando o conteúdo do objeto mudar será chamado o Procedimento de Evento indicado
OnDblClick Quando o Objeto receber Dublo-click será chamado o Procedimento de Evento
indicado
P r o p r i e d a d e s
Text Texto do Componente
EditMask String de configuração da Máscara
Página: 73
Delphi 5
P r o p r i e d a d e s Dicas
Align Posição do Componente no Formulário Nas propriedades BevelInner,
BevelOuter & BevelWidth você
BevelInner Contorno Interno: Baixo, nenhum e Alto Relevo poderá dar um efeito 3D muito
interessante ao Painel. Cuidado para
BevelOuter Contorno Externo: Baixo, nenhum e Alto Relevo não exagera!
Página: 74
Delphi 5
P r o p r i e d a d e s
Checked Marcado ou Não-Marcado ?
Alignment Alinhamento do Texto
Dicas
P r o p r i e d a d e s Para adicionar opções (ou botões ) ao
grupo de botões de rádio faça o
Columns Quantidade de Colunas no Componente seguinte:
1. Acesse a propriedade Items do
ItemIndex Informa o Índice do Item Selecionado. RadioGroup e quando vê o botão com
reticência (...) dê um click;
Se –1 então nenhum item foi selecionado 2. No memo da caixa de diálogo que
apareceu digite as opções, uma em
Items Lista de Itens do Componente. cada linha, e dê OK.
8.Depurando aplicações
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. Então 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 informações de
depuração 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 importantíssima o
Delphi é uma ferramenta de programação visual para aplicações Windows (ambiente gráfico) e, sendo
como tal, os seus programas não são uma seqüência de comandos executados um a um, como em qualquer
linguagem de ambiente caracter (Clipper, Cobol, Fortran, C...). Entretanto, são baseados em mensagens
(eventos), não existindo a possibilidade de executar passo a passo cada linha do código-fonte. Sendo
assim, devemos marcar pontos de parada (interrupção) nos trechos de código que você quer depurar.
Obs.: Leia sempre a barra de título principal do Delphi para ver o estado do depurador interno
(Running [executando programa] ou Stopped [aguardando: F7, F8 ou F9]
Página: 75
Delphi 5
Obs.: Para depurar também o Módulo "Program" do Projeto (arquivo DPR) selecione
na Caixa de Diálogo "Environment Option" na guia (página) "Preferences" o item "Step Program Block"
Página: 76
Delphi 5
Depois de configurada a monitoração o nome da variável estará em uma lista. Para remove-la basta
selecionar e pressionar a tecla [Del].
Lista de Monitoração
Bloco que protege o código e sempre que termina-o, ocorrendo erro ou não, executa um ou mais
instruções de finalização do processamento.
Try
< Instruções protegidas >
Finally
< Instruções executadas sempre após as Instruções Protegidas. Ocorrendo erro ou não! >
End
Bloco que protege o código e sempre que ocorre um erro ele executa um ou mais instruções de para
tratamento do erro. E além disso o programador pode avisar ao usuário sobre o problema acontecido via uma
caixa de diálogo (usando, por exemplo, MessageDlg ) ou não.
Try
< Instruções protegidas >
Página: 77
Delphi 5
Except
[ on { NomeDoTipoDeExceção } do [ NomeDeUmSubRotinaPersonalizada; ] ]
< ou Instruções em um bloco begin-end para tratar e/ou Informar Erros >
[ else ]
{ Para todos os outros tipos de Erros }
End
Há várias 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 instruções:
... Except
begin
ShowMessage('Ocorre um erro! Repita a operação, por favor.');
{ . . . outras instruções . . . };
end; ...
2. Focalizando Tipos de Erros em particular que podem acontecer ao código protegido e indicar uma
Sub-rotina personalizada , uma instrução ou algumas instruções, para cada:
... Except
on EDivByZero do TratarErroDeDivisao;
on EConvertError do ShowMessage('Erro de Conversão!!!');
on EDatabaseError do
begin
ShowMessage('Erro na manipalação dos Dados');
Edit1.Text := '';
end; ...
Atenção! A recepção do erro é seqüencial. Ocorrendo um erro não vai ser verificado o próximo tipo
de erro da seqüência informada no except.
Página: 78
Delphi 5
BDE ODBC
MS-SQL Server
9 Interface de Dados & Formatos de Dados:
1. Formatos Nativos:
1.1. BDE dá acesso direto a vários 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;
Com certeza você já está ciente desta terminologia, mas não custa relembrar:
Página: 79
Delphi 5
As duas formas de fonte de dados: a Baseado em Registros e a Baseado em Tabelas são acessadas pelo
Delphi e você pode trabalhar com arquivos simples de dados (Baseado em Registros), como no formato
dBase, com os seus índices e "campos MEMOs" em arquivos separados, porém em uma mesma pasta de
arquivos (diretório). Ou, trabalhar com formato Interbase (Baseado em Tabelas), que tem todas as
tabelas, consultas, índices e ... em um só arquivo. Para o BDE, quanto ao acesso, é a mesma coisa pois ele
possui um abordagem particular que trata os dois da mesma forma. É como se ele, o BDE, olhando para
uma Pasta de Arquivos dos arquivos dBase (dados, index e memo) visse um Banco de Dados baseado em
Tabelas. Tratando todo e qualquer arquivo de registros como uma tabela. Porém por natureza um Banco
de dados baseado em Tabelas e totalmente diferente, ideologicamente e tecnologicamente falando, de um
Banco de dados baseado em Registros. O último não são suportadas certas operações.
Quanto a indexação e/ou ordenação são feitas automaticamente após um deleção ou inclusão.
Para cria suas tabelas, índices (primários e secundários), integridade referêncial, senhas, editar dados e fazer
manutenções. Você usará o utilitário DataBase DeskTop.
II. Para Editar Dados (fazer manutenção dos dados) de uma tabela:
1. Abra a tabela;
2. Escolha no Menu: Table - Edit Data.
Página: 80
Delphi 5
FORMATO PARADOX
Tipo Tamanho Nota
Alpha (A) 1 - 255 Alfanumérico
Number (N) - Ponto Flutuante
Money ($) - Formato Moeda
Short (S) - Numerico curto
Página: 81
Delphi 5
FORMATO DBASE
Tipo Tamanho Nota
Character ( C ) 1 - 254 Caracter
Float (F) 1 - 20 Ponto Flutuante
Number (N) {BCD} 1 - 20 Numerico
Date (D) - Data
Logical (L) - Booleano
Memo (M) - Memorando
OLE (O) - OLE
Binary (B) - Gráfico
Página: 82
Delphi 5
3. Observe a pequena e resumida Modelagem da dados para você compreender os relacionamentos das
tabelas:
CodCargo
CodDepart
CodFunc
CodFunc 1 N
Funcionário Dependente
N N
CodDepend
1 1
Cargo Departamento
CodCargo CodDepart
Chave Primária
Chave Estrangeira
Chave Estrangeira Parte da Chave Primária
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 Funcionários (nome do arquivo: Funcionario.DB):
Página: 83
Delphi 5
É claro que você não vai trabalhar assim. Fazendo e refazendo, mas às vezes acontece e você quer alterar. Por
isso vamos vivênciar o trabalho de restruturação de tabelas, para quando for necessário você não ter dificuldades.
Para apagar um campo use: [Ctrl]+[Del]. Para mover clique no número de ordem do campo e arraste-o. Altere
seguindo as orientações abaixo:
Página: 84
Delphi 5
Obs.: É obvio que há uma solução de manipulação de UF que não armazenado no BD, porém optamos por essa para usarmos um
componente de BD com essa tabela.
CodUF
N 1 UF's
Funcionário
CodUF
APLICATIVO DELPHI
DBEditCodPedido
DBEditDataPedido
Página: 85
Delphi 5
Indica e representa uma tabela física de um certo Banco de dados, gerando um DataSet para a mesma. Não
pode ser utilizada diretamente pelos "outros componentes", necessitando de um componente intermediador
(DataSource).
Atenção!!! As propriedade estão posicionada na ordem que devem ser setadas (configuradas).
P r o p r i e d a d e s
Name Nome Identificador do componente
DataBaseName Nome do Banco de Dados ou Alias
TableName Nome da tabela física do banco de dados
Exclusive DataSet não compartilhado (exclusivo)?
ReadOnly DataSet apenas de Leitura?
MasterSouce Nome Identificador do DataSource da Tabela Mestre
MasterField Campo da Tabela Mestre
IndexFieldNames Nome do Campo que se quer indexar
IndexName Nome do Index (índice secundário) que se quer indexar
Active Abrir o DataSet ?
RecordCount Apenas em Tempo de Execução possui a quantidade de "Registros" do DataSet.
Ex.: LabelQuantDeRegistros.Caption := IntToStr ( Table1.RecordCount );
M é t o d o s
MUDANÇA 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 Alteração 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 Alteração (Edit) ou Inclusão (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
número do campo pelo qual quer basear sua pesquisa.
Ex.: Table1.KeyFieldCount := 0; {Explicação: vai baseado no primeiro campo}
GotoKey Retorna "True" se a pesquisa exata teve êxito.
If Table.GotoKey Then ShowMessage (' Código 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 próximo
Prior Ao Anterior
MoveBy ( ) Mova-se "n" "registros".
Ex. 1o: 5 registro à frente: Table1.MoveBy(5);
Ex. 2o: 5 registro para trás: Table1.MoveBy(-5);
Página: 86
Delphi 5
Constrói uma tabela virtual com base em uma ou mais tabelas de um certo Banco de dados por meio de
código SQL, formando-se um DataSet. Já que usamos a versão Client/Server vamos construir o código
SQL com a ajuda de um utilitário chamado de "Query Builder", no devido momento iremos conhecê-lo.
Não pode ser utilizada diretamente pelos "outros componentes", necessitando de um componente
intermediador (DataSource).
Atenção!!! As propriedade estão posicionada na ordem que devem ser setadas (configuradas).
P r o p r i e d a d e s
Name Nome Identificador do componente
SQL Código SQL que vai ser executado quando a Query for aberta
DataBaseName Nome do Banco de Dados ou Alias. Geralmente é automaticamente setado por
causa do código SQL.
Active Abrir o DataSet ?
Params Quando a query tem vínculo com uma tabela é necessário informar o nome do
campo de relacionamento (que é passado como parâmetro)
DataSource Name do DataSource que possibilitará o vínculo da query com a tabela "mestre"
RecordCount Apenas em Tempo de Execução possui a quantidade de "Registros" do DataSet.
Componente que faz comunicação entre uma Table (ou Query) e os componentes de controle de dados
(DBEdit, DBText...) possibilitando-os a enxergar os campos representados por essa (table ou query).
Como você viu na figura de Estrutura de vínculos dos componentes, logo no início dessa aula, o
DataSource é fundamental a toda essa estrutura no aplicativo.
P r o p r i e d a d e s
Name Nome Identificador do componente
DataSet Name de uma Table ou Query que servirá como uma "fonte de Dados"
Enabled Ativar ou Desativar ?
Agora vamos executar o seguinte para o nosso Banco de Dados recém criado:
1. 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 seqüência correta, como indicado no posicionamento das propriedades e como ministrado pelo
instrutor. Não esqueça de denominar "names" sugestivos;
Página: 87
Delphi 5
DataBaseName DataBaseName
= "indique o Alias criado " = "indique o Alias criado "
TableName = Dependente.DB TableName = Departamento.DB
IndexName = IdxCodFunc IndexName = IdxNomeDepart
MasterSource
= DataSourceFunc
MasterFields = CodFunc *
DataBaseName
= "indique o Alias criado "
Visualização do Módulo de Dados com os componentes de Acesso
TableName = EstadosUF.DB
IndexName = IdxNomeEstado
4. Atenção! A Table para a tabela de Dependentes terá uma "configuração" diferenciada das outras Table. Pois
teremos que relacioná-la com uma Table Mestre (Master). E a Table Mestre será a de Funcionários (TableFunc).
Acompanhe a seqüência 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á, então, uma caixa de Diálogo de nome
"Field Link Designer";
Os Componentes de Controle de Dados são aqueles que exibem e permitem edição das informações do
bancos de dados, também chamados de controles consciente de dados (data-aware). Iremos estudar os
seguintes: DBNavigator, DBEdit, DBMemo, DBText (parecido com Label), DBImage (parecido com
Image), DBCheckBox, DBRadioGroup, DBLookUpComboBox e DBLookUpListBox.
Página: 88
Delphi 5
Esses componentes não tem acesso direto a tabela física, necessitam de um DataSource que indique um
certo DataSet (Table ou Query).
Antes de entrarmos no componentes de Controle de Dados (data-aware). Vamos nos lembrar do que já
fizemos no Nosso Aplicativo:
1. Formulário Principal com Menu;
2. Formulário de Entrada (Splash) com som;
3. Formulário Sobre;
4. Formulários Secundários chamados pelas opções do Menu Entretenimento (Multimídia);
5. O Banco de Dados (as tabelas paradox em um diretório) e seu Alias;
6. O Módulo de Dados (DataModule) referenciando as tabelas do Nosso Alias;
Em um só formulário os cadastros de
departamentos e cargos. As páginas
possuem a mesma interface.
Nesse formulário existirá: inclusão,
exclusão e alteração, só que trabalharemos
sem código. Você vai ver como isso
funciona.
Página: 89
Delphi 5
Agora que já fomos apresentados aos formulários de cadastro vamos continuar com o assunto e no momento
adequado iremos trabalhar em cada um neles.
Tem o mesmo objetivo da Label, não permitir acesso do usuário ao seu conteúdo.
Página: 90
Delphi 5
Extensão do componente RadioGroup para vínculo com um campo de um DataSet que possua múltipla escolha
ou opção.
Propriedades Particulares
Items Nomes dos botões (itens) do grupo
Values Valor, de cada item, que será encaminhado ao campo se o item (botão) for
escolhido. Cada valor para o seu respectivos item.
Obs.: Se não for indicado os valores, por padrão, será encaminhado ao campo da
tabela o título do item escolhido pelo usuário.
Possibilita o deslocamento (navegação) entre os "registros" e aplicação das operações (inclusão, deleção e
alteração) num DataSet.
Propriedades Particulares
DataSource Name do DataSource relacionado ao DataSet (Table ou Query) à controlar
Hints Descrição no idioma do usuário para cada botão do componente de navegação
VisibleButtons Apresentar este botão ?
ConfirmDelete Sempre perguntar antes de apagar ?
Propriedade de Evento
OnClick Quando for clicado um dos botões. Pode-se no procedimento de Evento
verificar qual foi o botão clicado. Botões: nbInsert, nbEdit, nbPost,
nbCancel ...
Possibilita relacionamento ou conexão com duas Origens de Dados. A Primeira é do DataSet mestre (a
principal) e a Segunda é do DataSet secundário.
Exemplo de um caso: Não queremos que na tabela de funcionários guarde-se o nome do estado pois
criaria um redundância (repetição) de Dados, então na tabela funcionário guardaremos um código
identificador que represente aquele estado e conseqüêntemente teremos uma segunda tabela que terá todos
os estados. Bem, agora temos outro problema pois o usuário não vai querer decorar o código de cada
estado, então teremos que baseados no código do estado achar o nome do estado correspondente e
apresentá-lo. Isso é bem natural! Porém será necessário escrever algumas linhas de código e gasta-se
Página: 91
Delphi 5
um pouco de tempo. Entretanto não será necessário pois existe esse componente que é esse que estamos
estudando que facilitará nossas vidas e tornará o desenvolvimento mais rápido.
Propriedades Particulares
DataSource Name do DataSource relacionado ao DataSet (Table ou Query) Mestre
DataField Name do campo do DataSet Mestre que será o nosso alvo de alteração
KeyField Name do campo do DataSet Secundário que efetivará a união dos DataSets
ListSource Name do DataSource relacionado ao DataSet (Table ou Query) Secundário
ListField Name(s) do(s) campo(s) do DataSet secundário que será (rão) exibido(s).
Obs.: O separador do "names" será o ";" (ponto-e-vírgula).
Ex.: NomeEstado;SiglaUf
Propriedades Particulares
DataSource Name do DataSource relacionado ao DataSet (Table ou Query) requerido
Columns Propriedade que permiti tratamento individual para cada coluna da Grade. Por
padrão a Grade terá a quantidade de colunas baseada na quantidade de campos do
DataSet vinculado (ou conectado), isso automaticamente.
Options Propriedade que permiti setar o comportamento da Grade
Nós já vimos alguns recursos, na aula sobre o componente Table, porém aqui temos mais outros para você
trabalhar via código-fonte com o banco de dados:
Página: 92
Delphi 5
6. Para ler ou gravar um valor do campo será necessário, quando usar “FieldByName ( )” , a propriedade “AsString”
ou “AsInteger” para converter os conteúdo do campo para o tipo compatível. Observe abaixo outras
propriedades de conversão de conteúdo de campo:
AsFloat, AsDateTime e AsBoolean.
Obs. 1: Você pode usar o método de acesso direto do mesmo modo do anterior, mas não é legível. Fields [ ] .
Ex.: CodPedido := TablePedido.Fields[1].AsString;
Obs. 2: Para ler ou gravar uma informação em um campo que foi adicionado pelo Editor de Campos você pode
usar os métodos de conversão, acima citados, ou a propriedade “Value”.
Nessa aula iremos trabalhar naqueles formulários que nos foram apresentados na aula anterior, um a um, e
aprenderemos mais recurso de banco de Dados, passo a passo.
Atenção! Em todos os formulários que apresentam dados iremos abrir o(s) DataSet(s) quando o formulário for
apresentado (OnShow) e fechá-los quando o formulário for fechado (OnClose).
1 Etapa I:
Página: 93
Delphi 5
PageControl
DBNavigator
Há um DbText aqui será
exibido sempre na
consulta DBEdit que estará em apenas de
leitura quando em consulta
Aqui temos um MaskEdit
que será exibido e usado Um RadioGroup Comum que
apenas na inclusão fará a mudança do
IndexFieldNames do DataSet
2a Etapa I:
Chamará o formulário
de Pesquisa
Um DBNavigator Página: 94
Delphi 5
Bem, creio que você já montou uma interface como a da figura acima. Então vamos aos detalhes das Querys
uma para o nome do Cargo e a outra para o nome do Departamento, informações que constam em outras tabelas.
Iremos utilizar o "Query Builder" utilitário que é encontrado na versão Client-Server. Ele vai nos ajudar a construir o
código SQL que é necessário aos componentes do tipo Query.
Página: 95
Delphi 5
ª Repita os passos: Montagem do Código SQL da Query & Indicação do parâmetro da Query, para as
outras Querys (UF e Nome do Departamento), escolhendo as tabelas e campos correspondentes a informações
necessárias;
9 Quando a parte de consulta tudo pronto. Agora vamos trabalhar na interface para incluir & alterar. E depois
você poderá colocar as instruções necessárias para os botões de comando (novo, alterar, apagar...).
2b Etapa II:
Instruções para Inclusão:
1. Idem instruções para Inclusão, porém não deverá ser apresentado o MaskEdit do código, permaneça com o
DBText do código exibido;
2. Tanto na inclusão como na alteração há na interface caixas de combo, na verdade não são caixa de combo
simples são DBLookUpComboBox para diminuir o código-fonte e agilizar o desenvolvimento, basta setá-
los corretamente;
3. Se o usuário usar a Tecla ESC o formulário deverá fechar, mas deverá perguntar antes.
3 Instruções Gerais:
4 Instruções Gerais:
MaskEdit
(Aqui o Evento OnChange acionará a busca)
RadioGroups Comuns
(Aqui o Evento OnClick acionará a busca)
1. No "DataModule" coloque uma Query para a Busca que não usará parâmetro e um DataSource;
2. Na verdade a busca será montada num código SQL de uma Query. E o seu DataSet será o resultado da nossa
busca ou pesquisa;
Página: 97
Delphi 5
Atenção! Como a propriedade SQL da Query é do Tipo TString, assim também como é a propriedade
Lines do componente Memo, então podemos usar os métodos, como: Clear e Add, para montar em tempo de
execução o nosso código SQL;
3. A montagem do Código SQL e a abertura do DataSet da Query irá acontecer quando o usuário digitar uma ou
algumas letras no MaskEdit ou quando clicar um dos botões de rádio;
4. Quando o usuário dê duplo-clique em um funcionário que está na grade, a janela de procura fechará e
voltaremos ao cadastro de funcionário já posicionados no funcionário escolhido;
5. Quando o usuário fechar a janela de Procura e na grade de resultado da busca só encontrar-se um funcionário.
Será fechada a janela de procura e voltaremos ao cadastro de funcionário posicionados neste funcionário,
automaticamente. Para isto use a propriedade "RecordCount" e veja se é igual a 1.
6. Uma possibilidade de conteúdo da propriedade SQL da Query, em tempo de execução, será:
11.Relatório em QuickReport
1. Cabeçalho da Página;
2. Cabeçalho das Colunas;
3. Área de Dados (os detalhes);
4. Rodapé da Página &
5. Área de Sumário
Essas partes, acima citadas, em QuickReport as chamaremos de Bands (Bandas/Faixas) e cada uma será de
um tipo para que aja a identificação, separação e reprodução dessas partes no relatório gerado. Bem,
antes de começarmos, realmente na prática, iremos conhecer os componentes QuickReport e suas
principais propriedades.
Propriedades
DataSet Informar o “Name” da Table ou Query que o relatório irá usar
Página: 98
Delphi 5
Description Propriedade onde podemos colocar um pequeno texto descritivo sobre o relatório
Bands Podemos no próprio componente Relatório indicar as bandas comuns. Não sendo
necessário colocar realmente, a partir da página de componentes, um a um os
componentes do Tipo QRBand no nosso componente QuickReport.
ShowProgress Deseja apresentar a progressão do processo ?
Métodos
Print Imprimi o relatório. Ex.: RelatorioProdutos.Print;
Preview Apresenta a visualização de impressão. Ex.: RelatorioProdutos.Preview;
Componente que colocamos em um QuickReport para compor o relatório. Nele colocaremos outros
componentes QR que serão apresentados mais adiante.
Propriedade
BandType Informar o Tipo dessa Banda
ForceNewPage Forçar um quebra de página ?
FooterBand “Name” da Band que é o rodapé desse componente Band
HasChild Essa Band tem uma QRChildBand ? (Tem um Band que a acompanha (filha) ? )
ParentBand Se essa Band for do Tipo QRChildBand indica-se o “Name” do “Pai” dela
Componente que colocaremos em uma Banda e o usaremos como usamos um componente Label em um
formulário.
Propriedade
Alignment Alinhamento do Título
AlignToBand Alinhar o componente dentro da Banda ?
(Se True, então ele usará a conteúdo da propriedade Alignment, também)
Caption Texto estático que será exibido
Componente que colocaremos em uma Banda e o usaremos como usamos um componente Memo em um
formulário.
Página: 99
Delphi 5
Componente que colocaremos em uma Banda e o usaremos como usamos um componente Image em um
formulário.
Propriedade
Shape Possibilita escolher entre as formas disponíveis (linha vertical, retângulo ... )
Pen Possibilita: mudar a espessura (With) e a Cor da Linha (Color)
Componente que colocaremos em uma Banda para informar: data, hora, número da página ... .
Propriedade
Data Tipo de informação (apenas data, apenas hora, número da página ... ) que será
apresentada.
Componente que colocaremos em uma Banda para apresentar o resultado de uma expressão nele armazenado.
Propriedade
Expression Expressão que será executada na geração do relatório.
(Ex.1: Copy(Company,1,1) ou Ex.2: ‘Pedido nr.: ’ + CodPed
Mask Mascara de apresentação da informação
Master “Name” do QuickReport que possui o Daztaset para atualização dessa expressão
Página: 100
Delphi 5
Componente que colocaremos em uma Banda de Detelhes ou Sub-detalhes para apresentar o conteúdo de um
campo tipo: alfanumérico, numérico ou memo.
Componente que colocaremos em uma Banda de Detelhes ou Sub-detalhes para apresentar o conteúdo de um
campo tipo imagem.
Propriedade
Expression O grupo é quebrado toda vez que o resultado da expressão mudar
ForceNewPage Forçar um quebra de página ?
FooterBand “Name” da Band que é o rodapé desse componente Band de Grupo
Propriedade
ParentBand “Name” do “Pai” (Parent)
Propriedade
Bands Para indicar se há bandas rodapé e cabeçalho
Página: 101
Delphi 5
Pelo menu do nosso Aplicativo teremos apenas três relatórios: um para funcionários, um para departamentos e
outro para cargos. Decidir que os três serão, cada um, do tipo lista e que faremos para os funcionários um outro
relatório, do tipo mestre-detalhes, que apresentará para cada funcionário os seus dependentes. Iremos seguir uma
abordagem que é a seguinte: para cada relatório lista teremos um formulário com “name” e “caption” sugestivos. E
nesses formulários serão usados no sistema para o usuário escolher a ordenação (indexação) e se quer visualizar a
impressão ou imprimir. O quarto relatório (mestre-detalhes do funcionário) ficará dividindo o mesmo formulário e
nesse formulário o usuário deverá escolher se o relatório será o simples (lista) ou o mestre-detalhes, além das opções já
citadas anteriormente.
Página: 102
Delphi 5
1. Faça os passos que você executou anteriormente, para montar o relatório simples de departamentos, para montar o
relatório, simples em lista, dos funcionários;
2. Verticalmente aumente a banda dos detalhes e além dos campos de código e nome do funcionário coloque os
seguintes campos: foto, sexo, endereço, data de nascimento e nota, como na interface abaixo:
Página: 103
— Relatório Mestre-Detalhes —
1. No mesmo formulário do relatório de lista para os funcionário coloque um componente QuickReport para
montarmos o nosso relatório mestre-detalhes;
2. Sete as seguintes propriedades do QuickReport:
2.1. “DataSet” terá o “name” da Table principal (TableFunc) do relatório;
2.2. “Bands” solicite uso das seguintes: Título, Cabeçalho dos campos e detalhes, por enquanto;
3. Coloque a partir da página de componentes uma Banda SubDetail, sete-a da seguinte forma:
3.1. “DataSet” terá o “name” da Table de detalhes (TableDepend);
4. Coloque a partir da página 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;
5. Selecione a Banda Child que apareceu e altere um pouco a altura dela, assim ela dará um espaço entre os grupos;
6. Volte a Banda SubDetail e sete-a da seguinte forma:
6.1. “FooterBand” = “GroupFooter1” (indicando que o rodapé para totais do grupo é essa banda);
7. Na propriedade “Bands” do QuickReport solicite uso da Banda de rodapé de página;
8. Na banda de Rodapé do grupo (GroupFooter1) você deverá colocar uma expressão para contar a quantidade de
dependentes que foram listados no grupo, como você vê na figura abaixo;
9. Coloque os elementos necessários ao relatório, como na figura abaixo, e para testar abra as tabelas antes de ver o
“Preview”.
12.Entregando a aplicação
Uma das etapas mais importantes no desenvolvimento de qualquer software é sua entrega e instalação na
máquina de nossos clientes. Em diversas linguagens de programação essa etapa tem tornado-se uma
verdadeira dor de cabeça para os desenvolvedores que, além de ter tido todo o trabalho de desenvolvimento
ainda tem que se preocupar com a configuração da máquina na qual seu software está sendo instalado.
Página: 104
Delphi 5
Na versão 1.0 do Delphi essa preocupação também existia. Apesar do desenvolvedor contar com
características que facilitavam a instalação de seus produtos como, por exemplo, a utilização de um alias
no desenvolvimento de aplicativos para a área de banco de dados, o processo de instalação ainda era
trabalhoso. Como parte integrante do Delphi 1.0 estavam incluídos os discos de instalação do DBE, caso o
aplicativo sendo instalado fizesse acesso à um banco de dados, e do runtime do ReportSmith, caso o
aplicativo gerasse relatórios desenvolvidos por ele. Apesar da instalação e configuração desses produtos ser
feita de forma bastante simplificada, ainda era um trabalho a mais que deveria ser realizado pelo
desenvolvedor na hora da instalação de seu produto na máquina de seu cliente.
Com lançamento do Windows 95, um novo padrão de instalação de software, através 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 desinstalação.
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 distribuição de seus produtos. Desde a primeira versão do Delphi para o
ambiente Windows95, o Delphi 2.0, a Borland já forneceu juntamente com seu produto uma cópia do
InstallShield para facilitar ainda mais seus usuários. Passaremos agora a realizar um estudo sobre essa
ferramenta, em sua versão lançada para acompanhar o Delphi 5.0, o InstallShield Express Delphi Edition,
versão 1.11a.
Página: 105
Delphi 5
exibida toda vez que o InstallShield for inicializado a menos que a opção Don’t display this screen again
seja assinalada. Uma vez que tenhamos criado o nosso primeiro projeto a opção de abrir o nosso último
projeto ficará disponível para seleção. Iniciemos, então, escolhendo a opção para Criar um novo projeto de
instalação e, em seguida, pressionemos o botão OK.
Após clicarmos o botão OK, uma seqüência de caixas de diálogo é apresentada para que possamos criar um
projeto de instalação de software. A primeira dessas
caixas de diálogo é mostrada ao lado. Essa é utilizada
para identificar o projeto que está sendo
desenvolvido. Devemos, através do Directory List
Box selecionar o diretório no qual serão armazenados
os arquivos a serem criados para o novo projeto. Caso
ainda não exista o subdiretório no qual desejamos
colocar o nosso projeto, poderemos especificá-lo no
New Subdirectory Edit Box. Na figura acima, caso
desejássemos colocar o nosso projeto num diretório
chamado ProjectX localizado no diretório IS Express
Delphi Edition, bastaríamos 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 aplicação que foi desenvolvida. Observe
que o nome que o nome dado ao projeto é automaticamente colocado no texto acima do Directory List Box,
com a extensão iwz (do inglês InstallShield Wizard).
Existe ainda a possibilidade da criação de uma instalação múltipla. Esse tipo de instalação é bastante
comum em aplicações comerciais onde é dada ao usuário a oportunidade de escolher entre vários tipos de
instalação. Com a versão do InstallShield fornecida com o Delphi 5.0 é possível escolher entre 3 tipos de
instalação:
• Típica
Normalmente uma instalação completa, incluindo todos os componentes do sistema em questão.
• Compacta
Normalmente composta apenas por aqueles componentes necessários à execução do sistema
• Customizada
Permite ao usuário escolher quais os componentes a serem instalados
Para que isso seja possível devemos assinalar a opção Include a Custom Setup Type. Por hora vamos
começar com o desenvolvimento de uma instalação simples, não assinalando, portanto, essa opção. No
nosso exemplo, criaremos um projeto chamado Calc a ser armazenado no diretório ProjectX como
mostrado na figura acima. Podemos dar continuidade ao desenvolvimento de nosso projeto pressionando o
botão Create. Pronto, agora já possuímos um esqueleto para o desenvolvimento de nosso projeto de
instalação, restando apenas “preencher os espaços em branco”.
Passamos a partir de agora a mostrar cada um dos passos a serem preenchidos para que possamos, enfim,
obter os discos de instalação de nosso produto, são eles:
• Set the Visual Design
Fornece informações básicas a respeito da aplicação.
• Select InstallShield Objects for Delphi
Utilizado para fornecer informações a respeito de objetos do Delphi tais como o BDE a serem
utilizados pela aplicação
• Specify Components and Files
Fornece informações a respeito dos arquivos a serem instalados, bem como os diversos tipos de
instalação existentes
• Select User Interface Components
Informa quais as caixas de diálogo que serão exibidas no processo de instalação
Página: 106
Delphi 5
Help
Open
Página: 107
Delphi 5
• New
Abre a caixa de diálogo Abrir Novo Projeto
• Open
Abre a caixa de diálogo Abrir
• Save
Salva o projeto corrente com o nome e localização atual
• Build
Abre a caixa de diálogo do Disk Builder
• Test Run
Executa um teste de execução do projeto corrente
• Copy To Floppy
Abre a caixa de diálogo Copy to Floppy
• Explorer
Executa o Windows Explorer
• About
Abre a caixa de diálogo About
• Help
Executa a ajuda sensível ao contexto. Ao clicar nesse botão, o ponteiro do mouse muda de formato.
Clique sobre um elemento qualquer para obter ajuda específica 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
opção 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 botões 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 botões do speedbar, uma ajuda rápida sobre
a funcionalidade desse botão é exibia no statusbar.
Além dos botões contidos no speedbar e do statusbar, a janela principal do InstallShield é composta por
uma janela contendo um checklist das opções existentes, mencionadas anteriormente, para a criação de uma
instalação.
O checklist mostrado ao lado serve como um
Item
guia para indicar as opções a serem preenchidas
Concluído
para a geração dos discos de instalação de um
software. Nem todos os passos mostrados no
checklist são de preenchimento obrigatório,
Passos dependendo da instalação sendo criada, porém
são exibidos como forma de referência para
Itens futuras instalações.
Cada um dos passos listados no checklist é
composto por um ou mais itens que podem ser
configurados. Para que isso seja possível basta-
se clicar com o mouse por sobre o botão que está do lado esquerdo do item que se deseja configurar. Após
o clique, será exibida a caixa de diálogo correspondente para a configuração do item selecionado. Existe
ainda a possibilidade de se selecionar qualquer um dos passos do checklist através das opções do menu
Página: 108
Delphi 5
Checklist. Após a conclusão de cada item do checklist um marcador de conclusão aparecerá do lado
esquerdo do item concluído. Veremos adiante a funcionalidade de cada um desses itens.
Existe ainda a opção de ir para uma segunda página, clicando-se com o mouse por sobre a pequena “dobra”
de página existente no canto inferior direito do checklist. Essa segunda página mostra algumas informações
de como entrar em contato com os desenvolvedores do InstallShield para enviar comentários, sugestões e
problemas encontrados com o produto.
Application Name
Contém o nome da aplicação. O nome da aplicação pode conter, no máximo, 80 caracteres e é preenchido,
por default, com o nome do projeto que está sendo criado no InstallShield
Application Executable
Indica o arquivo executável primário da aplicação. A escolha do arquivo executável pode ser feita através
do botão browse. Após a seleção desse arquivo, é apresentado, na caixa de texto, a localização 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 instalação, ou seja, um diretório selecionado pelo usuário no momento da instalação. Essa noção ficará
bem mais clara adiante, quando mostrarmos como criar Grupos de Componentes para uma instalação
Version
Indica qual a versão do produto a ser instalado
Company
Indica o nome da companhia desenvolvedora do produto
Default Destination Directory
Especifica o diretório default para a instalação do produto. O padrão a ser seguido é o seguinte:
<ProgramFilesDir>\<Companhia>\<Aplicação>
Página: 109
Delphi 5
Existem diversos outros especificadores que podem ser utilizados no InstallShield para customizar ainda
mais todo o processo de instalação, para uma explanação mais detalhada desses especificadores verificar na
ajuda do InstallShield, sob o título de Express Directory Specifiers.
Após o preenchimento dos campos acima temos 3 opções a seguir: clicar o botão OK, confirmando os
valores colocados (o sinal de verificação aparecerá do lado esquedo do item Applicaion Information), clicar
o botão Cancel, cancelando a operação ou, por fim, selecionar uma das tabs restantes para continuar
preenchendo as informações para a instalação.
Vamos clicar no segundo tab, chamado de Main Window, existente na caixa de diálogo Set the Visual
Design para continuarmos a fornecer informação sobre a nossa instalação.
Main Title
Existem duas opções a serem seguidas neste ponto, a escolha de um
texto, com no máximo 80 caracteres, ou a escolha de um bitmap, com no máximo 16 cores, para ser
colocado como título na janela principal do aplicativo de instalação. Por default, a opção selecionada é a de
colocação de um texto, porém podemos selecionar um bitmap mudando o radio button para a opção de
bimap. Para escolhermos qual bitmap a ser exibido, podemos utilizar o botão Browse. Um detalhe a ser
observado é que, para selecionarmos a opção de bitmap, não basta apenas clicarmos no botão Browse,
devemos ainda escolher o radio button correspondente para que essa seja a opção escolhida. Caso
contrário, será exibido como título a localização (path) do arquivo selecionado. O título, ou bitmap,
selecionado será exibido no canto superior esquerdo da janela.
Logo Bitmap
Essa opção é utilizada para escolher um bitmap como, por exemplo, a logomarca da empresa que
desenvolveu o sistema a ser instalado, na janela principal da instalação. O processo de seleção desse bitmap
é exatamente igual ao mencionado anteriormente.
Uma vez selecionado qual o bitmap a ser utilizado, deverá ser feita a escolha da posição na qual ele será
colocado na janela principal. Existem três posições possíveis: 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 título da janela caso este exista.
Background Color
Aqui temos a opção de escolher a cor que será utilizada como cor de fundo para a janela principal do
aplicativo de instalação. O default é Dithered Blue, o azul utilizado na maioria dos programas de instalação
existentes.
Página: 110
Delphi 5
eseja marcada. Dessa forma, as modificações criadas automaticamente pelo InstallShield, por exemplo, nos
registrados do sistema operacional, podem ser feitas automaticamente por um programa de desinstalação.
Terminamos a primeira etapa de configuração de nosso programa de instalação, ajustando pequenas
“propriedades” que serão utilizadas pelo InstallShield para gerar o início da instalação do produto em
questão. Até agora, todas as informações fornecidas não são influenciadas sobre qual a plataforma de
desenvolvimento utilizada, se Delphi ou qualquer outra porém, a partir de agora, vamos começar a ver
detalhes que facilitam a instalação de produtos desenvolvidos com o Delphi.
Página: 111
Delphi 5
Temos nessa caixa de diálogo a opção de criar os aliases que serão utilizados na aplicação, bem como
remover aqueles que porventura tenham sido colocados por engano. Para que possamos criar um alias
devemos clicar no botão New. Com isso, é exibida a caixa de diálogo 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 botão OK. Devemos observar que, os nomes
dos aliases que iremos criar na instalação devem ser os
mesmos que estão sendo utilizados pelo programa sendo
instalado.
Após clicarmos
no botão OK, o alias é colocado no listbox da caixa de diálogo
mostrada anteriormente. Uma vez que todos os aliases que serão utilizados na aplicação sejam criados
podemos passar ao passo seguinte da configuração do BDE clicando no botão Next.
A caixa de diálogo seguinte permite especificar se o arquivo de configuração do BDE deve ser salvo de tal
forma que tanto aplicações de 32 bits quanto as de 16 bits possam acessá-lo. Para que isso seja possível, o
checkbox mostrado deve ser assinalado. A seguir mostramos a caixa de diálogo citada anteriormente.
Caso o checkbox não seja assinalado, apenas a versão de 32 bits será salvo. Podemos clicar no botão
Avançar para continuar a configuração do BDE. A caixa de diálogo responsável pelo terceiro passo no
processo de configuração do BDE é mostrada a seguir.
A caixa de diálogo mostrada acima permite a configuração de
cada um dos aliases a ser criado no processo de instalação.
Para isso, devemos escolher no combobox Alias Name o alias
a ser configurado. Para cada um desses aliases, deveremos
especificar sua localização, 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 questão.
Podemos utilizar como parte do caminho, os especificadores
definidos no InstallShield. No exemplo acima, foi utilizado o especificador <INSTALLDIR> para
identificar o diretório de instalação no qual o aplicativo foi instalado.
Além da definição do diretório no qual os dados serão colocados, é necessária também a especificação de
qual driver será utilizado no acesso a esses dados. Os drivers disponíveis são listados no combobox Type.
Tanto o caminho quanto o tipo de driver são de preenchimento obrigatório, não devendo, portanto, serem
deixados em branco.
Uma vez preenchidas todas as informações com relação aos aliases a serem utilizados pela aplicação,
podemos clicar no botão Avançar para chegarmos à última caixa de diálogo de configuração do BDE,
mostrada a seguir.
A caixa de diálogo mostrada acima finaliza o processo de configuração do BDE a ser instalado na máquina
do cliente. Para que essas configurações sejam utilizadas devemos clicar o botão OK. Para mudarmos
posteriormente, qualquer uma dessas configurações, devemos clicar o botão Settings na caixa de diálogo
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 faça uso de qualquer um dos links existentes,
devemos assinalar essa opção. Um detalhe importante a ser
observado é que, para se utilizar o componente SQL Links,
devemos também utilizar o componente BDE mencionado
anteriormente.
Após assinalarmos a opção para o componente do SQL Links, a
seguinte caixa de diálogo de configuração será exibida
automaticamente.
Através da caixa de diálogo mostrada acima, podemos escolher
Página: 112
Delphi 5
quais os drivers que devem ser instalados juntamente com o aplicativo. Por default todos os drivers estão
assinalados.
O InstallShield, no processo de instalação, instalará todos os arquivos necessários e fará todas as alterações
nos registradores do sistema operacional para os drivers assinalados para a instalação. Devemos lembrar
que, a escolha de drivers além do necessário não acarreta em problema algum para a instalação, o único
aspecto negativo está no fato da instalação e consequente diminuição do espaço livre em disco, com
arquivos desnecessários.
Uma vez configurados os componentes do InstallShield para o Delphi em seus aspectos gerais podemos
avançar para a aba Advanced. Devemos observar que o conteúdo dessa aba dependerá das opções
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 informações a respeito dos arquivos que, de
acordo com as opções feitas na aba General, foram selecionados
para instalação. Nesse ponto não podemos adicionar ou remover
elementos. Para adicionarmos elementos, devemos fazê-lo na aba
General, enquanto que a remoção de arquivos em particular poderá
ser feita na caixa de diálogo Groups and Files que será vista a
seguir. Para cada arquivo selecionado são exibidas informações a
respeito da data, tamanho e versão do arquivo.
Uma vez definidos e configurados os componentes que serão
utilizados pelo InstallShield no processo de instalação, estamos prontos para seguir adiante. Podemos clicar
no botão OK e passar para o próximo passo no processo de criação de nossa instalação descrito a seguir.
Neste ponto do processo de desenvolvimento de nossa instalação estamos prontos para especificar quais os
arquivos do software a ser instalados que serão inclusos no processo de instalação, bem como a sua
localização na máquina do cliente. Para isso devemos escolher a opção Groups and Files localizada na
opção Specify Components and Files no checklist da instalação.
O processo de configuração dos arquivos a serem instalados pelo InstallShield está baseado no conceito de
grupos. A idéia de grupo é bastante simples de ser entendida e utilizada, principalmente para instalações
que não envolvam múltiplas configurações como é o caso da qual estamos correntemente desenvolvendo.
Um grupo pode ser visto como uma coleção de arquivos relacionados como, por exemplo, os arquivos de
banco de dados de uma aplicação. A cada grupo é associada uma localização (path) que será utilizado no
momento da instalação dos arquivos pertencentes a esses grupos na máquina do cliente.
A criação de grupos, a especificação dos arquivos pertencentes a eles e a determinação de seu local de
instalação dos grupos associados a cada uma das instalações desenvolvidas pelo InstallShield é realizada
através da aba Groups na caixa de diálogo Specify Components and Files mostrada a seguir.
Página: 113
Delphi 5
Nesse ponto podemos começar a organizar os arquivos que serão instalados estabelecendo sua localização
relativa na máquina do cliente. É aconselhável que esses arquivos já estejam agrupados na própria máquina
de desenvolvimento para que o processo de “montagem” dos grupos seja feito de forma mais fácil e rápida.
Inicialmente já existe pelo menos um grupo a ser instalado, chamado Program Files, que possui o arquivo
executável principal da aplicação. Por default esse arquivo será instalado no especificador
<INSTALLDIR> que identifica o diretório selecionado pelo cliente no momento da instalação.
Dependendo de quais componentes tenham sido selecionados na caixa de diálogo Select InstallShield
Components for Delphi existirão outros grupos definidos automaticamente para instalação, como mostrado
na figura acima. Nesse momento podemos modificar a localização desses grupos clicando o botão Modify
Group. Devemos observar que, em relação aos grupos do BDE criados automaticamente, a modificação de
sua localização não é aconselhável. Essa observação advém do fato de que, caso já exista uma aplicação na
máquina do cliente que utilize o BDE e, consequentemente, possua seus arquivos instalados no diretório
default indicado pelo InstallShield, a instalação atual irá instalar uma nova cópia do BDE em um local
diferente, ocupando espaço desnecessário e podendo, inclusive, causar problemas durante a execução dos
aplicativos que o utilizem. Ao clicar-se no botão Modify Group, a caixa de diálogo a seguir é exibida.
Página: 114
Delphi 5
capaz de gerar os discos de instalação. Após a geração desses discos, tanto a remoção quanto a alteração da
localização desses arquivos pode ser feita normalmente.
A remoção de um grupo também é feita de forma bem simples e intuitiva. Para que um grupo seja
removido basta selecionarmos o grupo em questão e pressionarmos a tecla del. O InstallShield abre uma
caixa de diálogo 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
também serão removidos da instalação. De forma semelhante podemos remover os arquivos, basta que
selecionemos o arquivo desejado e pressionemos a tecla del. O arquivo em questão será removido da
instalação. A diferença entre a remoção de um grupo ou de um arquivo está na confirmação da remoção.
No caso da remoção de arquivos não existe um pedido de confirmação, o arquivo é removido
imediatamente após pressionarmos a tecla del, enquanto que ao removermos um grupo, existe o pedido
pela confirmação da remoção.
O botão File Details exibe informações a respeito do arquivo correntemente selecionado. Um exemplo da
caixa de diálogo com as informações de um arquivo é mostrado a seguir.
Uma observação que deve ser feita é em relação à
instalação de um software que utilize arquivos gravados
no diretório do Windows. Quaisquer arquivos que se
tente copiar, tanto para o diretório do Windows quanto
para o diretório System, que já possuam nesses diretórios
da máquina do cliente versões mais recentes do que
aquelas que a instalação está tentando gravar, não serão
copiados.
No processo de desenvolvimento de instalações simples, que não envolvam múltiplas configurações como
mencionado anteriormente, a única caixa de diálogo a ser preenchida é a de Groups. Deixaremos de lado,
momentaneamente, o preenchimento das duas outras abas, Components e Setup Types, que serão vistas
posteriormente quando falarmos a respeito de instalações múltiplas. Podemos seguir adiante pressionando a
o botão OK.
Welcome Bitmap
Permite a exibição de um bitmap logo após a exibição da caixa de diálogo de inicialização da instalação
mas antes de qualquer outra caixa de diálogo. Um exemplo de uma caixa de diálogo de inicilizazação é
mostrado a seguir.
Página: 115
Delphi 5
A aba Settings para esse item permite a escolha de qual bitmap deseja-se exibir.
Welcome Message
Exibe uma mensagem ao usuário dando as boas vindas ao programa de instalação e fornecendo instruções
ao usuário para que esse feche todos os aplicativos que estejam correntemente em execução antes de
continuar o processo de instalação. Um breve aviso sobre direitos autorais também é fornecido.
O nome fornecido na caixa de diálogo Application Information é colocado automaticamente no topo dessa
caixa de diálogo.
Não existe a aba Settings para esta caixa de diálogo.
Software License Agreement
Exibe uma caixa de diálogo contendo o Acordo para Licença de Uso do software que está sendo instalado.
A aba Settings permite indicar o arquivo texto que contém o texto a ser exibido na caixa de diálogo citada
acima.
Readme Information
Essa caixa de diálogo é utilizada para exibir um arquivo texto do tipo Leiame. É importante observar que o
texto a ser exibido nessa caixa de diálogo não é formatado automaticamente. Para que o texto seja
completamente exibido na caixa de diálogo, ele deve ser formatado com retorno de carro em cada linha de
acordo com a formatação desejada.
User Information
Utilizada para coletar informações a respeito do usuário tais como nome, companhia e, opcionalmente, o
número serial do produto sendo instalado.
A aba Settings permite a definição de quais informações podem ser fornecidas pelo usuário. Existem duas
opções, a primeira sem a opção para o número serial e a segunda, com o número serial.
Choose Destination Location
Através dessa caixa de diálogo o usuário pode escolher a localização na qual ele deseja que o aplicativo
seja instalado. O diretório escolhido pelo usuário irá substituir o especificador <INSTALLDIR>, nos locais
nos quais ele tenha sido utilizado no processo de criação da instalação.
A aba Settings é utilizada para definir o diretório default a ser exibido para o usuário no momento da
instalação. Pode-se ser utilizado qualquer especificador existente no InstallShield para compor o diretório
default porém, não é aconselhada a utilização do especificador <INSTALLDIR>. Caso isso seja feito, no
momento da geração dos discos de instalação, o InstallShield fornecerá um warning alertando sobre a
utilização desse especificador em um local não apropriado. O default utilizado pelo InstallShield para o
diretório default de instalação segue o padrão:
<ProgramFilesDir>\<Companhia>\<Aplicação>
Onde companhia e aplicação são substituídos pelas informações fornecidas na caixa de diálogo Application
Information.
Setup Type
Permite ao usuário escolher qual o tipo de instalação desejada. Para que essa caixa de diálogo possa ser
exibida, faz-se necessário que tenham sido criados os tipos de instalação correspondentes.
Não existe a aba Settings para esta caixa de diálogo.
Custom Setup
Essa caixa de diálogo será exibida apenas se o usuário escolher a opção de instalação customizada na caixa
de diálogo Setup Type.
Permite a escolha de quais componentes o usuário deseja instalar. Os componentes constantes nessa caixa
de diálogo devem ter sido previamente determinados na caixa de diálogo Components.
Página: 116
Delphi 5
Até agora, nas diversas caixas de diálogo apresentadas nesta apostila, foram fornecidas informações ao
InstallShield que serão diretamente visíveis aos usuários no momento da instalação. Neste tópico veremos
como definir informações que serão fornecidas ao sistema operacional.
A caixa de diálogo Make Registry Changes permite ao desenvolvedor definir as diversas chaves que serão
utilizadas nos registradores do sistema operacional, bem como definir os valores que nelas serão
armazenados. Para atender a essas finalidades,
a caixa de diálogo Make Registry Changes está
dividida em duas abas, cada um das quais
destinadas a atender as funcionalidades citadas
anteriormente. A primeira dessas abas, a aba
Registry – Keys é mostrada a seguir.
A caixa de diálogo Registry – Keys é utilizada
para definir as chaves que serão adicionadas
Página: 117
Delphi 5
aos registradores do sistema operacional no momento da instalação do software. O conteúdo dessa aba está
intimamente ligado ao conteúdo da segunda aba existente nessa caixa de diálogo onde, os valores exibidos
na segunda aba são 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, não podem ser removidas ou alteradas por serem utilizadas
pelo programa de desinstalação. As root keys servem como base para outras chaves a serem adicionadas ao
programa de instalação. Para maiores informações a respeito das root keys consultar o tópico de ajuda
Registry Key Automatic Entry. Cada nova chave a ser adicionada deve, portanto, ser descendente de uma
chave já existente.
O botão Modify Key não está inicialmente habilitado uma vez que não é possível a alteração de qualquer
uma das root keys. Uma vez que uma nova chave for adicionada e selecionada, esse botão 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
botão Add Key para que a seguinte caixa de diálogo apareça.
Devemos preencher o campo New Key com o nome
da nova chave a ser criada. Durante a composição do
nome da nova chave, podem ser utilizados mais de
um nível de chaves, sendo essas separadas por uma
barra invertida como mostrado na figura acima. Uma
vez definida a nova chave, podemos clicar o botão
OK para que a nova chave seja criada e exibida como
uma ramificação sob a root key indicada no campo
Sub Key of da caixa de diálogo Registry New Key
mostrada acima.
A modificação de uma chave existente também é feita de forma bastante simplificada. Para isso, basta que
a chave a ser modificada seja escolhida e seja pressionado o botão Modify Key. Uma vez pressionado o
botão Modify Key, uma caixa de diálogo 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 alteração basta que o botão OK seja clicado. Uma observação 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 permanecerão inalteradas.
A remoção de uma chave, da mesma forma que a alteração, é bastante simples e intuitiva. Para que uma
chave seja removida basta que ela seja selecionada e a tecla del seja pressionada. No caso da seleção de
uma chave que possua subchaves a remoção é feita da mesma forma porém as subchaves também serão
removidas juntamente com a chave inicialmente selecionada. Uma observação a ser feita está no fato da
não solicitação de uma confirmação antes da remoção de uma chave. Devemos, portanto, Ter bastante
cuidado antes de remover alguma chave para evitarmos qualquer possibilidade de re-trabalho.
O botão Registry Editor é utilizado para exibir o Editor de Registro do Windows95. Para maiores
informações a respeito do Editor de Registro, consultar a ajuda do próprio editor.
A segunda aba da caixa de diálogo Make Registry Changes, a aba Registry - Values, é utilizada para
fornecer valores para as chaves especificadas na aba Registry – Keys. A caixa de diálogo 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
alteração não pode ser feita diretamente na caixa de texto.
Para que um novo valor seja adicionado à chave correntemente
escolhida devemos clicar o botão Add Value. Ao fazermos isso, a
caixa de diálogo Registry Value será exibida como mostrado a
seguir.
Página: 118
Delphi 5
Passamos agora ao processo de acabamento final de nosso processo de desenvolvimento de uma instalação.
Nas duas caixas de diálogos que serão mostradas a seguir, passaremos a definir o ambiente no qual a
aplicação será executada, especificando o grupo e os ícones que serão instalados na máquina do cliente.
A caixa de diálogo General, mostrada a seguir, é utilizada para determinar os ícones que serão colocados
no grupo de programas da aplicação que está sendo instalada.
Inicialmente, é exibido o ícone especificado para a aplicação para a
qual a instalação está sendo desenvolvida, aquele arquivo
executável definido como primário da aplicação. Podemos alterar
os parâmetros a serem fornecidos à esses executável, preenchendo
a caixa de texto Run Command Parameters, bem como alterar a
descrição para esse executável. O conteúdo da caixa de texto
Description será utilizado logo abaixo do ícone, após o clique no
botão Modify Icon, como mostrado na figura.
Para adicionarmos novos ícones ao grupo sendo construído,
devemos clicar no botão contendo uma reticências, logo ao lado da
caixa de texto Run Command. Feito isso, aparecerá a seguinte caixa de diálogo.
A caixa de diálogo Setup Files Browser é utilizada para
selecionarmos os arquivos a serem colocados no grupo da
aplicação que será instalado. Nessa caixa de diálogo, estão
listados os arquivos pertencentes à instalação. Para que um
arquivo seja colocado, basta que ele seja selecionado, como
mostra a figura acima, e logo em seguida o botão OK seja
clicado. Os dados para o arquivo selecionado aparecerão na
caixa de diálogo Geral. Para que o ícone seja exibido, basta
que o botão Add Icon seja clicado. Com isso, o ícone para o
arquivo selecionado será colocado juntamente com os
demais ícones previamente selecionados.
Página: 119
Delphi 5
Para modificarmos os atributos de um ícone já existente, basta que façamos as alterações nos campos
desejados e, para que as alterações sejam efetivadas, o botão Modify Icon seja clicado.
Da mesma forma como mostrado com as chaves, os ícones selecionados podem ser removidos ao
pressionamos a tecla del. A remoção aqui também é feita sem que seja exibida qualquer caixa de diálogo
solicitando uma confirmação por parte do usuário.
A segunda aba pertencente à caixa de diálogo Specify Folrders and Icons, chamada Advanced, propicia a
configurações de características avançadas 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 diretório que será utilizado como diretório
de trabalho para o ícone selecionado. Por default, o diretório de
trabalho é o mesmo diretório onde encontra-se o aplicativo. É
importante observar que, para que quaisquer alterações efetuadas
no aplicativo sejam efetivadas, é necessário clicar o botão Modify
Info, caso contrário as alterações não terão efeito.
A seguir, podemos definir um ícone para o aplicativo. Para isso,
devemos clicar o botão contendo reticências ao lado da caixa de texto Icon. Feito isso, surgirá a caixa de
diálogo Setup Files Browser, mostrada anteriormente. Podemos escolher um ícone contido em um arquivo
do tipo ICO ou constante de uma DLL. Devemos ter, contudo, incluído 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 combinação de
teclas, ao aplicativo, devemos
selecionar o aplicativo e, com o
foco colocado na caixa de texto
Short Cut Key, pressionar a
combinação de teclas desejada.
Caso desejemos cancelar a
associação 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 instalações onde existam apenas um único ícone sendo instalado, onde não haveria a
necessidade da criação de um grupo para o aplicativo.
Página: 120
Delphi 5
720KB até o CD-ROM. O tamanho do disco deverá ser selecionado através do combobox Disk Size.
Uma vez definido qual o tamanho dos discos a serem gerados, podemos dar início ao processo de geração
das imagens dos discos de instalação. Para isso, basta clicarmos o botão Build. Feito isso, é dado início ao
processo de geração, que pode ser acompanhado através da barra de progresso existente acima dos botões
de Build, Close e Help, ou através do componente memo, chamado Feedback.
Ao final da geração das imagens, um pequeno resumo resumo é exibido na no memo Feedback e os
“discos” gerados são exibidos no list view Disk Images. A seguir mostramos o resultado da geração das
imagens dos discos de instalação do aplicativo.
Podemos clicar o botão Close para sairmos da caixa de diálogo Build. Já de posse das imagens dos discos
de instalação temos duas opções: testar a instalação que acabamos de criar ou gerar efetivamente os discos
de instalação, copiando as imagens geradas para os discos que serão utilizados na distribuição do produto.
Página: 121
Delphi 5
Uma vez iniciado o primeiro projeto no InstallShield, a caixa de diálogo que é exibida no início de toda
seção de trabalho com o InstallShield passa a disponibilizar mais uma opção como mostrado a seguir.
A partir de agora temos a opção de abrir o último projeto no qual
estávamos trabalhando. Esta opção agiliza a utilização do
InstallShield a medida em que trabalhamos com um projeto. Essa
passa a ser a opção default exibida todas as vezes em que iniciamos
o InstallShield.
Os passos para a criação de uma instalação com múltiplas
configurações é bastante semelhante ao descrito anteriormente. Devemos iniciar um novo projeto para que
a caixa de diálogo New Project seja exibida, como mostrado a seguir.
Devemos preencher todas as opções como mostrado
anteriormente. Neste ponto, o único detalhe a ser
observado está no fato de que, por tratar-se do
desenvolvimento de uma instalação com múltiplas
configurações, o checkbox Include a custom setup type
deve estar assinalado como mostrado na figura acima.
Podemos clicar o botão Create para dar início ao
processo de criação da instalação.
A janela principal do InstallShield é exibida
exatamente da mesma maneira como durante o
processo de desenvolvimento de uma instalação simples. As mesmas opções são exibidas no checklist, cada
uma delas devendo ser preenchida como foi mostrado nos tópicos anteriores desse manual. O processo de
desenvolvimento segue da mesma forma como mostrado anteriormente até o momento em que chegamos
na caixa de diálogo Components, a qual deixamos de explicar anteriormente mas que trataremos a seguir.
12.15. Componentes
A caixa de diálogo Components é utilizada para definirmos os componentes que fazem parte de uma
instalação. Da mesma forma com que podemos criar grupos no InstallShield, onde um grupo é composto
por um ou mais arquivos de forma a facilitar a organização física dos arquivos em disco no processo de
instalação, podemos definir componentes. Um componente é uma unidade lógica da instalação, cada um
dos quais contendo um ou mais grupos de arquivos a serem instalados. A caixa de diálogo Components é
mostrada a seguir.
Através da caixa de diálogo Components é possível a criação de
novos componentes bem como a modificação de componentes já
existentes, além da adição dos grupos criados anteriormente à
componentes específicos. Como podemos ver, a caixa de diálogo
Components está dividida basicamente em duas partes. Do lado
esquerdo temos a indicação de todos os componentes atualmente
inclusos no processo de instalação, juntamente com os grupos
que os compõe. Já do lado direito, temos todos os grupos.
Para podermos criar novos componentes à instalação, devemos
clicar o botão Add Component para que a caixa de diálogo Add
Component, mostrada a seguir, seja exibida.
Como mostrado na figura, devemos entrar com os valores que serão
utilizados como nome do componente a ser criado bem como uma breve
descrição. Uma vez clicado o botão OK, o novo componente será adicionado
à lista de componentes da instalação. Através do clique do botão Modify
Component podemos modificar tanto o nome como a descrição do
componente selecionado. Já a remoção de um componente é feita ao
pressionarmos a tecla del. O componente selecionado é removido sem
nenhum pedido de remoção, independentemente da existência de grupos associados a ele ou não.
Página: 122
Delphi 5
Um componente não 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 associação basta clicarmos o botão Add to Application
Component. Uma vez criados todos os componentes necessários ao desenvolvimento de nossa instalação
podemos clicar o botão OK para que nossas alterações seja efetivadas.
12.17. Conclusão
Como pudemos verificar, o InstallShield é um software bastante simples de ser utilizado mas que fornece
uma poderosa ferramenta para a geração de instalações, dando uma aparência profissional aos softwares
desenvolvidos por qualquer empresa.
Para maiores esclarecimentos, enviar correio eletrônico para o endereço mostrado na própria janela
principal do InstallShield, visitar o site da InstallShield ou mesmo consultar o Help On-Line do produto.
Página: 123