Vous êtes sur la page 1sur 300

Iniciando no Visual Basic

Para demonstrar como fcil comear a trabalhar com o Visual Basic e quo
rapidamente voc poder aprender a criar aplicativos teis, este captulo o
conduzir a um verdadeiro mergulho de cabea, fazendo-o escrever um
programa simples. Indubitavelmente, a experimentao com o Visual Basic a
melhor forma de obter uma viso das ferramentas com as quais voc
trabalhar, e isso lhe dar um lampejo do potencial excitante do Visual Basic.
Aps esta pequena experincia prtica, os captulos seguintes oferecero uma
viso mais detalhada dos "comos e porqus" do Visual Basic.
Iniciando o Visual Basic
1. Clique Iniciar na barra de tarefas
2. Selecionar Programas, e ento Visual Basic 5.0.
ou
Clique Iniciar na barra de tarefas.
Selecionar Programas.
Use o Explorer do Windows para achar o arquivo executvel Visual
Basic (VB5.exe).
3. Clique duas vezes o cone Visual Basic.
Voc tambm pode criar um atalho para o Visual Basic, clicar duas vezes no
atalho. Quando voc inicia o Visual Basic, voc v as janelas do ambiente de
desenvolvimento integrado, como mostrado em Figura 1.1.
Figura 1.1 O ambiente de desenvolvimento integrado do Visual Basic
Explorando o Vdeo
Aps voc iniciar o Visual Basic, um conjunto de janelas aparecer no seu
vdeo, conforme ilustrado pela Figura 1.1. Na parte superior da janela principal
esto menus padronizados File e Edit, os outros menus do Visual Basic, bem
como a barra de ferramentas. Na parte central do vdeo, encontra-se a janela
de form, uma janela grande e vazia intitulada Form1. Diretamente esquerda,
v-se a janela de palhetas chamada caixa de ferramentas. direita da janela
de form, situa-se a janela de propriedades, chamada Properties, e acima dela
aparece a janela de explorao do projeto, intitulada Project. Uma pequena
janela com uma representao do vdeo em miniatura tambm vista. Trata-se
da janela de Layout de Formulrio.
Eu quase posso escutar sua reclamao: "Isso pode ser complicado".
Realmente, pode ser complicado. Entretanto, a chave para gerenciamento de
complexidade a organizao, e o ambiente do Visual Basic foi projetado para
que voc se mantenha organizado. Vamos dar uma olhada em cada uma das
janelas
A Janela Principal
A janela principal contm a barra de menu, com onze menus drop-down. Um
dos mais importantes, especialmente enquanto voc estiver aprendendo o
Visual Basic, o menu Help. A partir desse menu, voc poder acessar uma
vasta documentao sobre o Visual Basic na forma de manuais (Books Online),
encontrar informaes sobre como contatar o servio de suporte a produtos da
Microsoft e explorar o sistema de ajuda online do Visual Basic.
Por exemplo, ao selecionar a opo Microsoft Visual Basic Help Topics do
menu Help, voc ver uma janela com divises em forma de fichas de arquivo.
Uma diviso apresenta o contedo do sistema de ajuda na forma de livros, que
ao serem abertos exibem novas subdivises ou tpicos de ajuda como sees
de um livro. Ao dar um clique duplo num dos tpicos ou selecion-lo e clicar no
boto Exibir, uma janela contendo o tpico lhe ser apresentada. Se preferir
procurar por um tpico dentro da ordem alfabtica de tpicos, escolha a diviso
ndice. Caso tenha uma palavra que no corresponde a nenhum tpico
presente no ndice, use a diviso Localizar.
Adicionalmente, o sistema de ajuda fornece informaes associadas ao
contexto. Se voc precisar saber mais sobre um boto, uma caixa de dilogo,
uma janela ou qualquer outro elemento enquanto estiver trabalhando com o
Visual Basic, basta pressionar a tecla F1 quando o elemento em questo
estiver destacado, e o sistema de ajuda exibir imediatamente as informaes
pertinentes.
A janela principal ainda contm a barra de ferramentas. Os botes da barra de
ferramentas mostrados na Figura 1.2 so atalhos para comandos usados mais
freqentemente. Por exemplo, em vez de abrir o menu File e selecionar a
opo Open Project, voc pode simplesmente dar um clique no boto Abrir
Projeto.
Figura 1.2 A barra de ferramentas do Visual Basic.

A Janela de Explorador do Projeto
A janela de Explorador do Projeto contm uma rvore de pastas com todos os
arquivos necessrios para executar o programa Visual Basic que voc est
criando. Ainda que voc no tenha comeado, j aparece uma entrada na
janela de Explorador do Projeto, como foi visto na Figura 1.1. Esta primeira
entrada a pasta Forms com o arquivo Form1.frm; o rtulo do arquivo (Form1)
indica que ele se encontra associado janela de form, chamada Form1. Se
voc salvar o form em disco, sem alterar seu nome, o Visual Basic usar o
nome de arquivo default: Form1.frm. Um aplicativo pode conter vrios forms,
sendo cada um deles armazenado em um arquivo separado. (O
armazenamento em arquivos distintos torna possvel o compartilhamento de
um form com vrios aplicativos.)
A janela de Explorador do Projeto tambm contm trs botes: View Code,
View Object e Toggle Folders. Por default, o Visual Basic exibe na janela de
form o form correspondente entrada que for selecionada na janela de
Explorador de Projeto. Essa viso lhe permite projetar a interao que o seu
aplicativo ter com o usurio final - a parte do aplicativo que o usurio v e com
a qual interage. Se voc der um clique no boto View Code da janela de
Explorador do Projeto, o cdigo para o arquivo selecionado ser exibido em
uma janela diferente. O cdigo refere-se s instrues em linguagem de
programao.
O processo de programao chamado de codificao. Quando voc cria um
programa em Visual Basic, o seu trabalho se divide entre o projeto do Form,
que eventualmente ser visto pelo usurio, e a codificao, que controlar as
operaes do programa. Para mover-se da janela de cdigo para a janela de
form, basta dar um clique sobre o form, ou ento acionar o boto View Form da
janela de Explorador do Projeto.
A Janela de Form e a Caixa de Ferramentas
Um form uma rea de exibio que corresponde janela que voc ver
quando o seu aplicativo estiver sendo processado. Quando voc inicia um novo
projeto, o Visual Basic cria um form vazio com o titulo Form1. Enquanto voc
desenvolve seu aplicativo, o form serve como uma prancheta, sobre a qual so
desenhadas as vrias partes do aplicativo. Os componentes do aplicativo que
voc coloca no form so chamados objetos ou controles, tais como caixas de
imagens, botes de opes e barras de deslocamento. (O Visual Basic
considera o prprio form como um objeto.)
Figura 1.3 A caixa de ferramentas do Visual Basic.
Os controles so criados a partir da palheta caixa de ferramentas, que
apresentada na Figura 1.3. Cada controle representado por uma ferramenta
ou cone da caixa de ferramentas. A maioria dos controles vistos na Figura 1.3
intrnseca ao Visual Basic. Entretanto, essa caixa de ferramentas pode ser
estendida de forma a incluir ferramentas adicionais. Clicando no submenu
Components do menu Project, lhe ser apresentada uma janela com muitos
outros controles que podem ser adicionados caixa de ferramentas. Basta
marc-los como selecionados e dar um Ok para que eles apaream na caixa
de ferramentas.
Voc constri a aparncia de seu programa escolhendo controles da caixa de
ferramentas e colocando-os sobre um form. Enquanto voc est
desenvolvendo um aplicativo, o Visual Basic opera de forma diferente de
quando o aplicativo est sendo processado. Durante a fase de
desenvolvimento, o Visual Basic prov ferramentas para auxili-lo a criar
objetos de exibio e escrever seu programa. Voc interage com os objetos
colocados em um form, alterando seu tamanho, sua posio e outros atributos.
Porm, durante a fase de desenvolvimento, os objetos estaro sempre inativos
e o cdigo de seu programa no ser executado - por exemplo, caso um objeto
barra de deslocamento seja colocado em um form, voc poder alterar o seu
tamanho e sua posio, mas ele no poder ser usado para deslocar coisa
alguma.
Ao iniciar a fase de processamento ou execuo, o Visual Basic remove as
ferramentas de desenvolvimento. O layout da janela fixado, os objetos na tela
podem ento ser ativados e o usurio pode interagir com a exibio, como foi
planejado no aplicativo. Nesse momento, o aplicativo ganha espao e o Visual
Basic executa as instrues de seu programa. (Na barra de titulo da janela
principal, o Visual Basic identifica quando voc est em fase de
desenvolvimento ou de execuo.)
A Janela de Propriedades
As propriedades do Visual Basic so mecanismos formais para descrio dos
atributos de um objeto. No mundo real, voc pode perguntar: "Qual a cor
daquele carro ?". Em Visual Basic, essa pergunta deveria ser: "Qual o valor da
propriedade cor daquele carro ?" Naturalmente, a resposta em ambos os casos
poderia ser "azul". Marca outra propriedade tpica de carros. Valores
esperados, ou configuraes, para a propriedade marca poderiam incluir Ford,
Volkswagen e GM.
Cada objeto do Visual Basic tem propriedades especficas, cuja configurao
controla a aparncia e o comportamento do objeto no aplicativo. Algumas
propriedades so restritas a um conjunto prefixado de valores. Por exemplo, a
propriedade Visible (visvel) de um objeto apenas pode assumir o valor True ou
False (verdadeiro ou falso). Outras propriedades, como Caption (ttulo) de uma
janela de form, podem assumir qualquer valor. importante notar que no
necessrio informar o valor para todas as propriedades de todos os objetos; os
valores atribudos automaticamente para muitas propriedades, via de regra,
so perfeitamente aceitveis.
Ainda que muitas propriedades possam ser alteradas, tanto em tempo de
desenvolvimento quanto em tempo de execuo, a janela de propriedades,
mostrada na Figura 1.4, estar ativa apenas na fase de desenvolvimento. Voc
pode ativar a janela de propriedades de vrias formas: dando um clique nela,
pressionado F4 ou, ainda, dando um clique no boto Janela de Propriedades
na barra de ferramentas.
Figura 1.4 A janela de propriedades.
A caixa de lista drop-down no topo da janela de propriedades chamada de
caixa de objetos. Ela exibe o nome de todos os objetos contidos em um
aplicativo, bem como o tipo de cada objeto. Inicialmente, a caixa de objeto
contm apenas informaes a respeito do objeto form, porm, medida que
voc adiciona outros controles ao form, o Visual Basic incorpora esses objetos
lista drop-down da caixa de objetos.
Abaixo da caixa de objetos, voc encontrar a lista de propriedades. A lista de
propriedades permite percorrer todas as propriedades do objeto mostrado na
caixa de objetos e ver os valores de cada propriedade. Dividida em duas
colunas, uma para o nome da propriedade (esquerda) e outra para os valores
das propriedades (direita), a lista de propriedades onde voc modificar as
caractersticas dos objetos. Para modificar uma propriedade, voc deve digitar
o novo valor na rea direita do nome da propriedade na lista de propriedades
ou escolher a nova configurao a partir de uma lista drop-down contendo as
possveis configuraes para a propriedade em questo.
Para demonstrar como usar essas vrias janelas do Visual Basic para criar um
aplicativo, vamos desenvolver seu primeiro projeto.
Criando a Interao com o Usurio
Como primeiro projeto, vamos criar um programa que simplesmente mea o
tempo decorrido, semelhante ao que faz um cronmetro. Um cronmetro tem
um boto onde se d um clique para iniciar a contagem do tempo, outro boto
que permite parar essa contagem e um mostrador no qual se v o tempo
decorrido. Voc pode usar esse modelo bsico para seu programa. Em Visual
Basic, um form servir como o mostrador do relgio e para o posicionamento
dos botes de incio e parada. Para iniciar o desenvolvimento de seu aplicativo,
voc ter de examinar e modificar algumas das propriedades do form.
Configurando as Propriedades do Form
Quando o aplicativo estiver sendo processado, o form ser apresentado em
uma janela padronizada para aplicativos. Se voc desejar que essa janela se
parea com aquelas apresentadas por outros aplicativos escritos para
Windows, certos atributos devem ser semelhantes. Por exemplo, um atributo
comum a todos os aplicativos Windows o nome do aplicativo aparecer como
um ttulo na barra de ttulo do form. Em Visual Basic, a maioria desses atributos
controlada por meio das propriedades dos objetos.
Para comear a configurar as propriedades do form, selecione-o como objeto
atual, dando um clique em qualquer lugar da janela intitulada Form1. Agora,
olhe para a janela de propriedades, onde Form1 exibido na caixa de objetos.
Para alterar o ttulo do form, d um clique na propriedade Caption na lista de
propriedades. Digite Cronmetro como novo ttulo. medida que voc digita, o
novo ttulo exibido na barra de ttulo da janela de form.
Quando uma propriedade somente puder assumir determinados valores, no
local de entrada de valores aparece uma caixa de lista drop-down e no um
campo para entrada de dados. Por exemplo, percorra a lista de propriedades e
selecione a propriedade Visible. A seta para baixo, colocada no lado direito do
campo de valores, agora se torna habilitada, indicando que as configuraes
para a propriedade Visible estaro restritas s que sero exibidas na lista drop-
down. Se voc der um clique no boto de seta para baixo, uma lista aparecer
abaixo para mostrar as configuraes True e False, conforme mostrado
na Figura 1.5. Assegure-se de que a propriedade Visible seja configurada
como True.
Figura 1.5 Configurando a propriedade Visible do Form.
Outra propriedade relacionada com a aparncia do form BorderStyle (estilo
da borda), que controla quando o usurio pode ou no redimensionar a janela
de exibio durante a execuo do aplicativo. Uma vez que o aplicativo
Cronmetro dever ter aparncia fixa, a sua janela no poder ser
redimensionada. Selecione a propriedade BorderStyle da lista de propriedades
e ento configure-a para 3 - Fixed Dialog, selecionando-a a partir da lista drop-
down direita da propriedade. (Esta opo indica que a janela ter uma borda
no-redimensionvel, sem botes para minimizao ou maximizao.)
A Propriedade Name
Todo objeto Visual Basic tem uma propriedade chamada Name (nome). Ao
configurar essa propriedade, voc d ao objeto uma identidade por meio da
qual possvel referenci-lo dentro do programa. Na janela de form, voc pode
acessar um objeto dando um clique nele. Na poro de cdigo do programa,
preciso referenciar-se ao objeto por meio do nome que for dado a ele mediante
a propriedade Name. (Note que as propriedades Name e Caption so
diferentes. O nome de um objeto sua identificao para efeito das instrues
do programa; o ttulo (Caption) aquilo que o usurio v na tela - um texto
identificador que exibido na janela do aplicativo.)
Na lista de propriedades, selecione a propriedade Name. Seu valor default,
mostrado na lista de propriedades, Form1. Edite a propriedade Name do seu
form, digitando o texto MeuForm no campo de valor.
Nota: Quando voc altera o nome de um form, o Visual Basic reflete essa
modificao na lista de arquivos exibidos na janela de Explorador do Projeto.
Lembre-se de que a definio de cada form armazenada em um arquivo
separado. Quando o aplicativo salvo, voc pode escolher o nome de arquivo
que deseja para seu form, porm o Visual Basic sugerir um nome de arquivo
baseado no nome do form.
Adicionando Objetos de Exibio
Retornemos ao projeto do form para criar os botes que iniciaro e pararo o
cronmetro:
1. D um clique na ferramenta Boto de Comando na caixa de ferramentas e
movimente o ponteiro do mouse para a janela de form em branco. O cursor ir
transformar-se numa cruz, indicando que voc se encontra em modo de
tracejamento.
2. Posicione o cursor no canto superior esquerdo do form.
3. Pressione o boto do mouse e arraste o cursor para baixo e para a direita.
4. Solte o boto do mouse
Quando voc soltar o boto do mouse, o Visual Basic criar o objeto boto de
comando na rea delineada pela operao de arrasto. O seu boto de
comando dever ser semelhante ao mostrado na Figura 1.6.
Aps a criao do boto de comando, a ferramenta Ponteiro ir tornar-se
novamente a ferramenta ativa da caixa de ferramentas. Quando a ferramenta
Ponteiro est ativa, voc pode editar o form, deslocando objetos e
redimensionando-os. Para deslocar um objeto, basta arrast-lo para a nova
posio. Para redimensionar um objeto, arraste uma de suas alas (mostradas
na Figura 1.6) para expandi-lo ou encolh-lo. Caso as alas no estejam
visveis, d um clique sobre o objeto, para selecion-lo.
Agora, crie um segundo boto de comando, desta vez usando um atalho. D
um clique duplo sobre a ferramenta Boto de Comando na caixa de
ferramentas. O Visual Basic criar um boto de dimenses padronizadas,
colocando-o no centro do form. Aps isso, posicione-o e altere suas
dimenses, de forma que ambos os botes de comando apaream do lado
esquerdo da tela, um abaixo do outro, e tenham o mesmo tamanho.
Figura 1.6 O boto de comando recm-criado.
Esses dois botes, agora rotulados automaticamente como Command1 e
Command2, serviro como botes de incio e parada para o aplicativo
Cronmetro. Por questes de clareza, voc deveria assinalar seus ttulos
(Caption) coerentemente. Para assinalar essa propriedade dos botes, siga o
mesmo processo que foi adotado para assinalar as propriedades do form:
1. D um clique no boto de comando superior para selecion-lo.
2. Selecione a propriedade Caption da lista de propriedades na janela de
propriedades.
3. No campo de valor, altere a propriedade para Iniciar.
4. D um clique no boto de comando inferior e altere a sua propriedade
Caption para Parar.
Ainda que tenha alterado apenas a propriedade Caption, voc deveria
modificar os nomes dos botes (a propriedade Name), para poder referenci-
los mais facilmente no cdigo de seu programa. (Lembre-se de que a
propriedade Caption e Name no representam a mesma coisa. A alterao de
uma no afeta a outra.) D um clique no boto superior e selecione sua
propriedade Name. Na campo de valor da propriedade, altere o nome
Command1, assinalado automaticamente, para Btnlniciar. A seguir, d um
clique no boto inferior e altere a sua propriedade Name para BtnParar.
Escolhendo Nomes
No imprescindvel renomear os botes no aplicativo Cronmetro que se est
criando, porm voc poder achar que fazer referncia a BtnIniciar em seu
aplicativo mais claro do que referenciar a Command1. T.S. Eliot dizia: "
muito difcil dar nome a Gatos"; o mesmo tambm verdadeiro para objetos
em programas. Voc pode concluir que nomes abreviados so mais fceis de
usar, ou pode achar conveniente deixar que o sistema fornea os nomes. No
entanto, quando voc retornar ao programa seis meses depois de cri-lo,
certamente ser muito difcil determinar o que exatamente o programa faz, se
no tiver atribudo nomes que contenham algum significado.
Voc deveria tentar aplicar na designao de nomes uma conveno que
permitisse especificar tanto o contexto quanto a descrio. Os nomes BtnIniciar
e BtnParar, por exemplo, tm um prefixo de trs letras que identifica o tipo de
objeto no programa. Em portugus, freqentemente usamos frases para
estabelecimento do contexto, por exemplo, em vez de simplesmente fazer
meno a "Deputado Joo", eu poderia referir-me usando a frase "meu gato,
Deputado Joo", para evitar provveis conflitos entre meu gato e algum
representante de nossa classe poltica. Em Visual Basic, entretanto, no
possvel usar a referncia "O boto chamado Iniciar", assim muito til
abreviar o contexto (Btn) e o nome (Iniciar) em um identificador simples
(Btnlniciar).
Completando o Visual do Aplicativo
Agora que voc j posicionou os controles do usurio para o aplicativo
Cronmetro na tela, necessrio exibir os resultados produzidos quando o
programa estiver sendo processado. Vamos adicionar algumas caixas de texto
ao form:
1. D um clique duplo na ferramenta Caixa de Texto na caixa de ferramentas
para criar uma caixa de texto. Ela aparecer no centro do form.
2. Desloque a caixa de texto para a rea superior do form, direita dos botes
de comando.
3. Usando o mesmo mtodo, crie mais duas caixas de texto, dispondo as trs
caixas conforme mostrado a seguir:
4. Use o mouse para selecionar o conjunto dos controles e posicion-los no
centro do form. Para isso clique numa rea do form prxima ao canto inferior
direito de Text3 e, mantendo o boto pressionado, arraste o mouse at que o
retngulo tracejado de seleo envolva todos os controles. Solte o boto do
mouse. Clique sobre qualquer um dos controles e arraste-os para a posio
desejada antes de soltar o boto.
necessrio nomear esses novos objetos. D um clique em cada caixa de
texto e modifique a propriedade Name, usando o nome TxtInicial para a caixa
de texto superior, TxtFinal para a caixa de texto intermediria e TxtDecorrido
para a caixa de texto inferior.
preciso tambm remover os textos defaults que aparecem dentro das caixas
de texto. Para cada caixa de texto, selecione a propriedade Text: da lista de
propriedades e apague todos os caracteres do campo de valor da propriedade.
Isso far com que o valor da propriedade Text seja assinalado para "vazio"
(uma cadeia de caracteres de comprimento zero).
Todos os elementos necessrios para a parte de seu aplicativo com a qual o
usurio interagir j esto em seu lugar. De fato, voc pode "rodar" o aplicativo
como ele se encontra no momento. Escolha a opo Start do menu Run, d um
clique no boto Iniciar da barra de ferramentas ou pressione a tecla F5. A
palheta caixa de ferramentas desaparece, como tambm a verso de
desenvolvimento do form, e a janela Cronmetro exibida, como mostrado na
Figura 1.8. Voc pode desloc-la atravs do vdeo, e ainda pode dar um clique
nos botes Iniciar e Parar. (Evidentemente, nada acontecer, pois voc ainda
no escreveu em Visual Basic as instrues que calcularo o tempo decorrido.)
Escolha a opo End do menu Run do Visual Basic ou d um clique no boto
Encerrar contido na barra de ferramentas para deixar o ambiente de
processamento e retornar ao ambiente de projeto do Visual Basic.
Figura 1.7 A janela do aplicativo Cronmetro em tempo de execuo.
Escrevendo o Cdigo
Codificar - escrever as instrues de linguagem que controlaro a operao do
programa - o corao da programao. Agora que voc j completou a parte
de interao do seu aplicativo, preciso fazer o programa funcionar. Uma vez
que voc estar escrevendo comandos na linguagem Visual Basic, razovel
imaginar que esses comandos estaro controlando o computador, ainda que
indiretamente. Para entender essa noo, considere um avio a jato.
Quando o piloto do jato deseja voar mais alto, ele puxa a alavanca de controle.
O resultado dessa ao uma alterao na posio dos flaps do avio, e o jato
comea a subir. Em jatos modernos, no h qualquer conexo fsica entre a
alavanca e os flaps. Quando o piloto puxa a alavanca, um sensor mede o
quanto ela foi deslocada e envia um sinal para o dispositivo hidrulico que
controla a posio dos flaps. Entretanto, do ponto de vista do piloto, a
alavanca que controla o avio.
No primordial para o piloto saber que o deslocamento de um centmetro na
alavanca corresponde a uma elevao de cinco ou dez graus dos flaps.
suficiente que ele saiba como o avio responde alterao.
Da mesma forma que o piloto de um jato, voc est no controle de seu
computador, e o Visual Basic o seu painel de instrumentos. A seo a seguir
tem por objetivo lhe dar uma viso da cabine de seu sistema - isto , com o que
ele se parece para um programador Visual Basic. Naturalmente, fora dessa
cabine de controle, muita coisa estar acontecendo, porm por alguns
instantes concentrar-nos-emos numa discusso geral, deixando a abordagem
dos detalhes relevantes sobre o sistema subjacente para os prximos
captulos.
Procedimentos de Eventos
Voc j estudou propriedades de objetos e como elas podem ser modificadas
para afetar um objeto. Similarmente, cada objeto pode ser associado a uma
coleo de procedimentos que so executados em instantes especficos. Um
procedimento um grupo de instrues na linguagem Visual Basic. As
instrues contidas no procedimento sero executadas quando o procedimento
for executado. Todo cdigo executvel que voc escreve ser encapsulado em
um ou outro tipo de procedimento.
Cada procedimento associado a um objeto est ligado a um determinado
evento ou ao, portanto chamado de procedimento de evento. Eventos
incluem aes como dar um clique, um evento disparado quando o usurio
pressiona o boto do mouse, e redimensionar, um evento que ocorre quando o
usurio altera a dimenso de uma janela de form. Eventos podem ocorrer
apenas em tempo de execuo, e no durante a fase de desenvolvimento.
Para todo e qualquer objeto, h uma certo nmero de eventos que podem ser
disparados; esses eventos so descritos no Captulo 5.
Retornemos ao nosso aplicativo Cronmetro. D um clique duplo no boto
Iniciar no form. O Visual Basic abrir uma janela de cdigo, semelhante
mostrada na Figura 1. 8. A janela de cdigo contm o ttulo MeuForm.frm, que
indica a relao entre o cdigo e o form. O cdigo que voc introduzir nessa
janela ser armazenado no mesmo arquivo que contm os objetos de exibio
do form.
Figura 1.8 A janela de cdigo para o aplicativo Cronmetro.
A caixa Object, na regio superior esquerda da janela de cdigo, exibe o nome
do objeto selecionado: Btnlniciar. A caixa de procedimento, ao lado da caixa
Object, mostra qual procedimento est sendo editado. Como voc ainda no
selecionou um dos procedimentos associados ao objeto Btnlniciar, o Visual
Basic selecionou automaticamente o procedimento Click. O procedimento
mostrado na janela de cdigo o que ser executado quando o usurio der um
clique no boto Iniciar durante a fase de execuo do aplicativo. Embora voc
ainda no tenha escrito qualquer cdigo, j aparecem duas instrues na
regio de texto da janela de cdigo:
Private Sub Btnlniciar_Click ()
End Sub
Quando o boto de comando foi criado, o Visual Basic criou automaticamente
um conjunto de procedimentos de eventos para o objeto. Como voc j deve
ter imaginado, esses procedimentos criados automaticamente nada fazem; eles
contm apenas uma declarao do procedimento (primeira linha) e a instruo
marcando o final do procedimento (End Sub).
Declaraes de Procedimento
Na declarao do procedimento, a palavra Sub identifica o incio do
procedimento. A seguir, vem o nome do procedimento neste caso,
BtnIniciar_Click. Aps isso, encontra-se uma lista de parmetros, os quais
completam a definio. (Apesar de no serem usados no procedimento, os
parnteses so obrigatrios; discutiremos a sua funo no Captulo 4). A
palavra Private significa que o procedimento s existe para o cdigo
pertencente ao arquivo do Form. Outras partes do programa no podem fazer
referncia a este procedimento.
O nome de um procedimento serve para caracteriz-lo como um procedimento
de evento. Nem todos os procedimentos so procedimentos de eventos. Voc
pode criar um procedimento em Visual Basic, dando um nome qualquer, tal
como lmpada ou almofada. Entretanto, o nome de um procedimento de
evento deve concordar com as seguintes regras:
A primeira parte do nome deve ser igual ao nome de um objeto que
tenha sido criado no form. (Ou precisa ser a palavra Form, quando o
objeto em questo for o prprio form.)
A ltima parte do nome deve ser o nome de um evento.
As duas partes devem estar ligadas por um caractere de sublinhado ( _
).
O objeto associado ao procedimento BtnIniciar_Click o boto de comando
Iniciar (Btnlniciar), e o evento o Click. Quando o programa estiver sendo
processado, acontecer mais ou menos o seguinte: o aplicativo estar em
algum lugar do vdeo aguardando que algo acontea. Enquanto isso, aparece a
usuria Marta, com seu mouse. Ela movimenta o ponteiro do mouse sobre a
imagem na tela e d um clique. O Windows cutuca o aplicativo e lhe diz: "Ei,
faa alguma coisa!". Quando o Visual Basic determinar que o clique foi
produzido sobre o boto chamado BtnIniciar, ele procurar o procedimento
BtnIniciar_Click e executar as instrues contidas naquele procedimento.
Como programador, seu trabalho decidir o que aquelas instrues devero
fazer.
Para verificar como isso funciona, digite a instruo Debug.Print "Al,
marinheiro" na linha em branco que h entre as instrues Sub e End. A janela
de cdigo dever ser semelhante a:
Private Sub BtnIniciar_Click ()
Debug.Print "Al, marinheiro"
End Sub
A instruo Debug.Print faz com que o Visual Basic escreva o texto em uma
janela especial chamada de janela Immediate. Pressione F5 para deixar o
ambiente de desenvolvimento e iniciar a execuo do aplicativo (da forma que
ele se encontra). Quando voc der um clique sobre o boto Iniciar, as palavras
Al, marinheiro sero escritas na janela Immediate.
Agora, escolha a opo End do menu Run do Visual Basic. O Visual Basic
parar a execuo do aplicativo e retornar ao ambiente de desenvolvimento,
onde voc pode continuar o projeto de seu aplicativo. (Antes de abandonar a
janela de cdigo, lembre-se de eliminar a instruo Debug.Print do
procedimento BtnIniciar_Click.)
Dica: Note que palavras como Private, Sub, Debug, Print e End aparecem na
tela da janela de cdigo, com cores diferentes do restante do cdigo. O Visual
Basic destaca partes diferentes do cdigo com vrias cores para facilitar a
localizao de componentes individuais. Voc pode controlar as cores que
sero usadas, escolhendo sua opo em Editor Format da caixa de dilogo
exibida pelo comando Options do menu Tools. Nela voc pode assinalar as
cores para texto e para fundo de palavras-chave, identificadores, comentrios e
inmeros outros elementos decdigo.
Declaraes de Varivel
Quando o usurio der um clique no boto Iniciar no aplicativo Cronmetro, o
programa precisar indicar que horas so. (O tempo de incio.) Ento, quando
o usurio der um clique no boto Parar, o programa deve subtrair o tempo de
incio do tempo de trmino, para calcular o tempo decorrido. Naturalmente,
voc ter de escrever as linhas de cdigo para que o programa possa fazer
isso.
O Visual Basic usa uma funo chamada Now, para fornecer a hora atual. Uma
funo um tipo especial de procedimento que retorna um valor. (As funes
do Visual Basic esto intimamente relacionadas com o conceito de funes
matemticas. As funes Visual Basic chamadas Sin, Cos e Tan, por exemplo,
retornam o valor do seno, co-seno e tangente de um ngulo.) Quando o usurio
der um clique no boto Iniciar, o seu programa deve chamar a funo Now, que
retornar um valor hora atual (de incio). O programa dever ento memorizar
esse valor at que ele possa ser subtrado do tempo final, quando o usurio der
um clique no boto Parar. Para guardar um valor em um programa de
computador, voc deve reservar um local para ele na memria do computador.
Pode-se fazer isso com declaraes de varivel.
O Visual Basic Supervisiona Voc
Se durante a digitao de instrues na janela de cdigo ocorrer algum
erro, o Visual Basic poder notific-lo colocando o erro em destaque e
exibindo uma caixa de dilogo com informaes. Essa superviso,
chamada verificao automtica de sintaxe, efetuada toda vez que a
tecla Enter pressionada. O Visual Basic, naturalmente, no pode
detectar todos os tipos de erro que se podem cometer, mas ele faz uma
verificao de erros de sintaxe, isto , enganos cometidos sobre a forma
que a linguagem Visual Basic usada, tais como palavra-chave ausente,
palavras fora de ordem dentro de uma instruo, pontuao incorreta e
assim por diante. Por exemplo, se voc digitar TxtFinal..Text em vez de
TxtFinal.Text, o Visual Basic informar-lhe- sobre o engano ou erro.
possvel desativar a verificao automtica de sintaxe: escolha a opo
Options do menu Tools e desmarque a opo Auto Syntax Checking na
caixa de dilogo de opes.
Na janela de cdigo, d um clique sobre o boto de seta para baixo, ao lado da
caixa Object, para que seja exibida uma lista com todos os objetos criados no
form. A partir dessa lista, selecione a entrada (General), que a categoria na
qual se incluem todos os procedimentos no-associados a um objeto em
particular. Ento, o Visual Basic altera automaticamente o titulo da caixa de
procedimentos para Declarations. (Chamaremos essa parte do cdigo de
programa de seo de declaraes gerais de seu cdigo.) Agora, introduza as
seguintes linhas na rea de texto da janela de cdigo:
Dim TempoInicial as Variant
Dim TempoFinal as Variant
Dim TempoDecorrido as Variant
Esses comandos avisam ao Visual Basic que voc deseja reservar a rea de
memria para os valores de tempo Inicial, Final e Decorrido, nas variveis
chamadas TempoInicial, TempoFinal e TempoDecorrido. Variveis so, em
essncia, nomes para pores reservadas da memria do computador. (Mais
detalhes sobre isso nos Captulos 2 e 3.) A instruo Dim diz ao Visual Basic
para reservar memria e como designar essa rea de memria. A instruo
Dim uma declarao, pois indica ao Visual Basic como o programa deve ser
configurado.
Cada uma das trs instrues mostradas acima declara uma varivel simples e
todas tm este formato:
Dim nome As Variant
Dim e As so palavras-chave, palavras reservadas que tm significado especial
para o Visual Basic. As instrues diferem apenas pelo nome nico que deve
ser dado para cada varivel. A palavra-chave Variant instrui o Visual Basic para
reservar memria suficiente para qualquer tipo de valor. (Voc poderia usar
palavras-chave diferentes para fazer uma declarao mais especfica. Por
exemplo, ao usar Integer em vez de Variant, o Visual Basic seria instrudo a
reservar somente a memria suficiente para armazenar um valor inteiro.)
Instrues Executveis
Agora que voc reservou memria para salvar valores correspondentes a
instantes do tempo, pode escrever o cdigo executvel do programa. Ao
contrrio de uma declarao, que estabelece uma configurao para o
programa, uma instruo executvel provoca alguma coisa quando
executada. Por exemplo, a instruo Debug.Print que foi usada anteriormente
uma instruo executvel.
Terminologia
Se a palavra Dim lhe parece sem significado e voc acha que Declare seria
mais apropriado, tem razo. Dim, entretanto, a abreviatura para Dimension,
proveniente das primeiras verses da linguagem Basic, datadas da dcada de
1960. Por questes de compatibilidade, as novas verses de linguagens de
programao mantm caractersticas das verses anteriores.
Selecione o objeto BtnIniciar na caixa Object da janela de cdigo. Edite o
procedimento BtnIniciar_Click, introduzindo estas instrues entre as linhas
Private Sub BtnIniciar_Click () e End Sub:
TempoInicial = Now
TxtInicial.Text = Format(TempoInicial, "hh:mm:ss")
TxtFinal.Text = ""
TxtDecorrido.Text = ""
Quando o programa estiver sendo processado e o usurio der um clique no
boto Iniciar, essas instrues sero executadas. A primeira linha de cdigo
usa a funo Now para recuperar a hora atual e salv-la na posio de
memria chamada TempoInicial. A prxima linha exibe a hora atual na caixa de
texto superior (TxtInicial), configurando a propriedade Text desse objeto. Alm
disto, ela formata a hora inicial em horas, minutos e segundos, com a funo
Format do Visual Basic. As duas linhas seguintes apagam o contedo das
outras duas caixas de texto (TxtFinal e TxtDecorrido), assinalando suas
propriedades Text para uma string vazia.
Agora, complete o programa, selecionando o objeto BtnParar na caixa
Object da janela de cdigo. Edite o seu procedimento de evento Click, como
mostrado abaixo:
Private Sub BtnParar_Click ( )
TempoFinal = Now
TempoDecorrido = TempoFinal - TempoInicial
TxtFinal.Text = Format(TempoFinal, "hh:mm:ss")
TxtDecorrido.Text = Format(TempoDecorrido, "hh:mm:ss")
End Sub
Esse procedimento ser executado quando o usurio der um clique no boto
Parar. Primeiro, a funo Now retorna a hora atual, que salva na varivel
TempoFinal. A prxima linha calcula o tempo decorrido, subtraindo o valor
salvo em TempoInicial de TempoFinal. Ento, o tempo final e o tempo
decorrido so escritos na tela, por meio de sua assinalao s propriedades
Text dos objetos TxtFinal e TxtDecorrido. Da mesma forma que no
procedimento BtnIniciar Click, a funo Format converte os valores de horas
para um formato que exiba horas, minutos e segundos.
Processando o Programa
Para iniciar o aplicativo, basta pressionar a tecla F5. Para usar o "cronmetro",
d um clique no boto Iniciar, esperando alguns segundos, e ento d um
clique no boto Parar. Voc dever observar algo semelhante ao resultado
mostrado na Figura 1.9.
Voc pode dar outro clique no boto Iniciar para reiniciar a contagem do tempo.
Para fechar o aplicativo Cronmetro, d um clique no boto Encerrar da barra
de ferramentas, pressione a tecla Alt-F4,ou clique na caixa de encerramento no
canto alto direito do formulrio ou escolha a opo Close do menu Control (este
o menu que aparece quando voc d um clique
na caixa do canto superior esquerdo de uma janela, por vezes denominado
menu de sistema).
Figura 1. 9 Processando o aplicativo Cronmetro.
Revisando o Projeto
No inicio, os detalhes de programao so to envolventes que comum
esquecermos do ponto de vista do usurio final. Vamos olhar novamente o
esquema de interao do Cronmetro: dois botes, trs caixas de texto.
Bastante simples. Entretanto, preciso levar em considerao uma pessoa que
no conhea o objetivo do programa. Os termos Iniciar e Parar so auto-
explicativos, mas que tipo de interpretao se pode fazer das trs caixas de
texto em branco? Sem dvida, uma das melhorias que voc pode fazer
colocar um rtulo nessas caixas, de forma que fique mais claro o tipo de
informao que elas fornecem.
O cone da ferramenta Rtulo na caixa de ferramentas se parece com uma
letra A maiscula. Usando a ferramenta Rtulo, trace um objeto de rtulo
prximo da caixa de texto superior na janela de form. Voc poder ter de
redimensionar o form ou deslocar as caixas de texto para a direita, para criar
espao para os rtulos. Como j vimos, voc pode deslocar as trs caixas de
texto como um grupo, se selecion-las com o retngulo de seleo produzido
quando se arrasta o mouse com o boto esquerdo pressionado. Uma outra
forma de selecion-las em grupo dar um clique sobre uma e , mantendo a
tecla Ctrl pressionada, dar um clique sobre as outras duas caixas de texto.
Essa forma de seleo em grupo conveniente quando h outros controles na
rea que o retngulo de seleo cobriria e que no desejamos ver
selecionados.
Agora, d um clique sobre o novo objeto de rtulo, selecione a propriedade
Caption do rtulo na lista de propriedades e digite Hora Inicial para o valor da
propriedade. Em seguida, crie mais dois objetos de rtulo, prximos s outras
duas caixas de texto, e configure a propriedade Caption da primeira para Hora
Final: e da segunda para Tempo Decorrido:, como mostrado naFigura 1.10.
Figura 1.10 Adicionando rtulos s caixas de texto.
Alguma outra melhoria a considerar? Pressione F5 para processar o aplicativo
novamente e ento d um clique no boto Parar, antes de dar um clique no
boto Iniciar. O aplicativo deveria reagir de maneira razovel a esse erro do
usurio, mas, em vez disso, ocorreu um resultado inesperado: a hora final e o
tempo decorrido so exibidos sem a hora inicial. Voc ter de deixar o
aplicativo e retornar ao ambiente de desenvolvimento para resolver esse
problema.
Em funo da estrutura atual, a forma mais simples de resolver esse problema
desabilitar o uso do boto Parar, enquanto o usurio no der um clique no
boto Iniciar. Na janela do form, d um clique no boto Parar para selecion-lo
e ento selecione a propriedade Enabled (habilitado) da lista de propriedades.
Clique na seta para baixo que exibe as opes de valores para esta
propriedade e escolha a opo False. Dessa forma, o boto estar desabilitado
quando o programa iniciar a sua execuo.
Abra a janela de cdigo e edite o procedimento BtnIniciar_Click como mostrado
abaixo (incluindo as duas linhas que aparecem destacadas). Voc pode usar
as teclas de direo para se movimentar at o ponto de insero na janela de
cdigo, ou ento simplesmente dar um clique com o mouse para assinalar o
novo ponto de insero.
Private Sub BtnIniciar_Click ( )
TempoInicial = Now
TxtInicial.Text = Format(TempoInicial, "hh:mm:ss")
TxtFinal.Text = ""
TxtDecorrido.Text = ""
BtnParar.Enabled = True
BtnIniciar.Enabled = False
End Sub
A nova codificao, reabilita o boto Parar quando o usurio d um clique no
boto Iniciar. A seguir, desabilitado o boto Iniciar. Com isso, elimina-se outro
erro potencial: dar um clique no boto Iniciar repetidamente.
Para completar essas modificaes, voc precisa editar o
procedimento BtnParar_Click adicionando as duas linhas mostradas abaixo:
Private Sub BtnParar_Click( )
TempoFinal = Now
TempoDecorrido = TempoFinal - Tempolnicial
TxtFinal.Text = Format(TempoFinal, "hh:mm:ss")
TxtDecorrido.Text = Format(TempoDecorrido, "hh:mm:ss")
BtnParar.Enabled = False
BtnIniciar.Enabled = True
End Sub
A Figura 1.11 mostra a verso final da interao do aplicativo. Nessa
ilustrao, o usurio deu um clique no boto Iniciar e o cronmetro est
rodando.
Figura1.11 A verso final do aplicativo Cronmetro.
Existem ainda inmeras formas de melhorar o aplicativo. Por exemplo,
lembrando que alguns cronmetros possuem um nico boto, seria possvel
modificar o programa de forma a conter apenas um boto cuja propriedade
Caption fosse alterada de Iniciar para Parar (ou vice-versa) cada vez que um
clique fosse dado nele. Provavelmente, voc prprio pode imaginar outras
melhorias.
Salvando o Seu Programa
Voc tem mais uma preocupao de ordem prtica: salvar o seu programa.
Abra o menu File e escolha a opo Save Project ou d um clique no boto
Salvamento de Projeto na barra de ferramentas. Na caixa de dilogo Salve File
As, mostrada na Figura 1.12, o Visual Basic pede o nome do arquivo e o
diretrio no qual o form e os procedimentos associados devero ser salvos,
sugerindo MEUFORM.FRM (o nome do form mais o sufixo FRM) como nome
de arquivo default para o aplicativo Cronmetro. Aps fornecer as informaes
necessrias, d um clique em OK.
Figura 1.12 A caixa de dilogo Save File As.
A seguir, o Visual Basic exibir a caixa de dilogo Save Project As, mostrada
na Figura 1.13, que lhe permite salvar o arquivo do projeto. O arquivo do
projeto contm os nomes de todos os arquivos forms e algumas informaes
adicionais sobre o projeto. (O aplicativo Cronmetro tem apenas um arquivo
form.) O Visual Basic sugerir o nome de arquivo default PROJECT 1. VBP
para o arquivo de projeto do aplicativo. Por ora, salve o aplicativo Cronmetro
com o nome CRONOM.VBP. (Retornaremos a esse projeto em um captulo
posterior.)
Figura 1.13 A caixa de dilogo Save Project As.
Para carregar e processar o seu aplicativo mais tarde, voc precisar em
primeiro lugar carregar o Visual Basic. (Para criar uma verso do aplicativo que
possa ser processada independentemente do Visual Basic, voc dever
compilar o programa, como ser feito num captulo frente.) Em seguida,
escolha a opo Open Project do menu File do Visual Basic, ou ento d um
clique no boto Abertura de Projeto na barra de ferramentas. A caixa de
dilogo Open Project exibe uma lista com todos os arquivos de projeto (todos
os arquivos com extenso VBP). Abra o arquivo CRONOM.VBP dando um
clique duplo no nome do arquivo da lista, ou selecionando-o e dando um clique
no boto Abrir. Pressione F5 para processar o aplicativo, ou se voc desejar
fazer alguma modificao adicional, abra a janela do form ou de cdigo, dando
um clique no boto apropriado na janela do Explorador do Projeto.





















Fundamentos de Programao para
Visual Basic
Com certeza, voc deve estar familiarizado com a terminologia usada
na indstria de computadores: bits, bytes, RAM, ROM, CPU e assim
por diante. No entanto, se voc tem apenas uma idia geral do
significado desses termos, no deixe de ler as prximas sees.
Compreender o que est acontecendo dentro do computador uma
parte importante do aprendizado de programao. Naturalmente, voc
pode apenas aprender as regras e fazer um trabalho razovel, porm
alguns conhecimentos adicionais podero lev-lo a se sentir mais
produtivo e confortvel com relao aos computadores.
Computadores e Dados
Computadores so ferramentas para tratamento de informaes, da
mesma forma que martelos e serrotes servem ao tratamento de
madeira. Enquanto madeira medida em polegadas ou centmetros,
uma informao medida em bits. Um bit a unidade fundamental
que mede a quantidade de informao que pode ser transferida de um
lugar para outro. o bloco atmico de construo do universo de
informaes. A resposta a uma questo, por exemplo, requer pelo
menos um bit de informao - quando no h bit no h resposta. No
papel, um bit convencionalmente representado pelo nmero 0 ou 1.
Em um computador digital, um bit representado pelo existncia ou
no de uma corrente eltrica.
Quando voc tem 20 centmetros de madeira, sabe que est lidando
com
uma quantidade de material palpvel. Porm, o que significa ter 3 bits
de informao? Como Humpty Dumpty disse em "Alice no Pas do
Maravilhas", significa "o que eu desejar que signifique". Como ser
mostrado pela Figura 2.1, trs bits de informao poderiam
representar respostas para trs perguntas: " maior do que a caixa de
po? uma cor brilhante? Pode cantar?" (no, sim, no); uma srie
de voltas para a esquerda ou para a direita (direita, esquerda, direita);
ou outros exemplos.
O significado da informao representada por bits depende do
contexto. Para entender isso, imagine que um amigo se aproxime de
voc na rua e diga: "Quarenta e dois". A sua primeira reao
provavelmente seria de espanto. Entretanto, se aps a saudao voc
tivesse feito uma pergunta do tipo "Qual a sua idade?" ou "Quantas
vezes?", a resposta teria um significado mais ou menos evidente. A
sua pergunta fornece um contexto para entendimento da resposta.
Outras vezes, apesar de no haver uma pergunta, h algum fato
ocorrido num passado bem recente que permite a inferncia do
contexto. Por exemplo, se voc se encontrasse com um amigo que no
dia anterior foi com voc ao cinema ver um filme de terror, uma frase
do tipo "Belas bruxas" teria o contexto "filme" facilmente inferido.
Figura 2.1 Bits representando informaes.
Em um computador, alguns contextos so inferidos com mais
freqncia do que outros. Um contexto muito comum o numrico.
Uma vez que bits so escritos como 0s e 1s, um grupo deles quase
sempre representa um nmero binrio (um valor do sistema binrio,
isto , base 2).
Representando Valores Numricos
O sistema numrico decimal (base 10) usa dez smbolos diferentes: 0,
1, 2, 3, 4, 5, 6, 7, 8 e 9 para representar os nmeros. (Tenha em
mente que esses dgitos so apenas smbolos; os romanos, por
exemplo, usavam o smbolo V para representar o nmero 5 e X para
representar o nmero 10) Para se representar um nmero maior do
que 9 (digamos 14) no sistema numrico decimal, h uma combinao
de dois smbolos, sendo que a posio de cada um tem um significado
especial. A progresso de valores representada pelas posies, como
mostrado naFigura 2.2, corresponde a potncias crescentes de 10.
Um nmero decimal que contenha vrios algarismos uma soma de
potncias de 10. O nmero 14, por exemplo, representa a soma de 1
dezena (10 1) e 4 unidades (10 0); o nmero 243, por usa vez, a
soma de 2 centenas (10
2
), 4 dezenas (10
1
) e 3 unidades (10
0
), e
assim por diante.
Figura 2.2 Valores posicionais no sistema de numerao decimal.
Esse mtodo geral de representao numrica tambm pode ser
usado com outras bases alm da decimal. Por exemplo, o sistema
numrico na base 7 usa sete dgitos, 0, 1, 2, 3, 4, 5 e 6, sendo que o
valor de cada posio aumenta em potncias de 7, como mostrado
na Figura 2.3. (Quando um nmero seguido por um subscrito, isto
significa que o nmero indica a base; nmeros sem subscritos, a
menos que haja indicao em contrrio, so subentendidos como
sendo de base 10.)
Figura 2.3 Valores posicionais no sistema numrico de base 7.
Certamente, agora, voc conhece as regras do jogo. O sistema binrio
usa dois dgitos (0 e 1), e cada posio representa um incremento de
valor posicional de potncias de 2. (Veja a Figura 2.4.) O sistema
binrio apenas um dos mecanismos que sero adotados para
permitir a representao de nmeros em computadores.
Naturalmente, voc consegue realizar operaes aritmticas em
qualquer sistema numrico com a mesma facilidade que no sistema
de base 10; ao utilizar nmeros binrios, os computadores apenas
podem fazer somas, subtraes, multiplicaes e divises.
Figura 2.4 Valores posicionais no sistema numrico de base 2
(binrio).
Representando Caracteres
Na maioria dos casos, no suficiente representar apenas
informaes numricas.
Como que voc pode ultrapassar o contexto de simples nmeros?
Uma das formas seria aplicar uma codificao padronizada. No cdigo
Morse Internacional, usado para envio de sinais telegrficos,
determinadas seqncias de sons representam letras do alfabeto; trs
pontos em sucesso rpida representam a letra S; trs pontos
seguidos por um trao, a letra V; e assim por diante. De forma muito
semelhante, os dgitos 0 e 1 so combinados para criar um cdigo
para computadores.
O padro ASCII (American Standard Code for Information Interchange
- Cdigo Padro Americano para Troca de Informaes) especifica as
regras de combinao de 0s e 1s para formar um cdigo para
computadores. O ASCII usa valores numricos para definir o conjunto
de caracteres da lngua inglesa, incluindo letras maisculas e
minsculas, algarismos, sinais de pontuao e outros smbolos. A
verso estendida do ASCII adotada pela grande maioria dos sistemas
de computadores usa 8 bits para representar cada letra, nmero, sinal
de pontuao e outros smbolos comuns linguagem escrita.
A Figura 2.5, mostra alguns exemplos do cdigo ASCII.
Figura 2.5 Padro ASCII para a representao de alguns caracteres
Entretanto, importante lembrar que a simples visualizao de um
conjunto de bits no revelar qual o contexto associado. Por exemplo,
a seqncia 01000001 representa a letra A em cdigo ASCII, mas
tambm pode ser interpretada como a representao binria do
nmero decimal 65. Como se v, a interpretao da informao
contida num conjunto de bits depende do contexto. Algumas vezes,
voc pode tirar vantagem do fato de um valor poder ser usado tanto
para a representao de nmeros inteiros quanto para letras. Por
exemplo, o fato de cada caractere possuir um valor numrico significa
que voc pode testar quando um caractere maisculo, verificando se
o seu valor numrico maior ou igual a 65 (ASCII "A") e menor ou
igual a 90 (ASCII "Z").
Usando Bits, Bytes e Palavras
O uso de bits para representar informaes permite ao sistema de
computao armazenar ou "memorizar" as informaes. Entretanto,
organizar a memria dos computadores tomando-se como base o bit
inconveniente, pois apenas um bit no representa muita informao.
Por exemplo, com o cdigo estendido do ASCII so necessrios 8 bits
para representar um simples caractere.
De fato, o comprimento de um caracter usado como unidade padro
de medida. Essa unidade padro de medida contendo 8 bits
chamada de byte. Para fazer referncia a grandes quantidades de
dados, os prefixos do sistema mtrico kilo, mega e giga so
adicionados ao termo byte. Em virtude da preferncia dos cientistas de
computao pelas potncias de 2, um kilobyte (Kbyte) representa
1.024 (2 ^ 10) bytes, enquanto um Megabyte representa 1.048.576 (2
^ 20) bytes. Aps isso vem o gigabyte (2 ^ 30), o terabyte (2 ^ 40) e o
pentabyte (2 ^ 50). Voc no precisa ficar extremamente preocupado
com o que vem depois.
Porm, um byte. no apropriado para a representao da maioria
dos valores numricos. O padro de 8 bits pode apenas representar
os nmeros decimais de 0 a 255. Portanto, para tornar mais eficientes
as operaes aritmticas, a maioria dos computadores trabalha com
dados em blocos maiores do que um byte. O nmero de bits que um
computador "prefere" usar chamado de tamanho de palavra do
computador e no padronizado. Muitos computadores de grande
porte e micros modernos tm um comprimento de palavra de 32 bits, o
que permite a acomodao de nmeros da ordem de bilhes. (Ainda
que o hardware seja otimizado para usar esse comprimento de
palavra, os computadores no se limitam ao tratamento de valores
que possam ser representados em 32 bits.)
Armazenando Informao no Computador
A Figura 2.6 mostra um diagrama de blocos simplificado de um
computador. No que se refere ao diagrama, voc pode pensar em
memria como a caixa onde os bits so armazenados quando o
computador est processando. No momento, restringiremos nossa
discusso memria eletrnica chamada RAM (Random Access
Memory - Memria de Acesso Aleatrio).
Figura 2.6 Um diagrama de blocos de um sistema de computao.
Voc pode imaginar a RAM como sendo uma longa fila de caixas,
cada qual grande o suficiente para conter 1 byte de dados e ser
identificada por um nmero. Por exemplo, algum poderia dizer, "D-
me o byte de dados da caixa 27441" ou "Coloque a letra g na caixa
13". Esse nmero identificador da localizao da memria chamado
de endereo da memria.
O Visual Basic, como os demais compiladores, permite o uso de
nomes em lugar de nmeros para referncias a locais de memria. (O
computador est habilitado a usar endereos numricos, porm
mais confortvel para os usurios trabalhar com nomes simblicos de
variveis.) Ainda que o Visual Basic possa associar um nome a uma
seqncia de bytes, cada varivel do Visual Basic corresponde a uma
localizao de memria. Mais adiante voc aprender mais sobre
como o Visual Basic armazena e representa os diferentes tipos de
dados.
Instrues de Computador
Vejamos, agora, o que o computador faz com os dados que ele
contm. Dentro do computador, um ou dois chips atuam como unidade
central de processamento. A CPU trata os dados na memria de
acordo com um conjunto de instrues chamado de programa. Para
que o computador possa executar as instrues, o programa precisa
estar na RAM. Instrues, da mesma forma que os dados, precisam
ser representadas por seqncias de bits.
As instrues orientam o computador para executar aes especficas
simples, tais como adicionar, subtrair, comparar ou copiar bits de um
endereo de memria para outro. Outras instrues enviam
informaes para dispositivos externos CPU, tais como impressora,
disco ou vdeo. Por exemplo, uma certa seqncia de bits poderia
representar a instruo "Some 1 ao nmero na memria 732" ou
"Envie a letra M para o dispositivo de sada 3". As seqncias de bits
que controlam o processador variam de CPU para CPU. (E por isso
que programas escritos para um IBM PC no rodaro em um
Macintosh da Apple e vice-versa.) A lista completa de instrues de
controle de um certo processador chamada de conjunto de
instrues.
possvel escrever programas, submetendo diretamente as
seqncias de bits que constituem cada instruo. Esse mtodo,
conhecido como programao em linguagem de mquina, raramente
usado. Algo mais comum encontrar pessoas programando em
linguagem Assembly, na qual cada seqncia especial de caracteres,
tais como ADD ou TEST, corresponde a uma instruo em linguagem
de mquina. Um programa chamado assemblador transforma as
seqncias de caracteres escritas pelo programador em linguagem de
mquina, conforme mostrado pela Figura 2.7. Muito embora a
programao em linguagem Assembly, seja menos dolorosa (e menos
sujeita a erros) do que a programao em linguagem de mquina, o
programa continuar tendo de especificar a instruo que o
processador ter de executar. Comandar o processador para efetuar
uma simples captura de uma tecla pode demandar quase uma
centena de instrues. Em conseqncia disso, at mesmo os
programas mais simples podem requerer algumas milhares de
instrues, podendo chegar a milhes de instrues no caso de
programas mais complexos.
Figura 2.7 Um assemblador trabalhando.
Compiladores e Interpretadores
Programas especiais chamados de compiladores podem ajud-lo a
evitar o nvel excessivo de detalhes da programao em linguagem
Assembly. Um compilador permite ao programador escrever
comandos mais produtivos que em Assembly ou em linguagem de
mquina; um comando Visual Basic, por exemplo, geralmente
transformado em muitas instrues de linguagem de mquina. O
programador escreve comandos na linguagem-fonte do compilador,
que, por sua vez, transforma-a em linguagem de mquina.
Linguagens-fonte comuns atualmente incluem C, Pascal e Visual
Basic. A Figura 2.8 ilustra como trabalha um compilador.
Para simplificar, um compilador ou um assemblador l um arquivo de
instrues escritas pelo programador e produz como sada um arquivo
em cdigo de mquina. O programa em cdigo de mquina ento
executado para produzir o resultado que se esperava ao escrever o
programa. Nos sistemas operacionais MS-DOS e Windows, um
arquivo com extenso EXE ou COM contm cdigo de mquina e
pode ser carregado diretamente na memria para ser executado.
Figura 2.8 - Compilando linguagem-fonte em linguagem de mquina.
Interpretadores, de forma similar aos compiladores, tambm
transformam instrues escritas em cdigo-fonte. Entretanto, um
interpretador transforma cada linha de cdigo-fonte e ento executa
imediatamente o cdigo de mquina resultante. O interpretador ento
volta ao cdigo-fonte e transforma a prxima linha. A Figura
2.9 apresenta as principais diferenas entre compiladores e
interpretadores. Outro meio de compreender a diferena entre
compiladores e interpretadores imaginar como a traduo de um
livro difere da traduo simultnea fornecida pelos intrpretes da
ONU. O trabalho de traduo de um livro assemelha-se ao processo
de um compilador. Um tradutor recebe uma edio do livro russo
Guerra e Paz, e aps alguns anos de rduo trabalho, produz um novo
livro com o mesmo texto em javans. O intrprete russo-javans na
ONU, entretanto, trabalha com cada palavra falada imediatamente, da
mesma forma que o interpretador do computador.
Figura 2.9 Compilando e interpretando.
Compilador ou interpretador, cada qual tem suas vantagens. Os
compiladores fazem o seu trabalho uma nica vez e o resultado um
arquivo executvel que pode ser processado quantas vezes for
preciso. Interpretadores lhe do retorno mais rpido, podendo ajud-lo
na deteco de erros. O Visual Basic contm tanto um interpretador
quanto um compilador.
Voc logo estar em contato com o interpretador do Visual Basic.
Quando voc escolher a opo Start do menu Run, o Visual Basic
interpretar o cdigo escrito e comear a execut-lo. Voc aprender
como suspender a execuo de seu programa enquanto ele est
sendo processado e ento submeter comandos diretamente para o
interpretador, para identificar e localizar possveis erros de sua
codificao. Quando o interpretador est fazendo o seu trabalho, tanto
o programa Visual Basic quanto o seu aplicativo devem estar na
memria ao mesmo tempo.
Voc tambm pode optar por compilar os seus aplicativos. Um
aplicativo compilado pode ser processado em qualquer sistema de
computao que esteja rodando o Windows; ele no depender do
programa Visual Basic para poder ser processado.
Compilando o Programa Cronmetro
Vamos tentar compilar o programa escrito por voc no Capitulo 1.
Caso no esteja trabalhando com o Visual Basic no momento, inicie a
sua execuo. Carregue o projeto Cronom, selecionando a opo
Open Project do menu File. Abra o arquivo Cronom.vbp, que o
arquivo de projeto para o programa Cronmetro. Para compilar o
aplicativo, selecione a opo Make EXE a partir do menu File. Na
caixa de dilogo Make EXE File, mostrada na Figura 2.10, altere o
ttulo do aplicativo para Cronom. Informe o diretrio de sua escolha,
digite Cronom.exe como nome do arquivo e d um clique no boto
OK, para fechar a caixa de dilogo. Aps isso, o Visual Basic
transformar o cdigo-fonte de seu programa em linguagem de
mquina, gravando-o no arquivo Cronom.exe.
Agora, tente executar a verso compilada do programa Cronom sem o
Visual Basic. Saia do Visual Basic, selecionando a opo Exit do
menu File. No menu Iniciar do Windows, selecione a opo Executar.
Na caixa de texto linha de comando da caixa de dilogo Executar,
digite o caminho de acesso do programa Cronom - por exemplo,
\VB\Cronmetro\Cronom.exe - e d um clique em OK. O aplicativo
ser carregado na memria e executado.
Figura 2.10 A caixa de dilogo Make EXE File usada para compilar
programas.
Voc pode dar cpias da verso EXE de seu programa para seus
amigos ou companheiros de trabalho, os quais podero process-lo,
mesmo que o Visual Basic no esteja instalado em seus
computadores. Entretanto, eles precisaro de um arquivo adicional
chamado MSVBVM60.DLL (que foi gravado no diretrio System do
Windows quando voc instalou o Visual Basic.) Qualquer um que for
processar um aplicativo compilado pelo Visual Basic precisa de uma
cpia desse arquivo. (Uma vez que a Microsoft garante explicitamente
que esse arquivo pode ser distribudo, voc no estar violando sua
licena de uso do Visual Basic se der uma cpia do MSVBVM60.DLL
juntamente com o programa compilado.)
MSVBVM60.DLL contm um conjunto de rotinas que o seu programa
necessita. O Visual Basic no transforma cada comando diretamente
em linguagem de mquina. Alguns conjuntos de instrues, tal como a
rotina para controlar a data e a hora atual do sistema, so necessrios
com tanta freqncia que o Visual Basic mantm disponvel apenas
uma nica cpia no arquivo MSVBVM60.DLL. Quando o seu programa
requisita a hora atual, a rotina contida no arquivo MSVBVM60.DLL
executada. Uma vez que esse arquivo ainda contm rotinas para
tratamento de elementos bsicos, tais como janelas e menus, at
mesmo os programas mais simples necessitaro dos recursos
contidos em MSVBVM60.DLL.
medida que voc desenvolver aplicativos mais sofisticados, ter de
incluir arquivos adicionais do tipo DLL que fazem parte do Visual
Basic. O Visual Basic pode ajud-lo a criar um disco de instalao ou
setup (semelhante aos que acompanham os aplicativos profissionais)
que inclui todos os componentes necessrios.
























Constantes e Variveis no Visual
Basic
Anteriormente vimos o problema da interpretao contextual das
informaes contidas em bits, isto , saber quando se trata de
nmeros, caracteres ou algo completamente diferente. O Visual Basic
ajuda-o a resolver essa questo, permitindo que seja especificado o
tipo de informao a ser armazenada.
Especificando Tipos de Dados do Visual Basic
Como voc j viu, os bits 01000001 podem representar a letra A, se o
contexto for o cdigo ASCII, ou o valor 65, quando o contexto for o
sistema numrico decimal. Voc poderia resolver essa ambigidade,
desenvolvendo codificaes especiais de bits para cada tipo de
informao, porm, felizmente voc no precisar envolver-se com
essa questo, pois o Visual Basic define um conjunto padronizado
para representaes de dados chamado de tipos de dados. A Figura
3.1 lista os nomes e caractersticas dos vrios tipos de dados
suportados pelo Visual Basic.
Figura 3.1 Tipos de dados do Visual Basic.
O tipo byte til para conter dados binrios. Seus valores so
numricos e podem variar de 0 a 255 sem sinal. Ocupam oito bits na
memria.
O tipo boolean um tipo numrico especial, pois pode conter apenas
dois valores: 0 (False) ou -1 (True). Na memria, ocupam 16 bits (2
bytes).
Os tipos Integer e Long so inteiros simples de 16 e 32 bits,
representados por valores binrios, semelhantes aos que foram
discutidos no Capitulo 2. Ambos os tipos devem ser usados apenas
para representar nmeros que no contenham parte fracionria. O tipo
Integer requer apenas 16 bits de memria, porm possui uma faixa de
valores mais restrita do que o tipo Long (Voltaremos a falar sobre a
faixa de valores mais adiante.)
O tipo string uma seqncia de caracteres, cada uma das quais
representada pelo esquema ASCII. A seqncia que no contm
qualquer caractere chamada de string vazia. As strings podem ser
de tamanho fixo ou varivel.
Strings de tamanho fixo podem possuir de 1 a aproximadamente
65.400 caracteres, enquanto as strings de tamanho varivel podem
chegar a aproximadamente 2 bilhes de caracteres. Vale lembrar que
as strings em Visual Basic ocupam 2 bytes de memria por caractere
e as strings de tamanho varivel possuem 10 bytes iniciais de
informao sobre a string.
O tipo de dado currency foi especialmente projetado para representar
valores monetrios. Um valor monetrio tem sempre quatro casas
decimais aps a vrgula - isto , voc pode armazenar um valor como
11,1625, mas no um valor como 21,00003. (Este ltimo valor seria
arredondado para 21,0000)
Os tipos de dados single e double permitem-lhe expressar nmeros de
ponto flutuante. Nmeros de ponto flutuante (tambm chamados de
nmeros reais ou apenas reais) representam valores que possuem
partes fracionrias. O nome ponto flutuante provm de ponto decimal
flutuante, que pode aparecer em qualquer posio, como em
0,000001, 356,555 ou, ainda, 10000,0; ao contrrio do tipo currency,
que um exemplo de tipo de dado com ponto decimal fixo.
Decimal um tipo de dados para nmeros gigantescos. Ocupa 14
bytes de memria e pode representar valores no intervalo +/-
79.228.162.514.264.337.593.543.950.335 sem a vrgula; ou valores no
intervalo +/-7,9228162514264337593543950335 com 28 posies
direita da vrgula; o menor nmero diferente de zero pode ser +/-
0,0000000000000000000000000001
O tipo de dados Date usado para representar datas que variam de 1
de janeiro de 100 at 31 de dezembro de 9999 e a hora de 0:00:00 a
23:59:59. Ocupam 64 bits (8 bytes) de memria.
O tipo de dados Object ocupa 4 bytes na memria e usado para
guardar referncias a objetos. Falaremos mais sobre este tipo de
dados quando tratarmos do uso de objetos no Visual Basic.
Finalmente, o Visual Basic inclui o tipo variant, uma espcie de tipo de
dado mutvel que pode assumir qualquer um dos tipos de dados j
apresentados. O tipo variant na realidade contm duas partes de
informao: um valor, que poder ser qualquer um dos tipos
mencionados, e um cdigo indicando o tipo de dado que est sendo
representado. (Por exemplo, currency ou string.)
Faixa de Valores
Uma das caractersticas mais importante dos tipos de dados a sua
faixa de valores, que limita os valores que o tipo de dado pode
armazenar. Esses limites se baseiam na quantidade de bits que ser
usada para armazenar os valores. Por exemplo, considere a Figura
3.2, que ilustra o que acontece quando voc tenta contar de 0 a 9
usando um nmero binrio de 3 bits. Com 3 bits, voc pode apenas
definir oito valores. Em conseqncia disso, alguma informao ser
perdida, um problema conhecido como estouro de campo, pois a
quantidade de bits necessrios para armazenar a informao maior
do que a quantidade de bits disponveis.
Figura 3.2 Perda de informao em funo de estouro.
Como um programador, voc deve decidir qual tipo de dado usar para
um certo valor. Se voc estiver escrevendo programas simples, esta
questo pode muito bem ser evitada usando sempre o tipo de dado
variant, que pode representar qualquer valor. Entretanto, quando se
tratar de programas mais complexos, voc provavelmente estar
preocupado em escolher o tipo de dado mais adequado, por questes
de espao em memria e velocidade de execuo. (O tipo de dado
variant menos eficiente do que os outros, pois, antes de tratar o
dado propriamente dito, o Visual Basic tem de verificar de que forma
ele dever ser tratado.)
Uma Cartilha sobre Ponto Flutuante
Quando voc trabalhar com nmeros de ponto flutuante, perceber
que a preciso quase to importante quanto a sua faixa de valores.
Nmeros de ponto flutuante tm uma faixa de valores que define o
maior e menor valor que eles podem representar e uma preciso que
estabelece a quantidade de algarismos significativos que o valor pode
conter.
O Visual Basic armazena nmeros de ponto flutuante em uma verso
binria da notao cientfica, onde os valores so expressos pelo
produto de dois nmeros: uma frao e um expoente. Em notao
cientfica, por exemplo, voc pode representar a distncia entre o Sol
e a Terra por 5,84 x 10 ^ 12 polegadas.
A parte fracionria do tipo single um valor binrio que expressa um
pouco mais do que 6 dgitos decimais de preciso. O expoente
permite que sejam representados valores que vo desde nmeros
muito pequenos (10 ^ -45) at nmeros muito grandes (10 ^ 38). O
tipo double, por sua vez, permite a representao de valores com uma
faixa de variao ainda maior (de 10 ^ -324 a 10 ^ 308), com
aproximadamente 13 dgitos decimais de preciso.
Se a idia de um nmero contendo apenas 13 dgitos de preciso lhe
parece estranha, considere o seguinte: o nmero 0,00000000017
parece bem preciso. Repare que ele contm apenas dois dgitos de
preciso. Isso fica mais fcil de visualizar quando se adota a notao
cientfica: 1,7 x 10 ^ -10. A parte fracionria apenas 1,7; o resto da
informao (o expoente) lhe indica onde colocar a vrgula decimal.
Como outro exemplo, considere o valor 5,84 x 10 ^ 12 polegadas.
Embora ele esteja representando um nmero de 13 dgitos, a sua
preciso de apenas 3 dgitos. Ainda que essa medida possa
apresentar um erro de alguns milhares de polegadas, isso no
importante, pois em comparao a um nmero da ordem de trilhes
de polegadas esse desvio desprezvel.
A distino entre preciso e faixa de valores sutil, porm importante.
Suponhamos que voc seja contratado pela Imensamente Grande
MegaCorp para escrever um programa que controle a contabilidade da
corporao. Essa empresa fatura todos os anos centenas de bilhes
de dlares. Voc pode concluir que o tipo single seja perfeitamente
adequado para o tratamento de valores, afinal ele pode representar
valores at 10 ^ 38, quando centenas de bilhes de dlares significa
algo parecido com 10 ^ 11. Entretanto, quando se fala em
contabilidade, necessria extrema exatido de valores, e o tipo
single no tem a preciso desejvel para tal. Por exemplo, se o
balano fosse iniciado com um saldo de $121.734.240.722, seriam
necessrios 12 dgitos de preciso para represent-lo, pois cada um
dos 12 dgitos nesse valor significativo. Repare ento que, apesar de
o tipo single poder armazenar valores bem maiores do que esse, se
esse valor fosse armazenado nesse tipo, ocorreria um estouro de
campo, pois esse tipo permite at 6 dgitos de preciso, isto , seria
armazenado um valor de 1,217342 x 10 ^ 11, ou seja,
121.734.200.000. Em seu primeiro dia no emprego, voc j teria
provocado o desaparecimento de 40.722!
Nota: O tipo de dado currency do Visual Basic perfeito para
tratamento monetrio. Ele providencia at 18 dgitos de preciso e
sempre mantm 4 desses dgitos como posies decimais. Uma
varivel do tipo double tambm admite a mesma quantidade de dgitos
significativos, porm o tipo currency tem ponto decimal fixo e no est
sujeito a arredondamentos.
Naturalmente, isso no quer dizer que o tipo single deva ser
desprezado. Se, por exemplo, voc estiver trabalhando com equaes
fsicas e medindo a quantidade de tomos em 31 gramas de silcio
(aproximadamente 6,02 x 10 ^ 23), um nmero real servir aos seus
propsitos - a menos que voc planeje calcular a quantidade exata de
tomos.
Criando Variveis e Constantes
Deixando de lado o tipo de dado a ser armazenado, o prprio
armazenamento no tem qualquer sentido quando no se pode
referenciar as informaes armazenadas, isto , se no for possvel
recuperar essas informaes. O Visual Basic permite-lhe nomear
localizaes de memria de forma a acessar as informaes l
armazenadas. Uma posio de memria nomeada chamada de
varivel. A instruo Dim, que informa o Visual Basic a respeito de sua
inteno de reservar uma rea de memria, tem o seguinte formato:
Dim varivel [As Tipo]
Quando voc usa essa instruo, precisa colocar a palavra-chave Dim
e segu-Ia com o nome da varivel que deseja usar. A frase mostrada
entre colchetes opcional; se voc us-la, precisa colocar a palavra-
chave As e, em seguida, especificar o tipo, sem incluir os prprios
colchetes. (Ser visto mais sobre notao em outro captulo.) Por
exemplo, a instruo a seguir avisa ao Visual Basic para reservar
memria suficiente para um dado do tipo currency (8 bytes) e usar
como referncia a essa localizao de memria o nome
SaldoDaConta:
Dim SaldoDaConta As Currency
Usando o nome da varivel, voc poder posteriormente instruir o
Visual Basic para armazenar novas informaes nessa localizao,
recuper-las, modific-las e assim por diante. Caso a clusula As seja
omitida, o Visual Basic assumir que a varivel do tipo Variant.
Voc pode imaginar as variveis como sendo caixas. A instruo Dim
cria uma nova caixa de um certo tamanho e lhe atribui um nome,
como ilustrado na Figura 3.3. Quando voc usa o nome de uma
varivel em um programa, o Visual Basic lhe fornece o contedo atual
da caixa (o valor atualmente l armazenado).
Figura 3.3 Reservando memria com declaraes de variveis.
Quando uma rea de memria reservada para uma varivel
numrica, o Visual Basic assinala a essa varivel o valor inicial 0
(zero). Entretanto, no boa idia confiar nessa inicializao
automtica. Se voc desejar que uma varivel assuma um certo valor,
melhor atribuir esse valor varivel em seu programa. A atribuio
explcita de valores s variveis torna o seu programa mais fcil de
entender, evitando pressuposies dbias. Alm disso, voc deve
lembrar-se de que a inicializao automtica uma caracterstica
particular do Visual Basic. Se voc converter seu programa para outro
ambiente de programao, o novo sistema pode no suportar a
inicializao automtica, e seu programa no funcionar mais.
s vezes, voc pode ter de usar valores que no se alterem - o valor
de pi, o nmero de Avogadro, o nmero de centmetros em uma
polegada. Ainda que seja possvel usar esses valores numricos
diretamente na instruo em que so necessrios, mais simples
usar um nome como PI, do que repetir o nmero 3,1415926 toda vez.
Para fixar tais valores, o Visual Basic permite que voc declare
constantes, ou seja, localizaes de memria cujo contedo no se
modifica (ao contrrio do contedo de variveis). Se voc tentar
modificar uma constante, o Visual Basic gerar uma mensagem de
erro. A instruo Const declara um valor constante e tem a seguinte
forma:
Const nome [As tipo]= expresso
No necessrio declarar o tipo de uma constante, pois o Visual
Basic determina-o automaticamente usando a verificao do valor da
expresso. Se voc escrever Const RESPOSTA = 42, o Visual Basic
usar o tipo Integer; se voc introduzir Const NOMEINICIAL = "Paulo",
ele criar uma constante do tipo string. (Normalmente, costuma-se
usar letras maisculas para criao de nomes de constantes.)
Com freqncia, pode haver alguma ambigidade quanto ao tipo de
constante que o Visual Basic deveria criar. Por exemplo, o valor 3,01
poderia ser single, double ou currency. Por default, o Visual Basic
selecionar o tipo que demandar menor espao de memria para seu
armazenamento. No entanto, voc pode for-lo a assumir um certo
tipo, colocando As tipo aps o nome da constante ou um caractere de
declarao de tipo. Os caracteres para declarao de tipo esto
listados na Figura 3.4.
Figura 3.4 Caracteres para declarao de tipos do Visual Basic.
Assim, a declarao Const ONE& = 1 reserva 4 bytes de memria
para uma constante do tipo long, e a declarao Const ONE# = 1
reserva 8 bytes e armazena o valor em uma representao de ponto
flutuante. Em qualquer um dos casos, voc deveria usar o nome ONE
(sem o caractere de declarao de tipo) em seu programa para se
referir a esse valor. Voc deveria adquirir o hbito de definir
constantes para valores padres; essa prtica tornar seus programas
mais inteligveis.
Dica: Ocasionalmente, voc poder ter de definir uma constante muito
grande - um valor como o nmero de Avogadro, por exemplo, que,
como voc deve se lembrar, 6.02 x 10 ^ 23. Felizmente, no
necessrio digitar algo como 602000000000000000000000. O Visual
Basic permite que voc introduza uma constante simples,
especificando apenas a parte fracionria do nmero (mantissa),
seguida pela letra E, e em seguida o expoente (6.02E23 no exemplo).
Para constantes do tipo double, use a letra D no lugar da letra E
(6.02D23).
Regras para Nomes
Para nomear variveis e constantes em Visual Basic, voc deve seguir
alguma regras:
O primeiro caractere deve ser uma letra.
Os caracteres seguintes podem ser apenas letras, dgitos ou o
caractere de sublinhado ( _ ).
O nome pode conter no mximo 40 caracteres.
Palavras-chave que contenham significado especial para o
Visual Basic tais como Sub, Now e End, no podem ser usadas
como nomes. (Se voc tem dvida a respeito de alguma
palavra, pressione a tecla F1 para exibir o sistema de ajuda e
ento procure o tpico Reserved words.)
Estas instrues usam nomes ilegais:
Dim 1Tempo As Long ' Inicia com um nmero
Const PRINT = 2 ' Print uma palavra-chave
Dim Isto*aqui As Currency 'Asterisco no aceito
Comentrios
Um apstrofo (') inicia o comentrio do programador em Visual Basic.
O apstrofo ou caractere de comentrio permite-lhe inserir
observaes sobre seu programa em qualquer lugar da codificao.
Uma vez que o Visual Basic ignora todos os caracteres direita de um
apstrofo, o texto que se segue deveria conter apenas informao ou
descrio que seja til a algum que esteja lendo o programa. Quando
um apstrofo o primeiro caractere de uma linha, a linha inteira
considerada como comentrio. Observe que, se o seu comentrio
precisar de mais de uma linha, voc deve preceder cada linha com um
apstrofo.
Eis como o procedimento de evento BtnIniciar - Click do aplicativo
Cronmetro,
desenvolvido no Capitulo 1, ficaria se fossem adicionados
comentrios:
Figura 3.5
As instrues a seguir so declaraes vlidas para o Visual Basic:
Dim NomedeVariveIMuitoLonto As Integer
Dim RX7 As String
Const CENT_POR_INCH = 2,54
O Visual Basic no diferencia letras maisculas de minsculas usadas
em nomes de variveis; CONTADOR, CONTador e Contador so
idnticos. Quando voc define o nome de uma varivel, o Visual Basic
providencia para que todas as referncias feitas varivel em questo
sigam a mesma utilizao de letras maisculas e minsculas adotada
na declarao. Os programas tornam-se mais legveis quando se
usam letras maisculas e minsculas alternadamente, por exemplo,
iniciando o nome com maiscula e deixando as outras letras em
minscula. Para constantes, interessante que todas as letras sejam
maisculas.
Criando Tipos Definidos pelo Usurio
Os tipos de dados mencionados at agora, ditos inerentes ao Visual
Basic, normalmente atendem a todos os requisitos para informaes,
que podem facilmente ser desdobradas em componentes individuais,
tais como textos, nmeros e assim por diante. No entanto, apenas
esses tipos de dados podem revelar-se insuficientes para tratamento
de informaes que deveriam permanecer agrupadas. Vejamos um
exemplo especfico.
Suponha que seu passatempo seja a criao de animais raros e que
voc tenha adquirido duas doninhas de topete da Floresta da Baviera
chamadas Siegmund e Sieglinda. Ansioso por testar as suas novas
aptides de programao, voc decide manter dados descritivos sobre
seus animais no computador, incluindo informaes como cor, peso,
tamanho e data de nascimento deles, bem como cor e tamanho de
seus topetes. Voc pode comear escrevendo declaraes como
estas:
Dim Siegmund_Cor as String
Dim Siegrnund_Peso As Integer
Dim Siegmund_Tamanho As Integer
Dim Siegmund_Data_nascimento As Double
Dim Siegmund_Compr_topete As Integer
Dim Siegmund_Cor_topete As String
Aps haver feito isto para Siegmund, h a Sieglinda:
Dim Sieglinda_Cor as String
Dim Sieglinda_Peso As Integer
Dim Sieglinda_Tamanho As Integer
Dim Sieglinda_Data_nascimento As Double
Dim Sieglinda_Compr_topete As Integer
Dim Sieglinda_Cor_topete As String
Sem dvida, teria sido mais simples se fosse possvel declarar as
informaes relevantes uma nica vez. O Visual Basic oferece uma
soluo ideal: criar seus prprios tipos de dados.
Um tipo de dado definido pelo usurio um agrupamento de tipos de
dados inerentes ao Visual Basic: integers, strings, doubles e assim por
diante. A palavra-chave Type indica o incio de uma declarao de tipo
feita pelo usurio, como mostrado abaixo:
Type DoninhaTFB
Cor As String
Peso As Integer
Tamanho As Integer
Data_nascimento As Double
Compr_topete As Integer
Cor_topete As String
End Type
A declarao de tipo agrupa todas as informaes que voc acredita
ser importantes sobre seus novos amiguinhos. Observe que voc
ainda no reservou qualquer rea de memria para os dados,
simplesmente descreveu para o Visual Basic a estrutura ou layout dos
dados. Voc pode imaginar essa declarao como sendo a planta de
uma rea de memria. Aps a definio do novo tipo, possvel criar
as variveis como usualmente:
Dim Siegmund As DoninhaTFB
Dim Sieglinda As DoninhaTFB
Essas duas instrues criam as variveis Siegmund e Sieglinda - isto
, reserva-se uma rea de memria com um nome associado a ela.
Cada varivel contm todos os componentes de dados que foram
definidos. Na maioria das linguagens de programao, as variveis
que podem conter mltiplos componentes so chamadas de registros,
e cada componente separado chamado de elemento dentro do
registro. Quando voc usa a varivel Siegmund, est-se referindo a
todos os dados (cor, tamanho, peso etc.) simultaneamente. Quando
necessrio fazer referncia a um componente individual, voc pode
usar o nome da varivel seguido por um ponto (.) e pelo nome do
componente. Assim, Siegmund.Peso um componente de dados
integer que armazena o peso do macho, enquanto Sieglinda.Cor
uma string de texto que descreve a cor da fmea.
Vantagens Prticas
Os tipos definidos pelo usurio facilitam a leitura e a atualizao de
seu programa. Considere o exemplo das doninhas. A primeira forma
envolveria 12 instrues Dim, cada uma definindo um atributo para
cada doninha. Neste primeiro caso, preciso ler todas as 12
instrues para poder determinar quais atributos do Siegmund e da
Sieglinda esto sendo declarados. Ainda assim, no est claro se
existem ou no outros atributos declarados em algum outro ponto do
programa e muito menos se pode afirmar que Siegmund e Sieglinda
sejam itens de dados relacionados.
Contrastando com essa confuso, observe a clareza que h na
declarao de tipo feita pelo usurio. Os atributos contidos na
instruo Type claramente pertencem a DoninhaTFB. Num piscar de
olhos, pode-se dizer que as variveis Siegmund e Sieglinda so do
mesmo tipo e quais as informaes especficas que ambas contm.
Alm disso, se voc desejar modificar o seu programa mais tarde,
acrescentando, por exemplo, a cor dos olhos ao conjunto de
informaes sobre os animais, bastar alterar a instruo Type. Isso
far com que todas as variveis passem a conter esse novo elemento
de dados. Finalmente, se as doninhas. tiverem um relacionamento
amoroso e lhe presentearem com um nova doninha. voc poder
incluir uma varivel nova para o pequeno Siegfried no programa, com
uma instruo bem simples do tipo Dim Siegfried As DoninhaTFB.
Dj Vu
O modo como se acessam os campos de tipos definidos pelo
usurio se parece com o que voc usou para configurar as
propriedades da caixa de texto no aplicativo Cronmetro
(Captulo 1). No programa Cronmetro, voc usou a instruo
TxtDecorrido.Text = Format(TempoDecorrido, "hh:mm:ss") para
configurar a propriedade Text do objeto de exibio TxtDecorrido.
Observe a similaridade entre a referncia a TxtDecorrido.Text (que
tem o formato Objeto. Propriedade) na instruo mostrada e a
referncia a componentes de variveis, tais como Siegmund.Cor (que
tem o formato Varivel. Elemento). Como as variveis, os objetos
tambm so representados em memria; quando modifica uma
propriedade, voc est alterando um dos componentes daquele
objeto.
Determinando o Escopo
Vamos tentar um experimento:
1. Inicie o Visual Basic e selecione a opo New Project: do menu File
para criar um novo projeto.
2. Crie dois botes de comando no form, um abaixo do outro. Voc
pode dar um clique duplo na ferramenta Boto de Comando na caixa
de ferramentas, ou selecionar a ferramenta e desenhar os botes no
form.
3. Selecione o primeiro boto de comando (Command1) e a seguir
selecione a propriedade Caption da lista de propriedades na janela de
propriedades. Configure o Caption desse boto para
AssinalarEMostrar, digitando esse novo ttulo no campo de valor da
propriedade. Ento, selecione o segundo boto de comando e
configure o seu ttulo (Caption) para Mostrar, como apresentado a
seguir:
Figura 3.6
4. D um clique duplo no boto AssinalarEMostar para exibir a janela
de cdigo. Na janela de cdigo, defina o procedimento Click da
seguinte forma:
Private Sub Command1_Click ()
Dim SeuNome As String
SeuNome = lnputBox("Qual o seu nome ?")
MsgBox "O seu nome " & SeuNome
End Sub
Examinemos esse conjunto de instrues. A primeira linha a
declarao do procedimento. A segunda reserva memria para uma
varivel string chamada SeuNome. A terceira linha chama a funo
InputBox, uma funo interna do Visual Basic que exibe uma caixa de
dilogo na tela. O usurio digita um texto na caixa de dilogo e a
funo InputBox retorna o texto digitado. Esse texto armazenado na
varivel SeuNome. A quarta linha usa o procedimento interno MsgBox
para exibir urna caixa de dilogo contendo o texto "O seu nome "
seguido pelo contedo da varivel SeuNome. O operador (&)
concatena ou "Junta" duas strings; por exemplo, a expresso "Al" & "
companheiro" equivalente a "Al companheiro". Finalmente, a ltima
linha marca o final do procedimento.
5. Selecione agora o boto Command2 a partir da caixa Object na
janela de cdigo e insira o seguinte cdigo para o procedimento Click:
Private Sub Command2_Click ()
Dim SeuNome As String
MsgBox "Al " & SeuNome
End Sub
Esse procedimento apenas exibir a palavra Al e o contedo de
SeuNome. Voc pode usar o procedimento MsgBox e o operador de
concatenao (&), como foi feito no procedimento anterior.
6. Feche a janela de cdigo e pressione F5 para executar este
aplicativo.
7. D um clique no boto AssinalarEMostrar. Digite um nome na caixa
de dilogo e pressione Enter ou d um clique no boto OK. Se, por
exemplo, voc tiver digitado Mariana, o resultado ser semelhante ao
seguinte:
Figura 3.7
8. D um clique no boto OK para fechar a caixa de dilogo. Em
seguida, d um clique no boto Mostrar. A caixa de dilogo exibir
apenas a palavra Al.
Por que o Visual Basic no preservou o contedo da varivel
SeuNome? Por que ser que esse aplicativo se comporta de forma
diferente do Cronmetro no Capitulo 1? H uma explicao bem
simples: o aplicativo Cronmetro continha apenas uma instruo Dim,
e ela no estava dentro de um procedimento. Tentemos novamente,
usando o esquema adotado com sucesso no aplicativo Cronmetro:
1 . Pressione Alt-F4 para deixar o aplicativo.
2. D um clique duplo no boto AssinalarEMostrar na janela de form,
para mover-se para a janela de cdigo, e remova a instruo Dim do
procedimento Click.
3. Remova tambm a instruo Dim contida no procedimento Click do
boto Mostrar.
4. Selecione (General) a partir da caixa Object da janela de cdigo.
Nesta seo de declaraes gerais, digite a instruo Dim SeuNome
As String.
5. Feche a janela de cdigo e processe o seu aplicativo novamente.
Desta vez, o boto Mostrar funcionar da maneira esperada. Isso
serviu para voc constatar os efeitos do escopo de uma varivel.
Variveis Locais e em Nvel de Mdulo
O escopo de uma varivel determina quais procedimentos tero
acesso varivel. Na primeira vez que voc processou o exemplo
precedente, haviam sido criadas duas cpias da varivel SeuNome,
cada qual acessvel apenas dentro de um procedimento. Elas so
chamadas de variveis locais. Na segunda vez, voc declarou uma
nica varivel na seo de declaraes gerais do form, tornando-a
uma varivel em nvel de mdulo. Variveis declaradas dessa forma
so acessveis a todos os procedimentos contidos no form, (O termo
mdulo. neste contexto, refere-se essencialmente a arquivo; lembre-
se de que o cdigo de todos os procedimentos associados a um form,
ou a objetos contidos nesse form, so gravados num nico arquivo.)
Essa diferena entre as duas verses do programa encontra-se
ilustrada na Figura 3.8.
Restringir o escopo de variveis til, pois permite-lhe reutilizar os
nomes de variveis. Por exemplo, ao somar alguns nmeros em um
procedimento, voc poderia armazenar o resultado em uma varivel
local chamada Soma. Se, mais tarde, for necessrio escrever nesse
mesmo programa um outro procedimento semelhante que tambm
efetue uma soma, voc poderia usar o nome Soma novamente, sem
afetar o resultado do procedimento anterior. Escopo local permite que
cada procedimento seja uma unidade autocontida - isto ,
modificaes em outras pores do programa no interferem na
operao de um procedimento em particular.
Figura 3.8 Variveis locais versus variveis em nvel de mdulo
Variveis Globais
As variveis em nvel de mdulo so acessveis apenas pelos
procedimentos definidos dentro do mdulo. Caso venha a ser criado
um programa com mltiplos forms, voc ter de arranjar algum modo
para poder compartilhar as informaes entre os vrios forms, Para
atender a esse requisito, o Visual Basic prov um terceiro nvel de
escopo, as variveis pblicas. Variveis pblicas so declaradas em
mdulos de cdigo e de classes. So acessveis a partir de qualquer
parte de um programa. (Discutiremos os mdulos de cdigo na
prxima seo.) A Figura 3.9ilustra os trs nveis de escopo de
variveis.
Figura 3.9 Variveis locais, em nvel de mdulo e pblicas.
Para criar variveis pblicas, deve-se usar a palavra-chave Public em
lugar de Dim. A sintaxe, afora isto, idntica da instruo Dim.
Public varivel [As tipo]
As regras de escopo aplicam-se igualmente para o tratamento de
constantes. s constantes declaradas com a instruo Const
associado o escopo local ou em nvel de mdulo dependendo de sua
colocao em um procedimento ou em um mdulo Para criar
constantes pblicas, deve-se colocar a sua declarao na seo de
declaraes gerais de um mdulo e usar a palavra-chave Public para
iniciar a instruo, como mostrado a seguir:
Public Const VELOCIDADELUZ! = 300000
Public Const PRIMEIROIMPERADOR = "D. Pedro I"
O ponto de exclamao na constante VelocidadeLuz avisa ao Visual
Basic para armazenar a constante como um nmero real de preciso
simples (Single). Lembre-se, entretanto, de que constantes publicas
no podem ser declaradas dentro de procedimentos de um form.
Mdulos de Cdigo
Como voc viu, a definio de um form e a codificao associada a
ele, procedimentos e seo de declaraes gerais, so armazenadas
em um nico arquivo com o sufixo FRM. possvel criar aplicativos
que contenham mltiplos forms e, consequentemente, mltiplos
arquivos de forms possvel tambm haver arquivos de aplicativos
que contenham apenas codificaes. Esses mdulos de cdigo, cujos
arquivos tm o sufixo BAS, so criados quando voc seleciona a
opo Add Module do menu Project do Visual Basic.
Mdulos de cdigo separados, a princpio, so teis para armazenar
cdigos a serem compartilhados e para ajudar a organizar o seu
programa. Declaraes pblicas em um mdulo de cdigo podem ser
compartilhadas por todas as instrues do programa. Quando voc
estiver construindo programas maiores e mais complexos, talvez seja
til agrupar a codificao relacionada a certo aspecto do programa
num mdulo separado.
Declaraes Default
possvel declarar uma varivel local sem usar a instruo Dim: basta
usar o nome da varivel quando necessrio. Pode-se usar um dos
caracteres (%, &, !, # ou $) para especificar o tipo de dado da varivel;
do contrrio, o Visual Basic assinalar o tipo variant como default. A
ttulo de exemplo, abra um novo projeto e coloque um nico boto de
comando no Form. Defina o procedimento de evento Click para esse
boto de comando, como mostrado a seguir:
Sub Command1_Click ()
Resposta$ = lnputBox("Voc me ama ?")
If Resposta$ = "Sim" Then
MsgBox "Ele me ama"
Else
MsgBox "Ele no me ama"
End If
End Sub
Esse fragmento de cdigo no contm uma declarao explcita para
a varivel Resposta$. No entanto, o sinal $ indica que ela uma
varivel do tipo string. Por default, o Visual Basic cria essa varivel
com escopo local.
Ainda que as declaraes default possam ser consideradas
convenientes, recomendvel evit-las. Em vez disso, procure
declarar explicitamente toda e qualquer varivel que o seu programa
for usar. O uso de declaraes default pode gerar erros em seus
programas. Assim, no exemplo anterior, voc poderia declarar uma
varivel em nvel de mdulo chamada Resposta como parte de uma
modificao posterior. Quando o procedimento viesse a ser
executado, o Visual Basic: assumiria que a varivel Resposta contida
no procedimento Command1_Click faz referncia varivel em nvel
de mdulo pois no h uma declarao explcita. Consequentemente,
aps esse procedimento ser executado, o contedo armazenado na
varivel em nvel de mdulo seria sobreposto.
Declaraes default sempre do origem a variveis locais. Variveis
em nvel de mdulo ou pblicas tm de ser declaradas usando-se a
instruo Dim, Private ou a instruo Public na seo de declaraes
gerais da janela de cdigo. A instruo Dim usada dentro de um
procedimento cria uma varivel local.
O Visual Basic pode ajud-lo a evitar declaraes default. Selecione a
opo Options do menu Tools. Na caixa de dilogo, marque a
opo Require Variable Declarations, conforme mostrado na Figura
3.10.
Figura 3.10 A caixa de dilogo Options.
Assim, toda vez que voc criar um novo arquivo, o Visual Basic
incluir a instruo Option Explicit seo de declaraes gerais de
seu cdigo. (Voc tambm pode introduzir essa instruo diretamente
na seo de declaraes gerais.) Com isso, quando voc tentar
executar um programa que contenha variveis no declaradas, o
Visual Basic colocar o nome dessas variveis em destaque, exibindo
a mensagem Variable not defined.
Outras Opes de Ambiente
A caixa de dilogo Options ainda permite-lhe modificar outras
configuraes. Tab Width (comprimento de parada para a tecla Tab),
normalmente configurada para 4, pode ser modificada, alterando as
posies de tabulao da janela de cdigo. Repare, no entanto, que o
Visual Basic no insere no seu cdigo o caracter correspondente
tecla TAB. Em vez disso, so colocados tantos espaos em branco
quantos forem necessrios para atingir a prxima posio de
tabulao.
A opo Auto Syntax Checking (verificao sinttica automtica),
quando marcada, habilita a verificao de cada linha de cdigo
medida que voc a introduz. (Quando a tecla Enter pressionada.)
Na ficha Environment, configure a opo When a Program Starts para
Save Changes (salva o projeto antes de executar). O Visual Basic
automaticamente salvar a verso atual de seus arquivos de forms e
de projeto antes de processar o seu aplicativo. Isso assegura que
voc no perder qualquer trabalho realizado, no caso de uma queda
do sistema. Voc pode preferir deixar essa opo desabilitada
enquanto estiver fazendo algumas modificaes que no deseja
salvar.
Outras opes na caixa de dilogo Options - em Editor Format -
permitem-lhe configurar as cores de exibio de texto nas janelas de
cdigo. Por meio da configurao dessas cores, possvel reconhecer
rapidamente comentrios, variveis, palavras-chave e assim por
diante, diferenciando dessa forma as vrias partes de seu programa.
Instrues, Expresses e
Procedimentos no Visual Basic
Este captulo concentrar-se- nas instrues simples do Visual Basic.
Uma instruo na linguagem Visual Basic a exposio de um
comando completo para o computador, o equivalente a uma frase em
portugus. Dentro das instrues voc pode criar expresses
combinando valores e operadores. Este captulo descreve os
diferentes tipos de operadores e como us-los. Fornece tambm uma
explicao mais detalhada sobre procedimentos que voc encontrou
anteriormente, quando construiu seu primeiro aplicativo.
Instrues de Assinalamento
A instruo mais simples e provavelmente mais comum em programas
a instruo de assinalamento. Ela consiste em um nome de varivel
seguido pelo operador de assinalamento (=) e por algum tipo de
expresso. Em sua forma mais simples, uma expresso contm
apenas uma constante; ela pode no entanto conter uma referncia a
uma varivel, ou a variveis e constantes, sobre a qual certas
operaes so executadas. Todas as instrues a seguir so
instrues de assinalamento vlidas:
Tempoinicial = Now
Explorador.Nome = "Capito Mascarenhas"
ContadordeBits = ContadordeBytes * 8
Energia = Massa * VelocidadeLuz ^ 2
Lquido = Proventos - Descontos
Uma instruo de assinalamento armazena informao. O valor da
expresso, que aparece direita do operador de assinalamento,
calculado e o resultado armazenado na varivel esquerda do
operador. O tipo de dado da varivel deve ser apropriado para
armazenar o resultado da expresso. Por exemplo, uma constante ou
expresso do tipo string no pode ser armazenada em uma varivel
integer ou double. Se os tipos de dados estiverem relacionados, mas
no forem iguais - por exemplo, voc pode desejar armazenar um
valor inteiro em uma varivel de ponto flutuante -, o Visual Basic
converter o resultado da expresso para o tipo da varivel. Porm, se
voc armazenar o resultado de uma expresso em uma varivel do
tipo variant, o tipo da expresso ser mantido. Variveis do tipo variant
mantm tanto o tipo quanto o valor.
Infelizmente, o operador de assinalamento idntico ao smbolo
matemtico usado para representar igualdades (o sinal de igual que
une as duas partes de uma equao, como em x + 1 = 0). Igualdade
no sentido matemtico expressa uma condio que verdadeira. Nas
instrues de assinalamento do Visual Basic, o smbolo = um
comando que transfere o resultado da expresso que se segue para a
varivel que o precede. O sinal de igual em Visual Basic representa
uma ao que o sistema deve executar, em vez de estabelecer um
fato. A equao 2 + 1 = 1 + 2 no uma instruo vlida em Visual
Basic, pois falta uma varivel do lado esquerdo do sinal de igual. Caso
tente-se introduzir essa linha como uma instruo completa, o Visual
Basic gerar uma mensagem de erro.
Todas as instrues que voc criou no aplicativo Cronmetro so
instrues de assinalamento. Em algumas instrues, como
BtnParar.Enabled = True, foram assinalados valores constantes
simples. Em outras, tal como TempoDecorrido = TempoFinal -
TempoInicial, voc usou uma expresso. Em instrues como
TxtInicial.Text = Format(TempoInicial, "hh:mm:ss"), voc invocou uma
funo interna. O restante deste capitulo explora a capacidade do
Visual Basic nessas reas.
Expresses e Operadores
Como foi dito, uma expresso pode ser to simples quanto uma
constante, no entanto, usualmente as expresses representam
clculos a serem executados. Via de regra, um operador indica o tipo
de operao a ser feita. Certamente, voc j deve estar familiarizado
com os operadores aritmticos, como o sinal de mais (+), que indica
uma soma. A expresso 2 + 1 avisa ao Visual Basic para somar os
valores 2 e 1. O 2 e o 1 so os operandos da operao de soma. Alm
dos operadores aritmticos, o Visual Basic prov um operador de
concatenao de strings, operadores de comparao, operadores
lgicos e o operador AddressOf, que permite referenciar o endereo
de um procedimento na memria (sero discutidos mais adiante neste
mesmo captulo).
Por si s, as expresses no so instrues vlidas, pois no esto
completas. Introduzir, por exemplo, apenas 2 + 1 no seu programa
provocar um erro. Se considerarmos uma instruo na linguagem
Visual Basic uma frase, uma expresso deve ser considerada uma
frase. E possvel usar expresses em todo e qualquer lugar onde se
possa colocar uma constante.
muito difcil definir uma expresso. As melhores definies so
sempre referncias prpria expresso. Uma definio parcial poderia
incluir estas regras:
Um valor constante uma expresso.
A combinao de uma expresso seguida por um operador e
uma outra expresso tambm uma expresso.
Conforme essas regras, 3 uma expresso, tanto quanto 1; alm
disso, 3 + 1 tambm uma expresso. De onde se deduz que 3 * 3 +
1 uma expresso, como o 3 * 3 + 1 + 1. Voc pode imaginar at
onde isso pode continuar: expresses podem ser arbitrariamente
complexas.
Tipos de Expresses
O tipo de uma expresso determinado a partir do tipo de seus
operandos. Para um valor constante, o tipo da expresso o mesmo
que o da constante. Para uma expresso que contenha uma
operao, o Visual Basic usa o tipo dos dois operandos para
determinar o tipo do resultado. Naturalmente, quando voc soma dois
nmeros inteiros, o resultado inteiro. Se voc soma dois valores de
dupla preciso, o resultado ser do tipo double (real). Se voc misturar
tipos diferentes - por exemplo, multiplicar um inteiro por um single,
como na expresso 2 * 7,5 -, o Visual Basic geralmente transformar o
resultado no tipo que puder acomodar a maior faixa de valores. Neste
caso, o resultado seria do tipo single. Para prevenir possveis
ambigidades, melhor no usar tipos diferentes em uma expresso.
O uso de caracteres de declarao de tipo para constantes numricas
poder ajud-lo a minimizar a quantidade de tipos diferentes de uma
expresso. Esses caracteres faro com que a constante seja tratada
de acordo com o tipo especificado. Por exemplo, 100 normalmente
seria um inteiro. Mas 100! do tipo single e 100@, do tipo currency.
(Os caracteres usados pelo Visual Basic para declarao de tipos
encontram-se listados na Figura 3.4 do Captulo 3.)
Nota: O Visual Basic no permite o uso de caracteres de declarao
de tipo para truncar constantes reais em valores inteiros. Por exemplo,
voc no pode usar 3,14% como se fosse o inteiro 3 (ainda que
quisesse). No entanto, se voc desejar converter variveis de ponto
flutuante para inteiros, o Visual Basic prov funes de converso
especficas que se encontram documentadas no arquivo de ajuda do
Visual Basic.
As expresses no precisam restringir-se a operadores e constantes.
Por exemplo, a expresso 17733,50 + (ReceitasAjustadas - 32450) *
23 / 100 inclui uma varivel e um conjunto de parnteses, operadores
e constantes.
Quando as expresses so mais complexas do que dois operandos e
um operador, possvel haver duas ou mais formas distintas de
avali-las. Por exemplo, a avaliao da expresso 2 + 6 / 2 pode, em
primeiro lugar, fazer com que seja feita a soma de 2 com 6 e ento
dividir o resultado por 2, obtendo 4 como resultado final, ou dividir 6
por 2 e, ao resultado, somar 2, obtendo-se 5 como resultado final. Os
parnteses so usados para eliminar esse tipo de ambigidade. As
subexpresses contidas entre parnteses so sempre avaliadas em
primeiro lugar. A expresso 2 + (6 / 2) indica claramente que a
operao de diviso deve ser efetuada em primeiro lugar. Expresses
muito complexas podem requerer o uso de vrios conjuntos de
parnteses. As expresses mais internas ou contendo maior nvel de
aninhamento so avaliadas em primeiro lugar.
Na falta dos parnteses direcionadores, o Visual Basic aplica um
conjunto de regras, chamado precedncia de operadores, para
determinar quais operaes devem ser executadas em primeiro lugar.
Por exemplo, em virtude de a diviso e a multiplicao terem
precedncia maior que a soma e a subtrao, o Visual Basic avaliaria
a expresso 2 + 6 / 2 como 2 + (6 / 2). A prxima seo deste captulo
descreve os operadores disponveis em Visual Basic, agrupados de
acordo com a funo e seguidos pela tabela de precedncia, que
ilustra como os operadores se relacionam entre si.

Operadores Aritmticos
Os operadores mais familiares so os responsveis por operaes
aritmticas simples. A Figura 4.1 lista os operadores aritmticos
oferecidos pelo Visual Basic.
Nas operaes de adio, subtrao e multiplicao, os resultados
so nmeros do mesmo tipo que os operandos. (Combinao de tipos
foi descrita na Seo precedente.) Via de regra, o uso de nmeros
inteiros ou nmeros de ponto fixo mais eficiente do que o uso de
nmeros de ponto flutuante. Porm, a menos que a avaliao envolva
muitos clculos complexos, a diferena no ser notada.
Figura 4.1 Operadores aritmticos.
Exponenciao
O operador de exponenciao permite-lhe calcular potncias e razes.
Em matemtica, a exponenciao indicada por nmeros
sobrescritos. Por exemplo, o valor 28 e 2 elevado oitava potncia,
que seria computado pelo Visual Basic pela expresso 2 ^ 8. A raiz
quadrada de 2, que 2 elevado potncia 1/2, poderia ser computado
em Visual Basic pela expresso 2 ^ (1 / 2) ou por 2 ^ 0,5. A Figura
4.2 apresenta outros exemplos de exponenciao.
Figura 4.2 Exemplos de exponenciao.
Diviso de Inteiros e de Ponto Flutuante
O operador de diviso de ponto flutuante (/) executa a diviso padro,
porm retorna o resultado num formato de ponto flutuante. Assim, a
expresso 3 / 2 avaliada como 1,5, como seria de se esperar.
Contrastando com o operador de diviso de inteiros (\), que retorna
um valor inteiro. Se esse operador fosse aplicado expresso 3 \ 2,
produziria 1 como resultado. Era o que faltava, voc deve lamentar -
uma funo que retorna a resposta errada.
Depende do ponto vista. Imagine que voc esteja empacotando
pimenta malagueta e precise saber quantas pimentas pode colocar em
um vidro de 0,5 litro. Como especialista que na matria, voc sabe
que em um vasilhame de 4 litros cabem 150 pimentas e que no se
costuma colocar pedaos de pimenta. Uma vez que 0,5 litro 8 vezes
menor do que 4 litros, voc sabe que deve colocar 18 pimentas no
vasilhame menor, ou seja, 150 \ 8. Se for usado o operador de diviso
de ponto flutuante, o resultado seria 18,75, que no pode ser aceito,
pelo menos no caso das pimentas.
Como o Visual Basic pode facilmente converter valores de um tipo
para outro, voc pode achar que chegaria ao mesmo resultado
simplesmente usando uma varivel inteira para guardar o resultado,
como abaixo, onde usado o operador de diviso de ponto flutuante
(/):
Dim PimentasPorVidro As Integer
PimentasPorVidro = 150 / 8
Na realidade, quando a instruo de assinalamento for executada,
ser armazenado o valor 19 na varivel PimentasPorVidro e no 18,
como voc esperava. Ao avaliar a expresso acima, o Visual Basic
obtm como resultado 18,75, porm, como esse resultado deve ser
armazenado em uma varivel inteira, o Visual Basic promove o
arredondamento, do nmero de ponto flutuante para o prximo inteiro,
que 19. Quando voc usar o operador de diviso de inteiros,
qualquer parte fracionria existente ser truncado em vez de ser
arredondada. A Figura 4.3 mostra as diferenas entre truncagem e
arredondamento.
Figura 4.3 Truncagem e arredondamento.
Resto
O operador Mod, que est intimamente ligado diviso inteira, retorna
o resto produzido pela diviso inteira do primeiro pelo segundo
operando. Por exemplo, se voc divide 7 por 4, o resultado 1, com
resto 3. Assim, a expresso 7 Mod 4 avaliada como 3.
Analogamente, a expresso 21 Mod 4 produz 1 como resultado. (21
divido por 4 igual a 5 e resta 1.)
Usando o exemplo das pimentas novamente, voc agora sabe que
pode colocar 18 pimentas em um vidro de 0,5 litro. Se voc tiver 75
pimentas para embalar, a expresso 75 \ 18 lhe informar quantos
vidros podero ser preenchidos (4), enquanto a expresso 75 Mod 18
indicar quantas pimentas sobraro.
Precedncia de Operadores Aritmticos
A Figura 4.4 indica a ordem de precedncia para os operadores
aritmticos. A exponenciao tem a maior precedncia; as operaes
de adio e subtrao possuem a menor precedncia. Operadores
colocados na mesma linha so iguais em termos de precedncia.
Figura 4.4 Ordem de precedncia dos operadores aritmticos.
A Figura 4.5 contm algumas expresses simples em Visual Basic e
os valores que resultam quando elas so avaliadas. Se necessrio,
use a ordem de precedncia mostrada na Figura 4.4 para entender
como o Visual Basic chegou aos resultados.
Figura 4.5 Usando a ordem de precedncia para avaliao de
expresses.
O Operador de Concatenao de String
Quando os operandos em uma expresso so do tipo string, o
operador (&)
concatena, ou combina, as strings. Voc pode usar a concatenao
para "colar" duas ou mais strings, para obter uma string maior. O
resultado de uma concatenao uma string inteiramente nova.
Nenhum dos operandos originais sofre qualquer alterao. O
fragmento de programa a seguir usa a concatenao para reproduzir
algumas linhas do livro de Lewis Carroll:
x$ = "morcegos"
y$ = "gatos"
Debug.Print "Os " & x$ & " comem " & y$ & "?"'Os morcegos comem
gatos ?
Debug.Print "Os " & y$ & " comem " + x$ & "?"'Os gatos comem
morcegos ?
Nota: o operador (+) tambm pode ser usado para concatenao de
strings, mas procure usar sempre o operador prprio para essa
funo.
Interagindo Diretamente com o Visual Basic
No Captulo 1, voc usou a instruo Debug.Print para escrever na
janela Immediate que pode ser exibida quando o seu aplicativo est
sendo processado. A janela Immediate mais do que apenas um local
til para colocar mensagens; nessa janela voc pode interagir
diretamente com o interpretador.
Crie um projeto novo, selecionando a opo New Project a partir do
menu File. Pressione F5 para iniciar o aplicativo. Ainda que voc no
tenha escrito qualquer instruo, e muito menos colocado qualquer
objeto no form, o Visual Basic processar o form, em branco. Agora,
selecione a opo Break do menu Run. Isso far com que o
processamento do seu aplicativo seja suspenso, independentemente
do que estiver sendo processado (que, neste caso, no deve ser muita
coisa). Digite a instruo Debug.Print "Al" na janela Immediate e
pressione a tecla Enter. O interpretador do Visual Basic process-la-
imediatamente, executando a sua instruo.
Figura 4.6
Como a janela Immediate o form ativo no momento que o
interpretador executa o seu comando, voc no precisa incluir o nome
do objeto Debug ao chamar o mtodo Print; basta usar a palavra Print.
Alm disso, o Visual Basic lhe permite abreviar Print como ? para
obter os resultados mais rapidamente, como mostrado a seguir:
Figura 4.7
Voc pode submeter expresses a serem avaliadas e fazer chamadas
a funes na janela Immediate. Voc tambm pode chamar um
procedimento e executar normalmente qualquer instruo que possa
ser codificada em um programa. Passar para a janela Immediate um
meio rpido e fcil de depurar (testar) uma linha de cdigo. Aps
terminar, pressione a tecla F5 para continuar o processamento normal
de seu aplicativo, ou ento selecione End do menu Run para sair do
aplicativo.
Caso seja necessrio concatenar um nmero com uma string, voc
deve usar uma das funes internas do Visual Basic para converter o
nmero em string. A mais simples dessas funes chamada de Str$.
Por exemplo, a expresso "A raiz quadrada de 2 " + Str$(2 ^ 0,5),
converte o nmero entre parnteses para uma string.
preciso no se esquecer de incluir espaos em branco nas suas
strings quando necessrio; do contrrio o Visual Basic apenas ir
combin-las, sem incluir espaos.
Operadores de Comparao
Os seis operadores de comparao so mostrados na Figura 4.8.
Quando dois valores forem comparados, o resultado ser um valor
booleano - isto , ser True (verdadeiro) ou False (falso). ( O
termo booleano provm do nome do matemtico ingls George
Boole.) O Visual Basic oferece as constantes internas chamadas de
True e False, que representam os valores -1 e 0, respectivamente. A
representao binria de 0 um nmero em que todos os bits se
encontram no estado 0, e a representao de -1 um nmero binrio
em que todos os bits se encontram no estado 1, tornando o estado
True oposto ao estado False
Figura 4.8 Operadores de comparao.
A Figura 4.9 explica e avalia algumas expresses tpicas de
comparao. Os operadores de comparao so tambm conhecidos
como operadores relacionais, porque avaliam o relacionamento entre
dois operandos. Ainda que todos os operadores de comparao
tenham a mesma ordem de precedncia, ela menor que a ordem de
precedncia de qualquer operador aritmtico.
Provavelmente, voc deve ter notado que o operador "igual a" usa o
mesmo smbolo (=) que o operador de assinalamento. Entretanto, isso
no deve causar nenhuma confuso, pois o operador de
assinalamento vlido apenas em um local: imediatamente aps o
nome de uma varivel em uma instruo de assinalamento. Em todos
os outros casos, o sinal de igual estar sendo usado como operador
de comparao, ou operador relacional. Por exemplo, na instruo
Test = a = b, a expresso a = b ser avaliada como True ou False. O
resultado ser ento assinalado para a varivel Test.
Figura 4.9 Usando operadores de comparao.
Operadores Lgicos
Os operadores lgicos s vezes so chamados de operadores
booleanos, porque derivam da lgebra de lgica matemtica
desenvolvida por George Boole. Esses operadores possuem valores
booleanos como operandos e retornam resultados
booleanos. A Figura 4.10 exibe os operadores booleanos organizados
segundo sua ordem de precedncia. (Todos os operadores lgicos
tm ordem de precedncia menor do que os operadores de
comparao.)
Figura 4.10 Operadores lgicos ou booleanos em ordem de
precedncia.
O operador lgico mais simples chamado de Not. Ele sempre
precede um operando simples e retorna o seu oposto lgico - isto ,
ele nega o operando. Por exemplo, a expresso Not False leva ao
resultado True (o oposto de False); enquanto a expresso Not (4 < 3)
avaliada como True, porque a expresso (4 < 3) falsa. O operador
Not tem a maior ordem de precedncia entre os operadores lgicos.
O prximo operador na ordem de precedncia And. Ele retorna True
como resultado se (e somente se) ambos os operandos forem
avaliados como True. Se qualquer um dos operandos for avaliado
como False, ele retorna False. Esse operador corresponde ao e usado
em portugus, como na frase "Ficarei impressionado apenas se ele for
Ph.D. e (And) tiver mais de 1,90 metro de altura".
Expresso Resultado
False And False False
False And True False
True And False False
True And True True
O operador Or retorna o resultado True se qualquer um dos dois
operandos for avaliado como True. Novamente, o significado similar
ao uso da palavra ou em portugus, como, por exemplo, "Eu
comprarei o gato se ele custar menos de 50 dlares ou (Or) for um
siams".
Expresso Resultado
False Or False False
False Or True True
True Or False True
True Or True True
Ainda que os operadores Not, And e Or sejam os mais usados, o
Visual Basic ainda oferece trs outros operadores: Xor, Eqv e Imp. O
operador Xor (Or exclusivo) retorna o resultado True se qualquer um
dos operandos, mas no ambos simultaneamente, for avaliado como
True. Em outras palavras, ele funciona como o operador Or exceto no
caso em que ambos os operandos so True.
Expresso Resultado
False Xor False False
False Xor True True
True Xor False True
True Xor True False
O operador Eqv (equivalncia) retorna True como resultado se os dois
operandos tiverem o mesmo valor.
Expresso Resultado
False Eqv False True
False Eqv True False
True Eqv False False
True Eqv True True
Quando voc usar o operador Imp (Implicao), o resultado ser False
somente se o primeiro operando for True e o segundo for False. Nos
outros casos, o resultado ser True. O operador Imp o nico
operador booleano onde a ordem dos operandos faz diferena. A
implicao usada algumas vezes com o operador And, como
ilustrado pelo famoso silogismo "Scrates homem e (And) todo
homem mortal, isso Implica (Imp) que Scrates mortal".
Expresso Resultado
False Imp False True
False Imp True True
True Imp False False
True Imp True True
possvel usar mais de um operador lgico em uma expresso.
A Figura 4.11 fornece alguns exemplos; tente avaliar cada expresso
e verifique se o resultado est de acordo com a ordem de precedncia
mostrada na Figura 4. 10.
Figura 4.11 Usando mltiplos operadores lgicos em uma expresso.
Precedncia
A Figura 4.12 exibe o conjunto completo dos operadores do Visual
Basic (menos o operador de concatenao de strings), segundo a
ordem decrescente de precedncia. Ao encontrar uma expresso
complexa, voc deve em primeiro lugar determinar qual o operador
que tem a maior precedncia e ento avaliar a subexpresso que o
contm. Em seguida, determine qual o operador com a ordem de
precedncia imediatamente menor, avaliando a subexpresso, e
assim por diante at chegar ao resultado final.
Figura 4.12 Operadores do Visual Basic em ordem de precedncia.
Alguns operadores, como adio e subtrao ou, ainda, todos os
operadores de comparao, tm ordem de precedncia igual. Ao
encontrar operadores com precedncias iguais, voc deve avaliar as
subexpresses da esquerda para a direita.
Considere, por exemplo, a seguinte expresso:
Temperatura >= 300 And Inflamvel True
Como os operadores ( > e = ) tm o mesmo nvel de precedncia, o
Visual Basic avaliar essa expresso da esquerda para a direita. Aps
avaliar as subexpresses que contm esses operadores, o Visual
Basic executar a operao And. Neste caso, se Temperatura for
menor do que 300 ou Inflamvel for False, o Visual Basic determinar
False como resultado final.
Eis aqui um exemplo mais complexo:
Contador * 2 < 15 Or Cor = "Azul" And Contador * 2 < 21
Seguindo a tabela de precedncia, o Visual Basic em primeiro lugar
executar as duas operaes de multiplicao e em seguida as trs
comparaes, da esquerda para a direita. Depois, trabalhar com a
operao And e, finalmente, com a operao Or.
Se isso lhe parece um bom jeito de se perder, voc est certo. Mesmo
que no seja necessrio usar parnteses para modificar a ordem de
execuo das operaes, uma boa idia coloc-los para melhorar a
legibilidade das expresses que sero avaliadas. Com os parnteses,
o exemplo anterior ficaria assim:
((Contador * 2) < 15) Or ((Cor = "Azul") And ((Contador * 2) < 21))
Erros Comuns
Quase todos os programadores iniciantes cometem erros relacionados
a expresses. Vamos dar uma olhada em alguns dos erros cometidos
com maior freqncia, para que voc possa evit-los ou pelo menos
identific-los.
Um dos erros mais comuns o engano cometido no uso de
operadores relacionais quando se deseja testar se uma varivel est
dentro de uma certa faixa de valores. Por exemplo, ao trabalhar com a
varivel Temperatura para determinar se o seu valor maior do que
10 e menor do que 100 graus, voc deveria faz-lo com a expresso
Temperatura > 10 And Temperatura < 100. No entanto, voc poderia
sentir-se tentado a usar a expresso 10 < Temperatura < 100, que
apesar de parecer matematicamente correta no funcionar com o
Visual Basic. Apesar de estar sintaticamente correta, essa expresso
resultaria em uma resposta errada. Por qu?
Comecemos a avaliao das duas subexpresses da esquerda para a
direita. (Os dois operadores tm a mesma ordem de precedncia.)
Como os operadores relacionais sempre retornam True ou False, que
so equivalentes aos inteiros -1 e 0, o resultado da primeira
subexpresso 10 < Temperatura ser -1 ou 0. Em funo disso, a
segunda subexpresso poder ser - 1 < 100 ou 0 < 100, que True.
Assim, a expresso 10 < Temperatura < 100 sempre retornar True
como resultado final, independentemente do valor da varivel
Temperatura. Isso mostrado graficamente na Figura 4.13.
Figura 4.13 Modo incorreto de testar faixa de valores.
Outro erro tpico a criao de expresses lgicas com a mesma
impreciso que freqentemente h na lngua falada. A expresso no
exemplo anterior foi cuidadosamente formulada para encontrar um
valor que seja "maior do que 10 graus, mas menor do que 100 graus".
Porm, se estivesse conversando com um colega, voc poderia ter
estabelecido a questo da seguinte forma: "Eu desejo saber quando a
temperatura maior do que 10 graus ou menor do que 100 graus".
Essa formulao menos precisa (e de fato errnea), porm as
pessoas so razoavelmente inteligentes para conviver com esta
ambigidade, e provavelmente o seu colega entenderia o que voc
realmente pretendia falar. A expresso correta correspondente a essa
formulao seria Temperatura > 10 Or Temperatura < 100.
Novamente, examinando a expresso sob a tica do Visual Basic,
voc pode perceber onde est o problema. Primeiro seriam avaliadas
as duas expresses relacionais e depois a operao booleana Or. A
subexpresso Temperatura > 10 ser True para todos os nmeros
maiores do que 10; a outra subexpresso relacional, Temperatura <
100, ser True para todos os valores menores do que 100. Veja,
agora, o que acontece quando voc junta essas duas expresses. Se
a varivel contiver o valor 5, a primeira subexpresso resultar False (
5 < 10), enquanto a segunda resultar True, pois 5 menor do que
100. A operao Or sempre ter True como resultado, pois um
operando sempre ser True. Analogamente, o valor 200 far com que
a primeira resulte True e a segunda, False, levando a operao Or a
ser True. Para o valor 50, ambas as subexpresses resultaro True e
a operao Or ser True tambm. Portanto, o uso do operador Or em
vez de And far com que a expresso que voc montou resulte
sempre True.
Um terceiro engano comum confundir uma instruo de
assinalamento com condies matemticas. Esse problema pode ser
ilustrado pelo seguinte fragmento de cdigo:
A = 10
B = A / 2
A = 20
Aps a execuo dessas trs instrues, A valer 20 e B, 5. Se voc
imaginou que B deveria valer 10, caiu na armadilha. A segunda
instruo no expressa uma condio que True a todo instante; em
vez disso, uma expresso que avaliada uma nica vez, com um
determinado valor para a varivel A. Nesse exemplo, a instruo
processada quando a varivel A tem o valor 10. Instrues que se
seguem podem alterar o valor de A, porm o valor armazenado na
varivel B permanecer intacto at que seja executada outra instruo
de assinalamento para essa varivel.
Vejamos outro erro comum. At agora, usamos apenas os valores
False e True em operaes booleanas, porque isso que voc
encontrar com maior freqncia. No entanto, preciso estar atento
para o fato de que os valores True e False so equivalentes aos
valores -1 e 0. O Visual Basic no gerar qualquer mensagem de erro
se voc usar And, Or Imp ou qualquer um dos operadores lgicos com
operandos inteiros, tais como 6 ou 237. O Visual Basic realmente
executar a operao booleana especificada sobre cada bit dos
operandos
Isso pode conduzir a erros estranhos. Por exemplo, digamos que seja
necessrio saber quando a varivel x igual a 5 ou 6. Voc poderia
tentar codificar a instruo como Debug.Print x = 5 Or 6. O Visual
Basic executar a operao Or sobre os inteiros 5 e 6, um bit de cada
vez, resultando 7. Ento o valor de x seria comparado com 7, que no
exatamente o que voc tinha em mente. Em vez disso, voc deveria
codificar a instruo como Debug.Print (x = 5) Or (x = 6).
Procedimentos
Muito embora voc j tenha escrito alguns procedimentos e saiba o
que so e como funcionam, ser til investir algum tempo para
formalizar esse conhecimento. Esta seo aborda basicamente os
procedimentos internos do Visual Basic; mais adiante enfocaremos o
projeto e a criao de novos procedimentos.
Um procedimento e um conjunto de instrues que executa um
determinado servio. Voc pode requisitar a execuo do servio pelo
nome do procedimento que o contm. Por exemplo, no Captulo 3,
voc escreveu um pequeno programa que usava o procedimento
MsgBox. Quando aquela parte do seu programa era executada, o
Visual Basic exibia em uma caixa de dilogo a mensagem que havia
sido fornecida. Quando a caixa de dilogo era fechada, a execuo de
seu programa prosseguia. O Visual Basic oferece o servio de
desenhar uma caixa de dilogo ao redor de sua mensagem, criando
um boto OK, inspecionando o mouse at que seja dado um clique no
boto e removendo a caixa de dilogo da tela; tudo o que voc tem de
fazer fornecer a mensagem a ser exibida.
Servios oferecidos pelo Visual Basic podem ser comparados com
aqueles servios corriqueiros, executados todos os dias. Por exemplo,
se voc acabou de adquirir uma pintura de Van Gogh e est
preocupado com uma possvel falta de fundo para cobrir o cheque
com o qual pagou o quadro, pode chamar o banco e solicitar uma
transferncia. Voc fornece ao banco os nmeros das contas e o valor
a ser transferido. Aps isso, o banco executar o servio requisitado,
sem qualquer interveno de sua parte.
Em outros casos, um objeto palpvel retornado pelo provedor do
servio. Por exemplo, voc pode visitar uma pizzaria local, entregar a
eles o seu pedido de pizza e alguns trocados e obter uma pizza como
retorno. Como voc deve lembrar-se, os procedimentos do Visual
Basic que retornam valores so chamados de funes. No programa
de exemplo do Capitulo 3, voc chamou a funo InputBox, passou-
lhe uma frase a ser apresentada e ela exibiu a caixa de dilogo e lhe
retornou o texto introduzido na caixa de dilogo.
O Visual Basic oferece muitas funes internas teis, algumas das
quais se encontram descritas na Figura 4.14. Voc pode usar o
sistema de ajuda on-line do Visual Basic, para explorar em maiores
detalhes essas funes internas.
Sintaxe para Procedimentos e Funes
Para chamar um procedimento ou funo, preciso usar o seu nome.
Alm disso, o Visual Basic tem regras especficas sobre a sintaxe de
uma instruo - isto , sobre como a instruo tem de ser codificada.
(Ainda que as funes tambm possam ser chamadas de
procedimentos, na abordagem que se segue, por questes de clareza,
ser mantida a diferenciao entre funes e procedimentos. Apenas
lembrando: funes so procedimentos que retornam valores.)
Figura 4.14 Algumas funes internas do Visual Basic.
Para usar ou chamar um procedimento, deve-se escrever uma
instruo Visual Basic em que o nome do procedimento seja o
primeiro item. A chamada a um procedimento uma instruo
completa do Visual Basic, e o procedimento pode no requerer
qualquer informao adicional. Caso necessrio, os valores a serem
passados para o procedimento devem ser separados por vrgulas. Os
valores a serem passados so chamados de argumentos ou
parmetros do procedimento. No caso do procedimento MsgBox, voc
usou apenas um argumento, a string de texto a ser exibida. As
instrues a seguir so exemplos de chamadas a procedimentos:
MsgBox "Al, companheiro"
ChDir "\teste\dados"
Beep
SavePicture NoitedeEstrelas, "vincent.bmp"
A sintaxe para a chamada de funes diferente. Como h o retorno
de valor, a chamada pode ser usada em todos os lugares onde uma
expresso possa ser colocada. A chamada a uma funo ser
habitualmente encontrada dentro do contexto de alguma outra
instruo, mais freqentemente a instruo de assinalamento.
Quando uma funo no requer argumentos, voc pode usar o nome
de funo como se fosse o nome de uma varivel, tal como em
Tempoinicial = Now. A funo Now no requer argumentos e retorna
um valor temporal. O Visual Basic chama a funo e assinala o valor
retornado varivel Tempoinicial.
Quando uma funo requer um ou mais argumentos, deve-se colocar
um parntese esquerda antes do primeiro argumento e um
parntese direita aps o ltimo. Os parnteses s so usados se a
funo estiver sendo usada numa expresso em que um valor de
retorno esperado da funo. Caso o valor de retorno da funo no
seja esperado no contexto de uso, os parnteses precisam ser
omitidos e a funo chamada como um procedimento comum (A
exemplo dos procedimentos, os argumentos de uma funo tambm
devem ser separados por vrgulas.) As expresses a seguir contm
chamadas vlidas para funes, porm no so instrues completas
do Visual Basic:
Sin(x) ^ 2 'Obtm o quadrado do seno de x
Chr$(65) Retoma o caractere ASCII correspondente a 65
Format(Now,"hh:mm") Formata a hora atual
Note que, no terceiro exemplo, a expresso contm uma chamada de
funo dentro de outra. O valor retornado pela funo Now passado
como argumento para a funo Format.
Mtodos
Procedimentos e funes fazem parte de linguagens de programao
h muitos anos. Mais recentemente, os projetistas das linguagens de
programao orientadas a objetos introduziram um tipo especial de
procedimentos e funes, chamado mtodo. O Visual Basic inclui
mtodos para cada um de seus objetos, tais como forms ou botes de
comando. Mtodos funcionam da mesma maneira que procedimentos
e funes, porm so componentes de objetos especficos, tais como
propriedades e nomes de campos.
Para chamar um mtodo, deve-se usar o nome do objeto seguido pelo
nome do mtodo (separados por um ponto ".", evidentemente), como,
por exemplo, Debug.Print.
Isso um pouco mais trabalhoso do que apenas usar o nome do
procedimento, porm tem a vantagem de permitir que vrios mtodos
tenham o mesmo nome. Em verses antigas do Visual Basic, o
procedimento Print escrevia uma string de texto no terminal do
usurio. Para enviar a mesma string para uma impressora, era
necessrio usar um procedimento diferente, LPrint. Ambos os
procedimentos operavam similarmente, mas, devido a pequenas
diferenas, eram necessrios dois comandos distintos.
O Visual Basic no tem um procedimento Print. Em vez disso, todos
os objetos para os quais voc puder enviar dados que sero
registrados tm um mtodo chamado Print. Para escrever o texto "Al"
em um form chamado MeuForm, voc poderia criar a instruo:
MeuForm.Print "Al"
Para envi-lo para a impressora, que representada em Visual Basic
por um objeto especial chamado Printer, voc poderia usar este
cdigo
Printer.Print "Al"
A janela Immediate, representada por um objeto chamado Debug,
tambm possui um mtodo Print. Muito bem, como o Visual Basic
oferece mtodo Print para cada um desses objetos, no necessrio
que haja diversos comandos com nomes diferentes. Com menos
comandos para assimilar, seu aprendizado ser facilitado.
Com freqncia, o Visual Basic permite-lhe omitir o nome do objeto ao
usar um mtodo. Caso isso seja feito, o Visual Basic assumir tratar-
se do form atual. Se voc tivesse escrito apenas Print "Al" nos
exemplos acima, a sada seria direcionada para o form que estava
ativo quando essas instrues fossem executadas. Para evitar
ambigidade, voc sempre pode especificar o objeto ao qual pertence
o mtodo desejado, usando a denominao Objeto.Mtodo.
Mtodos podem funcionar como procedimentos ou como funes - isto
, eles podem apenas executar um servio, tal como o mtodo Print,
ou podem retornar um valor. Alguns mtodos - tais como Move, que
altera o posicionamento de um objeto - encontram-se implementados
para quase todos os tipos de objetos. Outros so mais especficos.
Por exemplo, o mtodo Print implementado apenas para alguns
objetos, tais como forms e printer. O prximo captulo explora os
objetos do Visual Basic, seus mtodos e suas propriedades.








Usando as Ferramentas e Forms do
Visual Basic
Objetos do Visual Basic
Uma das maiores vantagens da interface grfica que o usurio pode
interagir com um conjunto padronizado de objetos, tais como janelas,
botes e barras de deslocamento. Aplicativos que usam esses objetos
padres comportam-se de forma padro, simplificando o aprendizado
do aplicativo. Uma parte do trabalho do programador selecionar o
estilo de interao mais apropriado para a situao e escrever os seus
programas de forma que o usurio ache-o intuitivamente.
Em um ambiente GUI (Graphical User Interface - Interface Grfica
com Usurio), o usurio interage com os objetos apresentados na tela,
para dar incio a eventos -abrir uma janela, dar um clique em um
cone, escolher um item de menu, e por meio disto, controlar o
aplicativo. O Visual Basic transforma eventos iniciados pelo usurio
em atividade programada, chamando o procedimento associado ao
evento. A codificao que voc insere no tal procedimento de evento
implementa a resposta apropriada interao com o objeto.
Uma Nota sobre Este Captulo
Este captulo descreve a maioria dos objetos que se encontram
disponveis quando voc constri aplicativos em Visual Basic,
incluindo forms e os objetos criados pelas vrias ferramentas contidas
na caixa de ferramentas. Voc j encontrou alguns destes objetos em
captulos anteriores; aqui, entretanto, ter uma viso mais
aprofundada sobre algumas das propriedades que podem ser
configuradas e como elas afetam os objetos, em eventos gerados
quando o usurio manipula esses objetos em um aplicativo, e sobre
alguns procedimentos e mtodos que podem ser usados com os
objetos. Tambm exploraremos o processo de criao e
desenvolvimento de menus para seus aplicativos.
No final da maioria das sees deste captulo, um projeto simples
demonstra como voc pode usar os objetos do Visual Basic que foram
abordados. Os passos para a criao dos dois primeiros projetos
foram colocados explcita e detalhadamente, entretanto, nos projetos
subseqentes, as recomendaes sero mais genricas - por
exemplo, simplesmente avisando-o para criar um novo projeto, sem
indicar de que forma fazer isso -, assumindo que voc j saiba como
proceder.
Geralmente, ser deciso sua salvar ou no um aplicativo de exemplo.
Na maioria dos casos, isso no necessrio. Porm, se voc sabe
que usar uma ferramenta especfica ou objeto em um futuro prximo,
poder ser til salvar o projeto associado, para poder posteriormente
retornar a ele.
Voc deve saber que as listas de propriedades, procedimentos,
eventos e mtodos apresentados neste captulo no esto completas;
ao contrrio, o objetivo fornecer-lhe as ferramentas suficientes para
escrever programas teis. Achamos que a apresentao da lista
completa neste momento seria um tanto quanto exaustiva. Porm,
caso necessite de informaes adicionais, ela se encontra disponvel
no sistema de ajuda on-line. No CD que contm este manual, voc
pode encontrar uma traduo para o portugus da parte mais utilizada
da ajuda on-line.
Observe que muitos dos objetos que sero descritos aqui tm
propriedades idnticas ou suportam eventos semelhantes. Em tais
casos, a descrio completa das propriedades, procedimentos,
eventos, e assim por diante, no ser repetida para cada objeto.
Iniciaremos com a descrio dos forms; voc encontrar uma
descrio mais ampla nesta mesma seo.
Uma Nota sobre Sintaxe
A maioria das descries de procedimentos e mtodos inclui a sintaxe
das instrues Visual Basic envolvidas. Nesta sintaxe das instrues,
itens mostrados em itlico indicam que o tipo de informao deve ser
fornecido; por exemplo, onde for visto o termo varivel, dever ser
introduzido o nome de uma varivel. Itens tipo romano (texto) indicam
palavras-chave ou caracteres que devem ser colocados na forma em
que esto sendo apresentados. Itens colocados entre colchetes ([ ])
so opcionais, isto , a instruo ser vlida mesmo que os itens
sejam omitidos. Itens entre chaves ({ }) que estejam separados por
barra vertical ( | ) indicam uma escolha; voc deve selecionar um dos
itens dentro das chaves. Se um conjunto de colchetes ou chaves for
seguido por reticncias ( ... ), a seqncia dentro do conjunto de
colchetes ou chaves pode ser repetida. Eis um exemplo:
O nome [muito] {grande | pequeno} [e { espessa | tmida | verde }] ...
Segundo a notao sinttica apresentada, voc pode usar este
exemplo para construir todas as frases abaixo:
A fbrica muito grande.
O submarino pequeno e verde.
A janela muito pequena e espessa e tmida e verde.
Como se pode ver, sintaxe correta no produz necessariamente
instrues com significado; voc ver que muito fcil escrever
programas sintaticamente corretos, mas que no funcionam.
Cuidaremos desse problema no Captulo 7.
Forms
Como voc aprendeu no Captulo 1, forms so pranchetas onde o
aplicativo criado visualmente. Cada form corresponde a uma janela,
quando o aplicativo estiver sendo processado.
Propriedades
Muitas propriedades podem afetar a aparncia e o comportamento de
um form quando ele exibido; aqui, sero apresentadas apenas as
propriedades usadas com maior freqncia. A menos que seja feita
alguma observao em contrrio, as propriedades podem ser
configuradas por meio da janela de propriedades (Properties)
enquanto voc est desenvolvendo o seu aplicativo, ou ento por
meio de instrues executadas durante o processamento do
programa.
AutoRedraw A propriedade AutoRedraw (discutida em detalhe
quando falarmos de grficos) controla como as imagens da tela so
recriadas. Quando voc volta ao form do Visual Basic, aps trabalhar
em outra janela que tenha sido sobreposta, o Visual Basic gerar ou
traar novamente qualquer grfico sobre o form se a propriedade
AutoRedraw estiver configurada para True. Quando essa propriedade
est configurada como False, o Visual Basic deve chamar um
procedimento de evento para efetuar esse trabalho.
BackColor Esta propriedade determina a cor do fundo. Ao selecionar
BackColor a partir da lista de propriedades, na janela de propriedades,
v-se a configurao default &H8000000F&, uma constante
hexadecimal (base 16) que define uma cor Visual Basic. O Capitulo 10
fornece maiores detalhes sobre essas configuraes de cores, porm
no necessrio saber muito a seu respeito para configurar a
propriedade BackColor: basta dar um clique no boto de seta para
baixo direita do valor padro na janela de propriedades e o Visual
Basic exibir as opes de cores, como mostrado aqui:
Figura 5.1
Escolha a cor a partir da palheta, dando um clique no quadrado que
contiver a cor desejada, ou ento d um clique fora da rea da palheta
para fech-la.
BorderStyle Voc pode configurar esta propriedade para um dos seis
valores predefinidos. A propriedade BorderStyle pode ser configurada
apenas em tempo de desenvolvimento. As configuraes no afetam
o form em tempo de desenvolvimento, porm modificaro a exibio
da janela em tempo de execuo, como segue:
Figura 5.2
Caption Esta propriedade contm o texto da barra de ttulo da janela
de form
ControlBox Esta propriedade booleana deve ser configurada para
True se voc desejar uma caixa para o menu de controle a ser exibido
no canto superior esquerdo da janela. Voc pode alterar esta
propriedade apenas em tempo de desenvolvimento. Configurar esta
propriedade para True no tem efeito se a configurao de
BorderStyle for 0 - None.
Enabled Todo objeto Visual Basic tem a propriedade Enabled, que
pode ser configurada para True ou False, ativando-se ou desativando-
se o objeto. Para forms esta propriedade normalmente configurada
como True, porm voc pode pass-la para False, para evitar que
eventos de teclado ou mouse sejam enviados para o form.
FontBold, FontItalic, FontStrikethru, FontUnderline Voc pode
configurar estas propriedades booleanas para True se desejar que o
texto a ser impresso no form aparea em negrito, em itlico, tachado
ou sublinhado (ou ainda com qualquer combinao destas
propriedades). Apenas os caracteres impressos aps a modificao
destas propriedades que sero afetados pela nova configurao.
FontName A esta propriedade assinalado o nome da fonte que ser
usada para impresses no form Quando esta propriedade
modificada, o texto j escrito sobre o form permanece com a fonte
anterior. Por exemplo, se voc executasse a codificao a seguir, a
letra C seria impressa na fonte Courier New, e todas as outras seriam
impressas em Times New Roman:
FontName = "Times New Roman"
Print "AB"

FontName = "Courier New"
Print "C"
FontName = "Times New Roman"
Print "DE"
FontSize Esta propriedade permite-lhe especificar o tamanho (em
pontos) para o texto a ser impresso no form (Ponto a unidade
padro tipogrfica para mensurao de tamanho de tipos; 1 ponto
equivale a 1/72 polegadas.) Como as anteriores, a modificao desta
propriedade afeta apenas os textos que forem impressos aps a
mudana.
ForeColor Esta propriedade define a cor do texto ou grfico. Voc
pode configurar esta propriedade com a palheta de cores, da mesma
forma que a usou para configurar a propriedade BackColor. (Maiores
detalhes no Captulo 11.) Todas as instrues Print escrevem texto
usando esta cor.
Height, Width Estas propriedades determinam a altura e o
comprimento de um form, medidos na unidade chamada twips, ou
seja, 1/20 de um ponto. (Um twip equivalente a 1/1440 polegadas.)
Icon Voc pode configurar esta propriedade para o nome de um
arquivo contendo um cone. Esse cone representar o form, quando
ele for minimizado. Para configurar esta propriedade em tempo de
desenvolvimento, selecione-a a partir da lista de propriedades na
janela de propriedades e ento d um clique no boto de reticncias,
que aparece ao lado da caixa de configuraes para esta propriedade
ao selecion-la. Na caixa de dilogo resultante, escolha o arquivo de
cone. Se desejar configurar esta propriedade em tempo de execuo,
voc dever usar a funo LoadPicture, ou assinalar o valor da
propriedade Icon de algum outro form,
MaxButton, MinButton Voc deve assinalar estas propriedades para
True se desejar que os botes de minimizao e maximizao sejam
exibidos no canto superior direito da janela. Estas duas propriedades
sero ignoradas se a propriedade BorderStyle for configurada para 0 -
None. Observe que esses botes no desaparecem do form, em
tempo de desenvolvimento, mesmo que as propriedades MaxButton e
MinButton tenham sido configuradas para False; o efeito dessa
configurao visvel apenas em tempo de execuo.
Name Esta propriedade define o nome do form, no cdigo do
programa. No pode ser modificada em tempo de execuo.
Picture Voc pode configurar esta propriedade para indicar a imagem
do tipo bitmap que sempre ser exibida na janela. Para configurar esta
propriedade em tempo de desenvolvimento, selecione-a a partir da
lista de propriedades e d um clique no boto de reticncias que
aparece direita da caixa de configuraes na janela de propriedades.
Na caixa de dilogo resultante, escolha o arquivo contendo a imagem
que voc deseja exibir. Para alterar esta propriedade em tempo de
execuo, voc deve usar a funo LoadPicture.
Top, Left Estas propriedades controlam o posicionamento da janela
em relao ao vdeo, definindo as coordenadas do ponto superior
esquerdo da janela, calculadas em twips.
Visible A definio desta propriedade booleana indica quando a janela
form, ou no visvel. Configur-la para False faz com que o form,
torne-se "invisvel".
WindowState Esta propriedade determina quando a janela est
exibida em seu estado normal (valor 0), minimizada como um cone
(valor 1) ou em um estado maximizado (valor 2).
StartUpPosition Com esta propriedade voc define a posio inicial
do formulrio na tela quando do seu carregamento. Pode ser
configurada tanto em tempo de desenvolvimento quanto em execuo.
As seguintes constantes representam os valores vlidos para a
propriedade:
Figura 5.3
Eventos
Click (dar um clique), DlbClick (dar um clique duplo) e Load (carga)
so os eventos mais comuns para um form processar. (O evento
Keypress - pressionamento de tecla - e o processo de arrastar e soltar
(drag-and-drop) sero apresentados nos Captulos 6 e 7.)
Click Quando o usurio d um clique no form, o Visual Basic chama o
procedimento form_Click. Caso o clique seja dado em um objeto que
se encontra no form, o evento Click no ser passado para o form
mesmo que o objeto em questo no processe o evento.
DblClick Este evento recebido quando o usurio d dois cliques em
rpida sucesso no mesmo ponto do form, Este processo na realidade
dispara dois eventos: o evento Click para o primeiro clique do mouse e
o evento DbIClick para o segundo clique.
Load Este evento ocorre automaticamente sempre que o form, for
carregado. Por exemplo, quando o aplicativo iniciado.
Procedimentos e Mtodos
Os mtodos mais interessantes de um form, so grficos. Por serem
um tanto complexos, foi reservado um captulo especial para eles
(Captulo 11). Neste momento, daremos uma pequena introduo a
alguns mtodos (e a uma funo) para despertar o seu interesse.
Cls Este mtodo provoca a limpeza de todos os textos e grficos de
um form. A sintaxe completa a seguinte:
[formName].Cls
LoadPicture Voc pode usar esta funo para configurar a
propriedade Picture de um form. Eis a sua sintaxe:
LoadPicture([fileName])
fileName deve ser uma expresso de string que identifique um arquivo
contendo um cone, um bitmap do Windows ou um metarquivo do
Windows. (Esses nomes de arquivos tm sufixos bem caractersticos:
ICO, BMP e WMF, respectivamente.)
Caso no seja especificado um nome de arquivo, load picture
retornar uma imagem em branco.
Print Este mtodo escreve texto em um form. Use a sintaxe:
[formName].print [[expresso][{;|,}]]...
Cada expresso seguida por ponto e vrgula ou por vrgula. Se for
usado (;) a sada da prxima expresso segue imediatamente o ltimo
caractere escrito. Se for usado (,), a posio de sada no form ser
tabulada para a prxima coluna. (Colunas so definidas a cada 14
caracteres.) Caso a expresso final na instruo Print no termine
com (;) ou(,), a posio do prximo caractere a ser escrito no form
ser configurada para o incio da prxima linha. Eis aqui alguns
exemplos de uso do mtodo Print na janela Immediate:
Figura 5.4
Por mais estranho que possa parecer, o mtodo Print na realidade
um mtodo grfico; voc encontrar maiores informaes a respeito
no Captulo 12.
O Aplicativo Sorriso
Agora, tente construir este projeto simples, que demonstra algumas
configuraes de propriedades, mtodos e procedimentos associados
a forms.
Inicie o aplicativo Paint no Windows 95, desenhe uma imagem simples
e salve-a em seu disco fixo. Eis um exemplo, usando um famoso
cone cultural dos anos 70, que chamaremos de Sorriso.bmp.
Figura 5.5
Retorne ao Visual Basic e crie um novo projeto com a opo New
Project do menu File
Na janela de propriedades, selecione a propriedade Picture da lista de
propriedades e d um clique no boto de reticncias direita do
campo de configuraes. A caixa de dilogo Load Picture aparece:
Figura 5.6
Use a caixa de dilogo para localizar o arquivo grfico criado pelo
Paint e d um clique no boto Abrir. A verso do form agora est
parecida com:
Figura 5.7
Abra a janela de cdigo para Form1, clicando no boto View Code na
janela do Explorador de Projeto ou com um clique duplo no form.
Selecione Form na caixa Object no topo da janela de cdigo e ento
selecione Click na caixa de procedimentos. Introduza o cdigo
necessrio para criar o procedimento Form_Click, como mostrado
abaixo:
Private Sub Form_Click ()
Form1.Print "Tenha um ";
Form1.FontBold = True
Form1.Print "bom";
Form1.FontBold = False
Form1.Print " dia"
End Sub
Selecione o procedimento DlbClick na caixa de procedimentos.
Introduza a linha de cdigo para criar o procedimento Form_DbIClick,
como mostrado a seguir:
Sub Form_DbIClick()
Form1.Cls
End Sub
Execute agora o aplicativo, escolhendo a opo Start do menu Run,
dando um clique no boto Start da barra de ferramentas ou
pressionando F5. D cliques em vrios pontos do form O aplicativo
deveria comportar-se como mostrado aqui:
Figura 5.8
8. Enquanto o aplicativo estiver sendo processado, tente dar um clique
duplo no form Isso far com que seu programa execute o
procedimento Form_DbIClick. Se voc examinar atentamente, ver
que o procedimento Form_Click executado antes que o
procedimento Form_DbIClick limpe o form Alm disso, repare que o
mtodo Cls limpa apenas as informaes que foram adicionadas ao
form e no a imagem de fundo.
O cdigo escrito para esse exemplo muito especfico. Por exemplo,
tanto o mtodo Print quanto a propriedade FontBold fazem referncia
explcita ao form Form1, Em certas ocasies, essa especificidade
pode causar problemas. Para ilustrar, deixe o aplicativo (pressionando
Alt-F4 ou dando um clique no boto End da barra de ferramentas) e
retorne ao modo de desenvolvimento. Agora, altere a propriedade
Name do form para Sorriso. Em seguida, tente executar o programa
novamente. O Visual Basic exibir a mensagem de erro mostrada
na Figura 5.9.
O Visual Basic est reclamando que no conhece o objeto chamado
de Form1, Realmente, o seu programa no contm tal objeto; o nico
form agora se chama Sorriso.
Figura 5.9 A mensagem de erro objeto no definido
A modificao dos nomes dos forms pode demandar um tempo
considervel, principalmente quando se tornar necessrio incorporar
pedaos de um programa em outro. O Visual Basic oferece um
mecanismo que permite evitar esse tipo de problema. Mtodos e
propriedades, tais como variveis, tambm tm escopo. Caso o nome
de propriedades ou mtodos sejam usados sem referncia explcita ao
objeto o que pertencem, o Visual Basic usar o contexto da execuo
presente para determinar qual o objeto envolvido. Se voc eliminar
todas as referncia ao Form1, o cdigo do aplicativo Sorriso ficar
assim:
Sub Form_Click ()
Print "Tenha um ";
FontBold = True
Print "bom";
FontBold = False
Print " dia"
End Sub
Sub Form_DbIClick ()
CIS
End Sub
Uma vez que os procedimentos Form_Click e Form_DbIClick sempre
so executados levando-se em considerao o contexto do form
(independentemente do nome do Form), os mtodos Print e CIs e a
propriedade FontBold devem estar dentro do escopo do form atual.
Assim, o cdigo que voc cria ser mais genrico.
(Alm disso, haver menos digitao a ser feita.)
Caixas de Imagem e Imagens
Os controles de caixa de imagem e imagens permitem-lhe colocar
informaes grficas em posies especificas do form As ferramentas
Caixa de Imagem e Imagens da caixa de ferramentas so mostradas
nas Figuras 5.10 e 5.11. A caixa de imagem o controle mais flexvel,
portanto seu uso demanda mais memria e tempo de processamento.
As caixas de imagem so mais indicadas para o tratamento de
ambientes dinmicos - por exemplo, quando voc est traando
grficos diretamente sobre o vdeo, enquanto o programa est
executando ou deslocando um cone pela tela para gerar o efeito de
animao. (Mtodos grficos, que lhe permitem traar linhas e
imprimir textos, encontram-se descritos no Captulo 11.) Quando se
tratar de situaes estticas, mais recomendvel o uso de objetos
de imagens - isto , quando cones ou imagens bitmap que voc criou
e colocou sobre a tela no so modificados.
Figura 5.10 A ferramenta Caixa de Imagem.
Figura 5.11 A ferramenta Imagem.
Propriedades
Os controles de caixa de imagem e imagem tm as propriedades
Enabled, Height, Left, Name, Picture, Top, Visible e Width. A maioria
dessas propriedades comporta-se exatamente como descrito na seo
precedente sobre forms exceto pelo fato de as coordenadas para as
propriedades Height, Left, Top e Width serem medidas com relao
localizao do objeto dentro do form e no em termos de sua posio
absoluta na tela. (Isso vlido para todos os controles criados a partir
da caixa de ferramentas.) A propriedade Picture pode ser configurada
para exibir uma imagem bitmap ou um cone. Em tempo de
desenvolvimento, use a janela de propriedades e a caixa de dilogo
Load Picture (como ser usada no projeto simples que se segue); em
tempo de execuo, necessrio usar a funo LoadPicture.
Caixas de imagem, que apresentam comportamento semelhante a
pequenos forms colocados dentro do form principal, possuem algumas
propriedades a mais que o controle de imagem: AutoRedraw,
FontBold, FontItalic, FontName, FontSize, FontUnderline. Essas
propriedades comportam-se do mesmo modo que para o form.
Controles de imagens tm uma propriedade que as caixas de imagem
no tm: a propriedade Stretch. Por default, essa propriedade
configurada para False, fazendo com que o controle de imagens se
redimensione para acomodar a imagem que ele contm. Quando a
propriedade Stretch for True, o redimensionamento feito sobre a
imagem, de forma a caber dentro do controle.
Os controles caixas de imagem e imagens ainda diferem em um
aspecto. A exibio de um form. composta por trs camadas,
conforme ilustrado pela Figura 5.12. Toda e qualquer informao
exibida diretamente sobre o form. (por exemplo, mediante impresso
ou desenho com mtodos grficos) ser colocada na camada inferior.
Informaes geradas a partir dos trs controles grficos (imagens,
forma e controle de linhas) aparecem na camada intermediria e todos
os outros objetos so exibidos na camada superior. Em funo disso,
texto impresso no form. poder ser sobreposto por uma caixa de
imagem.
Figura 5.12 As camadas de exibio de um form.
Eventos
A exemplo dos forms os controles caixas de imagem e imagens
tambm podem receber os eventos mais simples que ocorrem com
maior freqncia: Click e DbIClick.
Mtodos e Procedimentos
A funo LoadPicture pode ser chamada para configurar a
propriedade Picture de uma caixa de imagem ou do controle de
imagens. Caixas de imagens suportam tanto os mtodos CIs e Print
quanto os mtodos grficos descritos no Captulo 11.
A Palheta de Smbolos
Este projeto simples faz com que voc use uma srie de imagens para
criar uma palheta de cones semelhante caixa de ferramentas do
Visual Basic. Este programa deveria funcionar da mesma forma, seja
com caixas de imagem, seja com controles de imagens; lembre-se, no
entanto, de que as caixas de imagens so menos eficientes para o
tratamento de situaes estticas.
Crie um novo projeto em Visual Basic, com a opo New Project do
menu File.
Configure as propriedades do form. conforme mostrado a seguir. (A
notao [vazio] indica que a configurao dever ser uma string vazia.)
Propriedade Configurao
BorderStyle 1 - Fixed Single
Caption [vazio]
MaxButton False
MinButton False
Name Simbolos
D um clique na ferramenta Imagem da caixa de ferramentas e arraste
o ponteiro do mouse no form para criar um pequeno controle de
imagem no canto superior esquerdo do form:
Figura 5.13
Crie mais trs controles de imagem do mesmo tamanho, dispondo-os
dois a dois. Para realizar essa tarefa com mais facilidade, selecione o
primeiro controle imagem criado e d um clique no boto de Copiar na
barra de ferramentas; clique ento no boto de Colar; responda no
caixa de dilogo que perguntar se voc quer criar uma matriz de
controles; uma cpia do controle ser colada sobre o primeiro; para
movimentar com preciso o novo controle, mantenha a tecla Ctrl
pressionada e use as teclas de seta para moviment-lo na direo
desejada. Com o mouse redimensione o contorno da janela do form
para acomodar apenas os quatro controles de imagem. Agora, o seu
form deve estar parecido com:
Figura 5.14
D um clique no controle de imagem superior esquerdo do form
(Image1) para selecion-lo. Na janela de propriedades, selecione a
propriedade Picture para Image1, a partir da lista de propriedades. A
seguir, d um clique no boto de reticncias, direita da propriedade
selecionada, para abrir a caixa de dilogo Load Picture (mostrada
anteriormente). Na caixa de dilogo, configure o tipo de arquivo para
exibir arquivos de cones (com extenso ICO). Voc poder encontrar
os quatro arquivos de cone que usaremos neste projeto na pasta
...\PacoteVB\Icones\Misc\ no primeiro cd deste produto. Selecione o
arquivo CLUB.ICO e clique em abrir na caixa de dilogo LoadPicture.
Ao escolher esse arquivo, o cone que ele contm aparecer no
controle de imagem selecionado:
Figura 5.15
D um clique duplo na imagem e defina o seguinte procedimento na
janela de cdigo:
Private Sub lmage1_Click ()
Debug.Print "Selecionado Paus"
End Sub
Repita esse mesmo processo para os outros trs controles de
imagem, carregando os arquivos DIAMOND.ICO, HEART.ICO e
SPADE.ICO e definindo os trs procedimentos Click como mostrado a
seguir:
Private Sub Image2_Click ()
Debug.Print "Selecionado Ouro"
End Sub
Private Sub Image3_Click ()
Debug.Print "Selecionado Copas"
End Sub
Private Sub Image4_Click ()
Debug.Print "Selecionado Espada"
End Sub
8. Para separar visualmente os cones, voc pode colocar bordas ao
seu redor. D um clique na imagem no canto superior esquerdo para
selecion-la e ento, mantendo a tecla Ctrl pressionada, d um clique
nas outras trs imagens para selecionar as quatro ao mesmo tempo.
Selecione a propriedade BorderStyle na lista de propriedades da
janela de propriedades e configure-a para 1 - Fixed Single.
Quando voc executar o aplicativo (pressionando F5), o seu form ser
a palheta "Smbolos". Dando cliques em alguns dos cones, voc
dever ver um resultado semelhante ao mostrado naFigura 5.16.
Figura 5.16 Usando a palheta de smbolos.
Ao incluir uma codificao semelhante em um aplicativo maior, voc
pode criar uma palheta de cones apropriada ao programa. A caixa de
ferramentas do Visual Basic, que usada em tempo de
desenvolvimento, um exemplo desse tipo de palheta.
Dica: Se voc tem o Visual C++ instalado no seu sistema, pode
utilizar-se do editor de cones que o acompanha. Entre no Visual C++
e escolha a opo New do menu File. Entre as opes apresentadas
na janela New escolha a ficha File. Ser exibida uma relao de tipos
de arquivos dentre os quais est a opo "Icon File". Ao selecionar
esta opo, ser aberto o editor de cones para que voc crie um novo
cone para a sua aplicao. Para informar-se sobre como utiliz-lo
procure mais informaes no help do prprio Visual C++.
Rtulos
Um rtulo oferece uma rea na qual voc pode apresentar informao
textual que no poder ser editada pelo usurio. O contedo
configurado pela propriedade Caption do rtulo. Voc no pode
imprimir ou desenhar um rtulo. Os rtulos devem ser criados com a
ferramenta Rtulo da caixa de ferramentas do Visual Basic, mostrada
na Figura 5.17.
Figura 5.17 A ferramenta Rtulo.
Propriedades
Os rtulos tm as propriedades FontBold, FontItalic, FontName,
FontSize, FontUnderline, Height, Left, Name, Top, Visible e Width, que
operam de forma padro. Algumas propriedades adicionais so
apresentadas a seguir:
Alignment Esta propriedade determina o alinhamento do texto
(propriedade Caption) em relao ao rtulo. Por default, a propriedade
Alignment configurada para 0, o que provoca alinhamento
esquerda. Voc pode ainda configurar o alinhamento para 1 -Right
Justify (justificado direita) ou 2 - Center (centralizado).
AutoSize Se esta propriedade for True, o rtulo automaticamente
redimensionado para conter o texto especificado pela propriedade
Caption. Se for False, o rtulo manter o tamanho definido em tempo
de desenvolvimento; nesse caso, se o texto for muito longo, ele ser
truncado.
BorderStyle Esta propriedade pode ser 0 (default) para o rtulo no
conter borda ou 1 para ter borda simples.
Caption A propriedade Caption contm o texto a ser exibido no campo
de rtulo ou numa rea da tela.
Enabled Esta propriedade normalmente configurada como True.
Porm, voc pode pass-la para False, para dar um tom acinzentado
ao texto, desabilitando qualquer evento associado ao mouse
Eventos
Os objetos do tipo rtulo recebem os eventos Click e DlbClick da
mesma forma que caixas de imagem, controles de imagem e forms.
Procedimentos e Mtodos
Objetos de rtulos so adequados para exibir pequenos blocos de
texto. Uma vez que os textos que sero exibidos so definidos
simplesmente pela configurao da propriedade Caption, nenhum dos
mtodos associados com rtulos de grande utilidade ou necessrio
para programadores iniciantes.
Modificando o Aplicativo Cronmetro
Faamos mais uma modificao no programa Cronmetro criado no
Captulo 1. Nesse programa, voc usou caixas de texto para exibir a
sada do aplicativo. Como voc deve lembrar-se, caixas de texto
podem ser modificadas pelo usurio. Para ilustrar isso, carregue e
execute o aplicativo. Depois de parar o cronmetro, selecione o texto
na caixa Hora Inicial e digite xyz - muito estranho, no?
Evidentemente, um tanto difcil saber por que o usurio desejaria
fazer isso, no entanto, comum programadores gastarem longas
noites solitrias imaginando por que os usurios fazem o que fazem.
Seja como for, para evitar esse tipo de problema no seu aplicativo,
uma soluo usar rtulos em vez de caixas de texto.
Termine a execuo do aplicativo e retorne ao modo de
desenvolvimento. Elimine as trs caixas de texto, dando um clique em
cada uma para selecion-las, e ento pressione a tecla DeI ou escolha
a opo Delete do menu Edit. No lugar das caixas de texto, desenhe
trs rtulos.
Configure a propriedade BorderStyle de cada rtulo para 1 - Fixed
Single, para criar uma linha de borda simples. Remova qualquer texto
que aparea no rea de valor para a propriedade Caption, deixando
essa propriedade configurada como uma string vazia para cada um
dos rtulos.
Configure a propriedade Name do rtulo superior para IblInicial. Em
seguida, configure a propriedade Name do rtulo intermedirio para
IbIFinal e a propriedade Name do rtulo inferior para IblDecorrido.
Nota: A abreviatura lbl provm da palavra Label, que em ingls
significa rtulo
Voc deve ainda modificar a codificao para os botes Iniciar e
Parar. A verso anterior do programa exibia seus resultados,
assinalando a propriedade Text das caixas de texto. No entanto, no
caso dos rtulos, necessrio usar a propriedade Caption em vez da
propriedade Text. E, naturalmente, voc substituiu as caixas de texto
por rtulos. preciso que voc edite os procedimentos Click dos dois
botes, para que todas as referncias propriedade Text das caixas
de texto sejam corrigidas. O seu novo cdigo deveria parecer-se com:
Private Sub btnlniciar_Click ()
TempoInicial = Now
IblInicial.Caption Format(TempoInicial, "hh:mm:ss")
IbIFinal.Caption = ""
lblDecorrido.Caption = ""
btnParar.Enabled = True
btnIniciar.Enabled = False
End Sub
Private Sub btnParar_Click ()
TempoFinal = Now
TempoDecorrido = TempoFinal - TempoInicial
IbIFinal.Caption = Format(TempoFinal, "hh:mm:ss")
lblDecorrido.Caption = Format(TempoDecorrido, "hh:mm:ss")
btnParar.Enabled = False
btnIniciar.Enabled = True
End Sub
Execute o aplicativo novamente para testar as suas modificaes. A
aparncia deveria ser exatamente igual de quando voc executou o
aplicativo no Captulo 1, porm agora no mais possvel selecionar e
modificar o texto exibido na tela.
Caixas de Texto
At agora, voc trabalhou com caixas de texto, usando a ferramenta
Caixa de Texto mostrada na Figura 5.18. A sua simples colocao no
form cria uma rea na tela na qual o usurio pode introduzir texto.
Figura 5.18 A ferramenta Caixa de Texto.
Propriedades
As caixas de texto tm as propriedades padres BorderStyle, Enabled,
FontBold, FontItalic, FontName, FontSize, FontUnderline, Height, Left,
Name, Top, Visible e Width, e as seguintes propriedades:
Locked Voc pode rolar o texto e selecion-lo, mas no pode edit-lo.
O programa ainda pode modificar o texto atribuindo valores
propriedade Text.
MaxLength Esta propriedade normalmente configurada para 0 (por
default), indicando que a caixa de texto dever aceitar tantos
caracteres quantos o usurio digitar. Caso esta propriedade seja
configurada para um valor diferente de zero, o Visual Basic restringir
a entrada do usurio ao nmero de caracteres especificado.
MultLine Na maioria das vezes, voc desejar configurar esta
propriedade de forma que o usurio introduza apenas uma linha de
texto. Caso esta propriedade seja configurada para True, o usurio
poder pressionar a tecla Enter, fazendo com que o texto continue na
prxima linha.
PasswordChar Esta propriedade controla quando a caixa de texto
um campo de senha. Ao introduzir um texto num campo de senha, os
caracteres mostrados so diferentes dos caracteres digitados. Por
default, esta propriedade configurada para uma string vazia,
indicando que o usurio ver os caracteres que introduziu. Caso a
propriedade seja configurada para um caractere, tal como asterisco
(*), ser exibido um asterisco a cada caractere introduzido pelo
usurio. Observe que o contedo real da caixa de texto configurado
para o texto digitado pelo usurio; apenas a exibio afetada.
ScrollBars Voc pode configurar esta propriedade para 0 (sem barras
de deslocamento na caixa de texto), 1 (apenas barra de deslocamento
horizontal), 2 (barra de deslocamento vertical) e 3 (barras de
deslocamento horizontal e vertical).
SelLength Esta propriedade indica a quantidade de caracteres
atualmente selecionados. O seu valor se modifica medida que o
usurio seleciona texto na caixa de texto. Voc tambm pode alterar o
texto selecionado via programa, configurando essa propriedade para
um valor inteiro. Se SelLength for 0, no h nenhum caractere
selecionado. Essa propriedade, junto com SeIStart e SeIText, apenas
pode ser acessada em tempo de execuo. (No pode ser
configurada em tempo de desenvolvimento.)
SeIStart O valor armazenado nesta propriedade indica-lhe a posio
do texto onde se inicia a seleo atual. O valor 0 indica que a seleo
(ou ponto de insero) inicia-se antes do primeiro caractere, o valor 1
indica que a seleo comea antes do segundo caractere, e assim por
diante. O valor desta propriedade pode ser alterado com instrues de
assinalamento.
SeIText Nesta propriedade armazenada a string de texto atualmente
selecionada. Se no houver qualquer seleo, esta propriedade
contm uma string vazia. Caso venha a alterar o contedo desta
propriedade, voc far com que o texto selecionado anteriormente
seja substitudo pelo novo texto. Por exemplo, se uma caixa de texto
contiver a linha "Francamente, meu claro, eu no me importo com isto"
e for selecionada a palavra "claro", voc pode corrigir a frase,
executando a instruo Text1.SeIText = "caro". Observe que isso
tambm modificar o valor da propriedade SelLength. Por outro lado,
como a seleo inicia-se na mesma posio, a propriedade SelStart
no ser alterada.
Text O programa l esta propriedade para ver o que o usurio digitou.
O programa tambm pode alterar a propriedade Text para modificar o
texto que est sendo exibido.
Eventos
Caixas de texto podem monitorar cada tecla pressionada pelo usurio.
Veremos mais a respeito de eventos de teclado no Captulo 6.
Change Este evento ser sinalizado quando a propriedade Text de
uma caixa de texto vier a ser modificada, seja pelo usurio, seja pelo
prprio programa, que pode assinalar um novo valor para a
propriedade Text. Observe que, quando o usurio digitar a palavra
Al, este evento ser disparado trs vezes, uma para cada letra
digitada.
LostFocus Este evento sinalizado quando o usurio pressiona a
tecla Tab para se mover para outro lugar, ou usa o mouse para
selecionar algum outro objeto no form. Se voc quiser examinar o
contedo da propriedade Text, normalmente ser mais eficiente faz-
lo como parte do procedimento de evento LostFocus. O procedimento
de evento Change, como se viu, acionado a cada letra digitada.
Procedimentos e Mtodos
O mtodo mais til associado s caixas de texto SetFocus, que
coloca o cursor em uma caixa de texto especfica. Quando voc cria
um form. com mltiplas caixas de texto, pode usar este mtodo para
direcionar a ateno do usurio para a caixa de texto mais importante.
A sintaxe simples:
[object.]SetFocus

Novidades do Visual Basic 6.0

O Aplicativo NotasEdit
At agora, voc usou caixas de texto para textos simples de uma
nica linha; vejamos agora como as caixas de texto se comportam
com linhas mltiplas, implementando um pequeno bloco de notas que
permita cortar, colar e fazer edies simples.
Inicie abrindo um novo projeto. Configure as propriedades Caption e
Name do form. para NotasEdit. Crie uma caixa de texto no form. e
configure as suas propriedades como segue:
Propriedade Configurao
MultLine True
Name TxtBox
ScrollBars 3 - Both
Text [vazio]
Aps isso, o seu form. NotasEdit dever parecer-se com:
Figura 5.19
A caixa de texto trabalhar com o texto introduzido e far edio sem
que seja necessrio escrever alguma instruo. Quando voc
processar o aplicativo, poder introduzir texto, edit-lo, cort-lo, copi-
lo e col-lo com essas teclas de atalho padronizadas pelo Windows:
Ctrl-X, Ctrl-C e Ctrl-V.
Para tornar esse aplicativo mais profissional, voc poder fazer com
que a caixa de texto ocupe inteiramente a janela do form. Para tanto,
edite o procedimento ReSize do form. como abaixo:
Private Sub Form_ReSize()
TxtBox.Top = 0
TxtBox.Left = 0
TxtBox.Width = ScaleWidth
TxtBox.Height = ScaleHeight
End Sub
Esse procedimento ser executado toda vez que o form for
redimensionado, inclusive na primeira vez em que for exibido.
Configurando as propriedades Top e Left da caixa de texto para 0,
voc assegura que o seu canto superior esquerdo seja colocado no
topo do form. como mostrado na Figura 5.20. As propriedades Width
e Height da caixa de texto foram configuradas para ficar de acordo
com as propriedades ScaleWidth e ScaleHeight do form. (as
dimenses totais da rea de exibio do form. Observe que voc
poderia ter escrito essas duas linhas como: TxtBox.Width =
NotasEdit.ScaleWidth e TxtBox.Height = NotasEdit.ScaleHeight.
Porm, como as instrues sempre sero executadas no contexto do
form. no necessrio fazer referncia ao nome do form. Alm disso,
se o nome do form viesse a ser modificado posteriormente, seria
preciso alterar a codificao.
Figura 5.20 Processando o aplicativo NotasEdit redimensionado.
Botes de Comando, Caixas de Checagem e Botes de Opo
Estes trs objetos do Visual Basic, sob o ponto de vista dos
programadores, so muito semelhantes. No entanto, para o usurio
final, eles diferem visualmente, prestando-se a propsitos distintos.
Botes de comando normalmente disparam uma ao (isto , um
comando a ser executado) quando recebem um clique, enquanto
caixas de checagem e botes de opes indicam estados e permitem
ao usurio alterar o estado. O usurio d cliques nas caixas de
checagem para selecionar ou cancelar um certo recurso; quando um
sinal aparece na caixa de checagem, a caracterstica selecionada,
ou habilitada. Cada caixa de checagem opera independentemente.
Ao contrrio, os botes de opo aparecem em conjunto e permitem
ao usurio escolher uma opo do conjunto. Quando um boto de
opo de um conjunto acionado, todos os outros so desabilitados.
(Botes de opo so algumas vezes chamados de botes de rdio.)
As ferramentas da caixa de ferramentas usadas para criar esses trs
tipos de objetos do Visual Basic so mostradas nas Figuras
5.21, 5.22 e 5.23.
Figura 5.21 A ferramenta Boto de Comando.
Figura 5.22 A ferramenta Caixa de Checagem.
Figura 5.23 A ferramenta Boto de Opo.
Propriedades
Botes de comando, caixas de checagem e botes de opo, dentre
outros, possuem as propriedades: Caption, Enabled, FontBold,
FontItalic, FontName, FontSize, FontUnderline, Height, Left, Top,
Visible e Width. Adicionalmente, voc poder achar til as seguintes
propriedades:
Cancel Esta propriedade suportada apenas por botes de comando.
Quando a propriedade Cancel de um boto de comando definida
para True, o pressionamento da tecla Esc passa a ter o mesmo efeito
de dar um clique no boto (como o boto Cancel em uma caixa de
dilogo). Apenas um boto de comando em um form pode ter sua
propriedade Cancel definida para True.
Default Esta propriedade suportada apenas por botes de comando.
Quando esta propriedade definida para True, o pressionamento da
tecla Enter passa a ter o mesmo efeito de dar um clique no boto OK
(como o boto OK em uma caixa de dilogo). Apenas um dos botes
de comando de um form pode ter a sua propriedade Default definida
para True.
Value Esta propriedade indica o estado de uma caixa de checagem ou
boto de opo. A propriedade Value de um boto de opo pode ser
True ou False. Quando definida para True, o boto est acionado, isto
, o centro do boto se encontra em destaque. A propriedade Value
de uma caixa de checagem pode ser assinalada para 0, 1 ou 2. O
valor 0 indica que a caixa de checagem no est assinalada; 1 indica
que a caixa est assinalada e 2, que a caixa est "desabilitada".
Eventos
Ainda que haja uma forte tendncia em usar o procedimento de
evento Click apenas para botes de comando, todos os trs tipos de
objetos recebem o evento Click. Os botes de opo e as caixas de
checagem automaticamente exibem o seu estado quando dado um
clique sobre eles; geralmente, no necessria nenhuma codificao.
Procedimentos e Mtodos
Voc no pode imprimir ou desenhar sobre botes de comando,
caixas de verificao ou botes de opo. Nenhum dos mtodos
apresentados at agora so aplicveis a esses trs tipos de objetos.
O Aplicativo Jogo
Este projeto contm a aparncia de um videogame. Inicie criando um
projeto novo. Crie trs botes de comando, quatro botes de opo e
duas caixas de verificao, dispondo-os da seguinte forma:
Figura 5.24
Configure as propriedades desses objetos como mostrado na Figura
5.25. Aps isso, o seu form dever parecer-se com o mostrado
na Figura 5.26.
Figura 5.25 Configurao de propriedades para o aplicativo Jogo.
Figura 5.26 A interface do Jogo.
Finalmente, edite o procedimento Click para os botes Command2 e
Command3, incluindo este cdigo:
Private Sub Command2_Click ( )
MsgBox "Fim de Jogo"
End Sub
Private Sub Command3_Click ( )
End
End Sub
Processe o programa algumas vezes para ver como ele se comporta.
Tente pressionar as teclas Enter e Esc para ver que comandos eles
executam.
Se quiser exibir o estado dos botes de opo e das caixas de
checagem na janela Immediate, voc pode alterar o procedimento
Click do Command2 como mostrado aqui:
Private Sub Command2_Click ( )
Debug.Print Option1.Value
Debug.Print Option2.Value
Debug.Print Option3.Value
Debug.Print Option4.Value
Debug.Print Check1.Value
Debug.Print Check2.Value
End Sub
Molduras
Molduras existem para permitir a criao de agrupamentos de objetos.
No caso de botes de opo, as molduras tambm afetam o seu
comportamento, como o projeto de exemplo demonstrar. Para outros
objetos, as molduras podem ser usadas como uma separao visual
ou como uma caracterstica genrica de habilitao/desabilitao.
Para colocar uma moldura em um form, use a ferramenta Moldura da
caixa de ferramentas do Visual Basic, mostrada na Figura 5.27.
Figura 5.27 A ferramenta Moldura.
Propriedades
A propriedade Name de uma moldura usada para identific-la nas
instrues de seu programa, e a propriedade Caption define o texto
que visvel, como parte da moldura. Molduras tm ainda as
propriedades Enabled, FontBold, Fontltalic, FontName, FontSize,
FontUnderline, Height, Left, Top, Visible e Width.
A propriedade Enabled, j abordada anteriormente, comporta-se de
forma um pouco diferente para as molduras. Essa propriedade
normalmente assinalada para True; quando assinalada para False,
o texto de titulo da moldura fica acinzentado e todos os objetos dentro
da moldura so desabilitados, incluindo caixas de texto, controles de
botes e outros objetos.
Eventos
As molduras no respondem a eventos de mouse ou de entrada de
dados feitos pelo usurio.
Procedimentos e Mtodos
Voc no pode imprimir ou desenhar sobre molduras, nem pode
associ-las a grficos.
Modificando o Aplicativo Jogo
Como as molduras no so intrinsecamente interessantes, em vez de
criar um exemplo especfico, vamos adaptar o projeto Jogo usado
anteriormente.
Na janela de form do aplicativo, remova os botes de opo
chamados 3 Jogadores e 4 Jogadores. Em seu lugar, desenhe uma
moldura.:
Coloque dois novos botes de opo dentro da moldura. Observe que
voc deve tra-los dentro da moldura; assim sendo, no pode dar um
clique duplo na ferramenta Boto de Opo para criar os botes e
depois arrast-los para dentro da moldura.
Configure a propriedade Caption da moldura para Modo.
Configure a propriedade Value do boto Option3 para True.
Configure a propriedade Caption do boto Option3 para Iniciantes, e a
propriedade Caption do boto Option4 para Experientes.
O resultado dever parecer-se com o mostrado na Figura 5.28.
Quando voc processar o aplicativo, note que os botes de opo
dentro da moldura operam independentemente dos que esto fora
dela.
Figura 5.28 A interface remodelada do Jogo.
Caixas de Lista
As caixas de lista permitem que voc d ao usurio uma escolha de
opes. A caixa de lista exibe as opes disponveis, e o usurio
seleciona um item ou entrada da lista, dando um clique nele. O Visual
Basic adicionar a barra de deslocamento caixa de lista, se a
quantidade de entradas que sero exibidas no couber na caixa de
lista. Para que uma caixa de lista possa trabalhar corretamente,
preciso que contenha pelo menos trs linhas. Para adicionar uma
caixa de lista a um form deve-se usar a ferramenta Caixa de Lista da
caixa de ferramentas, mostrada na Figura 5.29. (Caixas de lista drop-
down, como a que aparece na caixa de objetos da janela de
propriedades quando se pressiona o boto de seta para baixo, so
variaes de caixas combinadas e sero discutidas na prxima
seo.)
Figura 5.29 A ferramenta Caixa de Lista.
O contedo de uma caixa de lista pode ser definido em tempo de
desenvolvimento usando-se a propriedade List. Em tempo de
execuo preciso usar o mtodo AddItem para introduzir os itens na
lista. Normalmente, mais prtico inicializar uma caixa de lista no
procedimento de evento Load do form que a contm.
Propriedades
As propriedades usuais suportadas pelas caixas de lista so: Enabled,
FontBold, FontItalic, FontName, FontSize, FontUnderline, Height, Left,
Top, Visible e Width. Algumas propriedades especiais das caixas de
lista so as seguintes:
Columns Quando esta propriedade configurada para 0 (default),
todos os itens so exibidos em uma nica coluna. Caso esta
propriedade seja configurada para um valor maior ou igual a 1, os
itens da lista sero dispostos em mltiplas colunas; o valor desta
propriedade indica quantas colunas sero visveis ao mesmo tempo. A
barra de deslocamento horizontal ser adicionada lista, quando
necessrio.
List Esta propriedade contm uma matriz com todos os itens
armazenados na lista. (Matrizes sero discutidas no Captulo 6.) Pode-
se acessar os itens individuais de uma caixa de lista com a sintaxe:
objeto.List(ndice)
ListCount A propriedade ListCount, que no pode ser modificada
diretamente, contm a quantidade de itens da caixa de lista.
ListIndex A configurao desta propriedade indica o ndice do ltimo
item selecionado. O valor de ndice para o primeiro item da caixa de
lista 0, o valor de ndice para o prximo item 1, e assim por diante.
Caso no haja nenhum item selecionado, Listlndex contm o valor -1.
Caso o valor desta propriedade seja modificado por uma instruo do
programa, o mecanismo de destaque da lista mudar para refletir a
nova seleo. Para ter acesso ao texto do item selecionado, deve-se
usar a propriedade Text.
MultiSelect Esta propriedade controla quantos itens podem ser
selecionados na caixa de lista. Caso esta propriedade seja configura
da para 0 -None, o usurio poder selecionar apenas um item de cada
vez. (Em outras palavras, no permitida seleo mltipla.) Se for
carregado o valor 1 - Simple, o usurio poder selecionar mais de um
item. Quando MultiSelect for configurada para 2 - Extended, o usurio
poder selecionar uma faixa de itens, dando um clique no primeiro
item e, com a tecla Shift pressionada, selecionando o ltimo item da
faixa. O usurio tambm pode manter a tecla CtrI pressionada e dar
um clique para selecionar ou anular a seleo de cada item
individualmente. Observe que, ainda que haja mltiplos itens
selecionados, as propriedades ListIndex e Text referem-se apenas
seleo mais recente. Voc deve examinar cada elemento da
propriedade Selected para determinar quais itens foram selecionados.
Selected A propriedade Selected uma matriz que contm um
elemento para cada item da caixa de lista. O elemento correspondente
a um item configurado para True, para indicar que o item est
selecionado. Para verificar o estado de um determinado item,
preciso usar a seguinte sintaxe:
objeto.Selected(ndice)
Sorted Se voc deseja que o Visual Basic mantenha os itens
classificados em ordem alfabtica, deve configurar esta propriedade
para True. Quando esta propriedade for False, os itens sero exibidos
na ordem em que foram adicionados lista.
Text Esta propriedade, que no pode ser modificada diretamente,
contm o texto do ltimo item selecionado.
Eventos
As caixas de lista recebem os eventos Click e DblClick. Normalmente,
voc deve evitar a codificao do procedimento Click, pois o usurio
pode selecionar um item e ento desistir de sua seleo. Em vez
disso, seu programa deve ler a propriedade Text quando o usurio der
um clique em um boto de comando ou quando ocorrer o evento
DblClick.
Procedimentos e Mtodos
Os mtodos usados com maior freqncia para as caixas de lista
incluem: AddItem, Clear e RemoveItem. Esses trs mtodos permitem
que voc modifique o contedo de uma caixa de lista em tempo de
execuo.
AddItem Este mtodo permite-lhe inserir uma linha de texto (um item)
em uma caixa de lista. Voc especifica o texto a ser includo e,
opcionalmente, o ndice do item a inserir. Se voc no especificar um
ndice, o Visual Basic incluir o item aps todos os itens j existentes.
Caso a propriedade Sorted esteja configurada para True, no
especifique um valor para ndice; o Visual Basic incluir o item em
ordem alfabtica. Aqui est a sintaxe para o mtodo AddItem:
objeto.AddItem text[, ndice]
Clear Este mtodo remove todos os itens de uma caixa de lista. A sua
sintaxe bem simples:
objeto.Clear
RemoveItem O mtodo RemoveItem permite que voc remova um
item de uma caixa de lista. Voc deve especificar o ndice do item a
ser removido, usando a seguinte sintaxe:
objeto. RemoveItem ndice
O Aplicativo Queijo
O objetivo deste aplicativo simples transferir itens entre duas caixas
de lista. Os itens de uma caixa de lista estaro classificados em ordem
alfabtica; enquanto os itens da outra aparecero na ordem em que
forem selecionados.
Inicie criando um novo projeto. Desenhe no form duas caixas de lista,
como mostrado na Figura 5.30, e configure a propriedade Sorted da
lista direita (List2) para True. O restante da codificao necessria
para o aplicativo mostrado na Figura 5.31. O procedimento
Form_Load inicializa a caixa de lista. Os procedimentos List1_DblClick
e List2_DblClick so basicamente idnticos, exceto pelo fato de
fazerem a transferncia de itens de lista em direes opostas.
Figura 5.30 O projeto do form do aplicativo Queijo.
Figura 5.31 A codificao para o aplicativo, Queijo.
Quando for dado um clique duplo em um item de uma das caixas de
lista, ele ser includo na outra caixa, sendo removido da caixa onde
estava. A caixa de lista (List2) continua a classificar os seus itens
alfabeticamente.
Caixas Combinadas
Caixas combinadas so criadas com a ferramenta Caixa Combinada
contida na caixa de ferramentas, mostrada na Figura 5.32. A caixa
combinada recebe esse nome porque ela combina uma caixa de texto
com uma caixa de lista, formando um nico controle. Entretanto, ao
contrrio de uma caixa de lista, ela no suporta mltiplas colunas.
Voc pode optar por um dos trs tipos de comportamento para uma
caixa combinada por meio de sua propriedade Style.
Figura 5.32 A ferramenta Caixa Combinada.
Propriedades
Adicionalmente s propriedades usuais, as caixas combinadas tm
duas propriedades interessantes: Style e Text.
Style Esta propriedade determina o tipo de caixa combinada e como
ela se comporta, podendo assumir os valores 0, 1 e 2.
Quando a propriedade 2, a caixa combinada transforma-se em uma
caixa de lista drop-down. Inicialmente, visvel apenas um item;
porm, quando o usurio d um clique no boto seta para baixo que
aparece ao lado da caixa, exibida a caixa de lista contendo os itens,
permitindo ao usurio selecionar um deles. A caixa Object na janela
de propriedades do Visual Basic um exemplo familiar. (Nesse caso,
no permitido ao usurio a digitao de qualquer texto na caixa de
texto.)
O valor 1 d origem ao que chamamos de caixa combinada simples;
uma rea de edio na qual o usurio pode introduzir texto com uma
caixa de lista padro abaixo de si. A lista no retirada,
permanecendo sempre em exibio. O usurio pode selecionar um
item da caixa de lista ou ento digitar um texto na rea de edio.
Para dimensionar o tamanho da rea da caixa de lista associada,
selecione a caixa combinada, clique com o mouse sobre uma ala de
redimensionamento inferior e arraste-a para baixo at atingir o
tamanho desejado.
A configurao dessa propriedade para 0 cria uma caixa combinada
drop-down exibida quando o boto seta para baixo pressionado,
permitindo a seleo de um item. Porm possvel ao usurio
introduzir texto na caixa de texto.
Text Esta propriedade pode conter o texto de um item selecionado a
partir da lista, ou o prprio texto digitado pelo usurio.
Eventos
A forma como uma caixa combinada responde aos eventos depende
de seu estilo de operao - isto , de como a propriedade Style est
configurada. Por exemplo, o evento DblClick recebido apenas
quando a propriedade est configurada para 1 (caixa combinada
simples). Nos outros dois estilos, apenas o evento Click recebido.
Os dois estilos que permitem a introduo de texto recebem o evento
Change medida que o usurio est digitando o texto na rea de
edio da caixa combinada. Via de regra, voc desejar que o seu
programa leia a propriedade Text da caixa combinada aps o usurio
completar a seleo.
Procedimentos e Mtodos
Os mtodos AddItem, Clear e RemoveItem, descritos para caixas de
lista, tambm esto implementados para caixas combinadas e so
usados da mesma forma.
O Aplicativo Vo
Este projeto de exemplo inclui os trs estilos de caixas combinadas
lado a lado; assim voc pode fazer algumas experincias com eles. O
aplicativo simula uma caixa de dilogo que pergunta ao usurio sobre
suas preferncias quanto ao prximo vo.
Crie um novo projeto. Coloque trs rtulos e dois botes de comando
no form e configure a propriedade Caption de cada objeto como
mostrado abaixo:
Figura 5.33
Configure para True a propriedade Default do boto OK e a
propriedade Cancel do boto Cancel.
Abaixo do rtulo Destino, desenhe uma caixa combinada, configure a
sua propriedade Style para 1 e sua propriedade Name para
cboDestino. Torne-a grande o suficiente para permitir a exibio de
quatro ou cinco linhas de texto na parte da caixa de lista.
Nota: a sigla "cbo", que usamos aqui como prefixo nos nomes das
caixas combinadas, vem de ComboBox caixa combinada, em ingls.
Crie outra caixa combinada abaixo do rtulo Assento configurando as
propriedades Style para 2 e Name para cboAssento.
Crie mais uma caixa combinada, agora abaixo do rtulo Refeio.
Configure as propriedades da caixa Name para cboRefeio e Style
para 0.
Configure as propriedades Text de cboDestino e cboRefeio para "".
O seu Form dever estar parecido com:
Figura 5.34
Figura 5.35 A codificao para o aplicativo Vo.
Agora, ser preciso escrever dois procedimentos, um para relatar os
resultados da escolha das aes do usurio quando for dado um
clique no boto OK e outro para inicializar as caixas combinadas.
Esses procedimentos so apresentados na Figura 5.35.
Quando voc executar o aplicativo, observe quais caixas combinadas
lhe permitem digitar um texto. Repare tambm que o aspecto de cada
tipo de caixa combinada, conforme mostrado naFigura 5.36, indica
como proceder.
Figura 5.36 Processando o aplicativo Vo.
Barras de Deslocamento Horizontal e Vertical
As barras de deslocamento horizontal e vertical (mostradas na Figura
5.37.) comportam-se da mesma forma, mudando apenas a direo.
Esses objetos simples mostram a posio do elevador na barra de
deslocamento; voc tem controle sobre os limites da barra de
deslocamento e sobre os incrementos pelos quais o elevador pode ser
avanado. Por exemplo, se voc estiver usando uma barra de
deslocamento para representar o acelerador de um automvel, ela
poderia variar de 0 a 100, com incrementos de 5. Um controle de
volume poderia variar de 0 a 10, com incrementos de 1.
Figura 5.37 Barras de deslocamento horizontal e vertical.
Para criar esses objetos, use a ferramenta Barra de Deslocamento
Horizontal ou a ferramenta Barra de Deslocamento da caixa de
ferramentas do Visual Basic.
Propriedades
As propriedades padres suportadas por barras de deslocamento
incluem Enabled, Height, Left, Name, Top, Visible e Width. As
propriedades especiais tanto para barras de deslocamento vertical
quanto horizontal incluem LargeChange, Max, Min, SmalIChange e
Value.
LargeChange A configurao desta propriedade representa o
incremento adicionado ou subtrado do nmero contido na propriedade
Value quando o usurio d cliques na rea da barra de deslocamento,
entre o elevador e as setas de deslocamento.
Max Esta propriedade pode ser configurada para um nmero entre -
32.767 e +32.767. Quando o elevador est na extrema direita (barra
horizontal) ou na posio inferior (barra vertical), a propriedade Value
configurada para o valor armazenado na propriedade Max.
Min Esta propriedade pode ser configurada para um nmero entre -
32.767 e +32.767. Quando o elevador est na extrema esquerda ou
na posio superior, a propriedade Value configurada para o valor
armazenado na propriedade Min.
SmallChange A configurao desta propriedade representa o
incremento adicionado ou subtrado do nmero contido na propriedade
Value quando o usurio d um clique em uma das setas de direo
localizadas nos extremos da barra de deslocamento.
Value Esta propriedade contm o nmero representando a posio
atual do elevador dentro da barra de deslocamento. Se alguma
instruo de um programa vier a alterar esta propriedade, o Visual
Basic mover o elevador para a posio correspondente. Definir para
esta propriedade valores que estejam fora dos limites estabelecidos
pelas propriedades Max e Min produz uma mensagem de erro.
Eventos
Os eventos primrios associados a barras de deslocamento
so Scroll e Change. O evento Scroll repetidamente disparado
enquanto o elevador estiver sendo arrastado dentro da caixa de
deslocamento. O evento Change sinalizado aps a posio do
elevador ter sido modificada. Use o evento Scroll para rastrear as
modificaes dinmicas na barra de deslocamento e o evento Change
para obter o valor final da barra de deslocamento.
Procedimentos e Mtodos
Nenhum dos procedimentos e mtodos discutidos anteriormente so
aplicveis s barras de deslocamento.
O Aplicativo Barra de Deslocamento
O objetivo deste aplicativo fornecer-lhe apenas uma viso de como
as barras de deslocamento trabalham.
Crie um novo projeto. No form vazio, coloque um rtulo e uma barra
de deslocamento horizontal, como mostrado aqui:
Figura 5.38
Configure a propriedade BorderStyle do rtulo para 1 - Fixed Single, e
a propriedade Caption para uma string vazia. Configure as
propriedades da barra de deslocamento horizontal como segue:

Propriedade Configurao
LargeChange 10
Max 100
Min 0
SmallChange 2
D um clique duplo na barra de deslocamento, fazendo com que a
janela de cdigo seja apresentada. Introduza este procedimento para
tratamento do evento Change:
Private Sub_Hscroll1_Change ( )
Label1.Caption = Str$(HScroll1.Value)
End Sub
Como a propriedade Caption aceita apenas textos para sua
configurao, voc deve converter o valor HScroll.Value para uma
string usando Str$.
Introduza o seguinte procedimento para tratar o evento Scroll:

Private Sub Hscroll1_Scroll ( )
Label1.Caption = "Movendo para " & Str$(HScroll1.Value)
End Sub
Inicie agora o processamento do aplicativo. Quando voc d um clique
na rea cinza da barra de deslocamento, o valor exibido no rtulo se
modifica de 10 em 10. Quando voc d um clique sobre as setas de
deslocamento, nas extremidades da barra, o valor se modifica de 2 em
2.
Arrastando o elevador com seu mouse, possvel ajustar o valor em
incrementos diferentes de 2 ou 10. Por exemplo, o valor exibido
na Figura 5.25, poderia ser alcanado dando-se cliques sobre as
setas de deslocamento ou arrastando-se o elevador. Observe que o
procedimento para o evento Scroll atualiza a propriedade Caption do
rtulo medida que o elevador arrastado. Selecione a opo Break
do menu Run ou d um clique no boto Interromper da barra de
ferramentas e introduza a instruo Hscroll1.Value = 17 na janela
Immediate. Observe que a posio do elevador da caixa de
deslocamento se modifica quando o valor alterado. Agora, submeta
a instruo Hscroll1.Max = 500. A posio do elevador se modifica
novamente, de forma a manter a posio relativa s configuraes das
propriedades Min e Max.
Figura 5.39 Processando o aplicativo Barra de Deslocamento.

Temporizadores
Temporizadores, criados com a ferramenta Temporizador mostrada na
Figura 5.40, so objetos que podem disparar eventos em intervalos
regulares de tempo. Voc programa um temporizador configurando
sua propriedade Interval para a quantidade de milissegundos que
deve decorrer entre os eventos a serem disparados.
Figura 5.40 A ferramenta Temporizador.
Um temporizador est limitado pela configurao do hardware de seu
sistema. A maioria dos computadores pessoais capaz de gerar at
18 eventos por segundo, isto , com um intervalo de tempo entre os
eventos de aproximadamente 56/1000 segundos. Em termos prticos,
esse limite significa que valores menores do que 56 no tero utilidade
- em outras palavras, valores de intervalos intermedirios, entre os
mltiplos de 56, provavelmente produziro o mesmo resultado. Essa
limitao, no entanto, no significa que voc possa se descuidar dos
seus clculos afinal de contas, os futuros hardwares provavelmente
tero um melhor suporte para os temporizadores. Em suma, deve-se
entender essa limitao como um aviso para no se buscar extrema
preciso quando se tratar de temporizadores.
Adicionalmente, alguns dos eventos disparados por temporizadores
podem simplesmente perder-se no meio da confuso. Suponha, por
exemplo, que o seu programa esteja preparado para receber eventos
de um temporizador a cada segundo. Porm, uma parte de seu
programa que envolve clculos complexos pode demandar at 10
segundos. Quando esses clculos acabam, voc poderia esperar que
os 10 eventos disparados pelo temporizador fossem empilhados,
como ocorre em uma lenta fila de supermercado. No entanto, isso no
acontece. Apenas um evento ser sinalizado. Sempre que ocorre um
evento de temporizao, o sistema verifica se o evento de
temporizao anterior ainda se encontra pendente. Em caso positivo,
nenhuma evento ser gerado.
Sem dvida, devido a essas restries, voc deve estar se
questionando sobre a real utilidade dos temporizadores. Na realidade,
ainda que no tenham extrema preciso, eles podem ser muito teis.
Voc pode imaginar os temporizadores como "pontaps no traseiro"
de seu aplicativo. Com efeito, um temporizador pode, em intervalos de
tempo regulares, "cutucar" o seu programa dizendo "Ei, est na hora
de verificar algumas coisas".
Propriedades
As propriedades Name e Enabled so padres para temporizadores. A
propriedade mais importante dos objetos temporizadores a Interval.
Essa propriedade contm o nmero de milissegundos entre os
eventos de temporizao, variando em uma faixa de 0 a 65.535,
gerando eventos numa velocidade que varia teoricamente de 1000
eventos por segundo a quase 1 evento por minuto. O valor 0 equivale
a desativar o temporizador. Caso seja necessrio gerar n eventos por
segundo, use a frmula 1000 / n para achar o valor a ser armazenado
nessa propriedade. Por exemplo, para gerar eventos a cada meio
segundo (dois eventos por segundo), o clculo 1000 / 2 indica o valor
500 para a propriedade Interval.
Eventos
O evento Timer gerado em intervalos regulares quando o
temporizador est ativado.
Procedimentos e Mtodos
No h procedimentos ou mtodos que operem com objetos
temporizadores.
O Aplicativo Metrnomo
Este projeto - que cria um metrnomo usando um temporizador e uma
barra de deslocamento - demonstra o que acontece quando voc tenta
usar um objeto temporizador como um controle de tempo
extremamente preciso. Os metrnomos operam tipicamente numa
faixa que vai de 40 batimentos por minuto (para msicas muito lentas)
a 200 batimentos por minuto (para msicas muito rpidas). A
configurao de 40 batimentos por minuto corresponde a 2/3 de
batimento por segundo, ou seja, 1 batimento a cada 1500
milissegundos. Na outra extremidade, 200 batimentos por minuto
significam 3 1/3 batimentos por segundo, ou 1 batimento a cada 300
milissegundos. Assim, os valores 300 e 1500 podem ser usados em
seu aplicativo como limites mximo e mnimo para uma barra de
deslocamento. (Note que, quanto maior o valor, menor a quantidade
de batimentos; portanto, 1500 o valor mnimo e no o mximo.)
Crie um novo projeto e inclua uma barra de deslocamento horizontal
no form. Depois, crie um objeto temporizador, dando um clique duplo
na ferramenta Temporizador contida na caixa de ferramentas. No
preciso desenhar ou redimensionar um objeto temporizador, ele
aparece no form. em tempo de desenvolvimento; em tempo de
execuo, porm, ser invisvel.
Coloque um rtulo abaixo da extremidade esquerda da barra de
deslocamento e configure a sua propriedade Caption para Lento.
Abaixo da extremidade direita, crie outro rtulo, configurando a sua
propriedade Caption para Rpido. Veja a seguir como dever ficar o
seu aplicativo.
Figura 5.41
Configure a propriedade Interval do temporizador para 1000.
Configure as propriedades da barra de deslocamento horizontal como
se segue:
Propriedade Configurao
LargeChange 10
Max 300
Min 1500
SmallChange 25
Value 1000
Ser preciso incluir duas linhas de cdigo para esse aplicativo, uma no
procedimento Change da barra de deslocamento e outra no
procedimento Timer do objeto temporizador. O procedimento Change
mantm o objeto temporizador em sincronia com a barra de
deslocamento, enquanto o procedimento Timer gerar o tique do
metrnomo. (Ou, neste caso, um beep):
Private Sub HScroll1_Change ( )
Timer1.Interval = HScroll1.Value
End Sub
Sub Timer1_Timer ( )
Beep
End Sub
Quando voc iniciar o aplicativo, o metrnomo bater 1 vez por
segundo. O deslocamento do elevador modificar a velocidade de
batimento. Tente deslocar a janela do aplicativo ao longo da tela ou
processe outro aplicativo em segundo plano. Enquanto nada estiver
acontecendo, o temporizador ser bastante preciso, porm voc pode
ver como alguns eventos de temporizao so perdidos quando o
sistema desvia sua ateno para outra tarefa.
Linhas e Formas
Para melhorar a aparncia dos forms de seus aplicativos, voc pode
incluir linhas simples e grficos de formas slidas, usando as
ferramentas Linha e Forma da caixa de ferramentas, mostradas
nas Figuras 5.42 e 5.43. Os objetos criados com essas ferramentas
aparecem na mesma camada que os objetos de imagem.
Figura 5.42 A ferramenta Linha.
Figura 5.43 A ferramenta Forma.
Os controles de linhas e formas (tanto quanto os controles de imagem)
so teis principalmente para implementar vises de segundo plano
para os seus forms A ferramenta Linha cria segmentos de linha reta
simples. Voc pode modificar tamanho, cor e padres de linhas,
alterando suas propriedades. A ferramenta Forma cria sempre um
retngulo na tela, porm, modificando a configurao das
propriedades dos objetos forma, voc pode criar crculos, ovais e
retngulos arredondados. Alm disso, voc pode configurar cores e o
padro de preenchimento das formas.
Propriedades
Ambos os objetos tm as propriedades Name e Visible usuais.
Objetos do tipo Forma possuem ainda as propriedades padres
Height, Left, Top e Width. Objetos Linha tm as propriedades
posicionais X1, Y1 e X2, Y2, que so as coordenadas das duas
extremidades da linha. Outras propriedades determinam como esses
objetos aparecem na tela.
BorderColor Esta propriedade determina a cor de contorno (ou no
caso de objetos Linha, a cor da linha). Voc configura a propriedade
BorderColor escolhendo uma cor de uma palheta, da mesma forma
que usada para configurar as propriedades BackColor e ForeColor
de um form.
BorderStyle A propriedade BorderStyle controla como a linha ou o
contorno da forma traada. Voc pode aplicar uma das sete
configuraes:
0 - Transparent (Transparente)
1 - Solid (Slida)
2 - Dash (Trao)
3 - Dot (Ponto)
4 - Dash-Dot (Trao-Ponto)
5 - Dash-Dot-Dot (Trao-Ponto-Ponto)
6 - Inside Solid (Slido Interno)
BorderWidth Esta propriedade permite-lhe especificar a largura de
uma linha ou do contorno da forma. Se voc configurar BorderWidth
para um valor diferente de 1, no poder usar configuraes
pontilhadas ou tracejadas de BorderStyle.
Objetos forma tm ainda as propriedades FillColor e FilIStyle:
FilIColor Anloga propriedade BorderColor, FilIColor permite-lhe
definir a cor interior de uma forma. Voc configura esta propriedade do
mesmo jeito que a propriedade BorderColor, com o auxlio de uma
palheta.
FillStyle A configurao da propriedade FilIStyle determina o padro
interno de um objeto Forma.
0 - Solid (Slido)
1 - Transparent (Transparente)
2 - Horizontal Line (Linha Horizontal)
3 - Vertical Line (Linha Vertical)
4 - Upward Diagonal (Diagonal Ascendente)
5 - Downward Diagonal (Diagonal Descendente)
6 - Cross (Cruz)
7 - Diagonal Cross (Diagonal em Cruz)
Eventos
Objetos Linha e Forma no recebem evento algum.
Procedimentos e Mtodos
Nenhum dos mtodos apresentados neste captulo se aplicam a linhas
e formas.
O Projeto Camada
Este projeto de exemplo no um aplicativo completo; ele
simplesmente leva voc a fazer algumas experincias com objetos de
exibio, para familiariz-lo com as ferramentas.
Crie um novo projeto. Coloque no form uma caixa de imagem, um
boto de comando, uma forma, uma linha e um controle de imagem,
nesta ordem. Distribua-os no form como mostrado aqui:
Figura 5.44
Selecione a propriedade Picture do objeto Picture1 na janela de
propriedades. D um clique no boto de reticncias, direita do valor
da propriedade, para exibir a caixa de dilogo Load Picture. Na caixa
de dilogo, configure o tipo de arquivo para exibir os arquivos com
sufixo ICO. No diretrio \PacoteVB\Icones\Misc\ no primeiro cd deste
produto, voc encontrar o arquivo de cones HEART.ICO. Escolha
esse arquivo para carregar o cone na caixa de imagem. De forma
semelhante, configure a propriedade Picture de Image1 para carregar
o cone DIAMOND.ICO no controle de imagem.
Configure a propriedade FilIStyle de Shape1 para 0 - Solid e a
propriedade FilIColor para azul. (D um clique no boto de seta para
baixo direita da propriedade e selecione a cor azul na palheta.)
Configure a propriedade BorderWidth de Line1 para 4. O form dever
parecer-se com:
Figura 5.45
Movimente o objeto forma para o centro do form e depois mova os
outros objetos sobre a forma de modo que se sobreponham, como
mostrado aqui:
Figura 5.46
Observe que, em cada camada da exibio, o objeto criado mais
recentemente aparece sobre os objetos criados anteriormente. (A
caixa de imagem e o boto de comando se encontram na camada
superior; a forma, a linha e a imagem encontram-se na camada
intermediria.)
A ordem segundo a qual certos objetos se sobrepem a outros
chamada de Z-Order, e pode ser alterada. D um clique sobre o objeto
Line1 para selecion-lo e escolha a opo Bring to Front (trazer para
frente) do menu Format\Order do Visual Basic. A linha, que j
apareceu sobre a forma, agora se sobrepe tambm imagem. No
entanto, note que, quando voc move a linha ao longo da tela, ela no
se sobrepor caixa de imagem ou ao boto de comando. As opes
Bring to Front e Send to Back (Mandar para trs) trabalham apenas
dentro de uma camada; objetos da camada intermediria sempre
sero sobrepostos por objetos da camada superior. Voc pode aplicar
essas duas opes a todos os controles (objetos), e com isso controlar
a Z-Order. Experimente usar essas opes aps selecionar o boto de
comando.
Caixas de Lista de Unidades, Caixas de Lista de Diretrios e
Caixas de Lista de Arquivos.
As trs ferramentas da caixa de ferramentas do Visual Basic
mostradas nas Figuras 5.47, 5.48 e 5.49 lhe permitem construir
caixas de dilogo personalizadas para fazer a interao com o sistema
de arquivos. Cada controle do sistema de arquivos gerencia um
componente isolado do sistema: a caixa de lista de unidades aparece
como uma caixa de lista drop-down, contendo os nomes de todas as
unidades de disco do sistema; a caixa de lista de diretrios exibe
todos os subdiretrios do diretrio atual; e a caixa de lista de arquivos
exibe alguns ou todos os arquivos gravados no diretrio atual.
Na maioria das vezes, voc no usar a caixa de lista de unidades ou
a caixa de lista de diretrios individualmente. Ao contrrio, quando o
usurio est selecionando um arquivo a ser aberto ou salvo, voc ter
de oferecer acesso a todos os componentes do sistema de arquivos
simultaneamente. Nesses casos, voc poder usar o controle dilogos
comuns, que acondiciona as funes File Open e File Save As.
Porm, ocasionalmente, voc poder precisar de uma caixa de
dilogo com mais componentes do que os fornecidos pelas caixas de
dilogo padres para File Open e File Save As. Por exemplo, o Word
for Windows da Microsoft tem botes adicionais para Salvar Verso e
Opes na caixa de dilogo Salvar Como.
Nesses casos, voc poder usar as ferramentas Caixa de Lista de
Unidades, Caixa de Lista de Diretrios e Caixa de Lista de Arquivos.
(Veja um exemplo no Captulo 10.)
Figura 5.47 A ferramenta Caixa de Lista de Unidades.
Figura 5.48 A ferramenta Caixa de Lista de Diretrios.
Figura 5.49 A ferramenta Caixa de Lista de Arquivos.
Propriedades
Os trs controles do sistema de arquivos tm muitas das propriedades
usuais: Enabled, FontBold, Fontltalic, FontName, FontSize, Height,
Left, Name, Top, Visible e Width. Adicionalmente, as seguintes
propriedades so importantes:
Drive Esta propriedade, que se aplica apenas a caixas de lista de
unidades, contm o nome da unidade atualmente selecionada.
FileName Apenas as caixas de lista de arquivos tm esta propriedade,
que contm o nome do arquivo atualmente selecionado na caixa de
lista de arquivos.
List, ListIndex Estas propriedades so suportadas somente pelas
caixas de lista de arquivos e so idnticas s propriedades List e
ListIndex das caixas de listas.
Path Nas caixas de lista de arquivos e de diretrios, esta propriedade
contm o caminho hierrquico atual. Esta propriedade no se aplica a
caixas de lista de unidades.
Pattern Esta propriedade das caixas de lista de arquivos contm uma
string que determina quais arquivos sero exibidos. Ela suporta o uso
dos caracteres * e ? para especificao dos nomes de arquivos. Por
exemplo, configurar esta propriedade para *.DAT faria com que
fossem exibidos todos os arquivos que tivessem a extenso DAT.
Eventos
Apenas as caixas de lista de arquivos e de diretrios respondem ao
evento Click. O evento DbIClick recebido apenas pelas caixas de
lista de arquivos. Alm disso, mais dois eventos so importantes para
os controles do sistema de arquivos:
Change Este evento reconhecido somente pelas caixas de lista de
unidades e de diretrios. Ele disparado quando o usurio ou o
programa modifica a seleo na caixa de lista.
PaIthChange Este evento aplica-se apenas s caixas de lista de
arquivos. Ele ocorre quando o caminho hierrquico modificado,
devido a um clique duplo em uma pasta de diretrio ou porque o
programa alterou alguma das propriedades Path ou FileName. Este
evento permite ao seu programa atualizar o contedo da caixa de lista
de diretrios de forma a exibir os subdiretrios do novo caminho
hierrquico.
Procedimentos e Mtodos
Nenhum dos procedimentos ou mtodos discutidos at agora
aplicvel aos controles do sistema de arquivos.
Outras Ferramentas do Visual Basic
A caixa de ferramentas do Visual Basic tambm inclui algumas outras
ferramentas, que sero descritas brevemente aqui. Essas ferramentas
e os objetos criados com elas, por exigirem um esforo considervel
de programao e algumas tcnicas avanadas, sero abordados
posteriormente.
Grades
A ferramenta Grade representada na Figura 5.32 permite-lhe criar um
controle de grade. Uma grade um bloco de clulas bidimensional,
muito parecido com as linhas e colunas de uma planilha. Voc pode
usar um controle de grade para implementar funes semelhantes a
planilhas em Visual Basic. O Visual Basic distribudo com os
controles de grade DbGrid e MSFlexGrid. O segundo mais moderno
e rico em possibilidades de uso. O cone da figura 5.50 refere-se ao
controle MSFlexGrid. Para que um projeto use uma dessas duas
grades, deve-se selecionar no menu Project o comando Components
e selecionar ,entre os componentes listados , o item Microsoft Data
Bound Grid Control 5.0, para o controle DBGrid ou Microsoft FlexGrid
Control 5.0, para o controle MSFlexGrid.
Aps o OK e sair da janela o controle escolhido aparecer na caixa de
ferramentas do projeto.
Figura 5.50 A ferramenta Grade.
O controle MSFlexGrid exibe e opera em dados na forma de tabelas.
Ele lhe permite flexibilidade total para classificar, mergear e formatar
tabelas contendo strings e imagens. Quando ligada ao controle Dados,
exibe dados apenas para leitura.
Voc pode adicionar texto, uma imagem ou ambos em uma clula da
grade. As propriedades Row (linha) e Col (coluna) so usadas para
indicar a clula atual da grade. Voc pode especificar a clula atual
em cdigo, ou o usurio pode modific-la em tempo de execuo
usando o mouse ou as teclas de seta. A propriedade Text refere-se ao
contedo da clula atual.
Se o texto da clula muito longo para ser exibido na clula, e a
propriedade WordWrap est configurada como True, o texto
quebrado para a prxima linha dentro da mesma clula. Para ver o
texto quebrado dentro da clula, voc pode precisar aumentar a
largura da coluna da clula (propriedade ColWidth) ou a altura da linha
(propriedade RowHeight).
Use as propriedades Cols e Rows para determinar o nmero de
colunas e linhas da grade.
Para adicionar uma linha na grade use o mtodo AddItem e, para
remov-la, use o mtodo RemoveItem. A sintaxe do mtodo AddItem
:
objeto.AddItem (item As String, ndice)
Onde:
Objeto um controle MSFlexGrid.
Item (requerido) uma string exibida na nova linha. Para adicionar
mltiplas strings (numa grade de mltiplas colunas), separe o texto de
cada clula com caracteres de tabulao (vbTab).
ndice (opcional) um inteiro longo representando a posio dentro da
grade onde ser inserida a nova linha. Se o ndice for omitido, a linha
ser posta no final de todas. A primeira linha possui o ndice 0.
Para remover linhas use o mtodo RemoveItem. Sua sintaxe :
objeto.RemoveItem ndice
Onde:
Objeto um controle MSFlexGrid.
ndice a posio da linha dentro da grade.
Dados
A ferramenta Dados, mostrada na Figura 5.51, permite-lhe criar um
controle de dados por meio do qual voc implementa um acesso a
dados especficos em um banco de dados. Um controle de dados tem
algumas propriedades especiais que definem a conexo entre o
aplicativo Visual Basic e o banco de dados que voc planeja acessar.
Entretanto, antes de usar a ferramenta Dados em Visual Basic, ser
necessrio habilitar o compartilhamento de arquivos. Veja como usar
esta ferramenta no final do Captulo 14.
Figura 5.51 A ferramenta Dados.
OLE
A tecnologia OLE (Object Linking and Embedding - Aninhamento e
Ligao de Objetos) da Microsoft permite-lhe criar um objeto num
aplicativo que contenha dados de outro aplicativo no-relacionado. Por
exemplo, o diagrama de um programa grfico ou um desenho
detalhado de um programa CAD (Computer-Aided Design -Projeto
Auxiliado por Computador) poderia vir a ser colocado em seu
programa Visual Basic. Entretanto, em vez de inserir uma cpia do
grfico ou do desenho no seu programa Visual Basic, o OLE manter
uma conexo com o aplicativo original, de forma que qualquer
modificao feita sobre o desenho ou grfico seja refletida
imediatamente em seu programa Visual Basic.
A ferramenta OLE da caixa de ferramentas do Visual Basic, mostrada
na Figura 5.52, permite-lhe implementar em seu programa Visual
Basic habilidades para estabelecer ligao e aninhamento entre
objetos.
Figura 5.52 A ferramenta OLE.
Caixas de Dialogo Comuns
Para padronizar a interface com os usurios, para as operaes
comuns a todos os aplicativos baseados em Windows, a Microsoft
criou um conjunto de caixas de dilogo. O Visual Basic oferece acesso
a essas funes por meio da ferramenta Dilogos Comuns. O uso
dessa ferramenta assegurar que seus aplicativos estejam dentro do
padro estabelecido para as operaes suportadas.
A exemplo da ferramenta Temporizador, a ferramenta Dilogos
Comuns, mostrada na Figura 5.53, estar invisvel em tempo de
execuo. Entretanto, quando voc colocar o seu cone em um de
seus forms ser possvel chamar qualquer uma das cinco funes
padres suportadas pela ferramenta. Cada funo padro est
associada a uma caixa de dilogo. As caixas de dilogo comuns
padres do Windows so: Open, Save As, Color, Font: e Printer (Abrir,
Salvar Como, Cor, Fonte e Impressora). Alm disso, a ferramenta
Dilogos Comuns pode invocar o sistema de ajuda on-line do
Windows. preciso que seja feita uma incluso desta ferramenta em
seu projeto selecionando-a na caixa de dilogo Components. Clique
em Components no menu Project e selecione Microsoft Common
Dialog Control. A ferramenta ento aparecer na sua caixa de
ferramentas aps o OK.
Figura 5.53 A ferramenta Dilogos Comuns.
A execuo de uma certa funo iniciada quando voc se utiliza de
um dos mtodos do controle de dilogos comuns que exibem caixas
de dilogo. As instrues de seu programa Visual Basic ficaro
suspensas at que o usurio no precise mais da caixa de dilogo.
Voc pode ento examinar as propriedades do controle para
determinar o que aconteceu. No h eventos associados a controles
de dilogos comuns. Voc especifica sua operao, configurando os
valores das propriedades e ento chamando um dos mtodos abaixo:

Mtodo Caixa de Dilogo Exibida
ShowOpen Abrir
ShowSave Salvar Como
ShowColor Cores
ShowFont Fontes
ShowPrinter Imprimir
ShowHelp Invoca o Help

Alm dos mtodos acima, a propriedade CancelError usada por
todas as funes de dilogos comuns. O estado default de
CancelError False. Quando configurada para True, o Visual Basic
sinalizar um erro se o usurio escolher o boto Cancel na caixa de
dilogo. Se voc tem inteno de configurar essa propriedade como
True, precisa usar os recursos para tratamento de erros do Visual
Basic, descritos no Captulo 9.
Os pargrafos a seguir descrevem os mtodos da ferramenta Dilogos
Comuns. Devido ao seu grande nmero, no foi fornecido um
programa de exemplo completo, apenas fragmentos de programas
que ilustram o uso tpico do controle.
Mtodo ShowOpen (Abrir)
A caixa de dilogo Abrir, mostrada na Figura 5.54, chamada quando
o mtodo ShowOpen usado. Voc pode configurar as seguintes
propriedades para controlar a aparncia da caixa de dilogo. Observe
que a caixa de dilogo na realidade no abre o arquivo, apenas
permite ao usurio selecionar o nome do arquivo.
Figura 5.54 A caixa de dilogo Abrir
Propriedades relacionadas a ShowOpen
DialogTitle Esta propriedade pode ser configurada para qualquer
string. A string ser exibida na barra de ttulo da caixa de dilogo. O
ttulo default "Abrir".
FileName Esta propriedade usada para configurar o nome
inicialmente mostrado na caixa de texto FileName da caixa de dilogo.
Aps a caixa de dilogo ser fechada, pode-se ler esta propriedade
para determinar o nome selecionado para o arquivo.
Filter A propriedade Filter pode ser configurada para restringir os
nomes de arquivos que aparecem na caixa de lista de arquivos. A
propriedade Filter deve conter uma string com um ou mais pares de
componentes. Cada par de componentes composto por uma
descrio, seguida pelo smbolo ( | ) e por caracteres de especificao
globais para nomes de arquivos. Os mltiplos pares de componentes
tambm so separados pelo smbolo ( | ). Por exemplo, a string a
seguir especifica trs pares de componentes:
"Documentos (*. DOC)|*.doc|Arquivos Texto (*.TXT)|*.txt|Todos
Arquivos (*.*)|*.*"
O primeiro filtro restringe a lista de arquivos a arquivos com a
extenso DOC; o segundo, a arquivos com a extenso TXT e o ltimo
permite a seleo de qualquer extenso. Note que no h nenhum
espao antes ou depois do smbolo ( | ).
FilterIndex Esta propriedade configurada para um inteiro indicando
qual o par de componentes que ser usado como default. No
exemplo acima, poderia ser 1, 2 ou 3.
Flags A propriedade Flags pode ser configurada para uma
combinao de um ou mais valores que controlam as caractersticas
especiais da caixa de dilogo. Os valores vlidos para esta
propriedade esto descritos no sistema de ajuda on-line do Visual
Basic. Um exemplo cdlOFNFileMustExist, que forar o usurio a
selecionar um arquivo existente.
Exemplo
Este fragmento de programa exibe a caixa de dilogo Abrir. Ela fora o
usurio a escolher um arquivo que exista e aplica um filtro padro para
arquivos de dados (*.DAT). Assume-se que o objeto dilogos comuns
chama-se Dlog.

Figura 5.55 Exemplo de uso do mtodo ShowOpen

Save As (Salvar Como)
A caixa de dilogo Save As, mostrada na Figura 5.56, aberta com o
uso do mtodo ShowSave. As propriedades para ShowSave so
idnticas s descritas anteriormente para ShowOpen, s que o valor
default para a propriedade DialogTitle Save As.

Figura 5.56 A caixa de dilogo Save As.

Propriedades relacionadas a ShowSave
DefaultExt Esta propriedade pode ser configurada para uma string de
1 a 3 caracteres, que ser usada como extenso default caso o
usurio especifique um nome de arquivo sem extenso.
Exemplo
O fragmento de programa a seguir exibe a caixa de dilogo Salvar
Como. Assume-se que o objeto dilogos comuns chama-se Dlog.
Neste exemplo, a propriedade CancelError configurada para True;
do contrrio, seria impossvel determinar se foi ou no selecionado um
nome de arquivo. Note que as instrues no provocam o salvamento
de qualquer arquivo; simplesmente permitem ao usurio selecionar o
nome para o arquivo.
Figura 5.57 Exemplo de uso do mtodo ShowSave

Color (Cor)
A caixa de dilogo Color, mostrada na Figura 5.58, exibida quando
o mtodo ShowColor chamado. Voc pode configurar as seguintes
propriedades para controlar a aparncia desta caixa de dilogo.
Figura 5.58 A caixa de dilogo Color.
Propriedades relacionadas a ShowColor
Color Esta propriedade usada para configurar a cor inicial. Aps o
usurio dispensar a caixa de dilogo, a cor selecionada poder ser
determinada com esta propriedade.
Flags Esta propriedade deve ser configurada
para cdlCCRGBInit para ler ou configurar a propriedade Color.
Exemplo
Este fragmento de programa exibe uma caixa de dilogo para a
seleo de cores. Assume-se que o objeto dilogos comuns tenha o
nome Dlog. A cor selecionada usada para configurar o fundo do form
atual.
Figura 5.59 Exemplo de uso do mtodo ShowColor
Font (Fonte)
A caixa de dilogo Fonte, mostrada na Figura 5.60, chamada
quando se usa o mtodo ShowFont. Voc pode configurar as
seguintes propriedades para controlar a aparncia da caixa de
dilogo.
Figura 5.60 A caixa de dilogo Font.
Propriedades relacionadas a ShowFont
Color Esta propriedade permite configurar ou ler a cor da fonte. (Ela
est ativa apenas quando a propriedade Flags inclui cdlCFEffects.)
Flags Esta propriedade pode ser configurada para modificar o
comportamento da caixa de dilogo. Entretanto, ela deve incluir um
dos seguintes valores: cdlCFPrinterFonts, cdlCFScreenFonts ou
cdlCFBoth. Eles determinam quais fontes devem ser listadas na caixa
de dilogo (apenas fontes para impressora, apenas para vdeo ou
ambas).
FontBold, FontItalic, FontStrikethru, FontUnderline Estas so
propriedades booleanas que podem ser configuradas ou lidas para
determinar o estilo de informao para a fonte. A configurao da
propriedade Flags deve incluir cdlCCEffects para permitir a
configurao de estilos.
FontName Esta propriedade pode ser configurada para inicializar a
fonte default e pode ser lida para determinar a fonte selecionada pelo
usurio.
FontSize Esta propriedade pode ser configurada ou lida e determina o
tamanho da fonte em pontos.
Esta sub-rotina permite que os atributos do controle caixa de texto
sejam modificados. O controle passado como um parmetro.
Assume-se que o objeto dilogos comuns chama-se Dlog.
Figura 5.61 Exemplo de uso de ShowFont
Print (Imprimir)
A caixa de dilogo Imprimir, mostrada na Figura 5.62, exibida
quando se chama o mtodo ShowPrinter. Voc pode configurar as
seguintes propriedades para controlar a aparncia desta caixa de
dilogo.

Figura 5.62 A caixa de dilogo Imprimir.

Propriedades relacionadas a ShowPrinter
Copies Esta propriedade especifica a quantidade de cpias que ser
impressa.
Flags Esta propriedade trata das caractersticas especiais da caixa de
dilogo. Valores de constantes so combinados usando o operador
lgico Or para definir caractersticas da caixa de dilogo a ser exibida.
Veja o arquivo de ajuda para a descrio detalhada do efeito do uso
de cada constante na configurao da propriedade Flags.
Exemplo
Este fragmento de programa exibe a caixa de dilogo para impresso.
Como antes, assume-se que o objeto de dilogo chama-se Dlog.
importante notar que a chamada da caixa de dilogo no provocar o
incio do processo de impresso. Voc deve escrever para o objeto
Printer. A caixa de dilogo apenas permite ao usurio selecionar
certas opes de impresso.

Figura 5.63 Exemplo de uso de ShowPrinter

ShowHelp (Ajuda)
O aplicativo Help do Windows, mostrado na Figura 5.64, chamado
quando se usa o mtodo ShowHelp do controle de dilogos comuns.
Voc pode configurar as seguintes propriedades para controlar a
aparncia desta caixa de dilogo.

Figura 5.64 O aplicativo Help.

Propriedades relacionadas a ShowHelp
HelpCommand Esta propriedade especifica o tipo de ajuda que voc
deseja obter. Normalmente, voc usar a constante cdlHelpKey,
indicando ajuda para uma certa palavra-chave.
HelpFile Esta propriedade indica o nome do arquivo de texto de ajuda.
HelpKey Esta propriedade indica a palavra-chave inicial a ser usada
na tela de ajuda.

Exemplo
Este fragmento de programa invoca o sistema de ajuda do Windows
para a funo MsgBox
Dlog.HelpCommand = cdlHelpKey
Dlog.HelpFile = "vb5.hlp"
Dlog.HelpKey = "MsgBox"
Dlog.ShowHelp 'Invoca a ajuda
Menus
Ainda que tenha criado diversos aplicativos at agora, voc pode estar
com a impresso de que nenhum deles se parece com "aplicativos
reais". Por que no? Para comear, nenhum deles tem barra de
menus. Entretanto, isso contornvel, pois o Visual Basic torna muito
simples a criao de menus. Os menus operam de uma forma
orientada a eventos, muito semelhante maioria dos objetos que
foram discutidos.
Para criar o menu para um aplicativo, voc deve usar a janela do
editor de menus do Visual Basic, mostrada na Figura 5.65. Crie um
novo projeto e abra essa janela, escolhendo a opo Menu Editor do
menu Tools ou dando um clique no boto Menu Editor contido na
barra de ferramentas do Visual Basic.
Figura 5.65 A janela do editor de menu (Menu Editor) do Visual Basic.
Voc constri a barra de menus de seu aplicativo, criando uma
hierarquia de itens na janela do editor de menu. Para cada item de
menu, voc deve definir a propriedade Caption e a propriedade Name.
Na propriedade Caption, coloque o ttulo que dever aparecer na barra
de menus ou no menu drop-down (submenu). O nome (name) do item
de menu identifica-o na codificao de seu programa. obrigatrio um
nome, pois cada item de menu ter um procedimento Click associado
a ele.
Suponha que seu computador contenha os dispositivos de hardware
necessrios para mostrar imagens de TV dentro de uma janela. Os
menus para o aplicativo, que controla esses dispositivos poderiam ser
semelhantes a um controle remoto. Veja a seguir um layout: possvel
para a estrutura de menus, com trs nveis de hierarquia.
Arquivo
On
Off
Exit
Canal
Selecionar ...
Up
Down
Som
Mute
Preset
Soft
Moderate
Loud
Louder
Softer
Observe o sinal de reticncias (...) que aparece aps o item de menu
Selecionar. Ele serve para indicar ao usurio que a sua seleo
provocar o aparecimento de uma caixa de dilogo.
Vamos agora implementar os menus desse aplicativo. Entretanto,
antes de ir para a janela do editor de menus, preciso dar uma
refinada na sua lista de menus.
Na maioria dos aplicativos Windows, voc pode usar o teclado para
escolher itens de menus, sem usar o mouse. Essas alternativas via
teclado so chamadas de teclas de acesso e normalmente se baseiam
no pressionamento da tecla Alt, seguido pelos caracteres que
estiverem sublinhados nos menus. Por exemplo, em Visual Basic,
voc pode digitar Alt, F, S para selecionar a opo Save do menu File.
Na janela de projeto de menus, voc pode especificar a tecla de
acesso para um item de menu, colocando o sinal & antes do caractere
a ser sublinhado no menu do aplicativo. (Esse sinal no ser exibido
no menu.)
A menos que haja algum conflito, use sempre como caractere a
primeira letra do ttulo da opo. Por exemplo, em nosso aplicativo, os
itens On e Off comeam com a mesma letra. Dois itens de menu de
mesmo nvel no podem ter teclas de acesso iguais. Assim, ser
preciso escolher alguma outra letra para um dos itens. (Uma outra
exceo o uso da letra X, em vez de E, para a opo Exit. J se
tornou padro usar a seqncia Alt, F, X para sair dos aplicativos.)
Veja, a seguir, como ficam os itens de menus para o aplicativo de
exemplo, com os caracteres para teclas de acesso especificados:
&Arquivo
On
Of&f
E&xit
&Canal
&Selecionar ...
&Up
&Down
&Som
&Mute
&Preset
&Soft
&Moderate
&Loud
&Louder
&Softer
Alm de um ttulo e de uma tecla de acesso, cada item de menu
precisa de um nome. Ainda que possa parecer lgico usar a mesma
palavra tanto para o ttulo quanto para o nome, acontece que muitas
vezes isso impossvel. Por exemplo, Exit uma palavra reservada
em Visual Basic que pode ser usada como ttulo, mas no como nome
de objetos.
melhor estabelecer um esquema padro para designao, a fim de
reconhecer imediatamente cada item. Nomes significativos e claros
so importantes, pois cada item de menu tem um procedimento Click;
quando voc est codificando, muito fcil esquecer qual item de
menu est sendo tratado. Por exemplo, vamos usar o prefixo mnu
para os nomes de objetos; isso identificar os objetos como itens de
menus, diferenciando-os de botes de comandos ou barras de
deslocamento.
Para os itens de menu no primeiro nvel de hierarquia, coloque aps a
sigla mnu o prprio ttulo do item: mnuArquivo, por exemplo. Para
itens no segundo nvel, use mnu seguido por trs letras que
identifiquem o item de primeiro nvel, ao qual est subordinado esse
segundo nvel, e, finalmente, o prprio ttulo do item de menu:
mnuArqOn, por exemplo, ou mnuCanSelecionar. Da mesma forma,
para itens de menu do terceiro nvel, inclua duas abreviaturas para
identificar os nveis superiores. Veja, a seguir, os nomes sugeridos
para este aplicativo:
mnuArquivo
mnuArqOn
mnuArqOff
mnuArqExit
mnuCanal
mnuCanSelecionar
mnuCanUp
mnuCanDown
mnuSom
mnuSomMute
mnuSomPreset
mnuSomPreSoft
mnuSomPreModerate
mnuSomPreLoud
mnuSomLouder
mnuSomSofter
Agora, voc est pronto para passar para a janela do editor de menus
e criar os menus deste aplicativo.
D um clique na caixa de texto Caption da janela Menu Editor e digite
&Arquivo. Depois, pressione a tecla TAB para mover-se para a caixa
de texto Name. Digite mnuArquivo nessa caixa e pressione Enter. O
ttulo (mas no o nome) aparecer na caixa de lista na parte inferior da
janela.
D um clique no boto seta para a direita acima da caixa de lista.
Quatro pontos aparecero na linha abaixo de &Arquivo, indicando que
os prximos itens que sero includos fazem parte do segundo nvel
da hierarquia.
Retorne caixa de texto Caption e digite &On. Mova-se para a caixa
de texto Name, digite mnuArqOn e pressione Enter. Volte para a caixa
de texto Caption, digite Of&f, mova-se para a caixa de texto Name,
digite mnuArqOff e pressione Enter. Use o mesmo procedimento com
o ttulo E&xit e o nome mnuArqExit. A sua janela de editor de menus
dever estar parecida com:

Figura 5.66
4. D um clique no boto seta para a esquerda para retornar ao
primeiro nvel da hierarquia. Agora, digite os ttulos e nomes restantes
de nossa lista. Para incluir os itens do terceiro nvel de hierarquia, d
dois cliques no boto seta para a direita. Caso seja cometido algum
engano ao colocar um item na hierarquia, voc pode selecionar o
nome do item na caixa de lista e ento dar um clique nos botes setas
para a direita e para a esquerda, para ajustar seu nvel. Os botes
setas para cima e para baixo movimentam um item de menu para um
local diferente na lista.
5. Quando voc completar a introduo dos itens de menu, d um
clique no boto OK.
A barra de menu agora aparece no form principal do aplicativo. Voc
pode ver os itens de menu dando um clique nos seus ttulos que
aparecem na barra. Um menu drop-down ser exibido, mostrando as
entradas que contm, como pode ser visto na Figura 5.67.
Se voc der um clique sobre uma entrada de menu que no conduza
a outros nveis hierrquicos, o Visual Basic abrir a janela de cdigo
para o evento Click. Nessa janela, voc escreve as instrues a serem
processadas quando o usurio selecionar aquele item de menu. Por
exemplo, d um clique no item de menu Exit do menu Arquivo para
abrir a janela de cdigo com o procedimento de evento
mnuArqExit_Click. A instruo Visual Basic para encerrar um
aplicativo End, assim o procedimento para o item Exit dever ser:
Sub mnuArqExit_Click ( )
End
End Sub
Figura 5.67 Um form com barra de menu e menus drop-down.
Faa experincias com seu aplicativo, colocando instrues
Debug.Print em vrios procedimentos de menu e ento processando
novamente o aplicativo. medida que selecionar diferentes itens de
menu, fique de olho na janela Immediate, para verificar quais
procedimentos de menu esto sendo executados.
Opes Adicionais para o Editor de Menus
A janela de edio de menus oferece ainda algumas opes
interessantes. Por exemplo, se voc colocar um hfen (-) como ttulo, o
Visual Basic coloca uma barra separadora naquele item de menu,
permitindo um agrupamento visual de itens de menu relacionados.
(Ainda que esse nome no seja usado no programa, preciso
assinalar um nome entrada "hfen".)
Voc tambm pode assinalar teclas de atalho para itens de menu.
Abra a janela do editor de menus novamente e selecione E&xit.
Depois, d um clique no boto seta para baixo, ao lado da caixa
ShortCut. Voc pode assinalar qualquer uma das teclas contidas na
lista para o item de menu Exit.
As caixas de verificao Checked, Enabled e Visible na janela de
edio de menus correspondem a propriedades do item de menu
selecionado na lista de itens de menu. Cada propriedade pode ser
configurada para True (indicado por um X na caixa de checagem) ou
False (caixa de checagem vazia). A configurao da propriedade
Checked para True coloca uma marca de verificao no menu, ao lado
do item de menu, indicando que ele est ativo. A propriedade Enabled
configurada para True por default; se voc configur-la para False, o
item de menu fica cinza, no podendo ser selecionado a partir do
menu. Caso a propriedade Visible seja configurada para False, o item
de menu no aparecer no menu.
As configuraes Checked, Enabled e Visible na janela de edio de
menus indicam a configurao inicial dessas propriedades. Voc pode
alterar essas configuraes por meio de instrues com a seguinte
sintaxe:
objeto.propriedade = [True I False]
A opo Window List usada com menus de janelas MDI (Multiple
Document Interface - Interface de Mltiplos Documentos). No modelo
MDI, uma janela me do tipo MDI contm janelas filhas (propriedade
MDIChild = True). Quando um menu da janela MDI possui a
propriedade WindowList assinalada, haver dentro dele uma lista de
todas as janelas filhas abertas no momento. Somente um menu pode
possuir esta propriedade ativa.
A opo Index tem nos menus o mesmo significado que para outros
objetos: um nmero que o identifica em uma matriz de objetos com o
mesmo nome. No prximo captulo falaremos sobre matrizes.
HelpContextID um nmero que serve para ligar o menu a um tpico
no arquivo de help da aplicao quando se quer criar ajuda sensvel
ao contexto para o menu: o usurio pressiona F1 e um tpico de ajuda
aparece explicando o objeto clicado.
Menus Popup
Ainda que, via de regra, os menus sejam invocados a partir da barra
de menus, algumas vezes voc pode querer exibir um menu a partir
de um controle. Esse tipo de menu chamado de menu popup, pois
normalmente no visvel, mas aparece quando dado um clique em
algum controle. Voc pode configurar qualquer menu para ser
invocado como um menu popup usando o mtodo PopupMenu.
Por exemplo, voc poderia associar o menu Som mostrado na Figura
5.69 imagem de um boto de controle de volume. Use a ferramenta
Imagem para criar uma caixa de imagem na tela e depois use a
ferramenta Forma para traar um boto de controle circular dentro da
caixa de imagem. (A forma ser inicialmente um retngulo. Para criar
um crculo, configure a propriedade Shape para 3 - Circle.) Introduza o
seguinte cdigo para o evento MouseDown da caixa de imagem.
Figura 5.68
Quando o usurio pressionar o boto do mouse dentro da rea da
caixa de imagem, o menu Som ser invocado, como mostra a Figura
5.69.
Figura 5.69 Um menu popup.
Note que, nesse exemplo, o menu Som poder ser acessado tanto a
partir da barra de menus quanto a partir de um clique na caixa de
imagem. Se voc quiser que o menu seja visvel apenas como popup,
dever configurar a sua propriedade Visible para False na janela de
projeto de menus. A propriedade Visible de um item de menu de nveis
superiores aplica-se apenas barra de menus, sendo ignorada pelo
mtodo PopupMenu.





Controle do Programa no Visual
Basic
Os pequenos programas que voc escreveu so extremamente
simples: executam instrues seqenciais, realizam tarefas sem
grandes desvios e, via de regra, so relativamente descomplicados.
Este captulo introduz conceitos que lhe ajudaro a ter um controle
adicional sobre como um programa executado, permitindo-lhe criar
mecanismos que possam tratar de vrias condies, repetidamente e
com ampla variedade de dados.
Fazendo Escolhas
Os programas escritos nos captulos anteriores eram formados
exclusivamente por instrues e expresses, o equivalente a frases
imperativas da lngua portuguesa. Porm, ningum, nem mesmo o
mais exaltado ditador vitalcio, pode passar a vida inteira apenas
dando ordens. Na vida real, as pessoas precisam fazer escolhas. A
ferramenta principal do Visual Basic para tratamento de escolhas a
instruo If.

A Instruo If
Suponhamos que voc esteja ensinando a um amigo como obedecer
aos sinais de trfego. Em particular, o que deve ser feito quando se
encontra um sinal de Ateno. Voc pode explicar o sinal de Ateno
da seguinte forma: "Reduza a velocidade para 20 Km/hora. Caso no
venha ningum, continue o seu caminho; do contrrio, pare e deixe o
carro passar". Em Visual Basic, essas instrues poderiam ser
transformadas em:
Figura 6.1
A forma clssica da instruo If especifica uma escolha entre duas
opes. Na vida real, costume escolher-se uma alternativa, deixando
de lado a outra e suas possveis conseqncias. Como programador,
necessrio seguir todas as alternativas possveis, at suas ltimas
conseqncias.
Como programador, voc tem de orientar o computador. Como voc
no sabe exatamente quais condies o programa encontrar a cada
momento quando estiver em processamento, torna-se necessrio
incluir instrues para tratamento de todos os casos. No exemplo do
sinal de Ateno, voc no sabe quando seu amigo encontrar ou no
carros trafegando, assim fornea as instrues adequadas para as
duas possibilidades. Na codificao de seu programa, aplique um
mecanismo conhecido como desvio condicional, usando a instruo If.
Eis aqui a sintaxe da instruo If em Visual Basic:
If expresso booleana Then
[Instruo] ...
Else
[Instruo] ...
End If
A palavra-chave If seguida por uma expresso booleana, que (como
voc se recorda do Captulo 4) uma expresso avaliada como
Verdadeira (True) ou Falsa (False). Isso um outro exemplo da
representao do mundo em termos binrios: True ou False, Desvio
esquerda ou direita, If ou Else. Caso a expresso booleana seja
True, todas as instrues que seguem a palavra Then at a palavra-
chave Else sero executadas. (As reticncias na descrio da sintaxe
indicam que pode haver mais de uma instruo.) O programa ento
saltar as prximas instrues, continuando a sua execuo aps as
palavras-chave End If. Se a expresso booleana for False, as
instrues imediatamente aps a palavra Then sero saltadas.
Quando for encontrada a parte Else da instruo If, o programa
continuar a executar as instrues. Os dois possveis caminhos de
execuo so mostrados a seguir:
Figura 6.2
A instruo If uma instruo composta - isto , apesar de ser
avaliada como um todo, ela contm vrias instrues dentro de si. A
maioria dos programadores costuma colocar essas instrues internas
recuadas, para melhorar a sua visualizao. Observe como seria difcil
ler o primeiro exemplo se isso no fosse feito:
Figura 6.3
Se voc examinar a definio da sintaxe da instruo If, poder ver
que a parte Else da instruo opcional. Isso evita codificao
desnecessria quando no houver instrues para serem colocadas
para a clusula Else. Assim, estes dois fragmentos de programa so
equivalentes:
Figura 6.4
Mltiplas Escolhas
A instruo If permite ao seu programa tratar da escolha entre duas
opes. Mas como o seu programa pode tratar uma escolha entre
muitas opes? Vejamos como utilizar a instruo If para tratar
mltiplas escolhas.
A ttulo de exemplo, considere o problema de identificao de cada um
dos Trs Patetas. Obviamente, voc tem trs possibilidades de
escolha. Neste caso, o tipo de cabelo pode ser usado como
caracterstica de identificao. Voc pode construir um teste simples,
como mostrado na Figura 6.5.
Figura 6.5
O uso da instruo If para construo de uma seleo mltipla pode
trazer lembrana o jogo das Vinte Questes, onde uma pessoa
pensa em alguma coisa de um tipo previamente combinado e as
outras pessoas tentam adivinhar de que se trata, fazendo perguntas
que recebem sempre uma resposta do tipo "Sim" ou "No". A cada
resposta, certas caractersticas vo sendo eliminadas, e o processo de
adivinhao se encaminha para uma certa direo.
A codificao a ser implementada em Visual Basic para fazer o teste
dos Trs Patetas, da Figura 6.5, mostrada aqui; a segunda
instruo If uma instruo aninhada integralmente contida na
primeira:
lf Cabelo = "Nenhum" Then
Pateta = "Curly"
Else
lf Cabelo = "Preto" Then
Pateta = "Moe"
Else
Pateta = "Larry"
End If
End If
Como o aninhamento de mais de duas ou trs instrues If torna-se
complexo, o Visual Basic oferece uma variante para a clusula Else,
chamada ElseIf. A clusula ElseIf combina a clusula Else com a
funcionalidade de outra instruo If. Veja a seguir uma verso da
codificao precedente, refeita para usar ElseIf. Ao lado, encontra-se
a sintaxe completa para as instrues If do Visual Basic.
Figura 6.6
Conforme indicado pela sintaxe da instruo, a clusula ElseIf pode
ser repetida muitas vezes, eliminando a necessidade de colocao de
mltiplas instrues If aninhadas.
O Aplicativo Caa-nqueis
Para explorar um pouco mais a instruo If, vamos construir uma
simulao de um caa-nqueis. Com o boto de comando fazendo o
papel de uma alavanca, o programa Caa-nqueis exibir trs cones
aleatoriamente toda vez que o boto de comando for acionado. Caso
os trs cones sejam iguais, o usurio vence. O programa manter um
registro das vitrias do jogador.
Voltaremos a usar aqui os cones Copas, Paus, Ouro e Espadas,
encontrados, respectivamente, nos arquivos HEART.ICO, CLUB.ICO,
DIAMOND.ICO e SPADE.ICO no diretrio \PacoteVB\Icones\Misc do
primeiro cd deste produto. O programa pegar aleatoriamente um
desses cones para cada uma das trs janelas do visor. Cada jogada
custar R$ 1, 00. Se os trs cones combinarem, o jogador ganhar
R$ 10, 00. Se os trs forem de Ouro, o jogador ganhar R$25,00.
Pensando a Respeito
Reveja com rigor todas as condies, quando estiver
programando com instrues If. preciso ser cuidadoso para
no incluir acidentalmente opes inesperadas ou, inversamente,
excluir condies que deveriam ser tratadas. No seja precipitado
em assumir que o seu primeiro impulso para escrever uma
clusula Else cubra somente as alternativas possveis.
A codificao escrita para identificar os Trs Patetas, por
exemplo, assume que, se Curly e Moe foram eliminados, a nica
possibilidade que resta Larry. Entretanto, como sabem os
estudantes da arte cinematogrfica, realmente h outras
possibilidades, tais como Shemp ou Curly-Joe. (Para quem no
est familiarizado com a arte cinematogrfica, o trio Moe Howard,
Larry Fine e Curly Howard protagonizou a maioria dos filmes dos
Trs Patetas. Entretanto, aps Curly sofrer um acidente, os filmes
posteriores foram feitos com outras pessoas no papel do terceiro
Pateta.)
Para um exemplo semelhante desse tipo de erro, imagine o teste
da cor de um elemento. Caso no seja branco ou vermelho,
podemos assumir que seja azul. Isso funciona se voc sabe que
todos os elementos a serem testados pertencem bandeira
americana; do contrrio, o seu teste poder tornar-se invlido.
Para desenhar a interface do programa, crie um novo projeto. Inclua
trs controles de imagem na parte superior do form, que sero usados
como o visor do caa-nqueis. Abaixo dos controles de imagem,
coloque o boto de comando que servir como alavanca da mquina.
esquerda, acrescente um campo de rtulo para exibir as vitrias do
jogador; direita, crie outro boto de comando que permitir ao
jogador sair do jogo. Finalmente, para acomodar os quatro cones que
sero usados, inclua mais quatro controles de imagem na parte
inferior do form. O seu form dever parecer-se com o mostrado
na Figura 6.7.
Para configurar os quatro controles de imagem inferiores, inicie
selecionando o mais esquerda e configurando a sua propriedade
Name para ImgCopas. A seguir, configure a propriedade Picture,
selecionando Picture na lista de propriedades, e d um clique no boto
de reticncias, ao lado da propriedade. Na caixa de dilogo Load
Picture, escolha o arquivo HEART.ICO a partir do subdiretrio
\PacoteVB \ Icones\Misc no primeiro cd deste produto. Repita esse
processo para os outros trs controles de imagem, nomeando-os
como lmgPaus, lmgOuros e lmgEspadas e configurando as suas
propriedades Picture de forma a carregar os arquivos CLUB.ICO,
DIAMOND.ICO e SPADE.ICO, nesta ordem.
Figura 6.7 O projeto inicial do form para o aplicativo Caa-nqueis.
Agora, configure as propriedades dos elementos de exibio, como
mostrado na Figura 6.8. O seu form agora deve parecer-se com
a Figura 6.9.
Figura 6.8 Configurao de propriedades para o aplicativo Caa-
nquel.
Para iniciar a codificao do programa, d um clique duplo no form, para
abrir a janela de cdigo. Inclua as seguintes linhas de cdigo na seo
de declaraes gerais:
Const COPAS% = 1
Const PAUS% = 2
Const OUROS% = 3
Const ESPADAS% = 4
Dim Vitrias As Currency
Os inteiros de 1 a 4 mapearo os nmeros gerados aleatoriamente
para os cones apropriados. As declaraes de constantes permitem-
lhe usar os nomes COPAS, PAUS, OUROS e ESPADAS no
programa, simplificando sua leitura e compreenso. A varivel
Vitrias, que tambm foi declarada neste ponto, ser usada para
armazenar as vitrias do jogador.
Figura 6.9 O desenho do form completo para o aplicativo Caa-nquel.
Agora, selecione Form na caixa Object da janela de cdigo e
selecione o procedimento Load na caixa de procedimentos. Inclua
estas linhas de cdigo, que sero executadas quando o form for
carregado pela primeira vez (isto , no incio do programa):
Private Sub Form_Load ()

Randomize
Vitrias = 0
End Sub
A instruo Randomize avisa ao Visual Basic para alternar os
nmeros produzidos pelo gerador de nmeros aleatrios; sem essa
instruo, haveria uma repetio dos nmeros gerados toda vez que o
programa fosse executado. Uma vez que o jogador ainda no
comeou a jogar, voc deve zerar a varivel Vitrias
Veja a seguir o cdigo para o boto Sair:
Private Sub btnSair_Click ()
End
End Sub
O procedimento para o boto Jogada apresentado na Figura 6.10.
Cada uma das variveis locais P1, P2 e P3 armazenar o nmero
aleatrio que ser usado para selecionar os cones que aparecero
nos controles de imagem superiores (ImgVisor1, lmgVisor2 e
ImgVisor3). A varivel Pagar conter o resultado de cada jogada (um
giro do caa-nqueis).
Figura 6.10 O procedimento btnJogada_Click para o aplicativo Caa-
nquel.
Em primeiro lugar, o programa abate R$1,00 do total de vitrias, ou
seja, o custo de uma jogada. A seguir, so gerados trs nmeros
aleatrios. A frmula Int(n * Rnd + 1) usa a funo interna do Visual
Basic Rnd para recuperar um inteiro aleatrio dentro da faixa de 1 a n.
Aps isso, o programa examina o nmero inteiro gerado e
armazenado em P1 e configura a propriedade Picture do controle
ImgVisor1, para copiar a imagem de um dos cones predefinidos na
parte inferior do form. Esse processo repete-se para os outros dois
visores, ImgVisor2 e lmgVisor3.
Uma vez configurado o visor do caa-nqueis, o programa verifica se
ocorreu alguma combinao vencedora. Se os trs nmero forem
iguais, o jogador vence. Alm disso, o programa verifica se a
combinao vencedora composta por ouros. A varivel Pagar
ento assinalada para 10 ou 25, de acordo com a combinao que
ocorreu. Caso o jogador no tenha vencido, a varivel Pagar zerada.
Finalmente, o programa adiciona o valor contido na varivel Pagar ao
total acumulado do jogador e exibe o total apurado no rtulo. A funo
Format do Visual Basic assegura que o total seja apresentado em
reais e centavos de reais.
Ao fechar a janela de cdigo, voc estar pronto para executar o
aplicativo. Entretanto, antes de faz-lo, redimensione o form para
esconder os quatro cones predefinidos, conforme mostrado na Figura
6.11. Eles continuaro a fazer parte de seu aplicativo, mas j no
aparecero na interao com o usurio.
Voc se sente com sorte? Pressione F5 e faa algumas tentativas.
Quando terminar o jogo, pode ser que voc queira salvar esse
aplicativo para retornar mais tarde a ele.
Figura 6.11 O form redimensionado para o aplicativo Caa-nquel.
Uma alternativa a ElseIf: Select Case
No aplicativo Caa-nquel, voc fez uso da palavra ElseIf para criar
testes de mltiplas possibilidades. Uma outra instruo do Visual
Basic lhe serviria ao mesmo propsito e com maior riqueza de
recursos e clareza. Trata-se da instruo Select Case.
A instruo Select Case uma estrutura de tomada de deciso que
obedece a sintaxe abaixo:
Select Case expressodeteste
[Case listadeexpresses
[instrues]] ...
[Case Else
[instrueselse]]
End Select
Onde:
expressodeteste qualquer expresso a ser testada quanto ao seu
valor.
listadeexpresses lista de uma ou mais expresses numa das
seguintes formas de
arranjo: expresso; expresso To expresso; Is operadordecompara
o expresso. A palavra To especifica um intervalo de valores. Se
voc usa a palavra To, a expresso de menor valor deve vir antes do
To. Use a palavra Is com operadores de comparao ( exceto Is e
Like) para especificar um intervalo de valores. Se no for fornecida, a
palavra Is automaticamente inserida.
Instrues pode ser uma ou mais instrues executadas se o valor da
expresso sendo testada conferir com o valor de alguma das
expresses da lista de expresses na clusula Case.
Instrueselse so opcionais. Representam uma ou mais instrues
que sero executadas caso nenhuma das clusulas Case contiver
uma expresso cujo valor confira com o da expresso sendo testada.
Se quiser utilizar Select Case no aplicativo Caa-nquel, voc pode,
por exemplo, substituir os testes das variveis P1, P2 e P3 pelo
seguinte cdigo:
Select Case P1
Case COPAS:
ImgVisor1.Picture = ImgCopas.Picture
Case PAUS:
ImgVisor1.Picture = ImgPAUS.Picture
Case OUROS:
ImgVisor1.Picture = ImgOUROS.Picture
Case ESPADAS:
ImgVisor1.Picture = ImgESPADAS.Picture
End Select
Select Case P2
Case COPAS:
ImgVisor2.Picture = ImgCopas.Picture
Case PAUS:
ImgVisor2.Picture = ImgPAUS.Picture
Case OUROS:
ImgVisor2.Picture = ImgOUROS.Picture
Case ESPADAS:
ImgVisor2.Picture = ImgESPADAS.Picture
End Select
Select Case P3
Case COPAS:
ImgVisor3.Picture = ImgCopas.Picture
Case PAUS:
ImgVisor3.Picture = ImgPAUS.Picture
Case OUROS:
ImgVisor3.Picture = ImgOUROS.Picture
Case ESPADAS:
ImgVisor3.Picture = ImgESPADAS.Picture
End Select
Tornando-se Repetitivo
A habilidade de escrever instrues de assinalamento, e fazer
escolhas usando a instruo If teoricamente lhe d as ferramentas
necessrias para criar qualquer tipo de programa. Porm, muitas
tarefas so mais fceis em teoria do que na prtica. Considere o
problema de imprimir todos os nmeros do intervalo de 1 a 1000. A
soluo bvia, escrever um programa contendo 1000 instrues Print
(Print 1, Print 2, Print 3 e assim por diante), seria extremamente
fatigante. Felizmente, o Visual Basic oferece um meio melhor.
A instruo Do do Visual Basic pode processar repetidamente um
conjunto de instrues. Eis a sintaxe mais simples para essa
instruo:
Do
[instruo] ...
Loop
A palavra-chave Do marca o incio de uma instruo composta, que
inclui todos os comandos at a palavra-chave Loop. As instrues so
executadas em ordem at que a palavra-chave Loop seja encontrada;
nesse ponto, a execuo comea novamente no inicio do bloco com a
instruo Do.
O conjunto de instrues que se repete chamado de lao. Quando
um programa est executando repetidamente esse conjunto de
instrues, costuma-se dizer que est em looping. O nome lao
provm do diagrama circular de fluxo de programa mostrado
na Figura 6.12
O lao mostrado na Figura 6.12 um lago infinito, isto , o Visual
Basic executar a instruo composta para sempre. E claro que,
normalmente, voc desejar que o programa interrompa a estrutura de
lao em algum ponto, passando a executar as instrues que existem
aps o lao. O Visual Basic permite-lhe implementar isso de vrias
formas.
Figura 6.12 Um diagrama de lao Do.
Voc pode anexar uma clusula While (enquanto) instruo Do ou
instruo Loop. O exemplo de impresso dos nmeros de 1 a 1000
tratado mais facilmente com um lao Do While, como mostrado a
seguir:
Contador = 1
Do While Contador <= 1000
Print Contador
Contador = Contador + 1
Loop
A varivel Contador recebe o valor 1. Ento, a instruo Do While, que

executada "enquanto" o Contador for menor ou igual a 1000, envolve
uma
instruo Print e uma instruo de assinalamento. Quando o lao se
encerrar, a execuo continuar com as instrues do programa que
se seguem palavra-chave Loop.
A palavra-chave While deve ser seguida por uma condio com o
formato de uma expresso booleana. Caso a expresso seja False, as
instrues que a seguem, at a palavra-chave Loop, sero saltadas e
a execuo do programa prosseguir com as instrues que vm aps
a instruo Loop. Neste exemplo, Contador verificado no incio de
cada lao, inclusive no primeiro. (Se Contador tivesse sido inicializado
com 5000, nenhuma das instrues dentro do lao seria executada.)
Observe que, se a instruo Contador = Contador + 1 no tivesse sido
includa, a expresso booleana seria sempre True (pois Contador
permaneceria com o valor 1) e o lao seria eternamente executado. A
criao de laos infinitos um erro comum, mesmo entre os
programadores mais experientes. Lembre-se de que, em Visual Basic,
voc pode sempre pressionar Ctrl-Break para interromper um
programa que est sendo executado e sair do lao infinito.
A palavra-chave While tambm pode ser associada instruo Loop,
obtendo-se um efeito um pouco diferente, como mostrado neste
cdigo:
Do
Password = lnputBox ("Digite a senha")
Loop While Password <> "Mussum"
A colocao da clusula While no final do lao assegura que as
instrues contidas no lao sejam executadas pelo menos uma vez,
pois o teste de terminao ocorre aps a palavra-chave Loop. Neste
exemplo, a caixa de dilogo solicitando ao usurio a digitao da
senha ser exibida repetidamente, at que o usurio introduza a
palavra certa.
Finalmente, para melhorar a legibilidade de seu programa, voc pode
usar a palavra-chave Until (at que) em vez de While. O uso de Until
inverte a lgica da condio. Compare os dois exemplos anteriores,
usando cada uma das alternativas.
Exemplos usando While
Contador = 1
Do While Contador <= 1000
Print Contador
Contador = Contador + 1
Loop
Do
Password = lnputBox("Digite a Senha")
Loop While Password <> "Mussurn"
Exemplos usando Until
Contador = 1
Do Until Contador > 1000
Print Contador
Contador = Contador + 1
Loop
Do
Password = lnputBox("Digite a Senha")
Loop Until Password = "Mussum"
Eis a sintaxe completa para a instruo Do no Visual Basic:

Teste no incio do lao

Do [While | Until] expresso
[Instruo]
Loop
Teste no final do lao
Do
[Instruo]
Loop [While I Until] expresso
O Aplicativo Banco
Vamos usar o conhecimento recm-adquirido para escrever um
programa que servir de banco privado, contendo alguma informao
diferente. Quando o usurio introduzir em uma caixa combinada os
montantes de todos os cheques emitidos durante um certo perodo, o
programa avisar ao usurio sobre o valor mdio por cheque. Para
encontrar essa mdia, o programa ir acumular todos os valores e
dividi-los pela quantidade de cheques - uma tarefa perfeita para um
lao Do While.
Crie um novo projeto no Visual Basic. A interface do programa requer
uma caixa combinada para armazenar o valor de todos os cheques,
um boto de comando para calcular a mdia e um rtulo para exibir a
mdia. Desenhe um form contendo esses objetos, configurando as
suas propriedades de acordo com a Figura 6.13. O seu form dever
parecer-se com o mostrado naFigura 6.14.
Figura 6.13 Configurao de propriedades para o aplicativo Banco.
Figura 6.14 Projeto do form para o aplicativo Banco.
Agora, voc deve modificar ligeiramente a caixa combinada.
Normalmente, uma caixa combinada oferece uma lista de opes para
o usurio. Neste caso, voc ir us-la para construir uma lista de
entradas do usurio. Cada vez que o usurio introduzir um valor na
parte de texto da caixa combinada, o programa adicionar o valor aos
itens da parte de lista. Para fazer isso, ser necessrio usar um
procedimento de evento que foi citado no Captulo 5, aquele baseado
no evento KeyPress.
O evento KeyPress ocorre toda vez que o usurio pressiona uma
tecla. D um clique duplo na caixa combinada e selecione KeyPress a
partir da caixa de procedimentos na janela de cdigo. A declarao
desse procedimento dever ser a seguinte:
Private Sub cboEntrada_KeyPress (KeyAscii As Integer)
End Sub

A varivel chamada de KeyAscii definida dentro dos parnteses.
Essa varivel um parmetro. Os parmetros funcionam como
variveis locais, exceto pelo fato de serem inicializados pelo
procedimento chamador e no pelo procedimento que contm a sua
declarao. (Parmetros em procedimentos so abordados em
maiores detalhes no Capitulo 7.) Por enquanto, basta saber que o
evento KeyPress ocorre com uma varivel predefinida chamada de
KeyAscii. Quando a execuo do procedimento iniciada, o valor de
KeyAscii o cdigo ASCII correspondente ao caractere digitado pelo
usurio. Por exemplo, se o usurio pressionar a tecla A, o valor de
KeyAscii ser 65. A digitao de a gera o valor 97. Dar um clique na
tecla 3 gera o valor 51.
A codificao do procedimento KeyPress pode modificar a varivel
KeyAscii. Caso isso venha a ser feito, o Visual Basic incluir o novo
caractere na caixa combinada, em vez daquele originalmente
introduzido pelo usurio. Experimente essa caracterstica. Defina o
procedimento KeyPress como segue:
Private Sub cboEntrada_KeyPress (KeyAscii As Integer)
lf KeyAscii = 83 Or KeyAscii = 84 Then
KeyAscii = 42
End lf
End Sub
Pressione F5 para iniciar a execuo do aplicativo e digite
TESTANDO na parte de texto da caixa combinada. As letras S e T
sero substitudas por asteriscos. (O cdigo ASCII para um asterisco
42.) Deixe o aplicativo e edite o procedimento
KeyPress novamente, como mostrado abaixo:
Private Sub cboEntrada_KeyPress (KeyAscii As Integer)
Se a tecla for Enter
lf KeyAscii = 13 Then
Inserir nova entrada
cboEntrada.AddItem cboEntrada.Text
Limpar a parte de texto
cboEntrada.Text = ""
Descartar a tecla pressionada
KeyAscii = 0
End lf
End Sub
Esse procedimento foi configurado para detectar o pressionamento de
Enter (cdigo ASCII13). Se a tecla pressionada pelo usurio no for
Enter, o Visual Basic simplesmente inserir o caractere digitado na
parte de texto da caixa combinada. Entretanto, quando o programa
detecta a tecla Enter, esse procedimento insere a parte de texto da
caixa combinada como um novo item na parte de lista. Depois, apaga
a entrada da parte de texto e configura KeyAscii para 0. Uma vez que
0 o cdigo ASCII para caracter nulo, o Visual Basic simplesmente
ignorar esse caractere.
Calculando a Mdia
Aps o usurio introduzir todos os valores, ele poder dar um clique
no boto Mdia para fazer com que o programa calcule o valor mdio.
D um clique duplo no boto de comando Mdia e introduza o
seguinte cdigo:
Figura 6.15
A instruo Dim define duas variveis locais: Atual, para ser usada
como indexador para os itens da caixa de lista ou caixa combinada; e
Total, que armazena a somatria dos valores. Total ento
inicializada como 0, e o indexador de itens configurado para 0. (Os
itens em uma caixa de lista ou caixa combinada so identificados por
meio dos indexadores 0, 1, 2 e assim por diante.)
A instruo Do While direciona o Visual Basic para continuar o
processamento enquanto o indexador for menor que a quantidade
total de itens. (No se pode esperar que o programa encontre o item
21 se apenas 7 itens tiverem sido includos.) A prxima instruo
contm a expresso cboEntrada.List(Atual), que especifica um item da
lista. Como os itens de caixas de lista e de caixas combinadas so
armazenados como texto, a funo Val do Visual Basic usada para
converter o texto para valor numrico. Analogamente, a funo Str$
converte o valor da mdia calculada para uma string de texto antes do
programa exib-lo no rtulo.
Agora, voc pode processar o programa Banco. Digite uma srie de
valores na parte de texto da caixa combinada, pressionando Enter a
cada valor. Quando tiver introduzido a lista completa, d um clique no
boto Mdia. Seus resultados devem ser semelhantes aos mostrados
na Figura 6.16.
Figura 6.16 Processando o aplicativo Banco.

Laos Que Contam
A instruo For uma instruo especial em Visual Basic que trata de
mecanismos de laos, fazendo contagem em ordem crescente ou
decrescente. Ela tem a seguinte sintaxe:
For varivel = primeiroValor To ltimoValor [Step Incremento]
[Instruo] ...
Next varivel
A instruo For cria um lao no qual a varivel contadora inicializada
com o valor de primeiroValor, sendo ento incrementada toda vez que
o programa executa o lao pelo valor incremento at atingir o valor
ltimoValor. Se a clusula Step for omitida, ser assumido incremento
1. A menos que o valor do incremento seja
negativo, primeiroValor dever ser menor do queltimoValor. Caso
seja usado incremento negativo, primeiroValor dever ser maior do
que ltimoValor.
O lao For pode ser escrito por meio de uma
instruo While (enquanto), porm mais comum usar o lao For, por
sua simplicidade. A sintaxe dos laos While equivalentes mostrada
aqui:
Figura 6.17
Repare que a expresso To no lao For equivalente comparao
menor ou igual no lao While, com incremento positivo, e equivalente
comparao maior ou igual, quando o incremento negativo. Isso
significa que o valor da varivel ao final da execuo do lao poder
ser diferente de ltimoValor. Como um exemplo, veja este lao e a
sada que ele produz:
For Contador = 1 To 10 Step 4
Print Contador
Next Contador
Sada
1
5
9
Se desejar, voc pode modificar a codificao do programa Banco
para usar
o lao For. Compare as suas modificaes com esta verso (que
mostra as linhas
alteradas em destaque):
Figura 6.18
Ao escrever a sua verso da codificao, voc configurou o valor final
do lao For para cboEntrada.ListCount - 1? Essa mudana, apesar de
importante, costuma ser esquecida com freqncia. Lembre-se de que
o Visual Basic numera os itens de uma caixa combinada, comeando
pelo 0, isto , trs itens so numerados como 0, 1 e 2. A verso
original do cdigo usa um lao com uma comparao menor do que. O
lao For usa menor ou igual.
Essas diferenas sutis podem conduzir a erros, fazendo com que o
lao seja executado uma vez a mais ou a menos. At mesmo os
programadores mais experientes cometem esses tipos de engano;
assim, preocupe-se em testar o seu programa cuidadosamente. Por
exemplo, quando eu criei o programa Banco pela primeira vez, ele foi
processado usando os valores 1, 2, 3 e 4. Entretanto, como sabia que
a mdia deveria ser 2,5, eu percebi que alguma coisa estava errada.
Quando um programa no produz nenhum resultado, imediatamente
descobre-se que est errado. Entretanto, quando um programa gera
um resultado, somos quase sempre tentados a assumir que ele esteja
correto.
Espere o Inesperado
Ainda que um programa produza um resultado correto nos primeiros
testes, no se pode assumir que estar sempre correto. Um exemplo
disso o programa Banco. Esse programa falhar se o usurio der um
clique no boto Mdia sem introduzir algum valor na caixa combinada.
Voc pode achar que ningum faria uma coisa dessas. Porm, parte
de seu trabalho como programador entender que tudo o que pode
acontecer provavelmente acontecer. E voc deve antecipar-se a tais
eventos da melhor maneira possvel.
No programa Banco, o lao Do While (ou o lao For, se voc fez as
alteraes) apresenta um problema no clculo da mdia. Se no
houver algum item na caixa combinada, a expresso
Total/cboEntrada.ListCount causar uma diviso por zero. Nesse
caso, o Visual Basic oferece um tratamento de erro, exibindo uma
caixa de dilogo que diz Division by zero. Isso, porm, no serve de
conforto para o usurio. Alm disso, alguns sistemas (tais como o MS-
DOS) simplesmente encerram a execuo de um programa que tente
fazer uma diviso por zero. Sem dvida melhor que voc, como um
bom programador, antecipe-se a esse erro, em vez de acreditar que o
sistema ir trat-lo de alguma forma (possivelmente indesejvel).
Voc pode melhorar o programa Banco de vrias formas. Uma
inserir o seguinte cdigo no incio do procedimento btnMdia_Click:
If cboEntrada.ListCount = 0 Then
Exit Sub
End If
Esse cdigo far com que o programa simplesmente ignore o clique
do mouse no boto Mdia quando inadequado, encerrando o
procedimento. Dar a impresso de que o boto Mdia no est
respondendo, o que pode confundir o usurio. Se estiver preocupado
com essa possibilidade, voc pode exibir uma caixa de dilogo, como
o cdigo mostrado abaixo:
If cboEntrada.ListCount = 0 Then
MsgBox "No h entradas para Mdia"
Exit Sub
End If
Usando Matrizes
No programa Banco, voc usou a varivel cboEntrada.List, que uma
matriz. Variveis matriz podem conter mltiplos valores. Isso pode
parecer-se um pouco com os tipos definidos pelo usurio no Captulo
3, porm no a mesma coisa. Uma varivel de tipo definido pelo
usurio contm um nmero fixo de componentes, cada um dos quais
com nomes e tipos de dados diferentes. Em uma matriz, todos os
elementos tm o mesmo tipo e cada elemento individual numerado
seqencialmente. Para fazer referncia a um campo de um tipo
definido pelo usurio, voc usa o nome da varivel do tipo seguido
pelo nome do campo, tal como em Siegmund.Cor. Para se referir ao
elemento de uma matriz, voc usa o nome da varivel matriz seguido
pelo nmero do elemento colocado entre parnteses, tal como
cboEntrada.List(3). O nmero que especifica um elemento de uma
matriz chamado de ndice. Os valores de ndices so sempre
inteiros. O Visual Basic armazena o valor dos elementos de matrizes
em memria, por ordem do ndice, comeando pelo elemento 0. A
Figura 6.19 compara o armazenamento de memria para variveis
simples e tipos definidos pelo usurio com o armazenamento de
memria para matrizes.
Figura 6.19 Alocao de memria para variveis simples, registros e
matrizes.

Reservando Memria para Matrizes
O Visual Basic permite-lhe criar matrizes para armazenar qualquer tipo
de dado, incluindo tipos de dados definidos pelo usurio. O programa
Banco usa uma matriz de strings (cboEntrada.List) que uma
propriedade predefinida de caixa combinada. Para criar uma matriz e
reservar memria para ela, deve-se usar uma declarao de varivel.
A exemplo das outras variveis, as matrizes so declaradas por meio
da instruo Dim. Eis a sintaxe para uma declarao padro de matriz:
{ Dim | Private | Public } name (tamximo) [As tipo]
O valor entre parnteses (tamximo) chamado de dimenso da
matriz; ele indica para o Visual Basic a quantidade de memria a ser
reservada para a matriz. A declarao cria uma matriz com ndices
que vo de 0 a tamximo - Por exemplo, a Instruo Dim X(3) As
Integer declara uma matriz com tamximo igual a 3, criando uma
matriz com quatro elementos: X(0), X(1), X(2) e X(3).
Fazendo Experincias com Matrizes
Matrizes so incrivelmente teis, permitindo-lhe escrever programas
mais genricos e menos dependentes de tipos especficos de dados.
Para demonstrar, considere nossos amigos do Captulo 3, as doninhas
de topete da Floresta da Baviera.
Para avaliar sua capacidade como criador de doninhas, voc decide
calcular o tamanho mdio das doninhas, para compar-lo com a
mdia nacional. A expresso a ser usada para este clculo
(Siegmund.Tamanho + Sieglinda.Tamanho + Siegfried.Tamanho ) / 3.
Naturalmente, qualquer programa que incorpore essa expresso ser
vlido apenas para doninhas especificas. Cada vez que a sua
populao de doninhas aumentar, ser preciso modificar o programa.
Voc precisa de uma forma mais genrica para armazenar
informaes.
Em vez de armazenar as informaes sobre cada doninha em uma
varivel separada, voc pode alterar a descrio do tipo (definida
anteriormente) para conter o nome da doninha. O novo tipo de dados
DoninhaTFB mostrado a seguir.
Type DoninhaTFB
Nome As String
Cor As String
Peso As Integer
Tamanho As Integer
Data_nascimento As Date
Cor_topete As String
Compr_topete As Integer
End Type
Agora, voc pode armazenar todas as informaes sobre as doninhas
coletivamente em uma varivel matriz Doninhas. Voc pode declarar a
varivel matriz Doninhas com a instruo Dim Doninhas(20) As
DoninhaTFB. Uma vez que essa matriz pode armazenar informaes
sobre diversas doninhas (21 para ser exato), voc precisa declarar
outra varivel para conter a quantidade de doninhas que existe no
momento: use a instruo Dim QtdDoninhas As Integer.
Depois de declarar as variveis, voc pode armazenar dados sobre
doninhas, quase da mesma forma que foi usada para armazen-los
em variveis separadas. As instrues que se seguem mostram como
alguns desses valores podem ser inicializados:
QtdDoninhas = 3
Doninhas(0).Nome = "Siegmund"
Doninhas(0).Cor = "Marrom"
Doninhas(0).Peso = 300
Doninhas(1).Nome = "Sieglinda"
Doninhas(1).Peso = 250
Doninhas(2).Nome = "Siegfried"
Doninhas(2).Peso = 150
Agora, assumindo que todas as informaes sobre as doninhas;
tenham sido armazenadas, voc pode escrever um programa para
calcular o tamanho mdio, independentemente da quantidade de
doninhas que voc tenha. Como seria de se esperar, a codificao se
parece com a usada no programa Banco:
Dim Atual As Integer, Total As Integer, Mdia As Single
Total = 0
For Atual = 0 To QtdDoninhas - 1
Total = Total + Doninhas(Atual).Tamanho
Next Atual
Mdia = Total / QtdDoninhas
Esse cdigo continuar a ser til tambm quando a populao de
doninhas se modificar. O fator-chave para ser bem-sucedido em
programao examinar o problema para determinar quando pode ou
no ser generalizado e ento escrever um programa para resolver
casos mais gerais, em vez de um programa que tenha de ser
constantemente modificado medida que as condies se alterem.
Usando Laos com Matrizes
Confirmando o que os programas simples deste captulo devem ter-lhe
sugerido, matrizes e laos so to complementares quanto mo e
luva. Operaes como clculo de totais, de mdias, achar valores
mximos e mnimos prestam-se muito bem ao processamento
matricial. Todas essas operaes precisam examinar a matriz
completa. Outras operaes, como procura, examinam apenas alguns
elementos de uma matriz.
Considere a matriz das doninhas. Agora que as informaes vitais
esto armazenadas anonimamente, voc no pode usar uma varivel
como Siegmund para extrair dados de uma certa doninha. Para isso,
necessrio pesquisar a matriz at encontrar a doninha cujo elemento
Nome seja igual a Siegmund. Por exemplo, se voc quiser imprimir o
peso de Siegmund, o processo mais simples seria parecido com:
Figura 6.20
Infelizmente, esse programa ter de examinar cada um dos elementos
da matriz, mesmo que Siegmund seja o primeiro elemento. Esse
problema no to srio, enquanto a populao de doninhas for
pequena, mas a pesquisa poder demandar um tempo significativo se
voc tiver algumas centenas de doninhas.
necessrio modificar a condio do lao para terminar quando a
doninha desejada for achada. Voc pode escrever esse lao de duas
formas diferentes. A primeira reformular o lao, tratando-o com uma
instruo Do While na qual a condio de finalizao leve em
considerao tanto o final da matriz quanto o prprio fato de encontrar
a doninha.
Figura 6.21

Convertendo o lao For para Do While, torna-se possvel definir um
teste de condio mais preciso. Esse lao ser encerrado quando a
varivel W ultrapassar o valor mximo, ou ento quando na
varivel Encontrado for armazenado um valor diferente de -1 (o que
acontece quando for achado o elemento Siegmund).
O mtodo alternativo consiste em manter o lao For, mas interromper
o processamento quando o elemento desejado for encontrado. O
Visual Basic oferece a instruo Exit com esta finalidade:
Figura 6.22
Ao atingir a instruo Exit, a execuo ser imediatamente transferida
para a instruo seguinte instruo Next W.
As duas alternativas so aceitveis. A primeira tem a vantagem de
estabelecer explicitamente as condies de encerramento do lao,
simplificando a compreenso do cdigo do programa. O segundo
mtodo ligeiramente mais eficiente, pois o lao no tem de executar
um teste adicional sobre o contedo da varivel Encontrado a cada
iterao do lao. Quando o elemento procurado achado, o lao
termina. Entretanto, a instruo Exit que termina o lao encontra-se
"perdida" no meio das instrues, podendo passar despercebida para
algum que esteja lendo o programa. Minha preferncia pessoal
pelo uso do mtodo mais eficiente.
As trs verses desse cdigo contm um problema comum: a
instruo Print. A codificao assume que tenha sido encontrado o
elemento procurado, mesmo que isso no tenha acontecido. A verso
correta deveria substituir a instruo Print pelo seguinte cdigo:
lf Encontrado = -1 Then
MsgBox "No foi encontrado"
Else
Print Doninhas(Encontrado).Peso
End If
Determinando o Tamanho da Matriz em Tempo de
Execuo
Ao escrever uma instruo Dim para declarar uma matriz, est-se
efetivamente preestabelecendo o tamanho da matriz. Pode ser que
voc conhea exatamente de que tamanho dever ser a matriz, ou
talvez saiba seu tamanho mximo. (Por exemplo, voc pode saber
que trabalhar com mais de 21 doninhas muito difcil.) Em tais casos,
uma matriz de tamanho fixo o ideal. O problema ocorre quando no
se conhece o tamanho da matriz. Suponha, por exemplo, que voc
deseje vender o seu programa de tratamento de doninhas para outras
pessoas. Como voc deve dimensionar a matriz ?
Voc pode simplesmente escolher um nmero arbitrariamente grande,
achando que ser suficiente, porm encontrar dois problemas com
essa abordagem. Primeiro, necessria muita memria; a instruo
Dim reserva memria para a matriz completa, esteja ou no sendo
usada. Em segundo lugar, voc est correndo o risco de vender o
programa para algum que queira criar mais doninhas do que voc
acha praticvel; o seu programa falhar e voc ter um cliente
insatisfeito.
Para resolver essa questo, o Visual Basic oferece a instruo ReDim,
que redimensiona uma matriz. ReDim no uma declarao, uma
instruo que pode ser executada vrias vezes durante um
processamento do programa. Para usar a instruo ReDim, voc deve
retirar a indicao da dimenso da matriz (tamximo) de seu
programa. Essa omisso avisar que se trata de uma matriz dinmica
(aquela cuja dimenso ou tamanho pode modificar-se). Examine esse
fragmento de programa que serve apenas para ilustrar como ReDim
funciona:
Dim Teste() As Integer 'Na seo de declaraes gerais
'Em algum procedimento de evento
For Tamanho = 10 To 50 Step 10
' Redimensiona a matriz teste
ReDim Teste(Tamanho) As Integer
Next Tamanho
Como a declarao original da matriz Teste no contm o componente
tamximo, o Visual Basic ir reconhec-la como uma matriz dinmica.
Em algum ponto, o lao For ser executado. Na primeira passagem do
lao, Teste redimensionada como uma matriz de 11 elementos (com
elementos numerados de 0 a 10). Na prxima passagem, Teste ser
redimensionada. como uma matriz de 21 elementos. Quando o lao
estiver completo, Teste estar dimensionada como uma matriz de 51
elementos. Eis a sintaxe da instruo ReDim:
ReDim [Preserve] varivel (tamxmo) [As tipo]
A sintaxe se parece com a da instruo Dim, exceto pelo fato de a
palavra reservada Preserve poder ser includa, e o valor tamximo
poder ser qualquer expresso inteira. Quando ReDim usada sem
Preserve, qualquer cpia existente da matriz ser desconsiderada, e
uma matriz completamente nova ser criada. Se voc usar ReDim
com Preserve, os valores armazenados na matriz antiga sero
preservados na nova matriz. Caso a nova dimenso da matriz seja
menor que a anterior, os valores com ndices maiores do que a nova
dimenso no sero preservados.
Usando Matrizes de Controles
Alm das matrizes de valores de dados, o Visual Basic permite-lhe
definir matrizes de objetos de controle, que so teis quando voc
estiver trabalhando com vrios controles que executem
essencialmente a mesma ao. As matrizes de controles
compartilham os mesmos procedimentos de eventos. Por exemplo, se
voc tiver uma matriz de trs botes de comando, ser chamado o
mesmo procedimento Click quando qualquer um dos botes receber
um clique.
O Visual Basic permite-lhe diferenciar os itens de uma matriz de
controles dentro do procedimento de evento compartilhado mediante a
passagem do valor do ndice como um argumento para o
procedimento. Vejamos como isso funciona. Em um form vazio, crie
dois botes de comando. Configure a propriedade Name dos dois
botes para btnTeste. Quando tentar configurar a propriedade Name
do segundo boto, o Visual Basic apresentar uma caixa de dilogo
que lhe pergunta se voc deseja ou no criar uma matriz de controles:
Figura 6.23
D um clique em Yes na caixa de dilogo. Agora, abra a janela de
cdigo, dando um clique duplo em qualquer um dos dois botes. Voc
ver que foi includo um parmetro Index em cada procedimento de
evento, conforme mostrado aqui:
Private Sub btnTeste_Click (Index As Integer)
End Sub
Esse procedimento de evento ser chamado quando for dado um
clique em qualquer um dos dois botes; a propriedade Index do boto
que recebeu o clique passada como um parmetro inteiro,
identificando o boto acionado.
Quando voc cria uma matriz de controles, o Visual Basic assinala um
ndice para cada objeto. Usando a janela de propriedades, examine a
propriedade Index para os dois botes de comando criados.
Figura 6.24
O primeiro boto tem a Propriedade Index igual a 0. O segundo tem o
valor 1. Voc pode modificar a propriedade Index em tempo de
desenvolvimento para dar valores especiais para a propriedade Index
desses botes. Essa propriedade no pode ser modificada enquanto o
programa estiver sendo processado.
Voc se refere a um elemento de uma matriz de controles,
especificando o nome da matriz seguido pelo valor da propriedade
Index, entre parnteses. Por exemplo, esse procedimento Click
configura os ttulos dos botes de comando no seu form, com o valor
da hora em que for dado um clique neles.
Sub btnTeste_Click (Index As Integer)
btnTeste(Index).Caption = Format(Now, "hh:mm:ss")
End Sub
As matrizes de controles so particularmente teis com botes de
opo. Voc pode definir todos os botes de opo dentro de uma
moldura como uma matriz de controles e ento usar a propriedade
Index ou a propriedade Caption em instrues de assinalamento. Por
exemplo, voc poderia usar o procedimento Click com uma matriz de
controles de botes de opo mostrada na Figura 6.25.
Private Sub OpcCor_Click (Index As Integer)
MinhaDoninha.Cor = OpcCor(Index).Caption
End Sub
Figura 6.25 Uma matriz de controle de botes de opo.
Uma simplificao interessante para a criao de matrizes de
controles consiste na criao do primeiro objeto de controle e na
configurao de suas propriedades. Depois, voc pode copiar e col-
lo tantas vezes quanto necessrio para criar controles adicionais que
tero o mesmo tamanho e com configuraes de propriedades
idnticas.
Identificando melhor os controles
Numa matriz de controles, todos os controles so referenciados pelo
ndice na matriz. Esta no uma forma de deixar claro para quem l o
cdigo qual controle qual. Uma forma de contornar isso utilizando
a propriedade Tag, comum a praticamente todos os controles. Tag
pode ser configurada para qualquer valor de string que voc queira.
Usando Tag para dar nomes aos controles, seus testes de
identificao dos controles dentro dos procedimentos de evento no
seriam pelo ndice, mas sim pelo valor da propriedade Tag. Exemplo:
Private Sub OpcCor_Click(Index As Integer)
Select Case OpcCor(Index).Tag
Case "Marrom"
instrues
Case "Preta"
instrues
Case "Cinza"
instrues
Case "Parda"
instrues
End Select
End Sub











Usando Procedimentos e Funes
no Visual Basic
A maioria dos procedimentos que voc escreveu nos captulos
anteriores foram procedimentos de eventos - isto , eles foram
projetados especialmente para responder a eventos especficos
disparados pelo usurio ou pelo sistema. Este captulo mostra-lhe
como escrever e usar procedimentos genricos (incluindo sub-
procedimentos e procedimentos de funes) que executam uma certa
tarefa quando so chamados explicitamente por outras instrues do
programa (em vez de serem disparados por um evento). Este captulo
explora tambm o uso de parmetros, que permite ao programa
passar certos valores para os procedimentos e funes que chama.
Como voc ver, at mesmo objetos do Visual Basic podem ser
passados como argumento. Finalmente, este captulo aborda alguns
procedimentos de eventos avanados, como aqueles que lhe
permitem rastrear o movimento do mouse e implementar recursos do
tipo arrastar e soltar.
Procedimentos Genricos
As primeiras aplicaes que voc escreveu tinham um controle de
fluxo linear: aps uma instruo ser executada, era executada a
prxima instruo seqencial. No capitulo anterior, voc comeou a
trabalhar com desvios condicionais (instrues If) e com laos, que
modificam a ordem na qual as instrues so executadas
Da mesma forma que laos, os procedimentos permitem que seu
programa execute um conjunto de procedimentos mais de uma vez.
Entretanto, em vez de executar repetidamente um conjunto de
instrues, os procedimentos permitem que voc agrupe instrues
num conjunto que possa ser executado quando necessrio. Por
exemplo, um procedimento de evento do Visual Basic executado
quando o usurio faz uma certa ao; um procedimento genrico
executado quando chamado por uma instruo do aplicativo.
Considere um programa que simule as aes de uma criana pequena
passeando de automvel. Este cdigo ilustra o comportamento
conhecido como
"choramingas" :
Resposta = lnputBox("Ainda no chegamos ?")
lf Resposta = "No" Then
MsgBox "Estou cansado"
End If
Em um programa que simule o comportamento de crianas, de se
esperar que essas linhas sejam duplicadas um boa quantidade de
vezes. Porm, em vez de codificar mltiplas cpias dessas instrues,
voc pode agrup-las em um procedimento e execut-lo simplesmente
invocando o seu nome. Inclua uma declarao do procedimento,
dando-lhe um nome descritivo:
Sub Choro ()
Dim Resposta As String
Resposta = lnputBox("Ainda no chegamos ?")
lf Resposta = "No" Then
MsgBox "Estou cansado"
End lf
End Sub
Com esse procedimento, os fragmentos dos dois programas que
seguem so equivalentes:
Figura 7.1
Fluxo de Controle
Obviamente, os procedimentos afetam o fluxo de controle de
execuo de um programa. Quando o Visual Basic encontra o nome
de um procedimento, ele guarda a posio atual no programa e ento
se move para executar o procedimento designado. Quando
encontrado o final do procedimento, ele retorna posio original do
programa e continua a execuo a partir daquele ponto. Esse
processo conhecido como chamada de procedimento, pois o
programa "chama" o procedimento. Como o Visual Basic pode rastrear
centenas de nveis de chamadas, um procedimento chamado por um
programa pode conter dentro de si prprio uma chamada de
procedimento e assim por diante.
Parmetros
Suponha que voc esteja escrevendo um programa que precise, em
algum ponto, imprimir os inteiros de 1 a 10. Em outro ponto, o mesmo
programa precisa imprimir os inteiros de 1 a 17. A codificao para
essas duas rotinas mostrada a seguir:

Primeira Rotina Segunda Rotina
For Contador = 1 To 10 For Contador = 1 To 17
Print Contador Print Contador
Next Contador Next Contador
Como essas rotinas so muito semelhantes, muito simples
generalizar -
isto , fazer com que o mesmo cdigo sirva para os dois propsitos. A
nica
diferena entre os dois o valor final no lao For, que pode ser
substitudo por uma varivel. Depois disso voc poder usar um
procedimento nico, chamando-o aps armazenar na varivel o valor
final desejado, conforme mostrado a seguir. (Assuma que a instruo
Dim ContFinal As Integer aparece na seo de declaraes gerais do
programa.)

Figura 7.2
Como se pode ver, o uso combinado de variveis e procedimentos
permite que voc encontre solues genricas para os programas
mais facilmente, alm de colocar sua disposio excelentes
ferramentas de programao. Entretanto, h alguns problemas
prticos com a implementao feita anteriormente. Em particular, voc
precisa declarar variveis globais (pblicas) ou em nvel de mdulo
para fazer a comunicao entre o programa principal e o procedimento
que est sendo chamado. Alm disso, preciso que as variveis
locais aos procedimentos tenham nomes diferentes das variveis
globais. Do contrrio, a chamada de um procedimento poder fazer
com que o valor de uma varivel global seja sobreposto por valores
locais ao procedimento.
O Visual Basic resolve essas questes, permitindo que os
procedimentos aceitem parmetros que sejam tratados como variveis
locais ao procedimento, porm inicializados pela codificao que
chama o procedimento. A rotina chamadora inicializa essas variveis
com a colocao de um conjunto de valores aps o nome do
procedimento a ser chamado. Eis a sintaxe para uma tal chamada de
procedimento:
name[ value[, value] ... ]
Observe que os argumentos so separados por vrgulas. A rotina
chamadora tem de saber os nomes dos parmetros, pois o
assinalamento destes valores s variveis locais ao procedimento
chamado ser feito segundo a ordem de especificao dos
parmetros.
Na declarao do procedimento, os parmetros so declarados dentro
dos parnteses que seguem o nome do procedimento. O Visual Basic
permite que os procedimentos tenham vrios parmetros. Eis a
sintaxe para declarao de procedimento que inclua parmetros:
Sub name ([parmetro [As tipo], [parmetro [As tipo]] ... ])
End Sub
Veja como ficou o exemplo anterior, refeito com o uso de parmetros:
Figura 7.3

Para ilustrar o uso de mltiplos parmetros, voc poderia modificar o
procedimento PrintCont para aceitar tanto o valor inicial quanto o valor
final, conforme mostrado a seguir:

Figura 7.4

Procedimentos de Funes
A partir dos exemplos precedentes, voc deve ter reparado que,
quando se trata de chamadas de procedimentos genricos, a
comunicao feita apenas num sentido - isto , a rotina chamadora
passa valores para o procedimento que executa alguma ao, mas
no retorna qualquer valor para a rotina chamadora. No entanto, voc
pode usar um tipo especial de procedimento, chamado procedimento
de funo (ou simplesmente funo), que retorna valor ao chamador.
A maioria da funes internas do Visual Basic faz isso.
Ao declarar uma funo, voc deve declarar o tipo de valor que ela
retorna, bem como os parmetros necessrios, como mostra a
definio de sintaxe:

Figura 7.5

Como voc pode ver, h duas diferenas entre um procedimento de
funo e um subprocedimento. Um procedimento de funo
delimitado pelas instrues Function e End Function, enquanto um
subprocedimento requer Sub e End Sub. E, como mostra a definio
sinttica, em algum lugar dentro do corpo da funo, voc deve
assinalar um valor (expresso) ao nome da funo. Esse o valor que
ser retornado para a rotina chamadora. Por exemplo, esta funo
retorna o maior valor entre dois inteiros:
Function MaxInt (X As Integer, Y As Integer) As Integer
If X > Y Then
MaxInt = X
Else
MaxInt = Y
End If
End Function
A sintaxe para a chamada de um procedimento de funo
ligeiramente diferente da sintaxe usada para chamar um
subprocedimento. Como a funo retorna um valor, ela pode ser
chamada em qualquer lugar em que uma expresso seja vlida. Os
parmetros da funo so, portanto, delimitados por parnteses para
separ-los de outras partes de uma expresso. Aqui esto algumas
instrues chamando a funo MaxInt:
Print MaxInt(7, 14)
DuasVezesMaior = MaxInt(3, 4) * 2
lf MaxInt(PrimeiraOpo, SegundaOpo) > 20 Then
Quando a funo a ser chamada no requer parmetros, basta usar o
nome da funo, como se fosse uma varivel. A funo interna Now
do Visual Basic (que retorna data e hora atuais) um exemplo de
funo que no requer a passagem de parmetros.
Escrevendo Procedimentos
A discusso que se segue usa o termo procedimento para se referir
idia geral de rotina que pode ser chamada. Quando necessrio, o
termo procedimento de funo (ou simplesmente funo) ou o termo
subprocedimento ser aplicado para dar maior clareza exposio.
Para criar um procedimento que possa ser chamado em Visual Basic,
voc deve abrir a janela de cdigo. A partir do menu Tools, escolha a
opo Add Procedure. Na caixa de dilogo Add Procedure, digite o
nome do novo procedimento, escolha entre Sub ou Function, dando
um clique num dos dois botes de opo. Escolha entre pblico e
privado tambm clicando em uma das opes.D um clique no boto
OK. O Visual Basic criar ento um novo item na caixa de
procedimentos da janela de cdigo, j inserindo a instruo End
apropriada para o tipo de procedimento que estiver sendo criado.
Agora, voc pode incluir as declaraes de parmetros necessrias ao
seu procedimento.
Nota: voc deve ter notado as opes property e event na caixa
de dilogo Add Procedure. Trataremos destas opes quando
falarmos sobre Classes e Objetos.
Vamos escrever um programa simples chamado Converso de
Temperatura, para executar uma converso simples de temperatura
entre as escalas Celsius e Fahrenheit. Abra um novo projeto e coloque
uma barra de deslocamento vertical, seis rtulos e duas caixas de
texto no form, dispondo-os como mostrado na Figura 7.7. Configure
as propriedades dos objetos de acordo com a tabela mostrada
na Figura 7.6.
O programa permitir ao usurio ajustar a barra de deslocamento para
qualquer configurao de temperatura entre os pontos rotulados como
-40 e 212 na escala Fahrenheit ou entre as temperaturas
correspondentes -40 e 100 na escala Celsius. O aplicativo ento
exibir o valor da temperatura para a configurao escolhida nas duas
escalas, Fahrenheit e Celsius. Repare que a configurao da
propriedade Min para a barra de deslocamento maior do que a
configurao para Max. Essa forma de configurao faz com que a
barra de deslocamento coloque o extremo superior de sua faixa de
variao no topo, ao contrrio do que acontece quando a configurao
da propriedade Min menor do que a da propriedade Max .
Figura 7.6 O projeto inicial do form, para o aplicativo Converso de
Temperatura.
Figura 7.7 Configurao de propriedades para o aplicativo Converso
de Temperatura.
Por questes de simplicidade, o programa sempre "pensar" em
termos de graus Celsius, fazendo a converso para obter a
temperatura em Fahrenheit. Em primeiro lugar, voc deve escrever a
funo que retorna a temperatura Fahrenheit quando o programa
fornecer a temperatura em graus Celsius. Comece abrindo a janela de
cdigo do form. A partir do menu Tools, escolha a opo Add
Procedure. Na caixa de dilogo, digite CParaF, escolha o boto de
opo Function e d um clique em OK. Ento, edite a nova funo
como segue (inicie adicionando as declaraes do parmetro e do tipo
de valor a ser retornado na instruo Function):
Function CParaF (TempC As Integer) As Integer
CParaF = Cint(TempC * 9 / 5 + 32)
End Function
A funo CParaF aplica a frmula padro de converso mtrica.
Recebendo a temperatura em graus Celsius como parmetro, ela
retorna a temperatura equivalente na escala Fahrenheit. Para
simplificar a sada e o uso da barra de deslocamento, os valores esto
restritos a inteiros. (A funo CInt converte valor em ponto flutuante
para inteiro, por arredondamento.)
Agora, voc pode escrever o cdigo que l o valor da barra de
deslocamento e exibe os valores das temperaturas. Introduza o
seguinte subprocedimento abaixo da funo:
Sub ExibeTemp ()
Dim TempC As Integer
TempC = Clnt(VscTermmetro.Value)
TxtGrausC.Text = Str$(TempC)
TxtGrausF.Text = Str$(CParaF(TempC))
End Sub
Aps introduzir a primeira linha (a instruo Sub), repare que o Visual
Basic adiciona o nome do procedimento caixa de procedimentos e
inclui a instruo End Sub no cdigo que voc est escrevendo. Como
voc pode ver, possvel criar novos procedimentos, tanto por meio
da opo Add Procedure do menu Tools quanto da introduo da
instruo Function ou Sub em qualquer lugar da janela de cdigo.
O cdigo para o procedimento ExibeTemp l o valor da barra de
deslocamento, VscTermmetro.Value, armazenando-o na varivel
TempC. O valor exibido na caixa de texto TxtGrausC. Ento, a caixa
de texto TxtGrausF configurada com o resultado gerado pela funo
de converso CParaR
Finalmente, selecione o objeto VscTermmetro (a barra de
deslocamento) na caixa de objetos da janela de cdigo e edite seus
procedimentos de evento como mostrado aqui:
Private Sub VscTermmetro_Change ()
ExibeTemp
End Sub
Private Sub VscTermmetro_Scroll ()
ExibeTemp
End Sub
Com isso, toda vez que o usurio alterar a barra de deslocamento, o
procedimento ExibeTemp far seu trabalho. Processe o aplicativo para
ver se ele funciona como esperado. O resultado dever parecer-se com
o exemplo mostrado na Figura 7.8.
Figura 7.8 Processando o aplicativo Converso de Temperatura.
Pensando no Futuro
Pode parecer que voc fez alguns trabalhos desnecessrios ao
escrever o cdigo para o aplicativo Converso de Temperatura. No
final das contas, se cada procedimento usado apenas uma nica
vez, por que no fazer todos os clculos em uma linha s e agrupar
todas as instrues no procedimento de evento Change da barra de
deslocamento? O cdigo do programa resultante deve parecer-se com
o mostrado a seguir:
Sub VscTermmetro_Change ()
Dim TempC As Integer
TempC = CInt(VscTermmetro.Value)
TxtGrausC.Text = Str$(TempC)
TxtGrausF.Text = Str$(Clnt(TempC * 9 / 5 + 32))
End Sub
De fato, esse programa perfeitamente aceitvel, e trabalha to bem
quanto a primeira verso. Porm, o programa original de Converso
de Temperatura melhor pelos seguintes motivos:
Ele substitui frmulas por nomes de funes no programa
principal.
Nomes adicionam clareza e ajudam a explicar o que est acontecendo
no programa.
Ele contm rotinas genricas que podem ser usadas
novamente. Ser muito simples copiar a funo CParaF para
outro programa.
Seus procedimentos so partes que podem ser manipuladas
com facilidade, se voc decidir modificar o programa.
Como uma ilustrao, considere uma melhoria do programa. Na
verso atual, preciso usar uma barra de deslocamento para
configurar uma certa temperatura. Porm, poderia ser de grande ajuda
permitir ao usurio introduzir diretamente o valor da temperatura e
ento levar o programa a fazer a converso. Usando os blocos de
construo que voc criou, ser relativamente simples fazer isso.
Caso voc tivesse escrito o programa como uma pea nica, esse tipo
de modificao poderia requerer duplicao ou at mesmo reescrever
o cdigo.
Generalizando
As melhores ferramentas so as que podem ser usadas em mais de
um servio. Com freqncia, voc pode facilmente converter poucas
linhas de um cdigo especifico, proveitoso apenas num certo contexto,
em uma rotina genrica. Considere o cdigo que voc escreveu no
Capitulo 6 para pesquisar um determinado nome de doninha; a verso
completa mostrada na Figura 7.9. A Figura 7.10 apresenta uma
verso que usa um procedimento genrico derivado do cdigo original.
Essa segunda verso oferece uma rotina que encontrar qualquer
doninha pelo nome, podendo ser til vrias vezes no programa.
Figura 7.9 Cdigo do programa que pesquisa uma doninha pelo
nome.

Figura 7.10 Cdigo do programa contendo um procedimento genrico
que pode pesquisar qualquer doninha.
Reciclando Cdigo
Hoje voc est escrevendo programas para acompanhar doninhas.
Amanh poder tratar-se de micos-lees. E quando voc estiver
escrevendo seus programas para micos, ser muito prtico poder
dizer: "Ei, algumas semanas atrs, eu escrevi alguma coisa
semelhante a isso". Se voc escreve rotinas genricas, possvel
simplesmente recuperar o cdigo de um programa velho e us-lo no
novo programa. Esse cdigo j foi depurado, h menor quantidade de
trabalho a realizar e seu projeto ser completado mais rapidamente. O
que mais voc poderia desejar?
Ainda que seja timo reutilizar um cdigo desenvolvido por voc
mesmo, normalmente antitico (e com freqncia ilegal) copiar
diretamente um cdigo escrito por outra pessoa. No entanto, voc est
liberado para copiar o cdigo dos programas de exemplo que
acompanham o Visual Basic; a Microsoft garante a permisso para
cpia dos cdigos.
Como Trabalham os Parmetros
At agora, voc usou parmetros apenas para passar argumentos
para os procedimentos. Porm, os parmetros so muito mais
flexveis do que isso. Vamos dar uma olhada nos dois mecanismos
que se encontram disponveis no Visual Basic para passagem de
argumentos.
Passagem por Referncia
Quando os parmetros foram introduzidos pela primeira vez, eu os
descrevi como se fossem variveis locais. Na verdade, nem sempre
esse o caso. Considere o subprocedimento Increment que adiciona 1
ao valor do parmetro, X:
Sub Increment (X As Integer)
X = X + 1
End Sub
Caso X seja uma varivel local, esse procedimento ser intil. O valor
do parmetro da rotina chamadora seria assinalado a X, e o
procedimento incrementaria esse valor e em seguida terminaria sua
execuo destruindo efetivamente as variveis locais. Na realidade, X
uma referncia ao valor original da rotina chamadora, e qualquer
modificao em X altera o valor original. Se o cdigo mostrado a
seguir chamasse o procedimento Increment, seria impresso o valor 4:
Dim A As Integer
A = 3
Increment A
Print A
Uma vez que o parmetro X no passa de uma referncia ao valor de
uma varivel, no ser alocada memria no subprocedimento
Increment para armazenar esse valor. O Visual Basic apenas
armazena a informao de que X uma referncia. O uso de
referncia permite ao Visual Basic operar mais eficientemente. Essa
eficincia no muito representativa quando se trata de variveis
inteiras. No entanto, considere o procedimento DeLado, que imprime
seu parmetro string entre parnteses:
Sub DeLado (Str As String)
Print "("
Print Str
Print ")"
End Sub
Se os parmetros fossem realmente variveis locais, o Visual Basic
teria de alocar espao para cada string passada para o procedimento,
e copiar a string a cada chamada. Como as strings podem conter
centenas de caracteres, seria muito mais simples criar uma referncia
string original.
Passagem por Valor
Voc tambm pode fazer com que os parmetros trabalhem de outra
forma - isto , como variveis locais. Se voc iniciar a declarao do
parmetro com a palavra-chave ByVal, o Visual Basic alocar
memria local para o parmetro e copiar o valor do argumento
correspondente para o parmetro. Eis um exemplo desse tipo de
declarao:
Sub Increment (ByVal X As Integer)
X = X + 1
End Sub
A passagem por referncia geralmente mais eficiente, porm a
passagem por valor d origem a variveis locais que algumas vezes
so necessrias nos seus programas. Por exemplo, vejamos a funo
que calcula X elevado potncia Y, isto , X ^ Y. Esse clculo usa
multiplicaes repetidas (por exemplo, X ^ 3 igual a X . X . X). Por
questes de simplicidade, essa funo ignorar valores negativos para
o expoente. O parmetro Y especifica a quantidade de multiplicaes
necessrias. O valor de Y decrementado aps cada multiplicao, e
o clculo termina quando Y chega a 0.
Function Potncia (X As Single, _
ByVal Y As Integer) As Single
Dim Result As Single
Result = 1
Do While Y > 0
Result = Result * X
Y=Y-1
Loop
Potncia = Result
End Function
Uma vez que voc deseja modificar Y na funo, porm no quer que
seja alterado o valor original da varivel que foi passada, deve
declarar Y com a palavra-chave ByVal. Examine o seguinte fragmento
de cdigo, que chama a funo Potncia:
'Aproximar E elevado a N, usando as sries de Taylor
Result = 1
For Aprox = 1 to 10
Result = Result + Potncia(N, Aprox) / Factorial(Aprox)
Next Aprox
O programador espera que essa rotina faa o lao 10 vezes enquanto
estiver fazendo o seu clculo. Entretanto, se a funo Potncia que
ela est chamando no usar a palavra-chave ByVal, essa rotina
jamais sair do lao, entrando em looping infinito. Aps a funo
Potncia ser chamada pela primeira vez, Aprox seria zerada (pois a
varivel local Y iria tornar-se uma referncia a Aprox). A funo
Factorial seria chamada com o valor errado e ento a instruo For
incrementaria Aprox e iniciaria o lao novamente. Como Potncia
continua a zerar a varivel Aprox, o lao For jamais terminaria.
Uma boa regra prtica que qualquer declarao de parmetro para o
tipo Integer, Long ou Single deveria ser uma declarao ByVal (isto ,
o parmetro deveria ser passado por valor), a menos que a rotina
chamadora espere que o procedimento modifique o valor que est
sendo passado. Por outro lado, strings e matrizes, por questes de
eficincia, devero ser passadas por referncia. Controles e tipos de
dados definidos pelo usurio (tal como DoninhaTFB) podem ser
passados apenas por referncia.
Para outros tipos de dados como double, currency e variant, a deciso
no to simples. A boa prtica de programao sugere que voc
passe esses parmetros por valor, pois dessa forma estar menos
sujeito a usar uma varivel parmetro incorretamente. Entretanto,
mais eficiente passar esses parmetros por referncia.
Meu conselho considerar em primeiro lugar os bons princpios de
programao. Passar inicialmente todas as variveis (exceto strings,
matrizes e tipos definidos pelo usurio) por valor. Aps completar a
construo de seu programa e depois de test-lo, voc poder
investigar como melhorar o seu desempenho. Ento, se o seu
programa passar a operar incorretamente, aps a remoo de
algumas palavras-chave ByVal, voc saber onde olhar para
encontrar os problemas.
Passagem de Parmetros de Matriz
Voc pode declarar um parmetro de matriz como faz com qualquer
outro parmetro, omitindo da declarao a dimenso da matriz. Por
exemplo, esta funo calcula a mdia dos elementos de qualquer
matriz de valores com dupla preciso.
Function Mdia (DMatriz( ) Double, _
ByVal Dcont As Integer) As Double
Dim Total As Double, Ix As Integer
Total = 0
For lx = 0 To Dcont - 1
Total = Total + DMatriz(lx)
Next Ix
If Dcont = 0 Then
Mdia = 0
Else
Mdia = Total / Dcont
End If
End Function
O parmetro DMatriz declarado como uma matriz do tipo Double,
porm a sua dimenso no declarada. Esse cdigo um outro
exemplo de uma soluo generalizada. Como a dimenso no
declarada, essa mesma funo pode ser chamada com argumentos
que sejam matrizes de qualquer dimenso. (Basta que os elementos
sejam do tipo Double.)
Para passar uma matriz como argumento para um procedimento, use
apenas o nome da varivel matriz seguido de um par de parnteses
vazio. Este fragmento de cdigo mostra como o procedimento Mdia
pode ser usado:
Dim MeusDados(100) As Double, ltensLidos As Integer
ItensLidos = CargaDados(MeusDados( ), 100)
Print "A mdia dos valores : " & _
Mdia(MeusDados( ), ltensLidos)
MeusDados declarado como uma matriz com dimenso 100. O
procedimento CargaDados (no mostrado aqui) chamado, sendo
passadas como parmetros a matriz MeusDados e a dimenso
mxima da matriz.
Provavelmente, a rotina CargaDados preenche o maior nmero de
elementos da matriz possvel, retornando como valor a quantidade
real de itens preenchidos. A seguir, o programa imprime a mdia. A
chamada Mdia retorna a matriz e a quantidade de elementos que
foram preenchidos por CargaDados.
Naturalmente, quando necessrio, voc pode passar elementos
individuais de matrizes. Basta indexar a matriz para indicar o elemento
a ser passado, como nesta linha de cdigo:
Print "A raiz quadrada do item 3 " & Sqr(MeusDados(3))
Voc pode modificar o aplicativo Banco do Capitulo 6 para usar a
funo
Mdia, como mostrado na Figura 7.11. Cada vez que voc der um
clique no boto Mdia, o programa redimensionar a matriz dinmica
ListaValor para acomodar a quantidade de itens na caixa de lista.
Como a caixa de lista contm uma matriz de strings; em vez de
nmeros, cada elemento deve ser convertido medida que for
copiado para ListaValor. Ento, o programa passa a matriz como
argumento para a funo Mdia.
Figura 7.11 Uma modificao no aplicativo Banco.
Esse programa modificado um pouco mais longo do que o aplicativo
original. Porm, voc criou uma nova ferramenta - a funo Mdia -
que pode ser usada em vrios lugares. Por exemplo, para ampliar o
programa Banco para trabalhar com mais de uma conta, voc pode
chamar a funo Mdia para cada conta, em vez de escrever um lao
separado para cada uma. Se voc tiver de escrever um programa que
calcule a mdia pluviomtrica, pode carregar o programa Banco,
copiar a funo Mdia e coloc-la no novo programa.
Alocao Local
Em funo da discusso sobre escopo feita no Capitulo 3, voc j est
familiarizado com variveis locais. Agora que voc est trabalhando
com parmetros similares s variveis locais, ser til verificar a
maneira pela qual o Visual Basic gerencia a memria usada por
variveis locais.
Quando voc inicia um programa, o Visual Basic sabe quantas
variveis globais existem e aloca memria para elas. No entanto, ele
no sabe quantas variveis locais existem ou quando cada
procedimento do programa ser chamado. Variveis locais e
parmetros so criados quando o procedimento que os contm
chamado, e so destrudos quando o procedimento acaba. Se um
procedimento for chamado novamente, as variveis so recriadas.
Esse processo no apenas retarda a alocao de memria at que ela
seja necessria, mas permite que a memria seja reutilizada por
variveis que pertenam a procedimentos diferentes. Os
computadores modernos executam essa alocao temporria e a
liberao muito eficientemente.
No entanto, algumas vezes voc pode querer que o valor armazenado
em uma varivel local no seja perdido quando o procedimento que a
contm for encerrado. Voc poderia declarar uma varivel em nvel de
mdulo ou pblica, mas essa soluo no seria ideal se a varivel
viesse a ser usada apenas em um procedimento.
O Visual Basic oferece a palavra-chave Static para tratar dessa
questo. Se voc usa Static em vez de Dim dentro de um
procedimento, as variveis declaradas dessa forma tero escopo
local, visvel apenas dentro daquele procedimento; no entanto, sero
permanentes, como se fossem declaradas em nvel de mdulo. O
Visual Basic inicializa todas as variveis Static como 0, tornando-as
teis para situaes como a que se segue:
Sub Command1_Click ()
Static Contador As Integer
Contador = Contador + 1
MsgBox "Este boto j foi pressionado" & _
Str$(Contador) & "vezes."
End Sub
Abra um novo form, inclua um boto de comando simples com o
procedimento acima e tente executar o programa. Ento, mude a
palavra-chave Static para Dim para verificar que, no caso de uma
varivel puramente local, o programa no funciona.
Objetos Do Visual Basic como Parmetros
Os procedimentos que voc escreveu at agora tm passado apenas
valores numricos, matrizes e strings como parmetros. O Visual
Basic tambm permite-lhe passar controles e forms. A sintaxe
similar: basta usar a palavra-chave Control ou Form, em vez de String,
Integer, e assim por diante, na declarao do procedimento.
Essa caracterstica lhe d a habilidade de escrever cdigo totalmente
genrico. Por exemplo, suponha que voc esteja escrevendo um
aplicativo com uma certa quantidade de botes na tela. Em vrios
pontos do aplicativo, voc deseja dar ateno especial a um boto
particular, colocando a caracterstica itlica em seu ttulo e
configurando a sua cor de fundo para vermelho. O seguinte
subprocedimento faz isso:
Sub Ateno (Boto As Control)
Boto.FontItalic = True
Boto.BackColor = vbRed
End Sub
Voc passa um objeto como um parmetro usando o seu nome. Voc
poderia passar para esse subprocedimento um boto chamado
btnNext, com a instruo Ateno btnNext.
Similarmente, voc pode declarar um parmetro como sendo um form.
Voc pode configurar ou examinar as propriedades do form e chamar
os seus mtodos. Pode passar o form pelo nome ou usar a varivel
interna Me (eu), que o form ativo no momento.
O Aplicativo Evasivo
Vamos desenvolver um aplicativo, chamado Evasivo que faz uma
brincadeira com o usurio. Ele exibir uma mensagem de erro, como
se tivesse ocorrido uma falha durante sua inicializao. O usurio ver
uma caixa de dilogo com dois botes de comando, Cancel e Retry.
Entretanto, o que acontece quando o usurio d um clique em um
desses botes no habitual. O boto caminhar para um ponto
qualquer do form, e o usurio jamais ser capaz de cancelar a
execuo do programa dando um clique num dos botes. Esse
aplicativo ilustra como voc pode passar objetos como parmetros e
como usar o mtodo Move - um mtodo que pode ser implementado
para a maioria dos controles do Visual Basic.
Cada boto de comando dever ter o mesmo comportamento. De
certa forma, voc pode assegurar isso, chamando o mesmo
procedimento para cada um dos botes. No entanto, uma das aes
do procedimento ser mover o boto para uma nova posio. Essa
ao requer uma chamada ao mtodo Move dos botes, exigindo que
voc passe o boto como um parmetro.
Crie um novo projeto e arranje dois campos de rtulo e dois botes de
comando no form como mostrado na Figura 7.12. A Figura 7.13 lista
as configuraes de propriedades que sero necessrias.
Figura 7.12 O projeto inicial do form para o aplicativo Evasivo.
Figura 7.13 Configurao de propriedades para o aplicativo Evasivo.

A Figura 7.14 contm o cdigo do programa para o aplicativo
Evasivo, e a
Figura 7.15 mostra como o aplicativo ficar quando o usurio
process-lo.

Figura 7.14 Cdigo de programa para o aplicativo Evasivo.
Figura 7.15 Processando o aplicativo Evasivo.
O procedimento Salto usado nesse aplicativo pode ajustar a posio
no apenas dos dois botes de comando, mas de quase qualquer tipo
de controle que lhe seja passado como parmetro, pois a maioria dos
controles possui o mtodo Move. Entretanto, algumas vezes voc
pode querer executar tipos de processamento especiais, que sejam
especficos a certos tipos de objetos. O Visual Basic oferece a
instruo If TypeOf para determinar o tipo de controle do parmetro.
Ela funciona da mesma maneira que a instruo If convencional;
apenas a primeira linha de sua sintaxe diferente.
If TypeOf objeto Is TipoObjeto Then
Se voc quisesse que o procedimento Salto distinguisse botes de
opo de outros tipos de controles, a primeira linha da instruo If
TypeOf deveria ser
semelhante a isto:
If TypeOf CtI Is OptionButton Then
Procedimentos de Eventos Avanados
Esta seo examina procedimentos de eventos do Visual Basic mais
complexos do que os procedimentos Click e DblClick. Essas tcnicas
permitem-lhe construir aplicativos com tratamento mais sofisticado
para teclado e mouse, e implementar uma tcnica grfica chamada
arrastar e soltar (drag and drop).
Eventos de Mouse
Nossos exemplos anteriores levaram em considerao o mouse
apenas quando usado para dar um clique em um objeto. O mximo
que voc fez foi escrever um cdigo para os procedimentos de evento
Click ou DblClick. No entanto, certos tipos de aplicativos requerem que
as atividades do mouse sejam acompanhadas mais de perto.
Um programa de desenho ou pintura, por exemplo, precisa saber a
posio do mouse quando voc est arrastando um grfico ou criando
uma nova imagem. Um jogo pode usar a posio do mouse para
controlar alguns de seus aspectos. Porm, o Visual Basic no contm
um objeto mouse. Em vez disso, o evento MouseMove disparado
quando a posio do mouse se modifica. Com freqncia, os eventos
de mouse so associados com forms e caixas de imagem, porm eles
podem ser usados tambm com os outros objetos. Com propsitos de
ilustrao esta seo ir concentrar-se apenas nos forms.
Cada form possui estes trs procedimentos padres:
Figura 7.16
O Visual Basic chama esses procedimentos quando o usurio interage
com
o mouse. O evento MouseDown ocorre sempre que um boto do
mouse pressionado. O evento MouseUp sinalizado quando o
boto do mouse (que se encontrava pressionado) liberado. O evento
MouseMove ocorre quando a posio do mouse alterada. A Figura
7.17 descreve os parmetros que so passados para esses
procedimentos de eventos.

Figura 7.17 Parmetros dos procedimentos de eventos do mouse.

A melhor forma de ilustrar estes eventos a criao de um aplicativo
de exemplo. Criaremos aqui o aplicativo Desenho de Linha. Esse
aplicativo usa o mtodo Line, um mtodo grfico para desenho de um
form. (Discutiremos o mtodo Line em maiores detalhes no Captulo
11.)

Figura 7.18 Cdigo de programa para o aplicativo Desenho de Linha.

Quando voc processar o aplicativo, a varivel Desenhando ser
inicialmente configurada como False. Porm, quando o boto
esquerdo do mouse for pressionado, a varivel ser configurada para
True. Quando o boto for liberado, Desenhando passar a ser False
novamente. medida que voc mover o mouse, mantendo o boto
pressionado, o programa traar a linha a partir da ltima posio
conhecida (CurrentX, CurrentY), at a posio atual do mouse. Se
voc mantiver a tecla Shift pressionada enquanto traa uma linha, a
sua cor ser alterada para vermelho at voc soltar a tecla Shift.
Nota: Mouses com um nico boto tm esse boto definido como left-
button (boto esquerdo). Se o seu mouse tiver dois botes e voc
alterou o Painel de Controle do Windows para inverter os botes
esquerdo e direito do mouse, o Visual Basic passar o valor
vbLeftButton quando for pressionado o boto da direita e vice-versa.
Eventos de Teclado
O Capitulo 6 introduziu o evento KeyPress, que disparado para
certos objetos quando o usurio est digitando. O Visual Basic permite
um grau de controle ainda mais refinado com os eventos KeyUp e
KeyDown, que so disparados quando o usurio pressiona e solta
uma tecla. Apenas aplicativos muito especficos requerero o uso
desses eventos, entretanto a ajuda do Visual Basic contm
informaes completas a esse respeito.
Os forms possuem outra caracterstica muito til relacionada ao
teclado. Normalmente, o pressionamento de teclas enviado
diretamente para o objeto (por exemplo, uma caixa de texto) que est
ativo no momento. Entretanto, configurando a propriedade KeyPreview
de um form para True, voc far com que os procedimentos de
eventos KeyPress, KeyDown e KeyUp do form sejam disparados em
primeiro lugar. Esses procedimentos podem filtrar a informao a ser
passada para os procedimentos de eventos KeyPress, KeyDown e
KeyUp dos objetos.
Por exemplo, para registrar cada tecla pressionada pelo usurio, voc
poderia definir a seguinte funo (suponha que SalvarTudo seja
declarada como uma varivel string em nvel do form):
Sub Form_KeyPress (KeyAscii As Integer)
SalvarTudo = SalvarTudo & Chr$(KeyAscii)
End Sub
Caso a propriedade KeyPreview do Form seja configurada para True e
o procedimento de tratamento de tecla em nvel do form vier a
modificar a varivel KeyAscii, o procedimento de evento KeyPress do
objeto atualmente ativo receber a tecla modificada. Se o
procedimento em nvel do form configurar KeyAscii para 0, o
procedimento KeyPress do objeto no ser chamado.
Arrastar e Soltar
O Visual Basic fornece tambm um suporte especial para outra forma
de interao com usurios; chamado arrastar e soltar. As palavras
arrastar e soltar referem-se ao uso do mouse para deslocar um objeto
exibido para outro lugar. Voc deve ter visto esse processo no
Explorer, que lhe permite mover arquivos de uma pasta para outra,
arrastando-se os cones dos arquivos.
Voc permite que um objeto do Visual Basic (normalmente uma caixa
de imagem ou controle de imagem) seja arrastado configurando a sua
propriedade DragMode para 1. Quando DragMode configurada para
1, o controle no recebe mais o evento Click ou MouseDown. Em vez
disso, o objeto se movimenta quando o usurio d um clique nele,
comeando a arrast-lo. O item que est sendo arrastado chamado
de objeto-fonte, e o item que recebe o evento DragDrop chamado de
destino. Quando o usurio solta o objeto-fonte (soltando o boto do
mouse), o Visual Basic envia o evento DragDrop para o objeto de
destino. Adicionalmente, eventos DragOver so enviados para
quaisquer objetos sobre os quais passar o objeto-fonte.
O mecanismo arrastar e soltar permite-lhe projetar uma interao
simples e prtica com os usurios, na qual podem ser executadas
vrias tarefas, sem o uso de comandos, menus ou botes. Esse
mtodo muito intuitivo em diversas situaes e freqentemente mais
veloz do que outros mtodos.
Para demonstrar o mecanismo arrastar e soltar, vamos escrever um
aplicativo chamado Correio Eletrnico, que simular o ambiente de
trabalho para a troca eletrnica de mensagens. Ele permitir que voc
crie novas mensagens e arraste-as para uma caixa postal, a partir da
qual elas podero ser distribudas para a rede. (Ser apresentado aqui
apenas o mecanismo arrastar e soltar. O cdigo completo para um
sistema de mensagens eletrnicas ocuparia o livro inteiro.)
Inicie pela criao de um novo projeto. Inclua dois botes de
comando, sete pequenos controles de imagem, conforme mostrado
na Figura 7.19. Os trs controles de imagem na parte inferior do form
armazenaro cpias mestras de cones, a exemplo do que foi feito
com alguns controles de imagens no aplicativo Caa-nqueis do
Captulo 6. Aps inicializar esses controles, voc pode redimensionar
o form para elimin-los da rea de viso. Os cones usados neste
aplicativo podem ser encontrados no diretrio de cones do CD deste
pacote.
Configure as propriedades dos trs controles de imagens inferiores
(Image5, Image6 e Image7), como listado na Figura 7.20. A
propriedade Tag ignorada pelo Visual Basic; voc pode us-la para
armazenar qualquer texto identificador que desejar. Esse aplicativo
usa a propriedade Tag para distinguir cones de cartas dos outros
tipos de cones.
Figura 7.19 O projeto inicial do form para o aplicativo Correio
Eletrnico
Figura 7.20 Configurao de propriedades para os trs controles de
imagens inferiores no aplicativo Correio Eletrnico.
Configurando-se a propriedade DragMode do objeto Image7 (cone de
carta) para 1, possibilita-se ao usurio arrastar as cartas ao longo da
janela. A configurao da propriedade Index para 0 transforma o cone
de carta em uma matriz de controles, contendo at agora apenas um
elemento. (Dentro de instantes voc ver como o cdigo do programa
usar essa matriz.) A Figura 7.21 mostra-lhe como a linha inferior de
controle de imagens deve ficar aps essa configurao de
propriedades.

Figura 7.21 Os trs cones inferiores usados no aplicativo Correio
Eletrnico.

Agora, configure as propriedades dos outros objetos, conforme
indicado pela Figura 7.22. Aps modificar as dimenses do form para
que as trs imagens inferiores no apaream, o seu form dever
parecer-se com o mostrado na Figura 7.23. Os controles de imagens
que aparecem na parte superior da janela serviro como caixas
postais, para as quais os cones de cartas podem ser arrastados. Os
cones que voc v sobre a "mesa de trabalho" (a caneta, o telefone e
o clipe) no podem ser distribudos pelo correio. A caixa postal exibir
o cone de caixa vazia (aquele de Image5) quando estiver vazia, e o
cone de caixa cheia (o de lmage6) quando o usurio arrastar uma
carta para a caixa postal. Os botes de comando permitiro ao usurio
criar novas cartas (com o cone de carta) e limpar a caixa postal.
Figura 7.22 Configurao de propriedades restantes usadas no
aplicativo Correio Eletrnico.
Figura 7.23 O projeto final do form para o aplicativo Correio
Eletrnico.
O cdigo para esse aplicativo requer a seguinte declarao:
Dim ProxCarta As Integer
Dois procedimentos so necessrios em nvel do form. O
procedimento Form_Load inicializa o cone da caixa postal e a varivel
ProxCarta; o procedimento Form_DragDrop move o controle para o
ponto que o usurio indicar:
Sub Form_Load ( )
ImgCorreio.Picture = ImgCaixaVazia.Picture
ProxCarta = 1
End Sub
Sub Form_DragDrop (Source As Control, X As Single, Y As
Single)
Source.Move X, Y
End Sub
A janela bsica mostra apenas trs cones. Voc deve escrever a
codificao para o boto MsgNova, para permitir ao usurio criar
novos objetos-cartas.
Sub btnNova_Click ( )
Load lmgCarta(ProxCarta)
lmgCarta(ProxCarta).Left = btnNova.Left - 2000 + ProxCarta * 100
lmgCarta(ProxCarta).Top = ScaleHeight - 500
lmgCarta(ProxCarta).Visible = True
ProxCarta = ProxCarta + 1
End Sub
O primeiro programa chama o procedimento Load. Como lmgCarta
uma matriz de controles, Load cria um novo controle, dando-lhe o
ndice especificado por ProxCarta. Aps o Visual Basic criar o novo
membro da matriz de controles (ImgCarta), esse novo membro recebe
uma posio na janela e torna-se visvel. Ento, a varivel ProxCarta
incrementada de forma que o prximo evento Click crie uma nova
carta.
O boto Limpar Caixa simplesmente reconfigura o cone (a
propriedade Picture) da caixa postal para o valor default:
Sub btnLimp_Click ( )
lmgCorreio.Picture = ImgCaixaVazia.Picture
End Sub
A caixa postal requer o seu prprio procedimento arrastar e soltar.
Quando um controle arrastado para a caixa, o programa verifica a
propriedade Tag do objeto-fonte. Caso no seja uma carta, o
procedimento provoca o seu encerramento, no permitindo que o
objeto seja colocado sobre a caixa postal. Do contrrio, o
procedimento Unload remove o cone da carta da tela e faz com que a
propriedade Picture da caixa postal seja configurada para o cone de
ImgCaixaCheia.
Sub ImgCorreio_DragDrop (Source As Control, X As Single, Y As
Single)
If Source.Tag <> "Carta" Then
Beep
Exit Sub
End If
Unload Source
lmgCorreio.Picture = lmgCaixaCheia.Picture
End Sub
Processe esse aplicativo e tente dar cliques no boto MsgNova
algumas vezes, para criar novas cartas. Excluindo a caixa postal,
todas as imagens que esto na janela do aplicativo podem ser
arrastadas. Arrastar uma carta para a caixa postal modifica o cone da
caixa postal, e dar um clique no boto Limpar Caixa restaura o cone
da caixa postal. Note que o programa no permitir que voc arraste o
telefone, a caneta ou o clipe para a caixa postal.
O programa usa a varivel ProxCarta para especificar um valor
continuamente crescente para os elementos subseqentes da matriz
de controles ImgCarta.



























O Poder das Classes no Visual Basic
A partir da verso 4 do Visual Basic, o programador passou a poder
criar seus prprios objetos. Um objeto uma instncia de uma classe
assim como Siegmund uma instncia do tipo DoninhaTFB. Uma
classe um tipo de dado que o usurio cria contendo tudo o que j
vimos sobre tipos de dados definidos pelo usurio e muito mais. Alm
de variveis uma classe tem um comportamento. Isto quer dizer que
dentro de uma classe voc no apenas cria variveis para armazenar
dados, mas tambm pode criar procedimentos que sero executados
quando chamados. Estes procedimentos so chamados mtodos da
classe. Um mtodo pode ser pblico ou no. Se for pblico, poder
ser chamado de qualquer ponto do programa. Caso seja privativo da
classe, somente o cdigo de um outro mtodo da prpria classe
poder comandar a sua execuo.
Esta mesma distino entre pblico e privado se aplica s variveis
contidas na classe. Essas variveis so chamadas variveis membros
da classe. Uma varivel membro tambm pode ser privativa classe e
somente poder ser acessada por mtodos da classe, ou ser pblica e
ter seu contedo livremente acessado de qualquer ponto do programa.
A esta caracterstica de proteo que a classe pode dar ao seu
contedo se d o nome de encapsulamento. O encapsulamento,
porm, no uma barreira definitiva para o acesso ao contedo das
variveis privativas da classe. Isto porque uma varivel privada pode
ser acessada indiretamente pelo mundo exterior classe. O modo
como isto feito usando um mtodo pblico da classe que nos
permita ler ou alterar o valor da varivel. Agora voc deve estar se
perguntando: mas se para tornar uma varivel passvel de ser
alterada por partes do programa externas classe, porque ento no
torn-la pblica de um vez? A resposta para isto que muitas vezes
voc quer ter controle sobre a faixa dos valores que sero atribudos a
uma varivel e tambm o tipo de dado que se pode atribuir a ela. No
mtodo que se usa para acessar a varivel, esta verificao pode ser
feita antes que algo de errado seja atribudo ela.
Ao procedimento que nos d acesso varivel damos o nome
de propriedade. Externamente classe uma propriedade vista
como um nico nome, mas que internamente classe representa dois
ou trs procedimentos diferentes. Dependendo do papel que o nome
da propriedade desempenha numa expresso, um dos procedimentos
chamado. Se a propriedade est sendo referida para se obter o seu
valor, chamado o procedimento Get_NomeDaPropriedade. Se a
propriedade est sendo referida para se atribuir um valor a ela,
chamado o procedimento Let_NomeDaPropriedade (para tipos de
dados comuns) ou Set_NomeDaPropriedade (para objetos).
Outra vantagem que as classes oferecem chamada
de polimorfismo. Por polimorfismo entende-se a possibilidade de
atribuir-se um mesmo nome a diferentes procedimentos. Uma classe
pode ter um procedimento (um mtodo) com o nome Calcular, que
signifique fazer o clculo de uma rea. Enquanto isso uma outra
classe pode ter um mtodo com o mesmo nome para calcular o total
de uma lista de compras.
Vejamos agora com mais detalhamento como trabalhar com classes.
Criando suas Prprias Classes e Objetos
Alm das classes e objetos que o Visual Basic e outras aplicaes lhe
oferecem, voc pode criar suas prprias classes e us-las para criar
objetos em tempo de execuo dos seus programas.
Voc inicia a criao de uma classe pela adio de um mdulo de
classe ao seu projeto. Abrindo o menu Project e selecionando Add
Class Module, uma caixa de dilogo surgir dando lhe trs opes
para a criao do mdulo de classe. Uma, Class Module, lhe permite
adicionar um mdulo de classe vazio para ser completado por voc
outra opo, Vb Class Builder, lhe d acesso a um assistente de
criao de classes que lhe poupa parte do trabalho de codificao da
nova classe; a terceira opo refere-se criao de Add-Ins, um tema
complexo que vai alm do propsito desta discusso. A segunda
opo sem dvida a mais prtica, mas antes que voc a utilize
interessante conhecer passo-a-passo os detalhes da criao de uma
classe seguindo o caminho mais trabalhoso. Vamos supor aqui que
voc tenha iniciado o procedimento de criao de uma classe e feito a
opo por criar um mdulo de classe vazio. Nos tpicos seguintes
expomos o que constitui uma classe e o que fazer para criar suas
classes.
Como Constituda uma Classe?
Uma classe pode possuir propriedades, mtodos e eventos. Em geral,
propriedades representam informaes sobre um objeto, enquanto
mtodos representam aes que um objeto pode realizar. Em outras
palavras, as propriedades descrevem o objeto e os mtodos so o seu
comportamento. Quanto aos eventos, estes so procedimentos que
um objeto chama dentro de um outro objeto que o contm.
Propriedades
O modo mais simples de adicionar uma propriedade a uma classe
criando uma varivel dentro da classe e declarando-a como pblica.
Exemplo: Public varivel as string. Desta forma poderemos atribuir
valores varivel em qualquer parte do cdigo da aplicao. Mas este
no o modo mais correto e usual de se criar uma propriedade.
Costumamos querer que as propriedades de nossos objetos sejam
acessadas de modo controlado pelo prprio objeto. Isto , queremos
poder definir, por exemplo, que uma propriedade somente para
leitura ou ter a garantia de que os valores atribudos a ela se situam
dentro de uma determinada faixa. A forma que usamos para conseguir
isto e a criao dos procedimentos de propriedade. Procedimentos de
propriedade so procedimentos usados para se ter acesso ao valor de
uma varivel interna classe usada para guardar o valor de uma
propriedade. Os procedimentos de propriedade se dividem em dois
tipos: procedimentos de leitura do valor da propriedade e
procedimentos de atribuio de valor propriedade. Nos
procedimentos de leitura inserimos o cdigo que retorna o valor da
varivel usada para guardar o valor da propriedade no interior da
classe. Nos procedimentos de atribuio de valor inserimos o cdigo
responsvel pela atribuio de valor e - se for o caso - validao do
valor que se est tentando atribuir propriedade. Caso queiramos que
uma propriedade seja apenas de leitura, no criaremos procedimentos
de atribuio de valores a ela. Qualquer tentativa de atribuir valor a
uma propriedade que no tenha uma procedimento para atribuio
gerar uma erro.
A criao dos procedimentos de propriedades seguem determinadas
regras. Os procedimentos usados para retornar o valor da propriedade
tm o seu nome composto pela palavra Getseguida de um caracter de
sublinhado ( _ ) e pelo nome da propriedade. Estes procedimentos
retornam um valor do tipo de dados da varivel que armazena o valor
da propriedade. Os procedimentos de atribuio tm seus nomes
formados pela palavra Let ou Set seguida de um caractere de
sublinhado ( _ ) e do nome da propriedade. Estes procedimentos
recebem como argumento o novo valor que se quer atribuir
propriedade. A seguir exibimos a sintaxe de criao desses
procedimentos.
Public | Private Get_NomePropriedade () As Tipo
Cdigo usado para retornar o valor da propriedade.
Ex.: NomePropriedade =mvarDataCriao, onde mvarDataCriao
a varivel que armazena o valor da propriedade no interior da classe.
Isto faz com que o procedimento retorne este valor.
End Property
Public | Private Let_NomePropriedade ( novovalor As Tipo )
Cdigo usado para armazenar o valor da propriedade.
Ex.: mvarDataCriao =novovalor, onde mvarDataCriao
a varivel que armazena o valor da propriedade no interior da classe e
novovalor o valor que se quer atribuir propriedade recebido como
argumento pelo procedimento de atribuio.
End Property
Public | Private Set_NomePropriedade ( novovalor As Tipo )
Cdigo usado para armazenar o valor da propriedade.
Ex.: Set mvarDataCriao =novovalor, onde mvarDataCriao
a varivel que armazena o valor da propriedade no interior da classe e
novovalor o valor que se quer atribuir propriedade.
End Property
Voc pode estar se perguntando sobre o porqu de termos dois tipos
diferentes de procedimentos de atribuio de valores s propriedades,
uns com nome iniciando por Let e outro por Set. A razo para isto
que ocorre s vezes de uma propriedade armazenar valores que so
referncias a objetos. Nestes casos o procedimento usado para
atribuir valores propriedade tem seu nome iniciado por Set e no seu
cdigo devemos usar a instruo Set para atribuir o valor varivel da
propriedade. Variveis usadas para armazenar referncias a objetos
no tm seus valores atribudos pelo uso simples do sinal de
atribuio ( = ), mas carecem tambm que se use a
instruo Set antes do seu nome. Exemplo: Set varForm = Form1;
esta instruo armazena uma referncia ao objeto Form1 na varivel
varForm.
H casos, no entanto, em que a propriedade pode armazenar tanto
referncias a objetos como a tipos de dados comuns. Caso a varivel
interna tenha sido declarada como sendo do tipo Variant, poderemos
atribuir qualquer tipo de dado propriedade. Nestes casos nos
utilizamos da tcnica de usar apenas o procedimento Let e
declaramos o tipo de dado do seu argumento como Variant. Antes de
fazermos a atribuio de valor propriedade, verificamos o tipo do
dado que est sendo passado e optamos pela forma correta de
fazermos esta atribuio. Veja abaixo como isto feito:
Public Let_NomePropriedade ( novovalor as Variant )
If IsObject(novovalor) Then funo IsObject retorna True se novovalor objeto
Set varPropriedade = novovalor
Else
VarPropriedade = novovalor
End If
End Property
At aqui vimos como criamos os procedimentos de propriedade dentro
da classe, mas fora da classe estes procedimentos no so utilizados
com os mesmos nomes que usamos para cri-los na classe. Para
atribuirmos valor a uma propriedade ou termos como retorno o seu
valor atual, utilizamos apenas o nome da propriedade. Baseado na
papel que o nome da propriedade esteja desempenhando numa
expresso que o Visual Basic vai decidir qual procedimento da
propriedade chamar. Se o nome da propriedade estiver esquerda de
um sinal de atribuio, o Visual Basic sabe que tem que chamar um
procedimento usado para armazenar o valor da propriedade ( nome
iniciado por Let_ ou Set_ ). Se o nome da propriedade estiver direita
de um operador de atribuio ou em qualquer outra situao em que
se espera um valor de retorno, o Visual Basic chamar o
procedimento da propriedade usado para retornar seu valor ( nome
iniciado porGet_ ). Exemplo:
Data = Arquivo1.DataCriao
chamado o procedimento Get_DataCriao, que retorna o
valor da propriedade DataCriao do objeto Arquivo1.
Arquivo1.DataCriao = Now
chamado o procedimento Let_DataCriao para atribuir a
data
retornada pela funo Now propriedade DataCriao do
objeto Arquivo1.
Mtodos
Os mtodos nada mais so do que os procedimentos e funes
pblicos de uma classe. Para chamar um mtodo de fora do cdigo da
classe, basta usar o nome do objeto seguido de um ponto e do nome
do mtodo. Exemplo: Form1.Show; esta instruo faz com que o
mtodo Show do objeto Form1 seja executado.
Os mtodos de uma classe tm acesso s variveis privadas da
classe.
Eventos
Como j foi dito acima, eventos so procedimentos chamados por um
objeto em um outro objeto que o contm como resposta a um
acontecimento que lhe ocorre. Os eventos podem ser disparados pelo
prprio objeto em alguma parte do seu cdigo utilizando-se da
instruo RaiseEvent. Pode-se tambm utilizar o artifcio de criar um
mtodo s para disparar um evento dentro do objeto. Um mtodo
assim seria chamado de fora do objeto para disparar o evento no seu
interior.
Para definir um evento dentro de uma classe no se cria um
procedimento de evento dentro do mdulo da classe. O que se faz
usar a instruo Event para atribuir um nome ao evento e definir sua
lista de argumentos, ou seja, as informaes que sero passadas ao
procedimento de tratamento do evento. Este procedimento sim ser
codificado dentro do objeto que contenha o objeto disparador do
evento caso se queira tratar o evento. Veja como a sintaxe da
instruo Event:
Public Event NomeEvento ( [ByVal] argumento As Tipo [, ...] )
Aps ter sido definido o evento na classe, ele poder ser tratado por
um procedimento de evento dentro de um mdulo que contenha uma
declarao de varivel do tipo da classe disparadora do evento, e que
tenha sido declarada com a palavra-chave WithEvents. Vejamos um
exemplo de como isto funciona.
Crie um novo projeto e adicione um mdulo de classe. Selecione a
propriedade Name do mdulo de classe na janela de propriedades e
atribua CMensagem como novo nome para a classe. No mdulo da
classe, adicione as seguintes linhas de cdigo:
Definio do evento chamado Mensagem
Public Event Mensagem ( texto As String )
Mtodo pblico para disparar o evento Mensagem de fora da classe
Public Sub DispararEvento ( argumento As String )
RaiseEvent Mensagem (argumento )
End Sub
Agora, entre na janela de cdigo do formulrio Form1. Adicione as
seguintes linhas de cdigo na seo de declaraes gerais do mdulo
de Form1:
Private WithEvents Msg As CMensagem
Examine a relao de objetos que aparecem na caixa de objetos da
janela de cdigo. Verifique que alm do objeto Form1, tambm
aparece o objeto Msg. Se voc selecion-lo, ver na caixa de
procedimentos o nome do evento Mensagem. Este o resultado de
termos acrescentado a palavra chave WithEvents na declarao da
varivel Msg. WithEvents usada para informar que a varivel ser
usada para armazenar uma referncia a um objeto que possui
eventos, e que queremos tratar estes eventos dentro do mdulo.
Assim como voc est acostumado a ver a relao de todos os
procedimentos de evento para os controles adicionados ao formulrio,
voc v agora os eventos para o objeto Msg na lista de procedimentos
de evento. Do mesmo modo como escreve cdigo para tratar os
eventos dos controles, voc pode faz-lo para tratar o evento
Mensagem do objeto Msg.
D um duplo clique sobre o evento Mensagem na lista para que
aparea o seu procedimento. Agora escreva o seguinte cdigo dentro
do procedimento do evento:
MsgBox texto
No procedimento Form1_Load acrescente:
Cria uma nova instncia da classe CMensagem e
armazena uma referncia a ela em Msg.
Set Msg = New Cmensagem
Dispara o evento Mensagem em Msg
Msg.DispararEvento "Isto uma mensagem!"
Pronto. Agora pressione F5 para executar.
To logo o formulrio Form1 inicie a sua carga, voc ver a
mensagem "Isto uma mensagem!" como resultado da chamada ao
mtodo DispararEvento que ativa o evento Mensagem no objeto Msg.
Numa outra situao, voc poderia desejar que um objeto container de
um objeto disparador de eventos fosse informado todas as vezes que
uma determinada propriedade do objeto contido sofresse alterao.
Seria o caso ento de se criar um evento para isso e dispara-lo com
RaiseEvent dentro do procedimento de atribuio de valor da
propriedade.
Eventos Comuns a Todas as Classes
Alm dos eventos que voc define para suas classes, elas tm em
comum com todas as demais dois eventos particularmente
interessantes: initialize e terminate. Estes eventos so disparados
quando da criao de um objeto da classe e quando da sua destruio
respectivamente. O tratamento destes eventos, ao contrrio dos
eventos que voc define, ocorre no interior do mdulo da classe. Para
ver o arcabouo destes procedimentos entre no mdulo da classe
CMensagem criada no exemplo acima e selecione Class na caixa de
objetos da janela de cdigo. Ao fazer esta seleo, examine a caixa
de procedimentos e veja que os nomes dos eventos Initialize e
Terminate esto relacionados. Caso queira executar algum cdigo de
inicializao ou de encerramento para os objetos da classe, nos
procedimentos de tratamento destes eventos que tal cdigo deve ser
adicionado.
Criando e Destruindo Objetos
J vimos no exemplo da classe CMensagem o uso da palavra New
para criar uma instncia de um objeto da classe. Ali, o uso de New foi
feito fora da declarao da varivel porque no permitido declarar
uma varivel com WithEvents e na mesma instruo de declarao
utilizar a palavra New. Mas, na ausncia de WithEvents, voc pode
declarar uma varivel e ao mesmo tempo usar New para que, na
primeira vez que a varivel for usada no cdigo, um objeto da classe
da varivel seja criado e a varivel passe a conter uma referncia a
este objeto. Veja um exemplo:
Private Msg As New CMensagem ' Declarao da varivel
Msg.DispararEvento "J sou um objeto!"

No exemplo acima nenhuma mensagem seria produzida, porque
nenhum procedimento de evento poderia tratar o evento disparado - j
que a varivel no foi declarada usando WithEvents -, mas ilustra a
no necessidade de se usar a instruo Set Msg = New
CMensagem para criar um objeto da classe quando se usa New j na
declarao.
O processo de criao de objetos a partir das suas classes mais
simples do que o processo de destruio desses objetos. Um objeto
s pode ser eliminado da memria quando no h mais nenhuma
referncia a este objeto em qualquer varivel. H duas formas de as
variveis deixarem de referenciar um objeto: uma quando so
destrudas por sarem do escopo do cdigo que est sendo
executado; outra quando lhes atribudo um novo valor. Os
programadores costumam atribuir o valor Nothing a toda varivel de
objeto que no precise mais referenciar um objeto. Desta forma o
objeto libera a memria to logo deixe de ser necessrio para a
aplicao. Exemplo:
Set varObjeto = Nothing
H uma observao, no entanto, a ser feita sobre isso no que diz
respeito aos objetos criados com a palavra New na declarao da
varivel: tais objetos no deixam de existir quando se atribui Nothing
s variveis que os contm. A explicao para isto vem do fato de que
ao usar New numa declarao de varivel, o compilador faz com que
uma instancia da classe (um objeto) seja criado e atribudo varivel
no caso de ela j no estar armazenando referncia a um objeto.
Quando voc atribui Nothing varivel, est limpando-a de qualquer
referncia a um objeto, mas tambm est referenciando-a dentro do
seu cdigo. Isto produz uma nova instanciao de objeto e nova
atribuio varivel. Evite, portanto, o uso da palavra New nas
declaraes de variveis. Declare as variveis de objeto de modo
simples e depois atribua um valor de objeto usando Set varivel =
New ClasseDoObjeto em alguma parte do cdigo.
Referncias Circulares entre Objetos
H um problema que pode passar desapercebido para os
programadores iniciantes no uso de objetos que o das referncias
circulares. Referncias circulares ocorrem quando um objeto tem uma
varivel membro usada para armazenar uma referncia a outro objeto,
e este outro objeto por sua vez contm uma varivel que faz
referncia ao primeiro objeto. Nestes casos um objeto no pode ser
destrudo porque h uma referncia a ele dentro do outro e vice-versa.
A soluo para isto atribuir Nothing s variveis membros de cada
um para s ento atribuir Nothing s variveis externas aos objetos
que guardam referncias a eles.























Depurao e Tratamento de Erros no
Visual Basic
Este captulo se concentra nos enganos ou erros cometidos durante a
codificao e o que fazer com eles. Independentemente da
experincia que voc tenha como programador, raramente os seus
programas sero processados sem erros logo na primeira tentativa. E
no importa o quo comportados sejam os usurios que trabalharo
com os seus programas, eles tendem a encontrar ou provocar uma
certa quantidade de erros durante a execuo dos programas.
Visualizaremos em primeiro lugar o processo de localizao e
remoo de bugs (erros) e ento veremos os meios para tratar os
erros de execuo, medida que ocorrem.
Bugs so aqueles insetos que infestam programas que voc tem
certeza de que esto perfeitos, apesar de no estarem produzindo os
resultados corretos. Curiosamente, um dos primeiros bugs registrados
em computadores era realmente um inseto. O computador Mark 11
era um computador eletromecnico construdo em 1945. Um dia o
computador misteriosamente parou de trabalhar. Uma busca cansativa
finalmente revelou que havia uma traa presa entre os pontos de
contato de um rel. Grace Murray Hopper, um dos criadores da
linguagem COBOL e um pioneiro na indstria de computadores,
retirou o infeliz lepidptero, colocando-o no livro de registros com a
anotao "Primeiro bug real encontrado".
Entretanto, os bugs discutidos neste capitulo so erros de lgica
contidos nos seus programas. Naturalmente, voc pode cometer
vrios tipos de erros que impedem seu programa de ser executado -
por exemplo, tentar assinalar um valor string para uma varivel do tipo
double. O Visual Basic sinaliza esses erros simples assim que os
encontra, facilitando a sua localizao e correo. Os bugs realmente
interessantes so os que voc precisa encontrar e corrigir por si
prprio.
Chama-se depurao o processo de localizao e correo de bugs.
Ao contrrio dos processos tradicionais de exterminao de pestes, a
depurao de programas de computador no tem efeitos colaterais, a
menos que voc leve em considerao as horas sem dormir e as
incontveis xcaras de caf que podem ser necessrias para resolver
um bug "cabeludo".
Depurar um programa pode ser interessante e at mesmo excitante.
Trilhar e eliminar um bug de software normalmente traz um sentimento
real de satisfao, seja em funo da sensao de concertar o seu
programa, de uma sensao de realizao ou, ainda, devido apenas
prpria emoo de caar. O exerccio mental pode ser elucidativo,
permitindo-lhe examinar e analisar seu prprio mecanismo de
pensamento.
Ferramentas de Depurao
Por mais que queiramos negar, todos os bugs realmente so erros de
programao. Entretanto, alguns erros se manifestam de forma to
rara ou sobre condies to anormais que parecem movidos por uma
inteligncia maligna, que sente prazer em nos confundir. O erro mais
comum uma rotina que simplesmente no funciona. Quando voc
encontrar um problema desse tipo, desejar usar algumas das
ferramentas que o Visual Basic oferece para depurao.
medida que trabalhar com as vrias ferramentas de depurao,
voc descobrir que alguns dos botes da barra de ferramentas
Debug do Visual Basic representam atalhos simplificadores. Esta
barra de ferramentas no visvel como a barra de ferramentas
padro, mas voc pode torn-la visvel selecionando-a no menu
View/Toolbars. A Figura 9.1 identifica os botes da barra de
ferramentas Debug.

Figura 9.1 Os botes da barra de ferramentas Debug.

A Janela Immediate
Como voc j sabe, o pressionamento de Ctrl-Break em qualquer
instante durante a execuo de seu programa interromper o
aplicativo e ativar a janela Immediate. Se um certo procedimento
estiver sendo processado quando o programa for interrompido, voc
ver tambm a janela de cdigo desse procedimento. Nesse ponto,
voc pode introduzir e processar instrues de Visual Basic na janela
Immediate . Cada instruo pode conter apenas uma linha. A
instruo executada dentro da janela Immediate ao se pressionar a
tecla Enter. O cdigo na janela de cdigo no se altera.
Normalmente, voc desejar apenas imprimir o valor de variveis e
expresses que lhe interessam. Porm, pode-se ir muito alm disso.
De fato, voc pode executar quase todas as instrues de
programao do Visual Basic; por exemplo, pode modificar uma
varivel ou executar um procedimento dentro da janela Immediate .
Observe, no entanto, que voc pode apenas modificar variveis locais,
parmetros do procedimento atual e variveis em nvel de mdulo ou
pblicas. No possvel examinar ou alterar variveis locais a outros
procedimentos que no o atual. possvel tambm modificar o valor
de quaisquer propriedades que possam ser alteradas em tempo de
execuo.
Como uma demonstrao, crie um novo projeto que contenha apenas
um boto de comando. Inclua o procedimento geral DoStuff e o
procedimento Click para o boto de comando, conforme mostrado
pela Figura 9.2.
Figura 9.2 O cdigo de programa para o aplicativo Girar os Polegares.
Pressione F5 para iniciar o aplicativo. D um clique no boto de
comando e pressione Ctrl-Break para que o Visual Basic pare o
aplicativo e exiba a janela de cdigo, que ser semelhante mostrada
na Figura 9.3. (So boas as chances de que o programa seja
interrompido na rotina DoStuff; caso isso no acontea, pressione F5
para reiniciar o programa e tente interromp-lo novamente.)
Figura 9.3 A janela de cdigo de um programa interrompido.
Na janela de cdigo mostrada na Figura 9.3, a linha Next B aparece
em destaque, porque a prxima instruo a ser executada pelo
Visual Basic. Na janela Immediate, voc poderia introduzir a instruo
Print B (ou apenas ? B) para ver quantas vezes a instruo For
realizou o lao. Voc poderia introduzir Print A para ver o valor atual
de A. Entretanto, no poderia digitar Print C ou Print D para examinar
as outras variveis do programa, mesmo que elas contenham valores,
pois a janela Immediate est limitada ao escopo do procedimento
executado no momento. Se introduzir as instrues Print C ou Print D,
o Visual Basic assumir que voc est apenas usando variveis no-
declaradas no procedimento atual e imprimir uma linha em branco.
Voc tem acesso a todas as variveis e propriedades de escopo
global ou em nvel de mdulo, tornando possvel a execuo de
instrues como Print Command1.Caption e Print Form1.Height.
Para modificar uma propriedade ou uma varivel na janela Immediate ,
voc deve usar as mesmas instrues e expresses que so usadas
em um programa. Por exemplo, voc pode diminuir o tamanho da
janela de um form, executando a instruo Form1.Height =
Form1.Height/2. Ou pode executar qualquer subprocedimento, ou
mtodo, introduzindo o seu nome. Por exemplo, ao introduzir a
instruo Print, voc est chamando o mtodo Print do objeto
representado pela janela Immediate (um objeto chamado Debug).
Voc no est limitado aos procedimentos internos do Visual Basic;
pode tambm executar qualquer um dos procedimentos que escreveu.
Expresses de Vigilncia
Quando voc deseja apenas examinar o valor de uma varivel, o
Visual Basic oferece uma tcnica rpida que dispensa o uso de
instrues Print. Estando no modo de interrupo (Break Mode),
posicione o cursor do mouse sobre o nome de uma varivel na janela
de cdigo - tente fazer isso com a varivel B do procedimento DoStuff
- e voc ver o valor da varivel aparecer num pequeno retngulo
prximo a ela.
Voc tambm pode incluir uma expresso vigiada na janela Watch ,
para poder acompanhar o seu valor todas as vezes que interromper a
execuo do programa. Para incluir uma expresso selecionada, d
um clique com o boto direito do mouse sobre o nome da varivel na
janela de cdigo e selecione Add Watch no menu apresentado, ou
escolha a opo Add Watch do menu Debug. Na caixa de dilogo Add
Watch, mostrada na Figura 9.4, d um clique no boto OK para fazer
com que a expresso vigiada selecionada aparea na janela Watch.
Figura 9.4 A caixa de dilogo Add Watch.
Voc pode tambm incluir uma expresso a ser vigiada na janela
Watch sem antes ter de selecion-la. Basta digitar a expresso
desejada diretamente na caixa de texto da caixa de dilogo Add
Watch. O quadro Context da caixa de dilogo permite-lhe especificar o
procedimento ou mdulo no qual as variveis de sua expresso esto
definidas - isso poder ser necessrio, por exemplo, quando voc tiver
duas variveis com o mesmo nome, uma em nvel de form e outra
local. (Discutiremos o quadro Watch Type da caixa de dilogo mais
adiante.)
A Figura 9.5 apresenta o aspecto da janela Watch aps a incluso de
duas expresses que sero vigiadas. Essas expresses exibem a
varivel D no procedimento Command1_Click e a varivel B no
procedimento DoStuff.
Figura 9.5 A janela Watch com expresses que sero vigiadas.
Se voc quiser editar ou remover uma expresso vigiada, includa na
janela Watch, selecione a opo Edit Watch do menu Debug e faa as
modificaes necessrias na caixa de dilogo Edit Watch que ser
exibida.
A Arvore de Chamadas (Onde Estou?)
No exemplo simples da seo anterior (o aplicativo Girar os
Polegares), era bem evidente o que aconteceria quando o programa
fosse interrompido. Porm, num aplicativo mais complexo, a
seqncia de eventos pode no ser to clara assim. Nesse caso, voc
pode selecionar a opo Call Stack do menu View para produzir uma
caixa de dilogo que mostre as chamadas a procedimentos ativos no
programa.
A Figura 9.6 mostra a caixa de dilogo Call Stack (Pilha de
Chamadas) para o programa Girar os Polegares. A primeira linha da
caixa de dilogo exibe o procedimento atual - neste caso, o
procedimento DoStuff, que est no mdulo Form1. Esse procedimento
foi chamado a partir do procedimento de evento Command1_Click,
tambm contido no mdulo Form1. O rastreamento das chamadas
termina aqui, pois a chamada ao procedimento Click foi disparada por
um evento gerado pelo usurio. Em um programa complexo, a caixa
de dilogo Call Stack poderia exibir muitas entradas, indicando o
aninhamento das chamadas a procedimentos. Voc pode dar um
clique duplo em qualquer uma das entradas (ou selecionar uma
entrada e dar um clique no boto Show) para exibir o cdigo do
procedimento em questo.
Figura 9.6 A rvore de chamadas para um programa interrompido.
Pontos de Interrupo (Break Points) e Instrues Stop
Ao pressionar Ctrl-Break para interromper o programa Girar os
Polegares, voc no tem muito controle sobre o ponto onde o
programa ser interrompido. Porm, o Visual Basic permitir que voc
marque explicitamente uma ou mais instrues como pontos de
interrupo, locais nos quais a execuo do programa parar, dando-
lhe a oportunidade de vasculhar o programa para tentar diagnosticar
os seus problemas. Voc pode configurar pontos de interrupo antes
de executar o programa ou ento aps interromper a sua execuo.
Para configurar um ponto de interrupo, abra a janela de cdigo para
o procedimento desejado e d um clique na regio acinzentada na
lateral da janela de cdigo esquerda da instruo onde a execuo
dever parar. Ou ento selecione a instruo e pressione F9 ou
escolha a opo Toggle BreakPoint do menu Debug. O Visual Basic
colocar a linha destacada para indicar a presena de um ponto de
interrupo.
Para remover um ponto de interrupo, basta refazer um dos
procedimentos acima para a instruo selecionada. Caso tenham sido
estabelecidos vrios pontos de interrupo, pode-se selecionar a
opo Clear All BreakPoints (remover todos os pontos de interrupo)
do menu Debug para elimin-los de uma nica vez.
Pode-se conseguir o mesmo efeito de estabelecimento de pontos de
interrupo, incluindo-se instrues Stop. Essa tcnica no to
conveniente quanto o uso de pontos de interrupo, pois exige um
esforo maior de codificao. Porm, com pontos de interrupo, o
Visual Basic interrompe o programa toda vez que a execuo atingir
um desses pontos. Com o uso de instrues Stop, voc pode ser
muito mais especfico, assegurando que o programa parar apenas
em determinadas condies. Por exemplo, o fragmento de cdigo a
seguir interromperia seu programa aps ser executado 10 vezes e
somente se o valor da varivel A fosse menor do que 0.
Static ContadorParada As Integer
ContadorParada = ContadorParada + 1
If ContadorParada > 10 And A < 0 Then
Stop
End If
Aps seu programa ser interrompido, seja por meio de pontos de
interrupo, seja por instrues Stop, voc pode fazer a execuo
prosseguir, pressionando F5 ou escolhendo a opo Continue do
menu Run do Visual Basic. Se tiver usado instrues Stop, precisar
lembrar-se de remov-las do programa. Os pontos de interrupo
estaro ativos apenas para a sesso atual do Visual Basic.
O uso de instrues Stop pode ser descrito como uma tcnica invasiva
- ou seja, e preciso modificar fisicamente a estrutura de seu programa.
Outro exemplo de tcnica invasiva a escrita na janela Immediate
(Debug) em um captulo anterior. A instruo Debug.Print seguida por
uma expresso faz com que o valor da expresso seja escrito na
janela Immediate , sem causar qualquer interrupo do programa. A
colocao de algumas poucas instrues desse tipo ao longo de
programas "doentes" poder ajud-lo a descobrir o ponto onde os
problemas comeam a ocorrer. Entre os usos mais comuns esto a
impresso do nome dos procedimentos que comearam a ser
executados, e a exibio do valor de certas variveis.
Apesar das tcnicas invasivas permitirem-lhe executar operaes
mais sofisticadas, as tcnicas no-invasivas, como pontos de
interrupo, so preferveis, pois evitam que voc deixe dentro do
programa "paciente" o equivalente a uma esponja ou a um bisturi. Se
voc se esquecesse de remover uma instruo Stop de um
procedimento raramente executado antes de compilar o programa,
voc (ou, pior ainda, um cliente que estivesse usando o seu programa)
poderia ter um choque quando a mensagem "Stop statement
encountered" ("Encontrada instruo Stop") aparecesse no meio de
um aplicativo, encerrando-o imediatamente e enviando toda e
qualquer informao para a terra do nunca.
Pontos de Vigilncia
H uma outra tcnica no-invasiva, chamada de ponto de vigilncia,
que avisa ao Visual Basic para interromper o programa quando uma
condio particular for atingida (em contraste com o ponto de
interrupo, que especifica a parada quando uma determinada linha
de cdigo for alcanada) ou quando o valor de uma expresso se
modificar.
Para assinalar um ponto de vigilncia, destaque a expresso
especifica no seu cdigo e escolha a opo Add Watch do menu
Debug, ou selecione a opo Add Watch primeiro e depois digite a
expresso na caixa de texto da caixa de dilogo Add Watch. Nessa
caixa de dilogo (mostrada anteriormente na Figura 9.4), mova-se
para a seo Watch Type (tipo de vigilncia), selecione o boto de
opo marcado como Break When Value is True (parar quando a
expresso for verdadeira) e d um clique no boto OK. O Visual Basic
incluir a expresso na janela Immediate . Se desejar que o programa
pare quando o valor da expresso se modificar, deve selecionar o
boto de opo marcado como Break When Value Changes (parar
quando a expresso se modificar) na caixa de dilogo Add Watch.
Em qualquer um dos casos, ao ser retomada a execuo do
programa, o Visual Basic: avaliar a expresso que ser vigiada aps
a execuo de cada instruo, interrompendo-o quando ocorrer a
condio especificada.
Pontos de vigilncia so ferramentas muito poderosas, mas tm um
lado negativo. Apesar de no-invasivos, os pontos de vigilncia
tornam mais lenta a execuo de seu programa, pois as expresses
que sero vigiadas precisam ser continuamente testadas. A melhor
tcnica o uso combinado de pontos de interrupo com pontos de
vigilncia. Assinale um ponto de interrupo na posio do programa
onde voc suspeita que algo esteja errado. O programa pode ser
executado a toda velocidade at aquele ponto. A partir da, voc pode
ativar um ou mais pontos de vigilncia e continuar a execuo mais
lentamente.
Passo a Passo
Outra tcnica de depurao no-invasiva a passo a passo, que lhe
permite executar o seu programa uma instruo de cada vez. Ela
essencialmente equivalente configurao de um ponto de
interrupo, uma instruo adiante da posio atual, executando a
instruo do momento e removendo o ponto de interrupo. Quando
voc caminha passo a passo atravs das instrues de seu programa,
consegue examinar o efeito da execuo de cada instruo.
O percurso passo a passo controlado pela tecla F8 (ou pela opo
Step Into do menu Debug, muito embora seja bem mais prtico usar a
tecla de funo). Voc pode iniciar a execuo passo a passo, quando
o seu programa no est sendo processado. Cada vez que F8 for
pressionado, o Visual Basic executar uma instruo e o destaque
marcando a prxima linha na janela de cdigo avanar. Se a
instruo executada contiver uma chamada a um procedimento escrito
pelo usurio, a janela de cdigo modifica-se e o destaque aparece ao
redor da primeira linha executvel do procedimento recm-chamado.
Caso seja executada uma instruo que contenha mais de uma
chamada, voc percorrer passo a passo cada um dos
procedimentos, na ordem em que forem chamados. Por exemplo,
considere o programa mostrado na Figura 9.7. (Os nmeros de
referncia do lado esquerdo foram includos apenas para identificar as
vrias linhas do programa.)
Se voc processar esse programa com um ponto de interrupo
assinalado na linha 3 (A = 4), o destaque aparecer inicialmente na
linha 3. Quando voc pressiona F8 para iniciar a execuo passo a
passo, a caixa avana para as linhas 4, 8, 9, 12, 13 e 5. (J que as
linhas 7 e 11 so vistas como declaraes, e no como linhas
executveis, a ferramenta de depurao ir salt-las. Se voc
configurar um ponto de interrupo em uma declarao, quando o
programa for interrompido, o destaque aparecer na prxima linha
executvel.)
Figura 9.7 Cdigo de programa demonstrando a execuo passo a
passo.
Se voc estiver executando um programa passo a passo e atingir um
procedimento que j tenha sido suficientemente depurado, pode evitar
a sua execuo passo a passo. Se mantiver a tecla Shift pressionada
enquanto pressiona F8, ou se der um clique no submenu Step Over do
menu Debug, o Visual Basic far a execuo da instruo apenas no
procedimento atual, executando as chamadas a outros procedimentos
como se fossem instrues simples. Se usar Shift-F8 para percorrer o
programa mostrado na Figura 9.7, voc ir mover-se da linha 3 para a
linha 4 e para a linha 5. O Visual Basic executar as linhas de 7 at 9
e de 11 at 13, evitando que voc tenha de percorrer os dois
procedimentos de funo, instruo a instruo, pois voc tem certeza
de que esto corretos. Caso voc chegue a entrar num dos
procedimentos chamados e queira sair da execuo passo a passo
dentro do procedimento, pode clicar na opo Step Out do menu
Debug ou pressionar a combinao de teclas Ctrl-Shift-F8. Nesse
caso, todas as instrues restantes do procedimento atual sero
executadas e a execuo s ser interrompida na posio
imediatamente seguinte sua chamada.
Voc tem liberdade para alternar entre as trs formas de percurso
passo a passo, instruo a instruo, procedimento a procedimento ou
entrada no procedimento e sada com Step Out, durante uma sesso
de depurao. Observe que um ponto de interrupo colocado dentro
de um procedimento causar a parada da execuo, mesmo que voc
esteja fazendo o percurso procedimento a procedimento.
Experimente essas tcnicas com o programa Girar os Polegares
mostrado na Figura 9.2. Em primeiro lugar, use F9 para assinalar um
ponto de interrupo na instruo Next D no procedimento
Command1_Click. Pressione F5 para processar o programa e d um
clique no boto de comando para atingir o ponto de interrupo.
Pressione F9 novamente para remover o ponto de interrupo.
Depois, mantendo a tecia Shift pressionada, pressione F8 algumas
vezes. Voc permanecer no procedimento Command1_Click (ainda
que observe uma pequena pausa enquanto o procedimento DoStuff
est sendo processado). Quando voc retornar instruo Next D,
pressione F8 duas vezes sem usar a tecla Shift. Esses dois passos
simples iro coloc-lo dentro do procedimento DoStuff, onde voc
pode continuar a tcnica passo a passo.
Finalmente temos a janela Locals, que pode ser exibida
selecionando Locals Window no menu View. Essa janela lhe permite
acessar para consulta e modificao o contedo de todas as variveis
e objetos que sejam visveis ao procedimento atual. As variveis e
seus valores so apresentados numa estrutura de rvore. No caso de
objetos, as suas propriedades e variveis membro podem ser
acessadas expandindo o n em que so apresentados.
Estratgias de Depurao
Normalmente, bem fcil localizar a origem de um problema em um
programa; com freqncia, evidente que tudo est funcionando, com
exceo de um boto ou de um certo clculo. Voc pode ento aplicar
a tcnica clssica de granulosidade decrescente. O termo
granulosidade refere-se ao tamanho dos blocos de programa que
precisam ser executados. Voc pode iniciar usando pontos de
interrupo que lhe permitam executar grandes pedaos do programa
sem interrupo. medida que se aproximar do ponto onde as coisas
comeam a dar errado, voc poderia mudar para passo a passo
procedimento por procedimento e ento para passo a passo instruo
por instruo, at determinar o ponto exato onde acontece o erro.
Evidentemente, o pargrafo anterior assume com otimismo que a
origem de seus problemas seja uma simples instruo.
Freqentemente isso no assim. Voc pode descobrir que fez
suposies sobre o valor de variveis ou sobre a entrada feita pelo
usurio que simplesmente no so verdadeiras, e isso ir for-lo a
reescrever algumas partes de seu programa. Como h uma forte
tendncia a assumir tais suposies como verdadeiras durante a sua
sesso de depurao, pode-se tornar muito difcil determinar o que
est dando errado. Em momentos como esses, voc poder verificar
essas suposies, criando a codificao necessria para tal. Por
exemplo, se voc assume que um certo parmetro jamais ter um
valor menor do que 10 ou maior do que 50, pode inserir a seguinte
codificao no incio do procedimento que contm o tal parmetro:
lf Param < 10 Or Param > 50 Then
Debug.Print "Suposio invlida sobre a varivel 'Param.' "
Stop
End If
Muito embora se trate de uma tcnica invasiva, a codificao para
validao de suposies, por vezes, pode ajud-lo a encontrar os
bugs mais rapidamente do que o uso das tcnicas no-invasivas,
especialmente no caso de programas longos ou complexos.
Finalmente, naquelas ocasies em que voc no tem a menor idia do
que est dando errado, pode recorrer tcnica Elmer Fudd, segundo
a qual voc aplica uma matriz de 12 verdades e mentiras para
"despachar o programa para qualquer lugar" se ele no comear a
funcionar direito. Entretanto, por mais satisfao que isso possa
trazer, seria altamente improdutivo.
H uma outra alternativa. Voc pode usar uma pesquisa binria, que
uma variao da abordagem de granulosidade decrescente. A
estratgia de uma pesquisa binria igual usada em jogos de
adivinhao. Se o seu adversrio escolhe um nmero de 1 a 100,
voc consegue determinar o nmero com no mximo oito tentativas. A
sua primeira tentativa deve sempre ser 50. Seu oponente deve dizer
se voc acertou, se est acima ou abaixo. Se estiver acima voc deve
tentar 25; se abaixo, 75. A cada tentativa, voc elimina metade das
alternativas restantes.
Similarmente, quando voc possui um programa complexo e no tem
qualquer idia de onde procurar o problema, coloque um ponto de
interrupo na metade do aplicativo. Ao ser atingida a interrupo,
examine o valor das variveis mais importantes. Se parecer que est
tudo bem, coloque o prximo ponto de interrupo no ponto mdio
entre a posio atual e o final do programa. Do contrrio, coloque o
ponto de interrupo no ponto mdio entre o inicio do programa e o
ponto atual e reinicie o processamento do programa. Essa tcnica
deve conduzi-lo mais rapidamente vizinhana do problema,
permitindo que ento voc mude para a tcnica de depurao passo a
passo, ou outra tcnica mais apropriada.
No hesite em utilizar os recursos de depurao do Visual Basic para
testar suas teorias sobre o que est acontecendo de errado com o seu
programa. Por exemplo, se voc descobrir que esqueceu de
incrementar uma varivel, no abandone o processo de depurao
para corrigir o programa. Use a janela Immediate para configurar a
varivel com o valor que imagina estar correto e deixe a execuo do
programa continuar. Por vezes, voc perceber que o que parece ser
a origem do problema na realidade um efeito colateral do problema
real.
Pode-se usar ainda as ferramentas de depurao para fazer
experincias com o fluxo de controle de seu programa. Digamos que
voc tenha interrompido seu programa em um certo ponto dentro de
um procedimento e tenha concludo que est faltando uma instruo If
para saltar algumas linhas. Voc pode configurar a prxima instruo
a ser executada, dando um clique nela e ento selecionando a opo
Set Next Statement do menu Debug. Voc pode selecionar qualquer
instruo dentro do procedimento do momento, mesmo que seja
anterior instruo atual, porm no pode especificar uma instruo
de outro procedimento como a prxima instruo a ser executada.
Tratamento de Erros
At agora, este captulo concentrou-se nos erros de programao que
podem causar uma falha do aplicativo ou o retorno de resultados
invlidos. Outra classe de problemas, chamada de erros de execuo
(runtime errors), tambm podem fazer com que seu programa venha a
falhar. Os erros de execuo quase sempre provm de condies que
voc no pode controlar, tais como falta de memria ou de espao em
disco, um engano por parte do usurio ao tentar abrir um arquivo que
j foi aberto por outros aplicativos e assim por diante. Outros erros de
execuo so bugs, indicativos de erros de lgica no seu programa,
tais como indexao alm do limite dimensionado para uma matriz.
Quando ocorre um erro de execuo, o Visual Basic normalmente
exibe uma caixa de dilogo de mensagem e encerra o aplicativo. No
entanto, voc pode obter o controle sobre o tratamento desses erros
por meio da codificao de algumas rotinas. Essa tcnica, chamada
de captura de erros, permite ao seu programa detectar e
possivelmente contornar o problema, ou pelo menos encerrar a
execuo do programa mais amigavelmente. Voc estabelece seu
controle sobre o sistema, habilitando a captura de erros. Quando voc
escreve um procedimento que captura erros, sua estrutura geral deve
ser semelhante a esta:
Sub declarao
[Instrues]
On Error GoTo Rtulo
[Instrues]
Exit Sub
Rtulo:
Codificao para tratamento do erro
End Sub
A instruo On Error GoTo Rtulo, onde Rtulo identifica o cdigo
para tratamento de erros, habilita a captura de erros. Se ocorrer um
erro de execuo na instruo que se segue instruo On Error
GoTo Rtulo, o controle ser transferido imediatamente para o cdigo
de tratamento de erros, identificado por Rtulo. Rtulo poder ser
qualquer identificador que voc venha a escolher e, quando usado
para marcar um determinado local do seu cdigo, deve terminar com
dois-pontos (:).
Para desabilitar a captura de erros mais adiante, dentro do mesmo
procedimento, voc pode usar a instruo On Error GoTo 0. A partir
desse ponto, qualquer erro de execuo que venha a ocorrer ser
tratado diretamente pelo Visual Basic, e no pela rotina de tratamento
de erros dentro de seu procedimento. Essa capacidade de ativar e
desativar a captura de erros ser til se apenas um pequena parte de
seu cdigo estiver propensa a conter erros de execuo.
A captura de erros ficar ativa apenas no procedimento que contiver a
instruo On Error GoTo Rtulo. Quando um procedimento se
encerra, a captura de erros retorna rotina que originalmente chamou
o procedimento. Caso essa rotina no contenha manipulador de erros,
a captura de erros ser desativada.
Uma vez que a execuo de seu programa seja movida para a rotina
de tratamento de erros de um procedimento, voc pode testar o valor
de retorno da funo Err para descobrir a origem do erro. Err retorna
um inteiro indicando o tipo de erro - erro 7, por exemplo, indica que
voc extrapolou a memria disponvel; erro 53 indica que o programa
no consegue encontrar o arquivo designado; e assim por diante. A
lista completa dos cdigo de erros aparece no sistema de ajuda on-
line do Visual Basic e em seu manual de referncia.
Evidentemente, o seu manipulador de erros no ser obrigado a tratar
de todos os tipos de erros. O erro 53, por exemplo, poder ocorrer
somente quando voc tentar acessar um arquivo. Se seus
procedimentos no tm acesso a arquivos, voc no precisa tratar o
erro 53.
Aps determinar o tipo de erro que ocorreu, voc tem quatro
alternativas. A mais simples devolver o erro para o Visual Basic.
Voc consegue isso com a instruo Error. A instruo Error requer
apenas um argumento e provoca imediatamente o erro de execuo
designado pelo argumento. A incluso da instruo Error Err no final
de sua codificao para tratamento de erros far com que o Visual
Basic trate os erros que voc no quis testar.
As outras trs alternativas envolvem a retomada da execuo do
programa. A incluso da instruo Resume em sua rotina de
tratamento de erros far com que a execuo seja retomada aps a
correo do erro. Voc pode usar as seguintes variaes:

Figura 9.8

Considere o cdigo de programa mostrado na Figura 9.9, que gera
um erro quando tenta fazer uma diviso por zero.

Figura 9.9 Cdigo de programa que inclui tratamento de erros.

Quando voc executar esse procedimento, as instrues sero
processadas seqencialmente at atingir a linha 6. Nesse ponto, ser
disparado o erro 11 (diviso por zero) e o controle do programa
passar para a linha 10. A codificao de tratamento de erro
assinalar o valor 2 para a varivel XX e a instruo Resume far com
que a linha 6 seja processada novamente. Desta vez, a expresso no
gerar erro. A instruo 7 imprimir o valor 5, e o procedimento ser
encerrado.
Caso fosse usada a instruo Resume Next na linha 12, o programa
continuaria na linha 7, que imprimiria o valor 10 (valor inalterado de
YY), pois a linha 6 no teria sido executada corretamente. Finalmente,
se a instruo na linha 12 fosse Resume ISair, a execuo seria
retomada na linha 8, provocando o encerramento da rotina sem
imprimir qualquer valor.
importante observar que a instruo Resume aplica-se somente ao
procedimento no qual aparece. Tomemos o exemplo da Figura 9.9, e
modifiquemos o cdigo para incluir dois procedimentos, conforme
mostrado na Figura 9.10, onde aparece o tratamento de erros com
mltiplos procedimentos.

Figura 9.10 Cdigo de programa que demonstra o tratamento de erros
com mltiplos procedimentos.
Ao executar esse cdigo, voc ver a seguinte sada:
Incio
Entrando
Entrando
5
Saindo
Feito
Se voc usasse uma instruo Resume Next em vez de Resume, a
seguinte sada seria produzida:
Incio
Entrando
Feito
Em ambos os casos, a rotina de tratamento de erros faz a execuo
ser retomada dentro do procedimento que contm o manipulador de
erros, e no na instruo que realmente causou o erro no
procedimento Bugged. Se voc deseja que seu programa seja capaz
de retomar a execuo normal dentro do procedimento Bugged, ter
de incluir uma rotina de tratamento de erros nesse procedimento.




Programao Grfica no Visual
Basic
Este captulo uma introduo programao grfica do Visual Basic.
Trabalhar com grficos pode ser divertido, embora no seja
necessariamente fcil. Naturalmente, o Windows em essncia um
ambiente grfico; lembre-se de que os melhores programas escritos
para Windows fazem uso desse recurso.
Forms e Caixas de Imagem
At este ponto, a maioria dos "desenhos" que voc criou em Visual
Basic foi feita em tempo de desenvolvimento. O Visual Basic tambm
suporta mtodos grficos que lhe permitem escrever no vdeo em
tempo de execuo, realizando tarefas tais como impresso de texto,
desenho de linhas, tracejamento de crculos, modificao de cores e
assim por diante. Esses mtodos esto associados a forms, caixas de
imagens e a um tipo especial de objeto chamado Printer. A discusso
a seguir concentra-se nos forms, porm as propriedades e mtodos
descritos aplicam-se tambm s caixas de imagens.
A impresso e o objeto Printer sero discutidos no captulo 12.
Gerenciamento de Vdeo
As imagens em seu monitor so reflexo direto do contedo da
memria de vdeo, um banco de RAM que pertence placa
controladora de vdeo. As imagens na tela so compostas por vrios
pontos individuais chamados de pixels (abreviatura para picture
elements - elementos de imagem). A quantidade de pixels que
compe o vdeo determina quanta memria RAM necessria. Um
monitor monocromtico requer apenas um bit para cada pixel. Quando
o bit correspondente em RAM est no estado ON, o pixel no vdeo
iluminado. Quando o bit est em OFF, o pixel fica escuro. Se, por
exemplo, a resoluo do vdeo de 640 por 320 pixels, sero usados
204.800 bits (640 x 320) ou 25.600 bytes da memria de vdeo para
controlar a exibio.
Em um monitor colorido, preciso mais de um bit para controlar o
pixel, pois a cor criada por meio de uma combinao de
intensidades variveis de vermelho, verde e azul. Dependendo do tipo
de controladora, podem ser necessrios de 4 a 32 bits por pixel para
controlar o monitor colorido. (Quanto mais bits, mais cores podero
ser exibidas simultaneamente.) Em sistemas com maiores recursos,
com grandes monitores coloridos, apenas a RAM de vdeo chega a
atingir 4 megabytes.
Exibindo Grficos
Todas as imagens de vdeo , desde linhas multicoloridas a textos
simples, so criadas por meio de uma configurao dos bits
apropriados na memria de vdeo. Os mtodos grficos do Visual
Basic fazem toda a configurao de bits para voc. Esses mtodos
grficos, chamados de Print, Line, Circle e PSet, traam textos, linhas,
arcos e pontos individuais no vdeo. Alm disso, um mtodo chamado
Point determina a cor de um ponto, e o mtodo CIs limpa o form.
Em ambientes onde apenas um programa controla a exibio, a
imagem traada no vdeo permanece nele. O Windows, no entanto,
um ambiente multitarefa. Aps ser traada uma imagem sobre um
form, o usurio pode mudar para um segundo aplicativo que traar
alguma coisa em algum lugar do vdeo . A confuso tem incio quando
o usurio, ao sair desse segundo aplicativo, espera rever a imagem
criada pelo primeiro aplicativo, possivelmente sobreposta pelo
segundo aplicativo.
O Windows resolve esse problema com o evento Paint, que tratado
por um procedimento de evento do Visual Basic. Se a exibio de um
aplicativo for sobreposta por alguma outra janela, o Windows enviar o
evento Paint para o aplicativo "sobreposto" quando este retomar o
controle da exibio, permitindo que ele recrie a imagem do vdeo. O
mesmo processo ocorre (sem interferncia do aplicativo) quando voc
minimiza uma janela contendo imagens ou controles e ento faz a sua
restaurao.
Um aplicativo simples pode demonstrar o que est acontecendo. Crie
um novo projeto. Inclua o seguinte cdigo como procedimento Click do
form e ento processe o programa:
Sub Form_Click ()
Print "Al
End Sub
D alguns cliques no form para fazer com que o texto aparea no
vdeo. Agora, minimize o form ou mova a janela de algum outro
aplicativo sobre o form. Quando voc restaurar o form, ativando-o
novamente, poder ver que o texto ter desaparecido.
Nesse caso, quando o form foi restaurado, o Visual Basic chamou o
seu procedimento Form_Paint. Porm, como ele no tinha sido criado,
nada aconteceu. Obviamente, se voc tem inteno de escrever
aplicativos grficos, precisar codificar o procedimento de evento
Paint para poder reconstruir as imagens. Isso requer um planejamento
cuidadoso. A melhor abordagem colocar toda a codificao grfica
no prprio procedimento Paint. Quando o programa estiver pronto
para traar a imagem pela primeira vez, chame esse procedimento
diretamente. Com isso, tudo estar estruturado de forma que a
chamada automtica que o Visual Basic faz para o procedimento de
evento Paint reconstrua as imagens necessrias.
Tente modificar o programa que voc acabou de escrever para usar
essa tcnica. Em primeiro lugar, introduza o seguinte cdigo na seo
de declaraes gerais:
' Inicializado como 0 pelo Visual Basic
Dim ContClick As Integer
Ento, inclua estes dois procedimentos de eventos:
Sub Form_Click ()
ContClick = ContClick + 1
Form_Paint
End Sub
Sub Form_Paint ()
Dim I As Integer
' Limpar a tela, posicionando a
impresso no topo do form.
Cls
For I = 1 To ContClick
Print "Al"
Next I
End Sub
Ao processar essa verso do programa, tente minimizar ou sobrepor
alguma outra janela janela do form. Voc ver que a exibio
sempre retorna aparncia anterior quando o form restaurado.
A Propriedade AutoRedraw
O Visual Basic tambm oferece uma tcnica simples para
recomposio de imagens. Todo form tem uma propriedade
AutoRedraw, que por default False. Caso essa propriedade seja
configurada para True, o prprio Visual Basic tratar toda a
recomposio.
Para testar isso, use o cdigo original do programa Al (sem incluir o
procedimento Form_Paint):
Sub Form_Click ()
Print "Al"
End Sub
Agora, configure a propriedade AutoRedraw para True, e pressione F5
para processar o aplicativo. Desta vez, o contedo do form no ser
perdido quando a sua janela for sobreposta ou minimizada, apesar de
o programa no conter o procedimento Form_Paint.
Naturalmente, isso uma armadilha. Ao configurar a propriedade
AutoRedraw para True, voc simplesmente transfere a
responsabilidade sobre o gerenciamento da exibio para o Visual
Basic. O Visual Basic desempenhar essa tarefa, alocando uma certa
quantidade de memria (a quantidade de bits necessrios para
armazenar uma duplicata das imagens do aplicativo). Quando voc
traa desenhos no form , o Visual Basic atualiza a cpia na tal
"memria de backup". Quando se torna necessrio restaurar o form, o
Visual Basic recupera a cpia na memria de backup, transportando-a
para a memria de vdeo do sistema.
Portanto, fundamental escolher entre programas simples que
requeiram quantidade maior de memria, ou programas complexos
que demandem menos memria. Enquanto voc est escrevendo
programas simples, aplicativos com um nico form, provavelmente
mais adequado assinalar a propriedade AutoRedraw como True.
Entretanto, medida que seus aplicativos ficarem maiores, voc
desejar economizar a memria despendida com cpias de seus
forms, e assim ser necessrio escrever os procedimentos
Form_Paint.
Nota: Em aplicativos que no usem mtodos grficos, a propriedade
AutoRedraw deve sempre ser configurada como False. Caixas de
texto, rtulos, caixas de listas, caixas combinadas e outros controles
semelhantes no so afetados pelos eventos Paint, tornando
desnecessrias cpias de backup.
Coordenadas do Vdeo
O Visual Basic oferece um sistema de coordenadas default que
especifica as localizaes de objetos dentro de um form. Esse
sistema, ilustrado na Figura 11.1, assinala as coordenadas (0,0) para
o canto superior esquerdo do form; com valores que crescem
medida que voc se movimenta para a direita ao longo do eixo
horizontal e para baixo ao longo do eixo vertical. As propriedades Top
e Left de um objeto indicam seu deslocamento a partir do ponto de
origem (0,0).

Figura 11.1 O sistema de coordenadas do Visual Basic .
As propriedades Top, Left, Width e Height so medidas em twips.
Como voc deve se lembrar do Capitulo 5, um twip a unidade de
medida equivalente a 1/1440 de polegada ou 1/20 de um ponto. (Um
ponto aproximadamente 1/72 de polegada, isto , a medida
tipogrfica padro usada para dimensionamento de fontes de
caracteres.) Assim, um objeto que tenha 1/2 polegada de altura e 2
polegadas de largura tem as propriedades Height e Width
configuradas como 720 e 2880, respectivamente.
Caso seja mais confortvel trabalhar com outras unidades de medida,
voc pode modificar a configurao da propriedade ScaleMode do
form, para que o Visual Basic adote outra unidade para o sistema de
coordenadas. A Figura 11.2 descreve as unidades de medida
correspondentes s vrias configuraes da propriedade ScaleMode.
Pode-se ver facilmente o efeito da modificao da configurao de
ScaleMode. Coloque um objeto da caixa de ferramentas em um form e
examine a configurao das propriedades Top, Left, Height e Width do
objeto. Modifique ento a ScaleMode do form para 5; um controle cuja
propriedade Height estava configurada em 720 (twips) ter agora a
configurao 0,5 polegada. Se voc mudar a ScaleMode para 6, a
Height (altura) passar para 12,7 milmetros.

Figura 11.2 Configuraes para a propriedade ScaleMode.

A configurao 4 para ScaleMode, que mede em caracteres, um
tanto quanto estranha, pois usa medidas diferentes para as escalas
horizontal e vertical. Com as outras unidades de medida, um objeto
que tem lados iguais um quadrado. Ao usar caracteres como
unidade de medida, um objeto com altura 6 e largura 12 um
quadrado com 1 polegada de lado.
ScaleMode 0
Ao configurar ScaleMode para 0, voc poder usar sua prpria escala
de medida. Para definir um sistema particular de unidades de medida,
deve-se configurar as propriedades ScaleHeight e ScaleWidth. Por
exemplo, se voc assinalar ScaleWidth para 500, est dizendo ao
Visual Basic para usar uma escala que contenha 500 unidades como
largura total do form. Se, depois disso, voc configurar a propriedade
Width de um rtulo para 250, ele ter a largura correspondente
metade da largura do form, conforme mostrado na Figura 11.3. A
propriedade ScaleHeight configurada de forma similar. A unidade
para altura (height) no precisa ter qualquer relao com a unidade de
largura (Width).
Figura 11.3 Trabalhando com unidades de medida definidas pelo
usurio.
Alm das escalas horizontal e vertical, voc tambm pode definir um
ponto de origem diferente do canto superior esquerdo. A nova posio
definida pelas propriedades ScaleLeft e ScaleTop, que por default
so 0. Assinalando novos valores para essas duas propriedades, voc
define um novo sistema de coordenadas. Por exemplo, assinalando 3
para ScaleLeft e -4 para ScaleTop, modifica-se as coordenadas do
ponto de origem de (0,0) para (3,4). As coordenadas do canto inferior
direito so definidas como (ScaleLeft + ScaleWidth, ScaleTop +
ScaleHeight). Assim, se voc configurar ScaleHeight para 17 e
ScaleWidth para 10, as coordenadas do canto inferior direito passam a
ser (13,13) no novo sistema de medidas, como mostra a Figura 11.4.
Figura 11.4 Sistema de coordenadas definido pelo usurio.
Se voc quiser visualizar o form como um sistema de coordenadas
cartesianas padro, com ponto (0,0) no centro do form, conforme
mostrado na Figura 11.5, assinale um valor positivo para a
propriedade ScaleTop, e o seu correspondente valor negativo para a
propriedade ScaleLeft. A Figura 11.5 ilustra um sistema de
coordenadas onde o canto superior esquerdo foi definido como (-
40,40), a propriedade ScaleWidth contm 80 e a propriedade
ScaleHeight contm -80.
Figura 11.5 Sistema de coordenadas cartesianas definido pelo
usurio.
A escala pode ser configurada pelo programa de duas formas
diferentes: configurando as propriedades individualmente ou usando o
mtodo Scale. A sintaxe do mtodo a seguinte:
[objeto.]Scale [(Ieft, top)-(right, bottom)]
Observe que a sintaxe inclui apenas as coordenadas dos cantos
superior esquerdo e inferior direito. O Visual Basic calcula as
propriedades ScaleHeight e ScaleWidth a partir desses pontos. Assim,
a instruo para configurao da escala para o form na Figura
11.5 deveria ser Scale (-40, 40)-(40, -40). Usar o mtodo Scale sem
parmetros faz com que a escala de medida seja configurada para
twips e reconfigurada a origem para o canto superior esquerdo, com
coordenadas (0,0).
Equaes e Grades
Se voc est pensando que essas informaes e mais alguns
trocados podem valer um caf e nada mais, espere um pouco. Na
realidade, um sistema de medidas bem configurado pode simplificar
consideravelmente a sua vida. Suponhamos que voc esteja
escrevendo um programa para representar funes matemticas
graficamente e que seja necessrio construir o grfico da equao y =
x ^ 2 - 3x + 12 dentro do domnio -10 <= x <= 10. Usando a escala e o
ponto de origem padres, voc teria de calcular a quantos twips para
baixo e para a direita traar os eixos, transformar cada valor de y e x
para twips e adicionar o deslocamento do ponto de origem. Porm, se
voc definir uma sistema de coordenadas apropriado para a situao,
precisar apenas calcular os valores de y e x; o Visual Basic faz o
resto. A Figura 11.6 contm o programa que traa esse grfico.
Figura 11.6 Cdigo de programa para representar uma equao
graficamente.
Dado um valor de X, a funo FofX calcula Y de acordo com a
frmula.
Observe que o restante do programa trabalha independentemente da
frmula contida em FofX. O cdigo principal o procedimento
Form_Paint, que chamado pelo Visual Basic sempre que se torna
necessrio atualizar a rea de exibio.
Em primeiro lugar, o programa configura a escala para o sistema
padro de coordenadas cartesianas, por meio da instruo Scale. A
seguir, so traados os eixos, por meio do mtodo Line. Em sua forma
mais simples, o mtodo Line tem a seguinte sintaxe:
[objeto.]Line [(x1,y1)]-(x2,y2)
Com isso, seria traada uma linha do ponto (x1,y1) at o ponto
(x2,y2).
Finalmente, o programa plota o grfico usando uma variante do
mtodo Line, sem especificao do ponto inicial. Nesse caso, o Visual
Basic assume como ponto inicial a ltima posio conhecida cujas
coordenadas esto armazenadas nas propriedades CurrentX e
CurrentY do form. CurrentX e CurrentY precisam ser configuradas
apenas uma vez no programa; aps a execuo de cada instruo
Line, o Visual Basic atualiza a configurao dessas propriedades.
Voc pode abrir um novo form, incluir esse cdigo e execut-lo sem
controles ou rotinas adicionais. Um exemplo da sada mostrado
na Figura 11.7.
Figura 11.7 O grfico para a funo FofX.
Repare que o cdigo mostrado na Figura 11.6 usou o valor default (1)
para Step. Para melhorar a resoluo do grfico (plotar uma
quantidade maior de pontos), inclua a clusula Step na instruo For,
conforme mostrado aqui:
For X = -10 To 10 Step 0.1
Ainda que no tenha plotado qualquer grfico desde a escola
secundria, voc achar muito til um sistema de medidas definido
pelo usurio para tarefas como desenho de tabuleiro de xadrez ou
para a construo de grades para jogos semelhantes ao GO. Voc
pode definir uma escala personalizada que tenha a dimenso de sua
grade - por exemplo, 0 a 8 (ou 1 a 9) para tabuleiro de xadrez. Ento,
em vez de ter de calcular a localizao das linhas, voc poder tra-
las nas posies 0, 1, 2 e assim por diante. O cdigo mostrado
na Figura 11.8 traa a grade de 8 por 8 que aparece na Figura 11.9.
Figura 11.8 Cdigo de programa para desenhar uma grade 8 por 8.
Figura 11.9 Uma grade 8 por 8 traada pelo programa mostrado
na Figura 11.8.
Como mencionado anteriormente, todas as propriedades e mtodos
discutidos aqui aplicam-se tanto a forms quanto a caixas de imagens.
Por exemplo, cada caixa de imagem pode ter seu prprio sistema de
coordenadas personalizado por intermdio das propriedades de
escala. Voc deve incluir o nome do controle caixa de imagem quando
fizer referncia a essas propriedades e mtodos; do contrrio, o
sistema assumir que se trata de mtodos e propriedades do form e
no do objeto. Por exemplo, se voc tivesse um objeto caixa de
imagem cuja propriedade Name fosse configurada para MeuDesenho,
poderia traar uma grade de 8 por 8 dentro da caixa de imagem com o
cdigo mostrado na Figura 11.10.
Figura 11.10 Uma grade 8 por 8 traada dentro de uma caixa de
imagens.
Cores
Retornemos por alguns instantes ao grfico mostrado na Figura 11.7.
Para diferenciar a linha plotada dos eixos do sistema de coordenadas,
seria interessante traar os eixos em outra cor. O mtodo Line
permite-lhe, por meio de parmetros opcionais, configurar a cor da
linha a ser traada. Alternativamente, pode-se configurar a
propriedade ForeColor do form, que especifica a cor a ser usada para
traar qualquer coisa no form (incluindo os textos a serem impressos).
As Figuras 10.11 e 10.12 contm o cdigo que traa os eixos do
grfico em verde e desenha a linha com a cor default. O cdigo
na Figura 11.11 especifica a cor por meio do mtodo Line; o cdigo
na Figura 11.12 altera a propriedade ForeColor do form.

Figura 11.11 Cdigo de programa para configurar cores de grfico
com o uso do mtodo Line.
Figura 11.12 Cdigo de programa para configurar cores de grfico
com o uso da propriedade ForeColor do form.
As duas rotinas usam a funo RGB para criar uma cor. Essa funo
(cujo nome abreviatura de Red "vermelho", Green "verde" e Blue
"azul") requer trs argumentos, cada qual um inteiro no intervalo de 0
a 255. O primeiro argumento especifica a intensidade da cor vermelha,
o segundo, a intensidade da cor verde e o terceiro controla a cor azul.
Um argumento 0 indica total ausncia de cor; 255 indica mxima
intensidade. A funo retorna um inteiro do tipo Long, que representa
uma cor no sistema RGB. A Figura 11.13 lista algumas cores comuns
e suas representaes no sistema RGB.
Figura 11.13 Configuraes de RGB para algumas cores comuns.
Nota: Ainda que a funo RGB teoricamente permita um mximo de
16 milhes de cores, o limite prtico ser determinado pelo tipo de
hardware de seu vdeo . O padro VGA, por exemplo, permite que
somente 16 cores sejam exibidas simultaneamente.
Adicionalmente configurao da propriedade ForeColor, voc pode
modificar a cor de fundo (background) do form, alterando a sua
propriedade BackColor. Caso o valor dessa propriedade seja
modificado em tempo de execuo, todos os grficos existentes sero
apagados.
O Visual Basic inclui tambm constantes especiais para as cores
correspondentes s configuraes de cores dos elementos da
interface definidas no Painel de Controle. Por exemplo, a instruo
ForeColor = ACTIVE_TITLE_BAR configura a cor de desenho do form
para ser a cor especificada no Painel de Controle para as barras de
titulo de janelas. Essas constantes globais esto listadas na Figura
11.14. (Note que a definio das constantes na Figura 11.14 inicia-se
com 0x, indicando que os valores aparecem em notao
hexadecimal.) O uso dessas constantes, em vez de cores fixas,
assegurar que seus aplicativos se adaptem ao mapeamento de cores
definido pelo usurio, e levar os aplicativos a ter um aspecto mais
profissional.
As seguintes constantes podem ser usadas em qualquer parte do seu
cdigo no lugar dos seus valores reais:
Figura 11.14 Constantes definidas para cores no Visual Basic.
Nmeros Hexadecimais
O sistema numrico hexadecimal (base 16) usa 16 smbolos para
representar valores numricos: os algarismos de 0 a 9 e as letras A
(equivalente ao decimal 10), B, C, D, E e F (equivalente ao decimal
15). Como foi explicado no Captulo 2, analogamente a outros
sistemas numricos, o valor de cada posio no sistema hexadecimal,
ou hex, cresce em potncias de 16. Por exemplo, o nmero hex 1A3
representa a soma de 1 x 16 ^ 2 (256), 10 x 16 ^ 1 (160) e 3 x 16 ^ 0
(3); assim, o decimal equivalente 419.
A notao hexadecimal usada com freqncia em programao
como uma forma abreviada para representar os nmeros binrios
usados pelo computador. Uma vez que qualquer um dos 16 dgitos
hexadecimais pode ser representado por 4 bits, 2 dgitos
hexadecimais (um para cada 4 bits) podem ser representados em 1
byte de oito bits, nos quais se baseiam tanto a memria do
computador quanto as reas de armazenamento em discos. Assim, 1
byte de rea de armazenamento pode conter 256 nmeros
hexadecimais diferentes (0 at FF).
Voc pode usar valores hexadecimais em qualquer lugar onde o
Visual Basic aceite um nmero. Basta colocar o prefixo &H ou 0x para
sinalizar que o valor est em notao hexadecimal.
Outros Mtodos e Propriedades de Desenho
A propriedade DrawWidth determina a largura de cada linha traada. A
configurao para essa propriedade sempre medida em pixels.
Assim, o valor 1 faz com que seja traada a linha mais fina, com
largura de 1 pixel. O valor 2 permite o desenho de linhas com 2 pixels,
e assim por diante.
As propriedades DrawStyle e DrawMode afetam como as linhas
aparecem na tela. DrawStyle similar propriedade BorderStyle de
um objeto linha. Configuraes de 0 a 6 indicam quando o traado da
linha slido, pontilhado, tracejado ou alguma combinao desses
estilos.
A propriedade DrawMode um pouco mais complexa. Suas 16
configuraes determinam como a imagem que est sendo traada se
comporta em relao s outras que j esto na tela. Por exemplo, a
configurao default (13 - Copy Pen) faz com que a imagem seja
traada sobreposta a todos os grficos existentes. Com essa
configurao, a execuo da instruo Line (0, .5)-(2, .75) duas vezes
seguidas daria a impresso de traar apenas uma linha, pois a
segunda iria sobrepor-se primeira. Porm, se DrawMode fosse 6 -
Invert, a primeira execuo da instruo faria com que a linha fosse
traada em cor de fundo inversa, enquanto a segunda execuo
inverteria novamente, fazendo a linha traada praticamente
desaparecer. Outras configuraes de DrawMode combinam cores de
diversas formas e permitem a criao de efeitos especiais; veja o
manual de referncia do Visual Basic para maiores informaes.
As propriedades FilIColor e FillStyle afetam a aparncia de
preenchimento de crculos e polgonos. Essas propriedades so
similares s propriedades FilIColor e FilIStyle de controles de
contornos descritos no Capitulo 5.
O Visual Basic oferece trs mtodos para auxiliar no processo de
desenho: PSet para configurar um ponto (ou pixel) para uma certa cor;
Line para traar linhas e retngulos; e CircIe para criar crculos, arcos
e elipses. (Abordaremos esses mtodos em detalhes daqui a
instantes.) Alm disso, o mtodo CIs limpa um form ou caixa de
imagem; e o mtodo Point opera como uma funo, retornando a cor
do ponto especificado.
O mtodo CIs limpa, ou apaga, textos e grficos do objeto
especificado - mais precisamente, ele configura cada pixel com a cor
de fundo. Da mesma forma que outros mtodos discutidos nesta
seo, o mtodo CIs, quando voc no faz referncia ao objeto, atua
sobre o form atual.
O mtodo Point tem a seguinte sintaxe:
[objeto,]Point (x, y)
Ele retorna cdigo de cor RGB para o pixel localizado nas
coordenadas (x, y), onde x a posio no eixo horizontal e y, a
posio no eixo vertical. As coordenadas so medidas nas unidades
especificadas pela propriedade ScaleMode do form ou da caixa de
imagem.
O Mtodo PSet
Para configurar um nico ponto para uma certa cor, use o mtodo
PSet. Este mtodo tem a seguinte sintaxe:
[objeto,]PSet [Step](x, y)[, cor]
As coordenadas (x, y) referem-se posio absoluta, medida nas
unidades especificadas pela propriedade ScaleMode do objeto sobre o
qual voc est desenhando. Entretanto, se as coordenadas forem
precedidas pela palavra-chave Step, elas sero o deslocamento
relativo posio atual (dada pelas propriedades CurrentX e
CurrentY). Por exemplo, Step(2, 10) refere-se posio atual mais 2
unidades horizontalmente e 10 unidades verticalmente - isto , a
posio (CurrentX + 2, CurrentY + 10).
Voc pode configurar um ponto para qualquer cor. Se uma cor no for
especificada, o mtodo PSet assinala para o ponto a configurao de
cor da propriedade ForeColor. Esse mtodo pode ser til para apagar
um nico pixel; basta configurar o pixel com a cor de fundo atual
(configurao da propriedade BackColor).
Observe que a dimenso e a aparncia do ponto so afetadas pela
forma como voc configura as propriedades DrawWidth e DrawMode.
Por exemplo, quando a propriedade DrawWidth configurada para 1,
o mtodo PSet configura a cor de um nico pixel. No entanto, quando
DrawWidth configurada para um valor maior do que 1, o ponto ser
dimensionado e centralizado nas coordenadas especificadas.
O Mtodo Line
O mtodo Line, que traa linhas ou retngulos, usa a seguinte sintaxe:
[objeto.] Line [[Step](x1, y1)]-[Step](x2, y2)[,[cor][, B[F]]]
O primeiro par de coordenadas (x1, y1) especifica o ponto inicial da
linha. Se voc omitir as coordenadas do ponto inicial, ser assumida a
posio corrente como ponto inicial. obrigatrio incluir o segundo par
de coordenadas, (x2, y2), que especifica o ponto final. Voc tambm
pode especificar a cor da linha.
Quando voc inclui a letra B (de box - caixa) na instruo Line,
traado o retngulo com os cantos opostos localizados nos dois pares
de coordenadas especificados. Esse retngulo ser preenchido com a
configurao de cor da propriedade FilIColor e com o estilo indicado
pela propriedade FilIStyle. Voc ainda pode incluir a letra F na
instruo Line, para que o retngulo seja preenchido com a mesma
cor com que foi traado. Voc s pode especificar F se for
especificado B. (Isto , a opo de preenchimento vlida apenas
quando um retngulo estiver sendo traado.)
So mostrados alguns exemplos de desenho com o mtodo Line nas
Figuras 10.15, 10.16 e 10.17. Cada um usa a instruo Scale (-2, 2)-
(2, -2) e a instruo Line mostrada na figura.

Figura 11.15 Traando uma linha com o mtodo Line.
Figura 11.16 Traando um retngulo com o mtodo Line.
Figura 10.17 Traando um retngulo cheio como mtodo Line.

O Mtodo Circle
O mtodo Circle o mais complexo dos mtodos de desenho. Voc
pode us-lo para traar crculos, elipses, arcos e "pedaos de pizza".
(Um pedao de pizza um arco com raios conectando as
extremidades do arco ao centro.)
A sintaxe completa para o mtodo Circle a seguinte:
[objeto.]Circle [Step](x, y), raio[, [cor][, [incio][, [final][, aspecto]]]]
Voc deve sempre especificar as coordenadas do centro (x, y) quando
usar o mtodo Circle; este mtodo no assume a posio atual como
default. Quando um crculo traado, CurrentX e CurrentY so
configurados para as coordenadas especificadas para o centro.
Para traar um crculo, basta informar a origem e o raio. Para estreitar
um crculo, transformando-o em uma elipse, voc deve modificar a
razo de aspecto. Os crculos tm razo de aspecto 1,0. Valores de
aspecto maiores do que 1 do origem a elipses altas e estreitas;
valores menores do que 1 criam elipses baixas e largas. Assim, um
valor de aspecto 4,0 traar uma elipse Stan Laurel (o magro),
enquanto um valor 0,4 dar origem a uma elipse Oliver Hardy (o
gordo), conforme mostrado nas Figuras 10.18 e 10.19. Observe que
voc deve especificar todas as vrgulas intermedirias existentes na
instruo Circle, mesmo quando no informa os valores para cada
parmetro.

Figura 11.18 Traando uma elipse Stan Laurel com o mtodo Circle.
Figura 11.19 Traando uma elipse Oliver Hardy com o mtodo
Circle.

Para traar um arco em vez de um circulo ou elipse completos, deve-
se especificar os parmetros incio e final na instruo Circle. Esses
valores devem ser fornecidos em radianos (desenterre aquele livro de
trigonometria), podendo variar de 0 a 2 pi. A Figura 11.20 mostra o
valor em radianos para pontos estratgicos ao longo do crculo.
Figura 11.20 Pontos ao longo do crculo especificados em radianos.
Se voc se sentir mais confortvel usando graus em vez de radianos,
defina a constante PI e use a seguinte funo:
Function GrausToRadianos (Graus As Single) As Single
GrausToRadianos = Graus * PI / 180.0
End Function
Agora, tudo o que voc tem a fazer passar para GrausToRadianos
um valor em graus, e a funo retornar o valor correspondente em
radianos.
Para traar pedaos de pizza, voc deve usar valores negativos para
incio e final na instruo Circle. Valores negativos fazem com que o
Visual Basic trace as linhas de raio no ngulo especificado pelo valor
absoluto do parmetro. Para que as linhas de raio sejam traadas,
preciso que os dois parmetros sejam negativos. O Visual Basic no
preencher um arco ou um pedao de pizza "aberto". As Figuras
10.21 e 10.22 mostram alguns exemplos.
Figura 11.21 Traando um pedao de pizza com o mtodo CircIe.
Figura 11.22 Traando um crculo menos um pedao de pizza com o
mtodo Circle.

Consideraes de Hardware para Programas Grficos
Se tiver interesse em escrever programas grficos que sejam
realmente teis para outras pessoas, voc deve considerar
cuidadosamente o projeto de seus programas e, em particular, deve
levar em considerao o tipo de hardware no qual os programas sero
executados. Por exemplo, conforme discutido anteriormente neste
captulo, a deciso sobre quando usar a propriedade AutoRedraw ou o
procedimento Paint para reconstruo da rea de exibio pode ser
muito importante. Lembre-se de que a quantidade de memria
requerida para o Visual Basic manter as cpias de seus forms
depende do hardware no qual o programa processado. Por exemplo,
voc pode ter desenvolvido um programa para um sistema
monocromtico, porm o usurio poder ter um monitor colorido com
resoluo de 1280 x 1024, cujos requisitos de memria so
substancialmente maiores do que os de seu equipamento. Usar
AutoRedraw em tal sistema poderia facilmente esgotar a memria
disponvel.
Ou pode ser que voc tenha desenvolvido o programa em um
computador de alta resoluo. O que acontece se o usurio tiver um
sistema com baixa resoluo? No seu sistema, um texto com 6 pontos
pode parecer apenas um pouco fino, porm talvez no seja legvel em
um laptop com baixa resoluo. Se voc tem inteno de desenvolver
programas para revender, pode ser interessante examinar as
propriedades TwipsPerPixelX e TwipsPerPixelY dos objetos Screen e
Printer. (O objeto Screen representa o vdeo completo. Seu programa
pode examinar as propriedades do objeto Screen para determinar
questes sobre o tipo de fonte a usar e onde colocar as caixas de
dilogo.)















Impresso no Visual Basic
O trabalho de impresso de relatrios no Visual Basic pode ser feito
basicamente de trs formas:
Utilizando o objeto Printer com seus mtodos e propriedades;
Fazendo chamadas a funes da API do Windows;
Utilizando o gerador de relatrios Crystal Reports, distribudo
com o Visual Basic.
Trataremos aqui apenas da primeira alternativa, remetendo o leitor
para o "Visual Basic 5.0 Programmers Guide to the Win32 API" - que
acompanha este pacote - para a teoria e exemplos de como utilizar a
API do Windows na gerao de relatrios. Quanto ao Crystal Reports,
embora seja uma ferramenta poderosa para gerao de relatrios,
muitas vezes o programador no consegue contornar os limites da
ferramenta para realizar tudo o que deseja. Em futuras atualizaes
deste produto trataremos do assunto.
Nota: As futuras atualizaes estaro disponveis na Internet
conforme instrues que acompanham este produto.
Imprimindo com o Objeto Printer
O objeto Printer a representao da impressora dentro do Visual
Basic.
Atravs dos seus mtodos e propriedades voc pode definir
praticamente tudo que precisa para suas tarefas de impresso.
Inicialmente referenciando a impressora padro do sistema, o objeto
Printer pode ser modificado para referenciar uma outra impressora
instalada. Na coleo Printers voc encontrar uma referncia para
cada impressora presente na instalao. Usando a instruo Set,
possvel atribuir ao objeto Printer qualquer uma destas referncias.
Assim: Set Printer = Printers(1), por exemplo, far com que o objeto
Printer tenha suas propriedades modificadas para refletir as atuais
configuraes da impressora Printers(1), e qualquer tarefa de
impresso concluda pelo objeto Prnter ser destinada a esta
impressora.
Numa tarefa de impresso, devemos levar em conta vrias
informaes que determinaro o resultado final. Algumas destas
informaes esto listadas abaixo:
O tamanho do papel a ser usado para imprimir o relatrio;
O rea imprimvel dentro da pgina;
As margens que separam os limites da rea imprimvel dos limites da
pgina fsica;
As fontes a serem usadas na gerao do texto;
Os atributos dos elementos grficos presentes no relatrio, tais como
cores, espessuras de linhas, modos de desenho, etc.
O nmero de cpias do relatrio;
O nmero de pginas;
A orientao da sada em relao ao papel (retrato ou paisagem).

Os parmetros para gerao de relatrios podem ser fixados pelo
programador ou permitir que a interao com o usurio determine
vrios desses parmetros. Essa interao normalmente feita atravs
de uma caixa de dilogo de impresso, usando o mtodo ShowPrinter
do controle de dilogos comuns. Aps o retorno da caixa de dilogo,
as propriedades do controle de dilogos comuns so verificadas para
que o programa responda s escolhas do usurio. A criao de uma
classe para exibio de dilogos de impresso tambm pode ser uma
alternativa para ter-se maior flexibilidade na escolha de quais opes
disponibilizar para o usurio. Existem casos em que necessrio
deixar ao usurio at mesmo a possibilidade de modificar a fonte
usada para impresso do relatrio, j que nem sempre a fonte
escolhida pelo programador a que melhor se ajusta impressora do
usurio. Exemplo de casos assim so os relatrios que devem ser
impressos em fontes do dispositivo nas impressoras matriciais.
Iniciamos uma tarefa de impresso escolhendo a impressora para a
qual ser destinado nosso relatrio e configurando as propriedades da
pgina de impresso. Como j vimos acima, a coleo Printers
contm todas as impressoras disponveis para o sistema. Em tempo
de execuo podemos verificar a propriedade DeviceName dessas
impressoras e identificar uma que estejamos querendo atribuir ao
objeto Printer para se tornar a impressora padro da aplicao. Feito
isto, devemos configurar a pgina sobre a qual iremos imprimir.
O tamanho da pgina pode ser escolhido atribuindo propriedade
PaperSize uma das constantes para os tamanhos pr-definidos
listados na figura abaixo ou utilizando as propriedades Height e Width
do objeto Printer.
Figura 12.1
As propriedades Height e Width tm precedncia sobre a propriedade
PaperSize. Ao atribuir valores a essas propriedades, PaperSize
automaticamente configurada para vbPRPSUser (tamanho definido
pelo usurio).
Os valores atribudos a Height e Width so entendidos sempre como
estando em twips (1/1440 de polegada) e correspondem s
dimenses fsicas da pgina. A rea realmente imprimvel na pgina
obtida com as propriedades ScaleWidth, ScaleHeight, ScaleLeft e
ScaleTop. Os valores em que esto expressas essas propriedades
depende da propriedade ScaleMode. Em ScaleMode, voc define as
unidades de medida usadas para posicionar texto e grficos
impressos na pgina. Veja na tabela abaixo as opes para essas
unidades.
Figura 12.2
Ao modificar alguma das propriedades ScaleHeight, ScaleWidth,
ScaleTop ou ScaleLeft, voc cria o seu prprio sistema de
coordenadas.
Uma vez que definimos qual o tamanho do papel e obtivemos o
tamanho da rea imprimvel, falta-nos saber quais so as margens
que separam a rea imprimvel da rea fsica total da pgina. O objeto
Printer no possui nenhuma propriedade ou mtodo que retorne essa
informao, mas dentro das DLLs do Windows existe uma funo que
pode ser chamada para retornar-nos essa informao:
GetDeviceCaps. Essa uma funo da API do Windows, que retorna
diversas informaes sobre um dispositivo informado. Como toda
funo residente em DLLs, GetDeviceCaps precisa ser declarada
antes que possamos fazer chamadas a ela em uma aplicao Visual
Basic. A declarao de GetDeviceCaps, bem como as de inmeras
outras funes da API do Windows, pode ser obtida usando o API
Text Viewer, que acompanha o Visual Basic 5.0. Com o API Text
Viewer possvel tambm obter-se as declaraes de constantes e
tipos de dados definidos pelo usurio requeridos nas chamadas a
funes da API. Por questo de simplificao apresentamos abaixo a
declarao de GetDeviceCaps e das constantes usadas para
obteno das margens que precisemos obter.
Figura 12.3
Incluindo estas declaraes em um mdulo padro da aplicao
podemos chamar GetDeviceCaps de qualquer parte do cdigo para
obtermos informaes sobre o dispositivo identificado pelo parmetro
hdc. As duas constantes declaradas so usadas para obteno das
margens esquerda e superior que separam os limites da pgina fsica
da rea imprimvel. Os valores retornados estaro em nmero de
pontos da impressora e dependero da resoluo presentemente
selecionada na configurao do dispositivo. Antes de us-los em
clculos, ser preciso convert-los para a unidade de medida
adequada.
Sero necessrias duas chamadas a GetDeviceCaps para obter as
margens de impresso: uma, passando PHYSICALOFFSETX como
argumento nIndex para obter a margem esquerda ; e outra, passando
PHYSICALOFFSETY para obter a margem superior. Como argumento
para hdc, passamos Printer.Hdc. O clculo das margens direita e
inferior pode ser feito usando as medidas fsicas da pgina total -
obtidas com as propriedades Height e Width -, as margens obtidas
com GetDeviceCaps e as medidas da rea imprimvel obtidas com as
propriedades ScaleWidth e ScaleHeight. Este clculo s pode ser feito
aps a reduo de todas as medidas a uma unidade comum.
Para converter as medidas obtidas com as chamadas a
GetDeviceCaps para as medidas que estivermos usando, podemos
recorrer inicialmente s propriedades TwipsPerPixelX e
TwipsPerPixelY do objeto Printer. Estas propriedades nos retornam o
nmero de twips ocupado por cada ponto do dispositivo. Isso nos
permite converter os pontos obtidos nas chamadas a GetDeviceCaps
para twips. Multiplicando Printer.TwipsPerPixelX pelo nmero de
pontos da margem esquerda, obtemos, em twips, o valor dessa
margem. Fazemos o mesmo com Printer.TwipsPerPixelY e a margem
superior. Uma vez convertidas as margens para twips, fica fcil
convert-las para outra unidade.
Vamos seguir nosso estudo supondo que estamos trabalhando com a
unidade twips. Antes de enviar qualquer texto ou grfico para a
pgina, precisamos definir a posio dentro da pgina em que
imprimiremos. Isto feito com o uso das propriedades CurrentX e
CurrentY. Com estas propriedades definimos as coordenadas
cartesianas para a posio em que se dar a prxima impresso que
fizermos sobre a pgina. CurrentX e CurrentY esto sempre em
unidades definidas pela propriedade ScaleMode. Para o uso dos
mtodos grficos, consulte a documentao do Visual Basic que
contm maiores detalhes sobre o significado de CurrentX e CurrentY
em cada caso.
Feita a escolha da posio para a nossa prxima ao de envio de
dados, podemos iniciar a montagem do contedo da pgina. Para
enviar texto usamos o mtodo Print do objeto Printer. Veja um
exemplo de uso do mtodo Print: Printer.Print "Isto uma string.". A
string entre aspas poderia ser substituda pelo nome de uma varivel
contendo uma string, por exemplo:Printer.Print varStr. Neste caso
seria impresso o contedo da varivel varStr.
A combinao do mtodo Print com as propriedades relativas a fontes
do objeto Printer, nos possibilitam imprimir texto com aspectos
variados. Utilizando, por exemplo, a propriedade FontName, podemos
definir o nome da fonte em que ser impresso qualquer texto que
enviemos para a pgina aps a sua atribuio. Os textos
anteriormente enviados permanecem inalterados. Na sequncia
veremos um exemplo do uso dessas propriedades.
Uma vez que tenhamos criado todo o contedo de uma pgina,
desejaremos passar para a seguinte. Isto feito com uma chamada
ao mtodo NewPage do objeto Printer. A pgina que acabou de ser
criada salva, mas no enviada para a impressora ainda. Somente
aps o trmino da gerao do relatrio que todas as pginas estaro
disponveis para impresso. O mtodo NewPage cria uma pgina
vazia com as propriedades CurrentX e CurrentY configuradas para o
canto superior esquerdo da nova pgina.
Criada a ltima pgina do relatrio, podemos sinalizar o seu trmino
com uma chamada a EndDoc. Isso far com que a aplicao envie o
relatrio para um arquivo em disco de onde poder ser transferido
para a impressora pelos mecanismos gerenciadores de impresso do
Windows.
O que foi visto at aqui descreve em linhas gerais a impresso com o
objeto Printer. Para ver um exemplo de impresso, procure pela
aplicao ExempPrt no diretrio Exemplos\ExemploPrt deste CD.
Voc encontrar uma pequena aplicao, onde poder ver o uso do
que foi visto acima e de mais alguns recursos de uso comum nas
tarefas de impresso com o objeto Printer.

Trabalhando com Bancos de Dados
no VB
Nota: Nas primeiras sees que se seguem sero expostas algumas
idias bsicas sobre bancos de dados. Se voc j tem um
conhecimento introdutrio sobre o tema, poder saltar algumas
dessas sees.
Um sistema de banco de dados simplesmente um sistema de
manuteno de arquivos e informaes relacionadas. Imagine um
banco de dados como um grande armrio para o arquivamento de
informaes. Dentro das gavetas - os arquivos - guardamos de
maneira ordenada as informaes necessrias para o exerccio de
alguma atividade. Se contratarmos um escriturrio para manter o
arquivo teremos o equivalente a um sistema gerenciador de banco de
dados. Em outras palavras, um banco de dados pode ser considerado
um conjunto de arquivos de dados, capaz de oferecer diversos
recursos automticos ao usurio de modo que diversas operaes
podem ser realizadas, a saber:
A adio e remoo de arquivos do banco de dados;
A insero e remoo de dados dos arquivos existentes;
A recuperao e a atualizao de dados nos arquivos existentes.
Fica claro, portanto, que um sistema de banco de dados compe-se ,
basicamente, de dois subsistemas. O primeiro deles envolve
simplesmente o armazenamento fsico dos dados. O segundo envolve
um subsistema capaz de manter e recuperar as informaes
armazenadas. Este seria, na analogia do armrio, o escriturrio
responsvel pela manuteno do arquivo. Ambos os subsistemas so
cruciais para a realizao da tarefa. Suponha que o mecanismo de
organizao dos dados no arquivo fsico fosse grosseiramente
projetado. Certamente o trabalho do arquivista seria um fracasso.
Sistemas de Banco de Dados
Os sistemas de bancos de dados mantm informaes significativas
para pessoas ou empresas - informaes necessrias para o processo
de tomada de decises para estas mesmas pessoas ou empresas.
Um sistema de banco de dados tem por finalidade manter informaes
e disponibiliz-las quando solicitadas.
Para maior eficincia em uma organizao, os sistemas de bancos de
dados costumam apresentar duas caractersticas bsicas,
representando sua maior vantagem:
Integrao. O banco de dados pode ser imaginado como a unificao
de diversos depsitos de dados de outra forma distintos, eliminando
total ou parcialmente qualquer redundncia. Uma conseqncia da
integrao do banco de dados que, em geral, um usurio s estar
interessado em um subconjunto dos dados, fazendo com que cada
usurio perceba o banco de dados de maneira distinta de todos os
demais.
Compartilhamento. Parcelas isoladas de dados podem ser
compartilhadas por diversos usurios de um banco de dados. Todos
os usurios podem ter acesso mesma parcela de dados, usando-a
com finalidades diversas. Diferentes usurios podem ter acesso s
mesmas parcelas de dados ( acesso concorrente ).
Tais caractersticas de um banco de dados corporativo permitem
organizao o controle centralizado de suas informaes operacionais
e gerenciais. Isto pode ser decisivo para a organizao facilitando e
agilizando a tomada de decises.
Sistema Gerenciador de Banco de Dados
Entre o armazenamento fsico dos dados no banco de dados e os
usurios e aplicaes do sistema encontra-se o sistema gerenciador
de banco de dados ( Database Management System - DBMS). Todas
as solicitaes de acesso ao banco de dados, sejam elas dos usurios
diretos ou dos aplicativos, so manipuladas pelo DBMS, isolando os
usurios dos detalhes de armazenamento a nvel de hardware.
Os Usurios
Na ponta final do processo encontram-se os usurios. No apenas os
beneficirios das informaes mantidas pelo sistema. Todos aqueles
que, de uma forma ou de outra, so obrigados a se relacionar com o
banco de dados (fsico) atravs do DBMS so usurios do sistema, a
saber:
O programador, responsvel pelos aplicativos que utilizam o banco de
dados.
O usurio final, que interage com o sistema a partir dos aplicativos.
O administrador do banco de dados, a quem cabe organizar,
padronizar e manter o acesso aos dados da empresa.
Os Dados
Independente de quaisquer outras consideraes, um banco de dados
no passa de uma coleo de dados operacionais - informaes
importantes para organizaes e indivduos. Por mais avanado e
eficiente que seja o DBMS, se os dados no forem armazenados com
uma estruturao lgica clara e consistente, todo este aparato ser
em vo.
Considere o caso mais simples de um caderno de telefones. Eu
desejo anotar o telefone da empresa Couves & Repolhos Ltda.,
especializada em atendimento mdico de emergncia. Assim, anoto o
telefone na letra C, usando o critrio do nome da empresa. Numa
emergncia, quando a informao extremamente necessria, bem
possvel que eu esquea o nome da empresa. Como o telefone no foi
anotado tambm nas letras E - emergncia - e M - mdicos, a
recuperao da informao ser penosa. A organizao do banco de
dados foi ineficaz. Se, num caso simples como este a organizao
lgica do armazenamento da informao crtica, imagine o problema
- bem mais complexo - de projetar um banco de dados para atender
s necessidades de uma grande empresa. E o melhor DBMS do
mundo no pode resolver este problema.
Consideremos agora a natureza do dado armazenado no banco de
dados. De maneira nenhuma, no exemplo anterior, eu pensaria em
anotar na minha caderneta de telefones, o nome de todos os mdicos
e paramdicos da empresa Couves & Repolhos Ltda. Essa
informao, do meu ponto de vista, transitria, no essencial
minha tomada de deciso.
Assim, h duas classes de informaes que no devero compor a
organizao lgica do meu banco de dados, ainda que circulem em
torno do sistema como um todo:
Os dados temporrios. Aquelas informaes que entram no sistema,
mas so transitrias. Ainda que provoquem alteraes nos dados
operacionais, tais informaes no devem fazer parte do banco de
dados. Um exemplo bem simples um dado calculado. De forma
alguma ele deve ser armazenado. Quando for necessrio, calcule-o a
partir dos dados permanentes.
Os dados de sada - mensagens e resultados procedentes do sistema.
Ainda que derivadas dos dados operacionais, tais informaes no
fazem parte do banco de dados em si.
Ainda que as qualidades de um DBMS no garantam uma
organizao eficaz dos dados - esta uma tarefa dos projetistas do
sistema especfico - a natureza desta organizao depender das
caractersticas do sistema gerenciador, sendo limitada por elas.
Isto porque o DBMS age como um intermedirio entre o aplicativo e os
dados. Sendo assim, a maneira como o sistema admite a organizao
dos dados influir criticamente no resultado final. O DBMS manipula
todos os acessos ao banco de dados. Quando o usurio emite uma
solicitao de acesso, usando, por exemplo SQL ou um aplicativo de
front-end especfico, o DBMS:
Intercepta a solicitao e analisa-a;
Determina as permisses de acesso do usurio e define a estrutura de
armazenamento;
Executa as operaes necessrias no banco de dados armazenado.
Os diversos esquemas de armazenamento e recuperao da
informao sero, portanto, decisivos para o projeto de estruturao
do banco de dados.
A Organizao dos Dados em Tabelas
O termo tabela faz parte do cotidiano de quem lida com banco de
dados. Agrupar informaes em tabelas a forma comum de se
organizar dados na maioria dos sistemas de armazenamento. Antes,
porm, que a informao seja agrupada em tabelas preciso
submete-la a um agrupamento de nvel mais bsico: o registro. Um
registro um conjunto de informaes que descrevem alguma coisa
de modo satisfatrio para algum propsito. Suponhamos que voc
queira anotar o endereo de algum numa agenda. Inicialmente voc
anota o nome da pessoa, depois a rua, o nmero, bairro, cidade. Se
para o seu propsito de localizao futura da pessoa estes dados
bastam, voc acaba de criar um registro desta pessoa na sua agenda.
Caso voc no tenha uma agenda, mas queira organizar suas
informaes de endereos numa folha de papel, uma alternativa
criar uma tabela, onde cada coluna ser usada para relacionar uma
das partes do endereo a ser anotado. Voc ter ento uma coluna
para o nome da pessoa, outra para a rua, outra para o nmero e
assim por diante. Cada novo endereo ser escrito na primeira linha
vaga da tabela aps os ltimos dados que j foram adicionados. Voc
pode dar um nome para a sua tabela, por exemplo, endereos de
clientes. Se fizer tambm uma tabela para endereos de amigos,
poder dar a ela outro nome. Cada coluna da tabela tambm pode
receber um nome que clarifique qual parte do endereo est escrita
nela. No caso de endereos pode ficar fcil compreender qual coluna
corresponde ao nome, qual rua, mas nada garante que algum no
ir confundir bairro com cidade se no for posto um ttulo em cada
coluna para deixar as coisas mais claras. Se o indivduo que for
examinar a sua tabela for um computador ento, no tenha dvidas de
que ele precisar de tudo muito claro. Se esta tabela vier a ser parte
de um banco de dados computadorizado, cada linha da tabela ser
um registro e cada coluna um campo de registro. Com o computador
sabendo identificar cada coluna da tabela por um nome de campo,
poderemos pedir a ele que nos apresente os registros ora ordenados
por nome, ora por endereo ou por qualquer outro campo que faa
parte do registro da tabela. A este conjunto de campos e posio
relativa que ocupam dentro do registro chamamos de LayOut do
registro.
Sistemas Relacionais
Nos ltimos anos, o modelo relacional tem se tornado um padro para
o projeto de bancos de dados. Isto se d em razo do poder do
modelo relacional em si e tambm porque ele oferece uma linguagem
padro de comunicao chamada SQL (Structured Query Language)
que permite a muitas ferramentas e produtos de banco de dados
trabalharem juntos de uma maneira consistente e compreensvel. Num
sistema relacional:
Os dados so percebidos pelos usurios como tabelas;
As operaes disposio do usurio (por exemplo, de recuperao
dos dados) geram novas tabelas a partir das antigas.
O usurio de um sistema no-relacional, ao contrrio, v outras
estruturas de dados e necessita de operaes diferentes para
manipul-los. Por exemplo, o IMS, um sistema hierrquico, apresenta
os dados sob a forma de um conjunto de estruturas de rvore. As
operaes para manipular tais estruturas incluem, por exemplo,
mecanismos para percorrer caminhos para cima e para baixo nos
galhos da rvore.
RDBMS Mono-usurios Tradicionais
Nota: RDBMS abreviatura de Relational DataBase Management
System.
Gerenciadores tradicionais de bancos de dados relacionais, como o
dBase e o Paradox, utilizam arquivos separados para cada tabela,
ndice ou coleo de ndices disponvel no sistema. Neles as tabelas
usam registros de comprimento fixo. Por exemplo, num campo
caractere, a especificao do tamanho mximo de cada campo feita
de tal forma que valores inferiores ao mximo so automaticamente
preenchidos com espaos em branco. Os RDBMS Btrieve, por
exemplo, admitem armazenamento de campos caractere de tamanho
varivel, promovendo uma importante economia de espao.
Porm, a manipulao dos dados nas tabelas e a manipulao dos
ndices nestes tipos de RDBMS responsabilidade da aplicao. Esta
traduz comandos de alto nvel, como o comando SQLSELECT ou o
comando dBase LIST, em instrues de baixo nvel. So estas as
instrues que manipulam diretamente os registros das tabelas.
RDBMS Cliente-Servidor
Os sistemas cliente-servidor diferem grandemente dos sistemas
mono-usurios.
A primeira distino que o comando SQL emitido pela aplicao de
front-end executado pelo servidor (back-end). Quando a estao
envia um comando SELECT para o servidor, somente os registros
correspondentes s especificaes da consulta so retornados
estao. O servidor responsvel pela execuo dos comandos
enviados pelas estaes, controlando os acessos concorrentes ao
banco de dados e a consistncia das entradas.
Bancos de Dados Locais e Remotos
Antes de situarmos o dispositivo de banco de dados do VB ( o
Microsoft Jet Database Engine) na famlia de bancos de dados
relacionais, conveniente fazermos mais algumas distines. Um
sistema de banco de dados, como j sabemos, possui trs
componentes: os dados armazenados, o sistema gerenciador e o
aplicativo de front-end. Do ponto de vista fsico, tais componentes
podem se localizar todos na mesma mquina, configurando um
sistema mono-usurio. Podem, contudo, localizar-se em diferentes
computadores ligados por uma rede. Por exemplo, os dados
armazenados podem residir num servidor de arquivos central e a
interface com o usurio (o aplicativo) em diferentes estaes de
trabalho, permitindo acesso concorrente de diversos usurios aos
mesmos dados.
Cliente-Servidor vs. Remoto
Uma importante distino nas aplicaes de bancos de dados
projetados para ambientes de rede consiste na diferena entre banco
de dados remoto e banco de dados cliente-servidor. Num sistema
cliente-servidor, o dispositivo gerenciador de banco de dados est
localizado no servidor central, ao lado dos dados armazenados. O
mesmo dispositivo gerenciador apode servir a muitas aplicaes
clientes ao mesmo tempo, manipulando os dados armazenados e
retornando os registros solicitados para cada aplicao local. Num
sistema remoto, o dispositivo gerenciador de banco de dados se
localiza no mesmo computador onde reside a aplicao do usurio;
apenas os dados residem num computador remoto.
O Microsoft Jet - um RDBMS No-Tradicional
O gerenciador de banco de dados do VB, o Microsoft Jet -
Inteiramente compatvel com o Microsoft Access - no um sistema
cliente servidor. Ele um dispositivo de acesso a banco de dados
residente em DLLs ligadas ao programa em tempo de execuo.
Havendo diversas cpias da aplicao em diversas estaes, cada
uma delas ter sua cpia local do dispositivo Jet, ainda que acessem
a mesma base de dados remota. Esta distino no tem alcance
meramente terico. Ao contrrio, esta caracterstica afeta a
performance global do sistema. Num sistema cliente-servidor,
trafegam pela rede, grosso modo, apenas aos comandos de consulta
e atualizao e os subconjuntos de dados eventualmente solicitados.
Numa arquitetura como a do Jet - como dados e gerenciador
localizam-se em mquinas diferentes - muito mais informaes
trafegaro pela rede.
possvel, contudo, criar aplicaes cliente-servidor em VB,
conectando-as a uma fonte de dados com suporte ODBC ( Open
Database Connectivity), tal como o Microsoft SQL Server. Nestes
casos, as consultas so passadas diretamente ao dispositivo servidor
ou utilizam procedimentos remotos nele armazenados.
Ainda que no seja um gerenciador cliente-servidor, o Microsoft Jet
pertence a uma categoria diferente dos RDBMS tradicionais, porque
tem pouca semelhana com sistemas como o dBase e o Paradox. O
dispositivo RDBMS incorporado ao VB possui muitas caractersticas
em comum com os bancos de dados cliente-servidor, em particular
com o Microsoft SQL Server. Tais caractersticas comuns so:
Todas as tabelas e ndices do banco de dados so armazenados num
nico arquivo com a extenso .MDB.
Os campos de data suportam informao de hora.
Os campos suportam valores nulos (Null).
Admite o armazenamento permanente de comandos SQL.
O tamanho dos campos OLE Object (LongBinary) limitado apenas
pelo espao em disco e no pela estrutura do arquivo.
possvel forar a integridade referencial entre as tabelas e a
integridade de domnio - entre os campos - da tabela.
Inclui capacidades de manuteno de segurana de acesso.
Inclui, automaticamente ou por programa, capacidade para gerenciar o
acesso concorrente.
Tais caractersticas tornam o Microsoft Jet - e o Microsoft Access -
ideais para aplicaes de banco de dados robustas, mas de
caractersticas intermedirias entre os grande sistemas cliente-
servidor e os pequenos sistemas mono-usurios. Como linguagem de
programao, porm, o VB no sofre essa restrio, permitindo a
conexo com sistemas cliente-servidor via tecnologia ODBC. Neste
caso, a interface de programao poder ter que se adaptar s
caractersticas do RDBMS especfico.
Conceitos Bsicos dos Bancos de Dados Relacionais
J falamos um pouco sobre alguns desses conceitos - tabelas,
registros e campos - mas aqui vamos procurar relacion-los a outros
ainda no citados. Ainda sobre tabelas devemos lembrar que:
desejvel, mas no essencial, que cada registro dentro de uma
tabela tenha um conjunto de campos cuja combinao de valores seja
capaz de individualizar inequivocamente o registro dentro da tabela.
Esse conjunto chamado identificador e boa prtica de projeto de
banco de dados a sua existncia.
Um campo que possua a capacidade de ser um identificador
chamado de chave primria. Por definio, um conjunto de valores
dos campos constituintes da chave primria deve ser nico para cada
registro. Registros em tabelas relacionadas podem ter valores
idnticos aos da chave primria de uma das tabelas. O valor idntico
ao da chave primria conhecido como chave externa.
A tabela abaixo resume os principais termos utilizados no projeto e
implementao de sistemas de bancos de dados relacionais.
Figura 13.1
Modelagem de Dados
o momento de fundamentarmos toda a teoria discutida ao longo
deste captulo com orientaes precisas sobre o problema principal -
e, portanto, o primeiro a ser enfrentado - no desenvolvimento de um
sistema de banco de dados: como projetar a base de dados da
aplicao? A melhor maneira de tratarmos do assunto , certamente,
com a ajuda de um exemplo concreto de modelagem de dados.
Exemplo de Projeto de um Banco de Dados
Vamos supor que voc foi contratado por uma firma distribuidora de
material de limpeza para desenvolver um sistema de controle da
atividade. Naturalmente, seu cliente no sabe com exatido o que
quer. Como sempre, ele sabe apenas que precisa automatizar o
negcio, de modo a favorecer o aumento de produtividade e a
expanso das suas atividades. O sistema atual - um controle
desordenado atravs de fichas de papelo - atingiu o seu limite.
Mant-lo significa contratar novos empregados e ver boa parte das
receitas se escoando em prejuzos causados pelo descontrole. Sua
tarefa , portanto, evitar o caos.
Como este no um manual sobre anlise de sistemas, passaremos
por alto pelos passos necessrios para alcanar a fase que nos
interessa. Diremos apenas que, aps algum esforo, voc chegou a
algumas concluses sobre o funcionamento do negcio da empresa, a
saber:
A firma - Limpa Tudo Materiais de Limpeza Ltda. - obtm seus
produtos de um conjunto de empresas fornecedoras. Estas podem ou
no ser os fabricantes originais. Cada uma delas fornece um ou mais
itens para o estoque, acontecendo algumas vezes que duas diferentes
empresas forneam o mesmo produto. A deciso sobre de qual
comprar feita com base numa srie de critrios gerenciais fora do
domnio do sistema a ser desenvolvido.
O pedido de novos itens feito atravs de contatos telefnicos com
cada fornecedor. Geralmente, cada empresa possui um ou mais
empregados encarregados de atender aos pedidos do seu cliente.
Tais pedidos so feitos sempre que o estoque de um item baixa at
uma quantidade considerada mnima pela firma.
A baixa do item do estoque feita pelo funcionrio do almoxarifado
sempre que levado pelo pessoal da entrega e no quando feito o
pedido. Isto faz com que alguns pedidos no possam ser atendidos
antes de um novo fornecimento.
Os clientes da Limpa Tudo - tambm empresas - solicitam
periodicamente quantidades variveis de cada item, pelo telefone.
Para atender a seus muitos clientes, a Limpa Tudo mantm um grupo
de vendedores. Estes recebem uma comisso de 5% por cada venda
efetuada.
A equipe de entrega recebe um roteiro prvio, contendo as diversas
faturas, onde so relacionados os itens entregues e o preo dos
produtos.
Naturalmente, esse levantamento insuficiente para o
desenvolvimento de um sistema real, mas deve bastar para o nosso
exemplo de modelagem de dados. Assim, com algum esforo, voc
chegou aos requisitos bsicos do aplicativo. O sistema deve cumprir,
no mnimo, as seguintes tarefas:
Controlar os itens em estoque. O sistema deve efetuar uma baixa
"virtual" do produto quando o pedido feito e uma baixa "real" quando
entregue. Deste modo, o pessoal da Limpa Tudo saber exatamente
quando solicitar um novo fornecimento, sem precisar manter estoques
exagerados e sem deixar de atender nenhum cliente com prontido.
Faturar os pedidos aos fornecedores, quando um item em estoque
estiver abaixo de um limite crtico.
Faturar os pedidos dos clientes, baixando, no ato da solicitao, o item
do estoque.
Controlar as vendas de cada empregado, visando o clculo das
comisses.
Manter um cadastro de clientes.
Manter um cadastro de fornecedores.
Oferecer um catlogo de produtos aos clientes.
Fornecer uma lista de itens para entrega, bem como faturas e os
diversos relatrios necessrios ao controle total do negcio.
Os Diversos Documentos de Entrada
O prximo passo ser analisar os diversos documentos e controles
mantidos pela Limpa Tudo. Tais documentos serviro de ponto de
partida para a criao das mltiplas tabelas gerenciadas pelo sistema.
Vejamos cada caso.
O primeiro documento relevante ser o utilizado no almoxarifado, para
o controle de produtos em estoque. A Limpa Tudo mantm atualmente
um fichrio de cartolina com as seguintes informaes:
Nome e descrio do produto.
Data da entrada de novos itens no estoque.
Quantidade de itens acrescentados nesta data.
Data de sada de alguns itens do estoque.
Quantidade de itens baixados nesta data.
Quantidade total de itens atualmente em estoque.
Quantidade mnima de itens a serem mantidos em estoque.
Nome e CGC das empresas fornecedoras do produto.
Endereo de cada empresa fornecedora.
Telefone de cada empresa fornecedora e nome dos diversos
vendedores responsveis pelo contato com a Limpa Tudo.
Preo corrente do produto cobrado por cada uma das empresas
fornecedoras.
O almoxarifado da Limpa Tudo razoavelmente organizado. Como o
empregado deste setor o responsvel pelos pedidos de
fornecimento, ele mantm controle sobre cada pedido de fornecimento
efetuado, visando cobrar eventuais demoras e auxiliar o patro no
planejamento do fornecimento. Este controle feito num livro comum,
onde cada folha registra as informaes a seguir, descartadas sempre
no atendimento do pedido pelo fornecedor:
CGC e Razo Social do fornecedor.
Endereo e telefones para contato do fornecedor.
Nomes dos diversos contatos na empresa.
Nome e quantidade do item solicitado.
Data do pedido e data prevista para a entrega.
O almoxarifado mantm ainda um catlogo completo de todos os
fornecedores, tambm num fichrio de cartolina. este o documento
consultado para montar o controle de pedidos de fornecimento e
possui as seguintes informaes:
Nome e CGC da empresa fornecedora.
Endereo completo do fornecedor, contendo rua e nmero, CEP,
cidade e estado.
Os diversos telefones utilizados para contatar a empresa.
O nome de cada um dos contatos no fornecedor.
Uma lista com o nome, a descrio e o preo de cada um dos
produtos fornecidos.
A equipe de vendas, como no poderia deixar de ser, mantm
tambm um conjunto de documentos visando controlar sua atividade e
(sobretudo!) as comisses devidas a cada um. O primeiro documento
referido ser o mantido para cada venda efetuada. Este contm as
seguintes informaes:
Nome e CGC da empresa cliente.
Endereo completo do cliente.
Nome de cada um dos itens vendidos.
Quantidade e preo unitrio de cada um dos itens vendidos.
Preo total de cada conjunto de produtos.
Valor total da fatura.
Data da venda.
Nome do vendedor e valor da comisso pela venda.
Este documento emitido em diversas vias, destinadas ao
almoxarifado, para providenciar a entrega, contabilidade, etc. Uma
das cpias fica em poder do vendedor e o seu controle de
comisses, apresentado periodicamente ao patro, para recebimento
dos valores devidos.
Obviamente, a equipe de vendas mantm um cadastro completo de
todos os clientes, mesmo os eventuais. Este cadastro, sob a forma do
velho fichrio de cartolina, serve no apenas como fonte de consulta
mas tambm como fonte de dados para marketing ativo. O fichrio
possui as seguintes informaes:
Razo social e CGC da empresa cliente.
Endereo completo do cliente.
Os diversos telefones para contato com o cliente, bem como o nome
dos empregados responsveis.
Uma lista contendo o nome e a descrio dos itens habitualmente
adquiridos pelo cliente.
A equipe de vendas mantm um catlogo completo de todos os itens
disponveis, contendo as seguintes informaes:
Nome de cada item.
Descrio do item.
Preo de venda do item.
O ltimo documento de interesse o relatrio utilizado pelo pessoal da
entrega no ato do despacho para os diversos clientes. As seguintes
informaes so relevantes para a Limpa Tudo:
CGC e nome da empresa cliente.
Endereo para entrega dos produtos.
Nome do item entregue.
Quantidade entregue.
Preo total.
Transformao em Tpicos
O primeiro passo na criao das tabelas definir o tpico de cada
uma. Em outras palavras, precisamos definir a entidade do negcio
representada pela tabela. Como ficou evidente na seo anterior, a
Limpa Tudo uma empresa bastante organizada. Sendo assim,
podemos utilizar os prprios documentos de entrada nessa definio.
Neste primeiro momento, definiremos apenas o tpico de cada tabela
e as informaes relacionadas a ele, sem quaisquer preocupaes
quanto redundncia dos dados. Este passo fundamental, j que
uma tabela um conjunto de informaes referentes a um tpico
determinado. Alm disso, j daremos nomes definitivos para cada item
de dados, de acordo com as convenes permitidas pelo Microsoft
Jet.
Evidentemente, a entidade-chave no sistema ser o Produto vendido
pela Limpa Tudo. A Figura 13.2 descreve, sumariamente, o tpico
Produtos. Os campos com asterisco representam aquelas informaes
passveis de repetio dentro do tpico:
Figura 13.2: O tpico Produtos.
O segundo tpico a ser descrito o de Fornecedores, listado
na Figura 13.3:
Figura 13.3: O tpico Fornecedores.
O prximo tpico abordado - os Clientes - fecha o conjunto de
entidades bsicas representadas. Veja a Figura 13.4:
Figura 13.4: O tpico Clientes.
Note que no inclumos na tabela um campo para armazenar os itens
habitualmente adquiridos pelo cliente, mantido pelos documentos da
Limpa Tudo. No o fizemos porque essa informao tem finalidade
estatstica e pode ser facilmente obtida da tabela de pedidos, vista
mais adiante. Isso sugere uma importante recomendao: no
armazene informaes calculadas ou que possam ser obtidas por
outros meios, ainda que indiretos. Tais informaes no so
essenciais. A nica razo para armazen-las decorre de
consideraes de performance. Contudo, nestes casos, deve-se
avaliar cuidadosamente os ganhos obtidos.
O prximo tpico descrito ser o Estoque. Aqui ser importante
distinguir a posio corrente dos itens em estoque do fluxo de entrada
e sada dos produtos. Este ser mantido em separado, j que
representa um tpico diverso, com finalidade diversa - um histrico de
operaes. A Figura 13.5 lista, ento, o tpico:
Figura 13.5: O tpico Estoque.
Abordaremos agora o fluxo dirio de itens em estoque. A Figura
13.6 lista a definio do tpico Transaes:
Figura 13.6: O tpico Transaes.
Como se pode notar, no inclumos as informaes referentes ao
fornecedor e ao preo do produto, mantidas no documento da Limpa
Tudo, visto na seo anterior. Tais informaes no se referem ao
assunto representado pelo tpico presente.
Tratemos agora do pedido de Fornecimento, tpico listado na Figura
13.7:
Figura 13.7: O tpico Fornecimento.
A Figura 13.8 lista o prximo tpico relevante - o pedido de Vendas:
Figura 13.8: O tpico Vendas.
Normalizao
Ao longo da seo anterior, preocupamo-nos somente em definir cada
assunto ou tpico e as informaes necessrias para descrev-lo por
completo. Em momento algum analisamos o problema da organizao
eficiente de cada um. H grupos de informaes repetidas dentro de
um mesmo tpico; h tambm informaes repetidas
desnecessariamente entre tpicos. Devemos eliminar esta
redundncia.
Um outro problema que as entidades bsicas esto definidas por
seus nomes. Isto pode ocasionar inconsistncia dos dados, j que
nomes longos podem ser informados, favorecendo erros de digitao
e dificultando a localizao. comum a utilizao de cdigos
numricos para essas entidades.
Um outro problema no qual podemos avanar definir claramente o
tipo de dado requerido por cada um dos campos, para garantirmos
rigorosa consistncia entre eles desde j. Campos conceitualmente
afins devem receber, alm de um mesmo nome, tipos de dados
rigorosamente iguais.
Logo no tpico Produtos encontramos matria para discusso. Ele
possui duas informaes passveis de repetio dentro da tabela -
Nome do Fornecedor e Preo de Compra - ambas relacionadas. Esta
redundncia deve ser eliminada. No admita grupos de informaes
repetidas dentro de uma tabela. Neste caso, divida as informaes em
duas tabelas.
Uma outra questo diz respeito Categoria do produto. Este campo
possui, por definio, um conjunto definido de valores possveis,
conhecidos de antemo. Assim, conveniente codificarmos o campo,
colocando sua descrio em outra tabela. Embora a economia de
bytes seja pequena, o princpio til. Encontrando valores de um
campo selecionveis de um conjunto limitado de valores possveis,
conveniente situ-los numa tabela em separado -conhecida como
tabela de autoconsulta.
Assim, o tpico Produtos pode ser organizado em trs tabelas
separadas,
listada na Figura 13.9:
Figura 13.9: O tpico Produtos dividido em tabelas.
O tpico fornecedores tambm padece de alta redundncia. Os
campos Nome do Produto e Preo de Compra, relacionados a um
Fornecedor, j esto definidos na tabela Produtos Por Fornecedor.
Podem, portanto, ser eliminados. Cidade e UF podem compor uma
tabela em separado pela mesma razo usada para criar a
tabela Categorias. Apenas o CEP basta para definir uma cidade e um
estado.
Note tambm que as informaes sobre o Telefone e o Contato, parte
integrante do tpico Fornecedores, podem se repetir. Como j vimos,
nestes casos devemos criar uma outra tabela. Esta, entretanto, ser
conceitualmente distinta, por exemplo, da tabela Categorias ou da
tabela de Localidades.
Em primeiro lugar, cada registro na tabela Fornecedores poder se
referir a inmeros registros na tabela de Telefones. Alm disso, no
faz sentido mantermos um registro na tabela de Telefones sem um
correspondente na tabela de Fornecedores. Neste caso, devemos
criar o que se convencionou chamar uma tabela-filha. Esta uma
tabela na qual todas as entradas compartilham algumas informaes
comuns, armazenadas em outra tabela. No momento, isso no ter
efeitos prticos. A razo dessa considerao ficar clara na prxima
seo.
Vale, porm, uma observao. Sempre que criar uma tabela-filha,
assegure-se de que as atualizaes efetuadas na tabela-pai se
propaguem para a filha. Alm disso, no admita registros rfos (sem
correspondncia na tabela-pai) na tabela-filha.
Desse modo, podemos criar as tabelas definidas a seguir para melhor
representar o tpico Fornecedores:
Figura 13.10: O tpico Fornecedores dividido em tabelas.
O tpico Clientes no apresenta nada de novo. Os campos Cidade e
UF j esto definidos na tabela Localidades e podem ser eliminados.
Os campos Telefone e Contato devem receber o mesmo tratamento
da tabela Telefones dos Fornecedores, criando-se uma tabela-filha.
Assim, precisamos criar somente as tabelas descritas a seguir:
Figura 13.11: O tpico Clientes tratado.
O tpico Estoque tambm pode ser reduzido. Os campos Nome do
Produto, Descrio e Categoria podem ser substitudos pelo cdigo do
Produto, tal como definido na tabela Produtos. Assim, a tabela
Estoque pode reduzir-se s definies listadas na Figura 13.12:
Figura 13.12: A tabela Estoque.
Nos tpicos Transaes e Fornecimentos basta substituir os campos
Nome do Produto e Razo Social pelos seus respectivos cdigos. Os
tpicos podem ser, ento, definidos como naFigura 13.13:
Figura 13.13: As tabelas Transaes e Fornecimento.
O tpico Vendas requer algumas consideraes. O campo Preo de
Venda redundante, j que foi definido na tabela Produtos. Os
campos referentes ao produto e quantidade vendida podem repetir-
se, j que uma mesma venda pode abranger inmeros itens. A
soluo , portanto, criar uma tabela-filha. Para referirmos as
informaes repetidas podemos criar um nmero identificador nico,
normalmente utilizado para fins de controle fiscal.
Um outro aspecto refere-se ao nome do vendedor. Do mesmo modo
que o campo Categoria do produto, podemos criar uma tabela de
autoconsulta de Vendedores e atribuir um cdigo inequvoco a cada
um deles. Outra questo refere-se s comisses. Em princpio, a
comisso nica e calculada a partir do valor total da venda. Pode ser
possvel, entretanto, a utilizao de comisses crescentes por faixas
de valores, visando estimular o negcio. Justifica-se, assim, uma
tabela especfica.
O tpico, ento, pode ser definido como descrito na Figura 13.14:
Figura 13.14: O tpico Vendas normalizado.
Relacionamento Entre Tabelas
O passo seguinte definir os diversos relacionamentos entre as
tabelas. Como j vimos, o relacionamento se define a partir da
duplicao de atributos de diferentes tabelas: a chave primaria na
tabela primria e a chave externa na tabela dependente. Cabe,
portanto, definirmos a chave primria de cada tabela a ser relacionada
s demais. Como j sabemos, a chave primria individualiza um
registro, no podendo, portanto, conter valores repetidos em mais de
um registro da tabela.
A Figura 13.15 lista os campos sugeridos como chave primria da
base de dados que viemos modelando:
Figura 13.15: As chaves primrias de campo nico do base de dados
da Limpa Tudo.
Evidentemente, no pudemos definir uma chave primria de campo
nico para aquelas tabelas que representam os histricos das
operaes da Limpa Tudo. Nessas tabelas, um nico campo no pode
identificar um registro. O mesmo no pode ser dito, porm, da
combinao de alguns campos de cada tabela. Por exemplo, na tabela
Faturas, a combinao de um cdigo de Fatura e de um cdigo de
Produto identifica univocamente o registro. A Figura 13.16 lista as
demais chaves primarias do banco de dados:
Figura 13.16: As chaves primrias de mais de um campo da base de
dados da Limpa Tudo.
Por que essa preocupao em garantir que todas as tabelas possuam
chaves primrias? No Microsoft Jet, s possvel estabelecer
relacionamentos entre tabelas a partir de campos definidos como
chaves primrias. Em essncia, um relacionamento exprime uma
ligao entre a chave primria de uma tabela e a chave externa de
uma tabela dependente.
Estamos prontos, agora, para definir os relacionamentos entre as
diversas tabelas. Comecemos pelo tpico Produtos. Voc se lembra
que dividimos o tpico em trs tabelas relacionadas - Produtos,
Categorias e Produtos Por Fornecedor. Trata-se, pois, de definir
claramente como elas se relacionam.
Um registro na tabela Categorias pode referenciar vrios registros na
tabela Produtos. E mais: havendo necessidade de se alterar uma
determinada codificao de categoria de produto, essa atualizao
deve-se propagar para a tabela dependente; o caso de se impor a
integridade referencial no relacionamento, forando a propagao de
eventuais atualizaes.
Por outro lado, um registro na tabela de Produtos pode referenciar
vrios registros na tabela Produtos Por Fornecedor, na medida em
que um mesmo item pode ser fornecido por diferentes empresas. Aqui
tambm deve-se impor integridade referencial entre as tabelas:
removendo-se um registro na tabela de Produtos, ele deve ser
tambm removido na tabela dependente.
Graficamente, o relacionamento entre as trs tabelas do tpico pode
ser expresso como na Figura 13.17.
O tpico Fornecedores relaciona as tabelas Fornecedores, Telefones
dos Fornecedores e Localidades. Um registro na tabela Fornecedores
pode referir mais de um registro na tabela Telefones dos
Fornecedores, devendo-se prever excluses em cascata dos registros,
j que a tabela dependente uma tabela-filha. A tabela Localidades
possui relao um-para-vrios com a tabela Fornecedores, devendo-
se tambm prever atualizaes, mas no excluses, em cascata.
Graficamente, o relacionamento pode se exprimir como na Figura
13.18.
Figura 13.17: Relacionamentos do tpico Produtos.
Figura 13.18: Relacionamentos do tpico Fornecedores.
No tpico Clientes - composto pelas tabelas Clientes, Localidades e
Telefones dos Clientes - o relacionamento precisamente o mesmo
que no tpico Fornecedores. Observe apenas que a tabela
Localidades possui o mesmo tipo de relacionamento simultaneamente
com duas tabelas. Graficamente, o relacionamento do tpico pode ser
expresso como na Figura 13.19.
Continuemos. Um registro na tabela Estoque possui um
relacionamento direto, de um-para-um, com um nico registro da
tabela Produtos. Um registro na tabela Fornecedores possui um
relacionamento um-para-vrios com a tabela Produtos Por
Fornecedor. Em ambos os casos, deve-se impor a integridade
referencial dos dados promovendo excluses em cascata sempre que
houver uma excluso na tabela determinante da dependncia.
Figura 13.19: Relacionamentos do tpico Clientes.
A tabela Produtos possui relacionamento de um-para-vrios tambm
com as tabelas Fornecimento e Transaes. conveniente impor a
integridade referencial dos dados visando evitar a existncia de
registros rfos nas tabelas dependentes.
Analisemos agora o tpico Vendas. Este composto das tabelas
Vendas, Faturas e Vendedores. Em primeiro lugar, devemos assinalar
que entre Vendas e Faturas existe uma relao de um-para-vrios -
relacionamento estabelecido pelo campo Fatura - onde se deve impor
integridade referencial, garantindo excluses em cascata, sempre que
um registro na tabela-pai (Vendas) for removido. Por outro lado, um
registro na tabela Vendedores pode referir vrios registros na tabela
Vendas. Neste relacionamento, devemos impor a integridade
referencial dos dados, garantindo que as eventuais alteraes na
tabela Vendedores se propaguem, automaticamente, para a tabela
dependente. O relacionamento do tpico pode ser representado como
na Figura 13.20:
Figura 13.20: Relacionamentos do tpico Vendas.
Analisemos, agora, os relacionamentos finais. Um registro na tabela
de Clientes pode corresponder a vrios registros na tabela de Vendas.
Neste caso, devemos garantir que eventuais atualizaes na tabela
primria se propaguem para a tabela dependente, impondo a
integridade referencial dos dados. Graficamente, o relacionamento
global das diversas tabelas da base de dados pode ser representado
como na Figura 13.20:
Figura 13.21: Os relacionamentos da base de dados da Limpa Tudo.

O Microsof Jet Database Engine e o
VB
O Microsoft Jet e os Tipos de Dados
O Jet suporta uma grande quantidade de diferentes tipos de dados,
garantindo total compatibilidade tanto com o Microsoft Access quanto
com os tipos de dados definidos pelo padro ANSI da SQL. A figura
abaixo ilustra os tipos de dados disponveis no mecanismo Jet e no
padro SQL associado, alm de sua compatibilidade com os diversos
tipos de dados do VB.
Figura 14.0 Os tipos de dados suportados pelo Microsoft Jet
Modos de Interao da Aplicao com o Microsoft Jet Engine
O Visual Basic oferece duas formas de comunicao entre aplicaes
e o mecanismo Jet: o controle Data e os objetos de acesso a dados
(DAO).
O controle Data faz parte da caixa de ferramentas padro e pode ser
inserido em formulrios como qualquer outro controle. Seu papel
fazer intermediao entre a aplicao e um banco de dados de modo
a automatizar tarefas comuns como incluses, alteraes, excluses e
navegao em meio massa de registros.
Enquanto o controle Data lhe d poder para acessar bancos de dados
existentes com pouca programao, o modelo DAO uma completa
interface de programao que lhe d total controle sobre o banco de
dados. Esses dois recursos, porm, no so mutuamente exclusivos,
podendo em muitas ocasies at mesmo ser desejvel combin-los.
Trataremos de incio dos objetos de acesso a dados por ser um
estudo que nos dar elementos para compreender melhor o uso do
controle Data.
Biblioteca de Objetos de Acesso a Dados (DAO)
Um dos mais importantes recursos do Visual Basic a sua biblioteca
de objetos de acesso a dados ou DAO (Data Access Objects). So
objetos que voc pode criar em tempo de execuo para acessar
dados tanto em arquivos de banco de dados do Access - o banco de
dados nativo do Visual Basic - como em outros tipos de banco de
dados locais como dBase, Paradox e tambm acessar dados em
bancos de dados cliente-servidor como o Microsoft SQL Server
usando a tecnologia ODBC.
Os objetos de acesso a dados esto organizados numa hierarquia, na
qual muitos objetos pertencem a colees de objetos, que tambm,
por sua vez, pertencem a outros objetos que lhes esto acima na
ordem hierrquica. A completa hierarquia da DAO est ilustrada
abaixo.
Figura 14.1: A hierarquia da DAO
Estamos usando a palavra objeto para nos referirmos aos data access
objects, mas na verdade no so objetos e sim de classes. Do mesmo
modo como voc cria instncias de suas prprias classes, voc o faz
com os objetos de acesso a dados. Veremos isso nos exemplos.
Antes faremos uma breve introduo aos objetos da DAO.
O Objeto DBEngine
No topo da hierarquia da DAO est o objeto DBEngine e corresponde
ao dispositivo Microsoft Jet de acesso a dados. O objeto DBEngine
usado para ajustar os parmetros do sistema de banco de dados
utilizado pelo VB e para definir a rea de trabalho default. O DBEngine
o nico objeto que voc no pode instanciar. Ele criado
automaticamente quando sua aplicao faz a primeira referncia a um
objeto da DAO.
O Objeto Workspace
Logo abaixo do objeto DBEngine, na hierarquia da DAO, est o objeto
Workspace (rea de trabalho). Esse objeto utilizado para criar e
identificar uma sesso de trabalho para um usurio. Ele contm os
bancos de dados abertos e prov controle sobre transaes
simultneas e segurana de acesso.
Um objeto Workspace default - Workspace(0) - criado
automaticamente na primeira referncia a um objeto DAO pela
aplicao. Ele pode ser inicializado com um Username (nome de
usurio) e com uma Password (senha). Ao contrrio de outros objetos
Workspace, a rea de trabalho default est sempre disponvel, no
podendo ser fechada nem removida da coleo Workspaces.
Objeto Database
O objeto Database representa um banco de dados, nativo do Jet ou
no. utilizado para definir as tabelas do banco de dados,
relacionamentos entre tabelas, consultas armazenadas, alm de
permitir a abertura de objetos Recordset - que veremos mais adiante.
Objeto TableDef
O objeto TableDef corresponde a uma definio de tabela
armazenada. Cada TableDef da coleo TableDefs representa a
definio de uma tabela no banco de dados corrente, ou uma tabela
externa anexada base de dados. Neste ltimo caso o objeto
TableDef no pode ter seus atributos alterados.
Objeto QueryDef
O objeto QueryDef representa uma consulta escrita em linguagem
SQL armazenada no banco de dados. Uma consulta armazenada
um comando SQL pr-compilado. possvel ler e modificar o cdigo
SQL de um objeto QueryDef, ajustar seus parmetros e, ento ,
executar a consulta.
Objeto Recordset
O objeto Recordset corresponde a uma viso ponteirada de uma
tabela ou do conjunto de registros resultantes de uma consulta a uma
ou mais tabelas. Uma viso ponteirada o armazenamento de
registros numa rea de memria (buffer), apontando para um registro
de cada vez, chamado registro corrente. O ponteiro (registro corrente)
pode ser reposicionado em qualquer registro utilizando-se os mtodos
move, seek ou find. Ele permite a navegao, atualizao e remoo
das tabelas subjacentes ao recordset. Como a viso dos dados de um
banco, o Recordset no contm ele mesmo os dados: apenas aponta
para eles. Nesse sentido no armazenado no banco, tendo
utilizao temporria. Quando um recordset fechado, ele removido
da coleo Recordsets e todos os recursos associados so removidos
da memria.
possvel a criao de trs tipos de recordsets:
Tipo tabela: Um recordset tipo tabela corresponde a uma tabela do
banco de dados. Quando um recordset desse tipo aberto, o
programador passa a ter acesso tabela subjacente.
Tipo dynaset: Um recordset do tipo dynaset corresponde a uma tabela
"virtual" resultante de uma consulta feita a uma ou mais tabelas. Ao
ser atualizada, todas as alteraes feitas no objeto se refletem
imediatamente nas tabelas subjacentes.
Tipo snapshot: Um recordset do tipo snapshot um conjunto esttico
de dados, similar ao dynaset porm no admite atualizao. Outra
diferena que os snapshots tm o conjunto de registros carregado
na memria. Se de um lado isso os torna mais rpidos, por outro cria o
problema de haver conflitos com limitaes de memria. Ajustam-se
melhor para pequenas quantidades de registros que no precisam ser
editados.
Objeto Field
O objeto Field corresponde a uma coluna de dados contendo um tipo
de dado comum e um conjunto de atributos. apenas um campo do
banco de dados. Nesse sentido, os objetos TableDef, QueryDef,
Recordset, e Index possuem colees Fields. A coleo de objetos
Field associada ao ponteiro de um recordset descreve um registro. Os
dados do recordset so lidos e atualizados atravs da propriedade
Value do objeto Field. Quando o ponteiro do recordset movido e
passa a apontar para um novo registro, todos os objetos Field da
coleo Fields so automaticamente atualizados.
Objeto Index
O objeto Index representa um ndice associado a um objeto TableDef
ou Recordset, sempre do tipo tabela. O ndice corrente pode ser
especificado num recordset tabela atribuindo-se um dos ndices da
coleo Indexes sua propriedade Index. A atribuio da propriedade
Index permite reordenar rapidamente os registros de uma tabela.
Objeto Parameter
O objeto Parameter representa um parmetro de consulta
armazenada no banco de dados. A coleo Parameters dos objetos
QueryDef e Recordset permite ao programador acessar as
informaes contidas no parmetro da consulta .

Segurana de Acesso
Objeto User
O objeto User utilizado para definir e garantir a segurana do banco
de dados. Adicionando ou removendo membros coleo Users,
criam-se ou removem-se contas de acesso para os usurios do
sistema. Cada objeto User criado com um nome uma senha. As
permisses de acesso aos objetos do sistema, tais como TableDef e
QueryDef, podem ser definidas para os usurios individualmente.
Objeto Group
Um objeto Group representa uma coleo de usurios com os
mesmos direitos de acesso. O objeto DBEngine suporta um conjunto
de grupos no acesso ao sistema. Cada usurio dentro de um grupo
herda as permisses de acesso a todos os objetos acessados pelo
Group.
Objeto Container
Os objetos Container so utilizados em conjunto com os objetos
Document para enumerar todos os objetos armazenados no banco de
dados, incluindo aqueles definidos por aplicaes clientes. O principal
uso dos objetos Container enumerar todos os objetos armazenados
no banco de dados , definindo permisses de acesso e usurios
proprietrios.
Objeto Document
Os objetos Document so objetos de um tipo comum que partilham
um Container. Permisses de acesso podem ser definidas para um
objeto Document, alterando privilgios de segurana.
Objeto Relation
O objeto Relation utilizado para definir o relacionamento entre
campos de dois objetos TableDef. Cada objeto Database possui uma
nica coleo de objetos Relation. O Jet pode forar determinadas
condies de atualizao dos dados associados aos campos dos
objetos Relation visando manter a integridade referencial dos dados
do banco. A adio ou remoo de objetos Relation cria ou remove
relaes entre tabelas do banco de dados.
Objeto Property
O objeto Property representa uma propriedade associada a um objeto
do banco de dados. Tanto as propriedades "intrnsecas" quanto as
propriedades definidas pelo programador so armazenadas na
coleo Properties associada ao objeto. possvel criar novas
propriedades adicionando novos objetos Property coleo
Properties. Tais propriedades podem ser armazenadas no banco de
dados e referem-se somente ao objeto especificado e no aos demais
objetos da mesma classe.
Os seguintes objetos DAO suportam a definio de novas
propriedades:
Database
TableDef
QueryDef
TableDef.Index
TableDef.Field
QueryDef.Field
Praticando com os Objetos da DAO
o momento de colocar em prtica os inmeros conceitos estivemos
expondo. Usaremos a verso de 32 bits na criao das tabelas.
Assim, no deixe de incluir uma referncia Microsoft DAO 3.5 Object
Library na opo References do menu Project do VB5.
A Criao do Banco de Dados
O primeiro passo ser a criao de um arquivo no formato Microsoft
Access. Normalmente os programadores criam o banco de dados no
Microsoft Access e no no VB. muito mais cmodo utilizar a
interface amigvel do Access para criar todas as tabelas, campos,
consultas, ... do que escrever cdigo em VB para construir a estrutura
do banco de dados. Como, no entanto, o programador de VB deve
conhecer bem as relaes entre os objetos da DAO, o estudo dos
meios de construo de um banco de dados por cdigo de grande
importncia.
Sempre que um arquivo de banco de dados aberto - ou criado -
necessrio que especifiquemos uma rea de trabalho onde abri-lo.
Caso nenhuma rea seja definida, o VB, automaticamente, abre o
arquivo na rea de trabalho default, endereada pelo ndice 0 da
coleo Workspaces do objeto DBEngine. No entanto, sempre boa
prtica de programao a definio explcita de uma rea de trabalho.
A criao do banco de dados pode ser feita pelo
mtodo CreateDatabase( ) do objeto Workspace. A referncia
retornada pelo mtodo pode ser utilizada, imediatamente, para criar
tabelas, etc.
Mtodo CreateDatabase
O mtodo CreateDatabase( ) cria um novo objeto Database, salva o
banco de dados no disco e retoma uma referncia ao objeto criado.
Aplicvel somente aos objetos Workspace.
Sintaxe
Set ObDatabase = ObWorkspace.CreateDatabase(nomeDoArquivo,
localizao[, opes])
O seguinte fragmento de cdigo cria um banco de dados na verso
3.0 da DAO chamado BASE32.MDB no diretrio corrente:

Dim BaseDeDados As Database
Set BaseDeDados = DBEngine.Workspaces(0). _
CreateDatabase(App.Path & "\Base32.Mdb", _
dbLangGeneral, dbVersion30)

Utilizamos a rea de trabalho default para abrir o banco de dados,
referindo-a explicitamente. As constantes utilizadas como argumentos
para o mtodo so definidas no prprio VB: a constante
dbLangGeneral indica a criao de um banco de dados com
ordenamento de strings compatvel com a Lngua Portuguesa; a
constante dbVersion30 indica um banco de dados no formato do
Microsoft Access para Windows 95. Note apenas que tal formato
incompatvel com verses anteriores da DAO ou do prprio Access.
O objeto Database retomado pelo mtodo pode ser utilizado
imediatamente para a definio das tabelas do arquivo. Observe que
se o arquivo existir, um erro ser gerado em tempo de execuo.
Criando Tabelas
A criao de uma tabela requer as seguintes condies mnimas:
1 . Uma referncia a um objeto Database onde ser adicionada a
tabela. Se o arquivo no existir, deve ser criado; caso contrrio, deve
ser aberto.
2. A criao de um objeto TableDef, atravs do
mtodo CreateTableDef( ). Este representar a
tabela criada.
3. A criao dos objetos Field necessrios para representar a
totalidade dos campos da tabela, feita atravs do mtodo CreateField(
).
4. A atualizao das propriedades de cada objeto Field, na medida
das necessidades da tabela.
5. A anexao de cada objeto Field coleo TableDefs, com o
mtodo Append.
6. A anexao do objeto TabIeDef criado coleo Databases,
tambm com o mtodo Append.
Vamos criar uma tabela como exemplo. Utilizemos a definio dada
tabela Categorias, no Captulo 13. A Figura 14.2 lista as propriedades
de cada campo da tabela:
Figura 14.2: As definies da tabela Categoria.
Como o arquivo BASE32.MDB j existe - criamos no cdigo para
CreateDatabase -, precisamos abr-lo, utilizando o
mtodo OpenDatabase( ), aplicvel somente a um objeto Workspace.
Mtodo OpenDatabase
O mtodo OpenDatabase( ) abre o banco de dados especificado numa
sesso, determinada por um objeto Workspace, e retorna uma
referncia a um objeto Database. O banco de dados aberto
automaticamente adicionado coleo Databases da rea de
trabalho.
Sintaxe
Set ObDatabase = ObWorkspace.OpenDatabase(nomeDoArquivo [,
modoExclusivo[, somenteParaLeitura[, fonteDeDados]]])
O passo seguinte ser a criao de um objeto TableDef para referir a
tabela a ser criada. Isto feito pelo mtodo CreateTableDef( ),
aplicvel somente aos objetos Database.

Mtodo CreateTableDef

Cria um objeto TableDef para representar uma nova tabela do banco
de dados.
Sintaxe
Set ObTabIeDef = ObDatabase.CreateTableDef([nomeDaTabela[, _
atributos[, fonteDeDados[, informaoDeConexo]]]])
Como vimos, cada um dos campos da tabela ser representado por
um objeto Field, criado pelo mtodo CreateField( ) aplicado ao objeto
TabIeDef anteriormente criado.
Mtodo CreateField
Cria um objeto Field para representar um novo campo de banco de
dados, aplicvel aos objetos Index, Relation e TableDef.
Sintaxe
Set ObField = ObVarivel.CreateField([nomeDoCampo[, tipoDeDado[,
tamanho]]])
O seguinte fragmento de cdigo cria uma nova tabela no banco de
dados aberto:

Figura 14.3

O cdigo acima, por razes didticas, segue rigorosamente o passo-a-
passo sugerido para a criao de uma tabela. Ns definimos cada
uma das propriedades dos campos utilizando um objeto Field e
anexando coleo Fields do objeto TableDef criado para representar
a tabela. Isso foi feito com o mtodo Append.
Mtodo Append
Adiciona um novo objeto de acesso a banco de dados a uma coleo.
Aplicvel a todas as colees da DAO.
Sintaxe
Coleo.Append novoObjeto
Aps cada definio ter sido criada, anexamos o objeto TableDef
coleo TableDefs do banco de dados, referido pela varivel Database
BaseDeDados. Isso tambm foi feito com o mtodo Append.
Adicionando ndices
A criao de um ndice para uma tabela requer os seguintes passos:
1. Um objeto TableDef ao qual anexar a definio de ndice. Se a
tabela no existir, dever ser criada como exposto anteriormente; caso
contrrio, sua definio dever ser aberta na forma Set ObTableDef =
ObDatabase.TableDefs("NomeDaTabela").
2. Um objeto Index, criado com o mtodo CreateIndex( ) aplicado ao
objeto TableDef.
3. A atualizao das propriedades do objeto Index, quando for o caso.
4. Um objeto Field para cada campo componente da chave de ndice,
criados com o mtodo CreateField( ), mostrado anteriormente.
5. A anexao de cada objeto Field ao objeto Index criado para
armazenar a definio do ndice. Isto feito pelo mtodo Append, tal
como j falamos.
6. A anexao do objeto Index ao objeto TabIeDef aberto, tambm
com o mtodo Append.
Exemplo:
Figura 14.4: A definio de tabela Clientes.
Propriedades para o ndice primrio da tabela:
Figura 14.5: A definio do ndice primrio da tabela Clientes.
Note que ajustar a propriedade Unique do ndice no estritamente
necessrio, j que um ndice primrio (propriedade Primary igual a
True) , por definio, sempre nico. O fragmento de cdigo seguinte
cria a tabela Clientes e seu ndice primrio:
Figura 14.6
Todo o cdigo at a criao do objeto Index funciona da mesma
maneira que no exemplo anterior. Apenas utilizamos um novo meio de
expressar as mesmas aes. Para criar o ndice, utilizamos o mtodo
CreateIndex( ), aplicvel somente a um objeto TableDef e ajustamos
suas propriedades de acordo com a definio de um ndice primrio.
Mtodo CreateIndex
Cria um objeto Index para representar um novo ndice de uma tabela.
Sintaxe
Set ObIndex = ObTableDef.CreateIndex([nomeDondice])
O passo seguinte foi criar a expresso de indexao do objeto. Ora,
uma expresso de ndice , simplesmente, uma lista de campos
componentes. Assim, para cada campo da expresso, criamos um
objeto Field para represent-lo. Isso foi feito com o mtodo
CreateField( ), j conhecido. Note que apenas especificamos o nome
do campo, uma vez que sua definio j existe.
A criao final do ndice envolveu apenas anexar o objeto Field ao
objeto Index, definindo uma expresso de indexao e anexar este ao
objeto TableDef. Tudo com o mtodo Append.
Adicionando Relaes
A definio de um relacionamento pela DAO envolve os seguintes
passos:
1. Um objeto Database, referindo um banco de dados aberto.
Naturalmente, as tabelas a relacionar devem existir e ser estruturadas
de tal forma que o relacionamento possa ser estabelecido. O campo a
relacionar deve ser a chave primria da tabela origem e do mesmo
tipo na tabela dependente (a chave externa).
2. A criao de um objeto Relation, feita pelo
mtodo CreateRelation(, aplicvel somente a um objeto Database.
3. A definio das propriedades do relacionamento; basicamente a
tabela origem (propriedade Table) e a tabela dependente
(propriedade ForeignTable).
4. Definir a natureza do relacionamento (se um-para-um ou um-para-
vrios, se a integridade referencial deve ser preservada, etc.),
ajustando a propriedade Attributes do objeto. Consulte a
documentao do VB para as constantes predefinidas disponveis.
5. A criao de um objeto Field, utilizando o j conhecido mtodo
CreateField, para definir o campo comum da relao.
6. A definio da chave externa do relacionamento, ajustando a
propriedade ForeignName do objeto Field para o campo relacionado.
7. A adio do campo coleo Fields do objeto Relation e a sua
adio coleo Relations do objeto Database aberto, para criar
efetivamente o relacionamento.
Mtodo CreateRelation( )
Cria um novo objeto Relation para a especificao de um
relacionamento entre tabelas.

Sintaxe
Set ObRelation = ObDatabase.CreateRelation([nomeDaRelao[, _
tabelaOrigem [, tabelaDependente [, atributos ]]]])
Uma vez mais, utilizaremos como exemplo uma das definies feitas
no captulo anterior. Vamos definir o relacionamento entre a tabela
Produtos e a tabela Produtos Por Fornecedor. A Tabela 3.5 lista as
definies do relacionamento:
Figura 14.7: As definies do relacionamento entre a tabela Produtos
e a tabela Produtos Por Fornecedor.
O seguinte fragmento de cdigo cria o referido relacionamento:
Figura 14.8

Objeto Relation
Propriedades
A propriedade Attributes indica as caractersticas do objeto. A
propriedade ForeignTable especifica tabela dependente na relao. A
propriedade Table especifica a tabela primria na relao definida.
Sintaxe
Objeto.Attributes [= valorConstante]
ObRelation.ForeignTable [= nomeDaTabela]
ObRelation.Table [= nomeDaTabela]
O cdigo-fonte segue, rigorosamente, o passo-a-passo anterior, no
merecendo maiores comentrios. Note apenas que no precisamos
definir o tipo de relacionamento um-para-vrios, atribudo por default.
Alm disso, a imposio da integridade referencial dos dados
atribuda por default propriedade Attributes. Caso precise utilizar
mais de uma constante, apenas some seus valores. Por exemplo, a
declarao dbRelationUnique + dbRelationUpdateCascade define um
relacionamento de um-para-um com atualizao em cascata.
ForeignName
Propriedade
Especifica o campo utilizado como chave externa de uma relao. Por
definio, o campo deve pertencer tabela dependente e se
relacionar a um campo definido como chave primria na tabela de
origem da relao.
Sintaxe
ObField.ForeignName [= nomeDoCampo ]
A Criao de Consultas
Como foi visto nas primeiras sees deste captulo, o Microsoft Jet
oferece amplo suporte utilizao da SQL. possvel no apenas a
execuo de declaraes SQL, como tambm o seu armazenamento
no banco de dados. Uma vez armazenada a consulta, ela pode ser
alterada ou removida.
Nesta seo, enfocaremos apenas o armazenamento e a remoo de
consultas de um banco de dados, deixando para mais adiante a sua
utilizao. No discutiremos, porm, a prpria linguagem SQL. Mais
informaes sobre SQL podem ser encontradas na apostila especfica
de SQL, que acompanha este manual.
Como vimos no sumrio da DAO, o Microsoft Jet fornece um objeto
QueryDef para a manipulao de declaraes SQL armazenadas no
banco de dados. Alm disso, todo objeto Database possui uma
coleo QueryDefs, contendo informaes sobre todas as consultas
armazenadas.
A criao e o armazenamento de uma consulta num banco de dados
requerem somente os seguintes passos:
1. Um objeto Database, referindo o banco de dados onde a consulta
ser armazenada.
2. A criao de um objeto QueryDef, atravs do
mtodo CreateQueryDef( ), para o armazenamento da consulta.
Observe que o mtodo pode salvar, automaticamente, a consulta no
banco de dados.
3.. A especificao da declarao geradora da consulta, atribuindo-se
uma declarao vlida propriedade SQL do objeto QueryDef.
Mtodo CreateQueryDef( )
Cria um objeto QueryDef, podendo armazenar a definio da consulta
SQL no banco de dados.
Sintaxe
Set ObQueryDef = ObDatabase.CreateQueryDef([ nomeDaConsulta ][,
declaraoSQL ])
Para o nosso exemplo, suponhamos que seja necessrio um relatrio
contendo os seguintes dados: Descrio da categoria do produto,
Nome do Produto e Preo de Venda. O objetivo bsico do relatrio
fornecer uma lista abrangente de produtos aos clientes. Para isso, so
necessrios dados da tabela
Produtos e da tabela Categorias, utilizando-se uma consulta simples
para extra-los.
O fragmento de cdigo a seguir ilustra a criao da consulta:
Figura 14.9

A Modificao de Estrutura do Banco de Dados
Uma vez criado um banco de dados, a alterao da sua estrutura
sofre algumas restries. ndices, campos e relacionamentos no
podem ter suas propriedades alteradas. Para isso, necessrio
primeiro remover o objeto, recriando-o com a nova configurao. A
remoo de um objeto de uma coleo qualquer feita com o
mtodo Delete.
Mtodo Delete
Aplicado a um Recordset, o mtodo Delete remove o registro corrente.
Aplicado a uma coleo, remove o objeto especificado.
Sintaxe
ObRecordset.Delete
Objeto.Coleo.Delete nomeDoObjeto
Mesmo a remoo de alguns objetos sofre restries, a saber:
No possvel remover um campo que faa parte de uma expresso
de ndice ou de uma relao. Para isso, necessrio, primeiro,
remover o ndice ou a relao.
No possvel remover um ndice que esteja mantendo uma relao.
Para isso, necessrio remover, primeiro, a relao.
No possvel remover uma tabela que esteja suportando um
relacionamento. preciso, primeiro, remover a relao.
A alterao de uma consulta armazenada envolve apenas a alterao
da propriedade SQL do objeto QueryDef. O seguinte fragmento de
cdigo ilustra a remoo de uma tabela e a alterao de uma consulta
SQL:
Figura 14.10

Manuteno do Banco de Dados
Visando incrementar a performance do acesso ao banco de dados,
sempre crtica num sistema relacional, o Microsoft Jet (e o Microsoft
Access) no removem as pginas de registros eventualmente
deletadas do banco de dados. Esse artifcio, embora garanta uma
performance adequada aos aplicativos de acesso, consome
considerveis quantidades de disco, j que os arquivos tendem a se
expandir mais do que o crescimento dos registros.
Por outro lado, erros de sistema ocorridos durante operaes crticas
podem danificar o banco de dados. Se o dano no for extenso,
possvel corrigi-lo.
Para estes casos, so indispensveis recursos de manuteno do
bancos de dados, como compactao e correo de erros. O Microsoft
Jet fornece ferramentas suficientes para tratar o problema. o que
veremos nesta seo.
Compactando um
Arquivo
O objeto de sistema DBEngine suporta um
mtodo CompactDatabase, que copia todos os dados de um banco de
dados para outro. No processo, o arquivo otimizado, resultando na
recuperao de espao eventualmente desperdiado.
Mtodo CompactDatabase
Copia e compacta um banco de dados, permitindo a alterao de
verso, definio de ordenamento e criptografia do arquivo.
Sintaxe
DBEngine.CompactDatabase arquivoAntigo, arquivoNovo [,
localizao [,
opes]]
No possvel compactar um banco de dados aberto. Alm disso, no
se deve utilizar o mesmo nome no processo, j que o arquivo anterior
ser removido, mesmo que a compactao no se complete.
Para ilustrar o mtodo, criaremos uma rotina de uso geral
razoavelmente segura para a compactao de bancos de dados
compatveis com o Microsoft Access. Veja o cdigo nas trs figuras
que se seguem:
Figura 14.11: Funo CompactDatabase.
Figura 14.12: Funo para obter arquivo temporrio.
Figura 14.13: Funo para verificar existncia de arquivo.
O objetivo bsico da rotina tornar mais fcil e completamente seguro
o processo de compactao.
De uma forma geral, a compactao de um banco de dados envolve
os seguintes passos:
1. Criar um novo arquivo de dados, compactado.
2. Se a compactao foi bem-sucedida, remover o arquivo original.
3. Renomear o arquivo compactado com o nome de arquivo anterior.
Evidentemente, preciso ter certeza de que o novo nome no
corresponde a um arquivo existente. Caso contrrio, ele seria
sobrescrito. Tudo isso faz com que uma rotina de compactao tenha
uma razovel quantidade de linhas de cdigo. S isso j justifica a
existncia de uma rotina genrica para automatizar essa
complexidade.
Anlise
CompactDatabase( )
A funo recebe trs parmetros e retoma um lgico indicando se a
operao foi bem-sucedida:
Uma string contendo o path completo e o nome do banco de dados a
compactar.
Uma string opcional com informaes de localizao. Se o parmetro
no for passado, a funo assume a constante predefinida
dbLangGeneral.
Um inteiro opcional com a definio de criptografia. Caso o parmetro
no seja passado, a funo assume o valor 0 (sem criptografia).
O primeiro passo da rotina , portanto, validar seus argumentos, como
descrito acima. A seguir, obtemos um nome de arquivo temporrio da
funo TempNam( ), discutida mais adiante, ainda nesta seo. Se,
por qualquer motivo, a funo falhar, a rotina retoma um valor False.
Estamos, ento, prontos para compactar o banco de dados, utilizando
o DBEngine. Claro que precisamos monitorar eventuais erros no
processo. Ainda assim, visando aumentar a segurana do processo
(afinal, a rotina remove o banco de dados anterior), testamos
novamente o sucesso da compactao. Simplesmente tentamos abrir
o novo banco de dados, ainda monitorando erros. Se isso for possvel,
o banco foi corretamente compactado.
O passo final remover o banco de dados antigo e renomear o novo
banco de dados. Se o banco de dados temporrio tiver sido criado
num diretrio diferente daquele onde se localizava o anterior, o
comando Name mover o arquivo e o renomear.
TempNam( )
A funo recebe os seguintes parmetros, todos opcionais:
O prefixo do nome de arquivo temporrio gerado. Caso o parmetro
no seja passado, a funo assume o valor "~AXC".
A extenso do arquivo, incluindo o ponto. O valor default ".TMP".
O caminho para o diretrio onde se deseja criar o arquivo temporrio.
Caso o parmetro esteja ausente, a funo assume o diretrio
especificado nas variveis ambientais "TEMP" e "TMP" ou, na
ausncia destas, o diretrio corrente.
O primeiro procedimento da funo verificar os argumentos e
assumir os valores default, se for o caso. A seguir, validamos o
argumento Path. Isso feito de maneira extremamente simples:
apenas salvamos o diretrio corrente e tentamos mudar para o path
especificado. Se a operao no for bem-sucedida, o path invlido e
a funo retorna. Caso contrrio, retomamos ao diretrio corrente e
seguimos em frente.
Depois, construmos um path completo, incluindo a definio de drive
e removemos a contrabarra final. Estamos prontos para gerar um
nome temporrio na instruo seguinte, concatenando o path e o
prefixo do arquivo. A seguir, inicializamos o gerador de nmeros
aleatrios para a criao do restante do nome do arquivo.
A gerao e teste do nome do arquivo feita dentro de um loop. Os
quatro caracteres restantes do arquivo so gerados aleatoriamente
pela funo Rnd e, formatados apropriadamente, so armazenados na
varivel TempName. Esta concatenada varivel TempFile para a
criao de um caminho e nome completos de arquivo. Por fim, o loop
testa se o arquivo j existe, chamando a funo ArquivoExiste( ),
comentada mais adiante. Se o arquivo existir, a funo retorna True e
o loop retorna. Caso contrrio, um arquivo temporrio foi gerado e a
funo o retorna.
Note que a funo no cria efetivamente o arquivo, como a funo da
API do Windows GetTempFileName( ), apenas gera um nome vlido
para um arquivo inexistente.
ArquivoExiste( )
Para testar a existncia do arquivo apenas tentamos abri-lo no modo
compartilhado, tendo o cuidado de utilizar um modo de operao que
no o danifique. Se a operao gerar um erro, mais especificamente o
cdigo de erro 53, o arquivo no existe no path especificado.
Reparando um Arquivo
Para reparar um arquivo danificado, utilizamos o
mtodo RepairDatabase, aplicvel exclusivamente ao objeto
DBEngine. A operao realizada por ele recupera um arquivo
invalidado por uma operao incompleta de leitura e escrita de pgina
de dados. Este tipo de dano ocorre freqentemente quando o sistema
desligado subitamente, ainda com o arquivo aberto.
Mtodo RepairDatabase
Recupera um arquivo Access danificado.
Sintaxe
DBEngine.RepairDatabase nomeDoArquivo
preciso notar que nem todos os tipos de danos podem ser
recuperados. Alm disso, a operao de recuperao no otimiza o
arquivo, deixando inmeras pginas desnecessrias alocadas,
consumindo espao em disco. Assim, aps uma recuperao bem-
sucedida, conveniente a compactao do banco de dados.
A rotina listada a seguir efetua as operaes de reparao e
compactao subsequente:
Figura 14.14: Reparando um banco de dados
Anlise
A funo RepairDatabase( ) recebe os seguintes parmetros:
O nome do banco de dados a reparar. Note que o arquivo deve estar
fechado para que a operao possa se realizar sem erros.
Uma string opcional contendo as informaes de localizao. Se o
valor no for declarado, a rotina assume a constante predefinida
dbLangGeneral.
Um inteiro opcional, definindo a criptografia do arquivo. Seu valor
default 0 (sem criptografia).
Os dois ltimos parmetros no so necessrios reparao do
banco de dados. Servem, contudo, para a compactao realizada
imediatamente aps.
Realizamos a compactao executando o mtodo RepairDatabase( ),
como indicado. A seguir, se nenhum erro ocorreu, compactamos o
banco de dados atravs da funo CompactDatabase( ), j discutida.
E isso tudo.
Navegao num Banco de Dados
Evidentemente, a criao e alterao da estrutura de um banco de
dados, bem como a manuteno da sua integridade e otimizao so
tarefas eventuais na programao comercial. S com estes recursos,
a DAO no seria til. A principal utilizao dos objetos disponibilizados
pela DAO na edio e navegao de um banco de dados.
O Microsoft Jet Database Engine disponibiliza dois mecanismos
distintos de execuo das diferentes tarefas relacionadas a um banco
de dados:
Um mecanismo navegacional, representado pelo conjunto de objetos
da DAO, para a movimentao entre os registros individuais de um
banco de dados.
Um mecanismo relacional, baseado na Linguagem Estruturada de
Consultas (SQL), para o processamento de massas relacionadas de
registros do banco de dados.
A boa programao em VB utilizar os dois mecanismos em conjunto,
obtendo o melhor de dois mundos. De uma forma geral, utilizaremos a
SQL para extrair uma viso particular dos registros do banco de dados
e os objetos da DAO para editar e visualizar cada registro em
particular. Por outro lado, sempre que for necessrio atualizar grandes
massas de registros segundo critrios consistentes, daremos
preferncia SQL.
Nesta seo, conheceremos os diversos recursos navegacionais
disponibilizados pelo Microsoft Jet. Uma discusso mais ampla da
SQL pode ser encontrada na apostila que acompanha este manual.
Abrindo o Banco de Dados
Evidentemente, todas operaes num banco de dados se iniciam aps
sua abertura. Isso feito, como j sabemos, pelo mtodo
OpenDatabase( ), j amplamente utilizado nos exemplos deste
captulo. No entanto, h ainda alguns aspectos a discutir.
A verso 5 do Visual Basic foi especialmente remodelada para operar,
no que concerne ao tratamento de bancos de dados, em ambientes
multiusurio. Ora, pelas razes vistas, o acesso a um banco de dados
num ambiente multiusurio deve obedecer a um conjunto de,
requisitos e restries, distintos dos sofridos em ambientes
monousurio, especialmente numa arquitetura cliente-servidor.
Destacamos em particular:
Deve-se definir um conjunto de regras de permisso e acesso para
cada grupo de usurios do sistema.
A conexo de um usurio ao sistema - uma sesso - deve ser
especificada com referncia s regras de permisso e acesso ao
banco de dados.
Conseqentemente, as transaes que estiverem ocorrendo no
sistema devem estar de acordo com as regras especificadas.
Assinalamos anteriormente que a definio da segurana de acesso
ao banco de dados no pode ser realizada no escopo do Visual Basic.
Este s capaz de utilizar um banco de dados cuja segurana foi
estabelecida no Microsoft Access ou em outro gerenciador compatvel.
Assim, no VB, o primeiro passo definir uma sesso para o logon do
usurio.
Uma sesso define uma seqncia de operaes executadas pelo
Microsoft Jet. Ela se inicia na conexo do usurio ao sistema e
termina no seu logoff. Todas as operaes executadas durante uma
sesso formam o escopo de uma transao e esto sujeitas s
permisses determinadas pela segurana de acesso definida para o
usurio.
Definindo uma rea de Trabalho
No Microsoft Jet, uma sesso implementada pela criao (ou
utilizao) de um objeto Workspace.
atravs deste objeto que uma sesso iniciada e gerenciada. Numa
sesso, possvel a abertura de diversos bancos de dados, a
manipulao de transaes e a garantia da segurana de acesso
baseada em senhas e identificadores de usurio.
Uma transao definida como uma srie de alteraes nos dados ou
no esquema de um banco de dados.
No Microsoft Jet, cada sesso definida pelos seguintes passos:
A sesso iniciada quando um objeto Workspace criado pelo
mtodo CreateWorkspace( ), quando definido um nome para a
sesso, um identificador de usurio e uma senha.
Os diversos bancos de dados necessrios so abertos na rea de
trabalho definida pelo j conhecido mtodo OpenDatabase( ).
Os dados do banco de dados so manipulados em transaes,
definidas pelos mtodos BeginTrans, CommitTrans e Rollback.
Os diversos bancos de dados so fechados.
A sesso se encerra quando o objeto Workspace fechado pelo
mtodo Close.
Mtodo CreateWorkspace( )
Cria um objeto Workspace, iniciando uma sesso e definindo uma
nova rea de trabalho.
Sintaxe
Set ObWorkspace = DBEngine.CreateWorkspace( nomeDaSesso,
identificadorDoUsurio, senha)
Assinalamos anteriormente que, ao ser inicializado, o Microsoft Jet
cria um objeto Workspace default, referido pelo ndice 0 na coleo
Workspaces do DBEngine. Sempre que no houver necessidade de
condies especiais de segurana de acesso, esta sesso pode ser
utilizada livremente.
Mtodos BeginTrans, CommitTrans e
Rollback
Os mtodos aplicveis aos objetos Workspace e Database gerenciam
as transaes de uma sesso. Uma transao iniciada por
BeginTrans e terminada por CommitTrans, podendo ser abortada por
Rollback.
Sintaxe
Objeto.BeginTrans
Objeto.CommitTrans
Objeto.Rollback
A utilizao de transaes melhora a performance geral da
atualizao de um banco de dados. Elas permitem ao Jet acumular
diversas atualizaes e grav-las numa nica operao. Uma das
vantagens mais evidentes de tratar as diversas operaes como um
todo que elas sero bem-sucedidas ou falharo em conjunto,
auxiliando na preservao da integridade dos dados.
Imagine a seguinte situao. Por qualquer motivo, necessrio
atualizar a base de dados atravs de trs consultas de atualizao
consecutivas, que processam grandes massas de registros. A
operao s pode ser considerada bem-sucedida se todas as
consultas forem executadas. Assim, antes de executar a primeira
consulta, utilize o mtodo BeginTrans. Somente quando o mtodo
CommitTrans for executado a operao ser completada, num nico
passo.
Mtodo Close
Fecha um objeto de acesso a banco de dados. Aplicvel aos objetos
Workspace, Database e Recordset.
Sintaxe
Objeto.Close
O cdigo a seguir ilustra a utilizao de uma sesso no Visual Basic,
para atualizar a tabela de Produtos definida anteriormente
Figura 14.15: Utilizando uma sesso no Visual Basic.
Este um exemplo bem simples de transao. Poderamos ter
utilizado mltiplas consultas, combinadas com diversas operaes de
E/S no banco de dados via objetos da DAO. O resultado seria sempre
o mesmo.
Abrindo Tabelas e Consultas
Uma vez iniciada uma sesso e aberto(s) o(s) banco(s) de dados,
estamos livres para manipular os dados de inmeras e diferentes
maneiras. Sempre que desejamos extrair uma determinada viso dos
dados armazenados, de uma tabela a uma consulta englobando
mltiplas tabelas, recorremos aos objetos Recordset. H trs tipos de
recordsets:
Tabela - refere-se a uma tabela local (no ODBC) armazenada num
banco de dados. Este o nico tipo de recordset com suporte
localizao indexada.
Dynaset - um conjunto dinmico de dados, podendo se referir tanto a
uma tabela, local ou no, quanto ao resultado de uma consulta SQL.
Um dynaset pode ser editado normalmente.
Snapshot - um objeto do mesmo tipo de um Dynaset, exceto que no
admite edio de dados. Como o Microsoft Jet no precisa manter
uma srie de referncias e ponteiros, como nos dynasets, a operao
com um snapshot tende a ser mais rpida.
Seja qual for o tipo de recordset, ele criado sempre pelo
mtodo OpenRecordset( ). Ao execut-lo, podemos especificar tanto a
fonte de dados (um comando SQL, uma tabela anexada, uma tabela
local, etc.) quanto o tipo de recordset a ser criado. Se nenhum tipo de
recordset for especificado, o mtodo tenta criar um do tipo tabela, se
possvel.
Mtodo OpenRecordset
Cria um novo objeto Recordset, representando qualquer conjunto de
dados extrados de um banco de dados. Aplicvel aos objetos
Database, QueryDef, Recordset e TableDef.
Sintaxe
Set Objeto = ObDatabase.OpenRecordset( fonteDeDados [, tipo [,
opes]])
Set Objeto = ObjetoFonte.OpenRecordset([ tipo [, opes ]])
Alm dos comandos SQL, h inmeras maneiras de personalizar a
viso dos dados obtida num recordset. A primeira delas ordenando
os dados obtidos.
Os registros num recordset do tipo tabela aparecem na ordem em que
foram originalmente adicionados ao banco de dados. Isso, geralmente,
de nada serve. H duas maneiras bsicas de ordenar um recordset
deste tipo:
Atravs da sua propriedade Index, atribuindo a ela um dos ndices
predefinidos para a tabela.
Atravs da criao de um novo objeto Recordset a partir do primeiro,
aps ajustar a propriedade Sort deste ltimo para um critrio de
ordenao.
No possvel alterar a ordenao de um dynaset ou snapshot j
criado. Ao contrrio da tabela, necessria a criao de um novo
recordset com o critrio de ordenao requerido.
Um outro mecanismo fundamental de personalizao dos dados
extrados por um recordset o estabelecimento de filtros.
A propriedade Sort dos objetos Recordset retorna ou determina a
ordenao do conjunto de dados extrado. Ela requer uma string
contendo uma clusula SQL ORDER BY vlida, sem a expresso-
chave da linguagem.
Da mesma maneira que a propriedade Sort, possvel alterarmos a
propriedade Filter de um recordset existente e, ento, extrairmos um
novo recordset dele. Este novo recordset apontar apenas para os
registros correspondentes ao critrio de filtro selecionado.
A propriedade Filter dos objetos Recordset retorna ou determina o
critrio de seleo dos registros de um conjunto de dados. Ela requer
uma string contendo uma clusula SQL WHERE vlida, sem a
palavra-chave da linguagem.
O fragmento de cdigo a seguir ilustra a abertura de tabelas e a
ordenao e filtragem dos registros:
Figura 14.16: Abrindo tabela, ordenando e filtrando registros
O exemplo fala por si. Note apenas a utilizao de apstrofos para
delimitar o valor do CEP desejado ,no ajuste da propriedade Filter do
objeto obDynaset. Esta a conveno para indicar que o valor incluso
uma string e no um objeto do prprio banco de dados. Selecionar a
condio CEP 20002000 sem os apstrofos no retomar registros.
Abrindo uma Consulta Parametrizada
Lembre-se de que, no exemplo anterior, o recordset obtido pela
condio de filtro do objeto obDynaset no retornava o cadastro
completo do fornecedor, apenas os campos armazenados na tabela
Fornecedores. Como os campos Cidade e UF pertencem tabela
relacionada Localidades, eles no seriam devolvidos.
Vamos supor agora, que voc precisasse do endereo completo para,
digamos, uma mala direta. Neste caso, voc precisaria tambm dos
dois campos armazenados na tabela Localidades. Na programao
em Clipper, por exemplo, voc deveria abrir ambas as tabelas,
relacionar os campos atravs do comando SET RELATION e codificar
inteiramente um algarismo de extrao dos dados. Nada disso
necessrio com o Microsoft Jet. Uma simples declarao SQL capaz
de fazer a mgica.
Para que possamos utilizar os registros retornados por uma
declarao SQL de extrao de dados, devemos atribuir o resultado
da consulta a um objeto Recordset. Como vimos mais acima, isso
pode ser feito tambm com o mtodo OpenRecordset( ). Neste caso,
passamos como parmetro ao mtodo a declarao que extrair os
dados. Veja o exemplo de cdigo a seguir:
Figura 14.17
O cdigo acima produz o mesmo resultado do exemplo anterior, onde
ajustamos a propriedade Filter do objeto obDynaset. Neste caso,
contudo, executamos diretamente no dispositivo Jet uma consulta
seleo de registros e atribumos o seu resultado a um objeto
Recordset.
Este exemplo, contudo, pouco realista. Dificilmente saberemos de
antemo, num ambiente programado e no interativo, o valor do CEP
desejado. Provavelmente, ele ser obtido, em tempo de execuo,
atravs de um dilogo, onde o usurio informar o valor desejado para
a mala direta. O que precisamos, neste caso, de uma consulta
parametrizada.
As consultas parametrizadas so armazenadas previamente no banco
de dados. Quando necessrias, elas so abertas e seus parmetros
atribudos. A partir da, podemos criar um recordset com o valor
atribudo agindo como filtro.
Para criar uma consulta parametrizada preciso preceder o texto da
instruo SELECT com uma clusula PARAMETERS, onde definimos
os parmetros da consulta com seus nomes e tipos de dados. A
clusula PARAMETERS tem a seguinte sintaxe:
PARAMETERS nomeparmetro tipodado ;
Poderamos transformar a consulta anterior em uma consulta
parametrizada , incluindo uma clusula PARAMETERS no seu incio e
modificando sua clusula INNER JOIN para WHERE. Os colchetes
aqui servem para indicar que o valor entre eles um parmetro. Veja
como ficaria:
"PARAMETERS [CdigoPostal] Text; SELECT Fornecedores.[Razo
Social],
Fornecedores.Endereo, Fornecedores.CEP, Localidades.Cidade,
Localidades.UF
FROM Localidades, Fornecedores WHERE Localidades.CEP =
Fornecedores.CEP AND
Fornecedores.CEP = [CdigoPostal]"
Em tempo de execuo, abrimos a definio da consulta e atribumos
seu parmetro, extraindo ento um recordset.
Veja o fragmento de cdigo seguinte:
Figura 14.18: Abrindo uma consulta parametrizada.
Utilizamos a coleo Parameters do objeto QueryDef para obter e
atribuir o parmetro desejado. O cdigo acima produz o mesmo
resultado que no exemplo anterior. Exceto que, numa aplicao real, o
valor atribudo ao parmetro seria obtido de uma varivel ou de um
controle de janela de dilogo.
Fechando Tudo
Ao longo dos ltimos exemplos no nos preocupamos em fechar os
recordsets e bancos de dados abertos. Utilizamos uma caracterstica
da DAO: o recordset ou banco de dados (numa palavra, o objeto)
fechado automaticamente, sempre que a varivel que o referencia sai
de escopo. Como utilizamos variveis locais para referir os diversos
objetos, no foi preciso fech-los.
Isso, no entanto, no boa prtica de programao. Preocupe-se
sempre em fechar cada um dos objetos utilizados com o j conhecido
mtodo Close. Lembre-se apenas de que, como numa pilha de pratos
sujos, o ltimo a entrar deve ser o primeiro a sair. Feche os objetos
sempre do nvel inferior da hierarquia (Recordset, QueryDef ou
TableDef, Database e Workspace, nessa ordem). Caso contrrio, a
pilha de pratos cai e um erro gerado em tempo de execuo.
Localizando um Registro
Na programao de front-ends de sistemas de bancos de dados
comum a necessidade de localizar um registro especfico num
recordset. A biblioteca de Objetos de Acesso a Bancos de Dados
fornece um bom conjunto de mecanismos de localizao de registros.
Localizao Indexada
A mais rpida, j conhecida dos programadores de outras linguagens
com filosofia de banco de dados diferente, como o Clipper ou o
Paradox, a pesquisa indexada. Ela s possvel em objetos
Recordset do tipo tabela, desde que o ndice apropriado tenha sido
definido como o ndice de controle. Se voc tentar localizar um registro
sem um ndice aberto ou por uma chave diferente do ndice corrente,
um erro gerado.
Para localizar registros numa tabela indexada procedemos da
seguinte forma:
1. Criamos um Recordset do tipo tabela e o atribumos a um objeto.
2. Alteramos a propriedade Index do objeto para o nome do ndice
desejado.
3. Utilizamos o mtodo Seek para localizar um registro cujo valor
corresponde chave especificada.
Mtodo Seek
Localiza um registro numa tabela indexada. Aplicvel somente a um
Recordset do tipo tabela.
Sintaxe
ObRecordset.Seek stringDeComparao, listaDeChaves
Quaisquer dos operadores de comparao podem ser utilizados como
argumento para o mtodo. Caso a chave de ndice possua mais de um
campo, uma lista de valores correspondente deve ser especificada.
Veja o fragmento de cdigo a seguir:
Figura 14.19: Localizando um registro com Seek
Primeiro, definimos o ndice PrimaryKey como o ndice de controle de
ordenao do recordset. A seguir, pesquisamos o cdigo de Produto
nmero 2. Note que especificamos um tipo de dado estritamente
compatvel com a chave de ndice. Por fim, como seria de se esperar,
verificamos se a busca falhou, testando o valor da
propriedade NoMatch.
Propriedade NoMatch
A propriedade retorna um lgico indicando se a ltima operao de
busca realizada num recordset falhou.
Sintaxe
ObRecordset.NoMatch
Localizao Seqencial
Como dissemos, a pesquisa indexada s pode ser utilizada nos
recordsets do tipo tabela. Isso no quer dizer, contudo, que o
Microsoft Jet no fornea mecanismos suficientes para a localizao
de registros em dynasets ou snapshots. Ao contrrio. Os seguintes
mtodos podem ser utilizados:
FindFirst - localiza o primeiro registro que satisfaa ao critrio
especificado a partir do incio do recordset.
FindLast - localiza o ltimo registro que satisfaa o critrio
especificado a partir do fim do recordset.
FindNext - localiza o prximo registro que satisfaa o critrio
especificado a partir da posio corrente.
FindPrevious - localiza o registro anterior que satisfaa ao critrio
especificado a partir da posio corrente.
O critrio especificado aos mtodos geralmente corresponde a uma
clusula SQL WHERE vlida, sem a palavra-chave da linguagem.
Normalmente, buscamos um valor idntico a um critrio para um
determinado campo. Como no mtodo Seek, podemos, contudo,
utilizar quaisquer dos operadores de comparao.
O fragmento de cdigo a seguir executa a mesma operao do
exemplo anterior. Desta vez operamos sobre um dynaset, da a
utilizao do mtodo FindFirst:
Figura 14.20: Localizando com FindFirst
Note o modo como especificamos o contedo da expresso a ser
buscada. No utilizamos delimitadores no valor 2 porque no se trata
de tipo de dado string!
Movendo-se nos Registros
Como j assinalado, o mecanismo navegacional (por oposio ao
mecanismo relacional) disponibilizado pela DAO se baseia no conceito
de movimento pelos registros de um recordset para localizar um ou
mais registros. Como tambm assinalamos, tais mecanismos so
ineficientes para o processamento de grandes massas de registros.
Nestes casos, deve-se utilizar os comandos SQL suportados pelo
Microsoft Jet. No entanto, para operaes de alcance limitado, esse
mecanismo inteiramente satisfatrio, sobretudo quando se quer
processar um nico registro.
A localizao de um registro particular indispensvel porque
somente os campos do registro podem ser editados, a menos que
utilizemos consultas de ao. Assim, mtodos para saltarmos entre os
registros de um recordset so indispensveis. O Microsoft Jet
disponibiliza os seguintes mtodos:
MoveFirst - salta para o primeiro registro lgico de um recordset.
MoveLast - salta para o ltimo registro lgico de um recordset.
MoveNext - salta para o prximo registro lgico de um recordset.
MovePrevious - salva para o registro lgico anterior de um recordset.
No caso de utilizarmos tais mtodos, indispensvel determinarmos
os limites de um recordset. Caso contrrio, um erro ser gerado
quando tentarmos fazer uma referncia sem um registro corrente. Os
objetos Recordset possuem as seguintes propriedades:
BOF - determina se foi atingido o incio lgico do recordset.
EOF - determina se foi atingido o fim lgico de recordset.
O fragmento de cdigo a seguir ilustra a navegao por todo um
recordset, enviando o contedo de um de seus campos para a
impressora:
Figura 14.21: Navegando num recordset
Editando o Banco de Dados
Uma vez localizado o registro desejado, hora de edit-lo. A DAO
fornece os seguintes mtodos de edio de um recordset
(evidentemente do tipo dynaset ou tabela):
Edit - copia o registro corrente para um buffer temporrio para edio
dos dados.
AddNew - cria um novo registro para um recordset e aloca o buffer de
edio.
Update - copia o contedo do buffer de edio para o registro corrente
ou o novo registro criado.
O fragmento de cdigo a seguir ilustra a utilizao dos mtodos de
edio:
Figura 14.22: Editando o Banco de Dados
Usando o Controle Data Para Acessar um Banco de Dados
O controle data automatiza uma srie de tarefas comuns no acesso a
dados, mas no faz isto sozinho. Para que sua capacidade seja posta
em uso ele precisa estar ligado a outros controles que so utilizados
para apresentar as informaes colhidas do banco de dados na tela.
Cabe ao controle Data o uso destes controles para realizar seus
objetivos.
Vejamos como utilizar o controle data para manipular uma tabela do
Banco de Dados de exemplo Biblio.mdb. Se voc fez a instalao
padro do Visual Basic, este arquivo pode ser encontrado no diretrio
VB. Crie um novo projeto no Visual Basic. Selecione o controle Data
na caixa de ferramentas e acrescente-o ao formulrio Form1. Na
janela de propriedades, ajuste a sua propriedade Align para 2 - Align
Bottom. Selecione a propriedade DatabaseName e clique no boto de
reticncias. A caixa de dilogo DatabaseName surgir para que voc
localize o banco de dados que ser acessado pelo controle Data.
Localize o arquivo Biblio.mdb e clique em Abrir. Selecione agora a
propriedade RecordSource do controle Data e de um clique na seta
para baixo para visualizar as opes de configurao do valor desta
propriedade. Uma lista com vrios nomes de tabelas pertencentes ao
Biblio.mdb aparecero. Selecione a tabela Authors da lista. Agora,
quando o formulrio Form1 for carregado, o banco de dados
Biblio.mdb ser aberto automaticamente pelo controle Data e uma
consulta ser feita tabela Authors para obter como retorno o seu
conjunto de registros. A este conjunto de registros retornados damos o
nome de recordset. Mas e ento? Onde ser apresentado este
recordset?
Para fazer a apresentao dos registros da tabela Authors, vamos
criar trs caixas de texto e lig-las ao controle Data1. Cada uma ser
usada pelo controle Data1 para apresentar um dos campos do registro
atual. Chamamos de registro atual o registro que atualmente pode ser
exibido, alterado ou excludo do recordset. Podemos navegar dentro
de um recordset mudando o registro atual atravs de comandos de
avano e retrocesso.
Para ligar as caixas de texto ao controle Data1 usamos a propriedade
DataSource das caixas de texto. Atribua o valor Data1 a esta
propriedade para as trs caixas de texto. Essa atribuio far com que
o controle Data1 possa exibir informaes da tabela Authors nestas
caixas de texto, mas ainda falta definir que informao ser esta em
cada caso.
Selecione a propriedade DataField na caixa de texto Text1. Clique na
seta para baixo para ver as opes de valor. As opes apresentadas
correspondem aos nomes dos campos da tabela Authors acessada
pelo controle Data1. Configure a propriedade DataField como Au_Id
para Text1, Author para Text2 e Year Born para Text3. Feito isto, inicie
a aplicao. Voc ver na caixa de texto Text1 um nmero que
corresponde ao contedo do campo Au_Id na tabela Authors, em
Text2 exibido o nome do autor. Em Text3, infelizmente, poucos
registros da tabela Authors possuem informao de data de
nascimento (Year Born) do autor, por essa razo ser difcil ver
alguma informao nesta caixa de texto. Mas voc pode navegar pela
tabela clicando nos botes de seta do controle Data1 e vez por outra
ver um registro com informao no campo Year Born.

SQL - Linguagem Estruturada de
Consultas e o VB
A linguagem estruturada de consultas (Structured Query Language),
uma linguagem de alto nvel para manipulao de dados dentro do
modelo relacional. de tal ordem sua importncia para a indstria dos
bancos de dados relacionais que ela acabou por se tornar o
mecanismo mais popular de acesso aos grandes bancos de dados
cliente/servidor. Quando o primeiro sistema gerenciador de banco de
dados relacional foi desenvolvido, no incio da dcada de 70, o
primeiro mecanismo de acesso aos dados ali mantidos foi uma forma
primitiva de SQL.
O sucesso da linguagem foi tal que obrigou o Instituto Americano de
Padres (ANSI) a padronizar as implementaes do produto. Assim, a
maior parte - seno todas - as implementaes da linguagem seguem
de perto o padro ANSI definido. As pequenas variaes existentes
no afetam a padronizao global e costumam ser incorporadas para
complementar as capacidades da linguagem. Ainda que tais variaes
possam aumentar a complexidade da migrao de um ambiente para
outro, elas no afetam a estratgia global de portabilidade entre
plataformas. Se o caso de desenvolver aplicaes portteis, o
padro ANSI - suportado por todos os produtos, de uma forma geral -
deve ser seguido rigorosamente. Ainda que se percam alguns pontos
em desempenho e facilidade, a portabilidade estar garantida.
Para ns, programadores em VB, a compreenso e a utilizao da
SQL decisiva por alguns bons motivos:
poderosa e flexvel. muito mais rpida a recuperao e a
manipulao de dados utilizando a SQL que os objetos disponveis na
DAO. Com uma nica instruo SQL podemos substituir dezenas ou
mesmo centenas de linhas de cdigo baseadas nos objetos da
biblioteca DAO.
um padro na indstria. Como a SQL, com pequenas variaes,
suportada pelos mais importantes bancos de dados relacionais,
podemos criar programas de front-end para a administrao de
bancos de dados relativamente independentes do back-end. Por
exemplo, podemos escrever um aplicativo voltado para administrao
de um banco de dados Access e, sem alteraes significativas, port-
lo de modo a utilizar o Microsoft SQL Server ou outro banco de dados
ODBC.
Freqentemente, a implementao da linguagem SQL incorporada ao
Microsoft Jet ser utilizada para desempenho mximo, em conjunto
com os objetos da DAO. Uma utilizao comum poder ser selecionar
um subconjunto dos dados atravs de uma instruo SQL, gerar um
objeto Recordset e manipul-lo com os mtodos navegacionais
disponibilizados pela DAO. Com isso, o programador obter o melhor
de dois mundos. Alm disso, essa estratgia costuma facilitar a
portabilidade do aplicativo: deve variar somente o mecanismo de
conexo com a fonte de dados SQL, tudo o mais permanecendo
constante.
Neste captulo, procuraremos abordar de uma forma ampla, os
fundamentos e a capacidade do dialeto SQL suportado pelo Microsoft
Jet Database Engine, tal como implementado na verso 5 do VB. O
objetivo bsico do captulo ser, ento, prover o programador de uma
ferramenta poderosa e porttil, capaz de tornar a programao de
aplicativos de front-end para bancos de dados uma tarefa simples.
O objetivo fundamental da SQL fornecer ao usurio de um RDBMS
uma interface de alto nvel, capaz de isol-lo completamente das
complexidades de implementao do sistema. Com tal objetivo em
mente, desenvolveu-se uma linguagem totalmente no-procedural. Ao
usurio da SQL no cabe definir como o gerenciador do banco de
dados executar uma tarefa em particular, mas somente o que deve
ser feito.
Vamos imaginar um exemplo para que isso fique claro. Suponhamos
que voc precise atualizar uma tabela de comisses sobre a venda
dos vendedores da empresa. Por padro, a empresa paga 5% de
comisso sobre o valor faturado numa venda. Como medida de
estmulo, a empresa resolveu pagar comisso de 7.5% para todas das
vendas maiores que R$ 1.600,00, mas somente para vendas
efetuadas a partir de 15 de fevereiro de 1998. No modelo
navegacional da DAO voc poderia escrever, por exemplo, o seguinte
cdigo:
Figura 15.1

Est claro, no exemplo, o modelo procedural da operao de
atualizao, expresso no seguinte algoritmo:
1. Posicionamos o ponteiro de arquivo no primeiro registro lgico.
2. Verificamos se o registro corrente corresponde ao critrio desejado.
3. Se a verificao verdadeira, atualizamos o campo desejado.
4. Seguimos para o prximo registro.
5. Repetimos os passos 2 a 4 at encontrar o fim do arquivo.
A mesma atualizao utilizando a SQL poderia ser feita da seguinte
forma:
Figura 15.2: Usando SQL para atualizar banco de dados
Note a diferena radical dessa abordagem. Em momento nenhum nos
preocupamos em determinar como a atualizao deve ser feita.
Apenas especificamos o que deve ser feito. Solicitamos ao Jet
atualizar o campo Comisso da tabela Comisses para 0.075 sempre
que o registro satisfaa ao critrio especificado. Isso foi feito por um
comando muito prximo da linguagem utilizada para descrever a
tarefa.
Evidentemente, o sistema gerenciador incapaz de compreender a
linguagem de alto nvel empregada. Antes de ser executada, ela deve
ser traduzida para uma linguagem procedural ao nvel da mquina. O
ponto principal a ressaltar, contudo, que essa traduo feita pelo
dispositivo gerenciador e no pelo programador. Este pode continuar a
pensar em termos da tarefa a ser executada e no de como execut-
la. Isso torna mais simples a programao, de modo que mais
pessoas podem escrever os mesmos programas em menos tempo.
Naturalmente, a complexidade no estranha a determinadas
instrues SQL. No entanto, essa complexidade ser sempre inferior
sua equivalente programada.
Um outro ponto a ressaltar diz respeito ao que voc pode fazer com o
VB e a SQL, ainda que no utilize o Jet. Como j assinalamos, o Jet
no um dispositivo cliente\servidor. Ele reside no mesmo
computador do aplicativo de front-end. Assim, utilizando um banco de
dados remoto, o trfego na rede equivalente quando utilizada a DAO
ou a SQL. No entanto, o mesmo cdigo escrito visando o banco de
dados Access pode ser, facilmente, portado, por exemplo, para a
utilizao do SQL Server como fonte de dados. Ambos os dispositivos
compreendem o mesmo dialeto da linguagem SQL. Numa consulta de
seleo de registros, por exemplo, trafegaro na rede somente o
comando SQL e os registros selecionados. Essa abordagem, portanto,
implica um ganho de performance impossvel sem a utilizao da
SQL.
Sintaxe do SQL
Uma declarao SQL pode consistir dos seguintes componentes:
Uma declarao de parmetros. Quando uma declarao requer
parmetros, isto , valores somente disponveis em tempo de
execuo a partir da interao com o usurio, conveniente - ainda
que opcional - a declarao explcita dos parmetros utilizados. Tal
declarao deve ser feita da seguinte forma:
PARAMETERS nomeDoParmetro tipoDeDado; Qualquer quantidade
de parmetros, dentre os tipos de dados suportados pelo dispositivo
Jet (ou pelo sistema gerenciador ao qual o aplicativo est conectado
via ODBC), inteiramente vlida.
O comando SQL. Este componente informa ao gerenciador a ao a
ser executada. Por exemplo, a declarao SELECT * FROM Clientes
solicita ao dispositivo gerenciador que retorne todos os campos da
tabela Clientes.
Clusulas opcionais. Informam ao dispositivo gerenciador as
condies segundo as quais os registros sero selecionados, tais
como ordenaes, condies lgicas de filtro, agrupamentos, etc. Se o
comando SQL informa ao dispositivo o que fazer, as clusulas
opcionais especificam os registros a serem includos no
processamento e o critrio especfico dessa incluso.
Comandos SQL
costume tratar a SQL como composta de subconjuntos de
comandos - linguagens - para a execuo de diferentes tarefas. Tal
como a DAO, a SQL suporta tanto uma linguagem de definio de
dados (DDL) - para a criao e alterao de tabelas e ndices quanto
uma linguagem de manipulao de dados (DML) - para a seleo e
atualizao dos dados armazenados nas tabelas. A Figura
15.3 sumariza os diversos comandos suportados pela SQL
incorporada ao VB:
Figura 15.3: Os comandos SQL suportados pelo VB.
Clusulas SQL
As clusulas so modificadores utilizados para definir os dados a
serem selecionados para a manipulao. A Figura 15.4 sumariza as
diversas clusulas suportadas pela SQL no VB5:
Figura 15.4: As clusulas suportadas pela SQL do Visual Basic.
Operadores
A SQL suporta dois tipos de operadores:
Os operadores lgicos, utilizados para conectar expresses,
normalmente numa clusula WHERE.
Os operadores de comparao, utilizados para comparar os valores
de duas expresses.
A Figura 15.5 sumariza, por tipo, os operadores suportados pela SQL
do VB:
Figura 15.5: Os operadores SQL suportados pelo Visual Basic.
Funes Agregadas
Alm dos comandos vistos anteriormente, a SQL suporta ainda um
conjunto de funes pr-definidas. Tais funes, utilizadas numa
clusula SELECT, referem-se a determinados grupos de registros e
retomam um valor aplicvel ao grupo. A Figura 15.6 sumariza as
funes suportadas pelo Jet:
Figura 15.6: As funes agregados suportados pela SQL do Visual
Basic.
Como j foi dito, a DDL um subconjunto de comandos SQL capazes
de criar e modificar a estrutura de uma tabela, incluindo os seus
ndices. De uma forma geral, a DDL pode substituir boa parte das
operaes efetuadas pelos objetos da DAO, tal como
discutimos anteriormente. No entanto, h algumas limitaes para as
operaes com a DDL:
Somente os bancos de dados nativos do Jet - no formato do Microsoft
Access - admitem os comandos DDL a partir do VB.
Apenas um limitado nmero de propriedades de tabelas, campos e
ndices abarcado pelos comandos DDL.
Operaes com a DDL
Com DDL, possvel:
Criar e remover uma tabela, definindo as propriedades bsicas (nome,
tipo e tamanho) dos campos;
Alterar a estrutura de uma tabela, incluindo e removendo campos;
Criar e remover um ndice.
Trataremos agora circunstanciadamente de cada bloco de operaes.
Criando e Removendo Tabelas
Para criar uma tabela com um comando DDL, apenas especificamos
os nomes, tipo de dado e tamanho, se for o caso, de cada campo
numa clusula CREATE TABLE. Os nomes dos campos no precisam
ser delimitados por aspas. Contudo, nomes de campos contendo
espaos devem ser delimitados por colchetes.
Na criao de uma tabela com a DDL, apenas as propriedades Name,
Type e Size do equivalente objeto Field so especificadas. As demais
propriedades suportadas pelo objeto, como ValidationRule,
ForeignName, etc., no so suportadas. Se necessrias, a tabela
deve ser modificada com o auxlio da DAO.
O seguinte fragmento de cdigo cria uma tabela Clientes no banco de
dados Base32.Mdb, para a empresa Limpa Tudo Materiais de
Limpeza Ltda., tal como j foi descrito:
Dim db As Database
Set db = Workspaces(0).CreateDatabase (App.Path & _
"\Base32.Mdb", dbLangGeneral, dbVersion30)
db.Execute "CREATE TABLE Clientes " & _
"(Cliente TEXT (4), CGC TEXT " & _
"(14), RazoSocial TEXT (30), " & _
"Endereo TEXT (50), CEP TEXT (8))"
db.Close
A remoo de uma tabela em SQL to simples quanto utilizando a
DAO. O seguinte fragmento de cdigo remove a tabela criada no
exemplo anterior:
Dim db As Database
Set db = Workspaces(0).OpenDatabase(App.Path & _
"\Base32.Mdb")
db.Execute "DROP TABLE Clientes"
db.Close
Modificando Tabelas
Do mesmo modo que na DAO, no possvel alterar as propriedades
de um campo j anexado a uma tabela. Sendo assim, utilizando os
comandos DDL, possvel apenas remover um campo (coluna) ou
anexar um novo tabela. Portanto, a alterao de uma das
propriedades do campo, via SQL, requer que ele seja primeiro
removido e depois novamente includo com as caractersticas
alteradas. Note-se uma vez mais que apenas o nome, o tipo de dado e
o tamanho de um campo podem ser especificados.
O seguinte fragmento de cdigo altera a estrutura da tabela Clientes,
criada na seo anterior:
Dim db As Database
Set db = Workspaces(0).OpenDatabase (App.Path & _
"\Base32.Mdb")
db.Execute "ALTER TABLE Clientes " & _
"DROP COLUMN Cliente"
db.Execute "ALTER TABLE Clientes " & _
"ADD COLUM Cliente SHORT"
db.Close
Criando e Removendo ndices
H trs diferentes maneiras de criarmos um ndice utilizando os
comandos SQL:
Na criao da tabela, aps a especificao do comando CREATE
TABLE. possvel, neste momento, criar um ndice a partir de uma
nica coluna ou a partir de diversas. Apenas acrescente a clusula
CONSTRAINT especificando os campos e propriedades do ndice.
Utilizando o comando CREATE INDEX isoladamente. Neste caso,
pode-se tambm especificar as diversas propriedades do ndice, bem
como definir regras de validao com a clusula WITH.
Utilizando o comando ALTER TABLE. Apenas utilize a combinao de
palavras-chave ADD CONSTRAINT aps o comando ALTER TABLE.
Como se pode notar, utilizamos a clusula CONSTRAINT para criar
ou remover um ndice junto com os comandos CREATE TABLE e
ALTER TABLE. Com esta clusula possvel tambm definir uma
chave primria ou externa, definir relacionamentos e forar a
integridade referencial dos dados.
O seguinte fragmento de cdigo cria um ndice primrio para a tabela
Clientes utilizando o campo Cliente:
Dim db As Database
Set db = Workspaces(0).OpenDatabase(App.Path & _
"\Base32.Mdb")
db.Execute "ALTER TABLE Clientes " & _
"ADD CONSTRAINT Cliente " & _
" PRIMARY KEY (Cliente)"
db.Close
O fragmento de cdigo seguinte cria uma nova tabela, chamada
Telefones dos Clientes e, a seguir, estabelece um relacionamento por
chave externa com a tabela Clientes, atravs do campo Cliente:
Dim db As Database
Set db = Workspaces(0).OpenDatabase(App.Path & _
"\Base32.Mdb")
db.Execute "CREATE TABLE [Telefones dos Clientes] " & _
"(Cliente SHORT, Telefone TEXT (10), " & _
"Contato TEXT (30)) "
db.Execute "ALTER TABLE [Telefones dos Clientes] " & _
"ADD CONSTRAINT TelefonesCliente " & _
"FOREIGN KEY (Cliente) " & _
"REFERENCES Clientes (Cliente)"
db.Close
O fragmento de cdigo seguinte ilustra a utilizao do comando
CREATE INDEX para indexar a tabela anterior utilizando o campo
Telefone:
Dim db As Database
Set db = Workspaces(0).OpenDatabase (App.Path & _
"\Base32.Mdb")
db.Execute "CREATE INDEX Telefones " & _
"ON [Telefones dos Clientes] (Telefone)"
db.Close
Para remover um ndice existente, apenas utilize o comando DROP
com referncia ao ndice desejado. Por exemplo, para remover o
ndice Telefones da tabela Telefones dos Clientes, utilize o seguinte
comando:
db.Execute "DROP INDEX Telefones " & _
"ON [Telefones dos Clientes]"
Mtodo Execute
Executa um comando SQL no banco de dados especificado. Note que
o mtodo s vlido para consultas de ao, onde no so retomados
registros.
Sintaxe
ObDatabase.Execute comandoSQL [, opes ] ObQueryDef.Execute [
[ opes ]
Extrao de Dados das Tabelas
De longe, a utilizao mais comum da linguagem SQL - mais
especificamente do subconjunto conhecido como DML, a linguagem
de manipulao de dados - na recuperao de subconjuntos dos
dados para posterior tratamento. o que se convencionou chamar
Consultas. Alis, o maior poder da SQL no se revela no subconjunto
DDL, mas principalmente na sua capacidade de selecionar um
conjunto complexo de registros segundo um conjunto, tambm
complexo, de condies e trat-lo num nico passo.
O Comando SELECT
Na SQL, o comando SELECT o utilizado na recuperao de dados.
A forma bsica do comando SELECT a seguinte:
SELECT nomesDosCampos FROM nomeDaTabela [clusulas]
Assim, a forma mais simples de uma consulta poderia ser a que
segue, aplicada a uma das tabelas definidas para a Limpa Tudo:
SELECT * FROM Fornecedores
A instruo anterior seleciona todos os campos da tabela
Fornecedores e retorna um subconjunto dos dados, que pode ser
visualizado no Microsoft Access, conforme a Figura 15.7:
Figura 15.7: Uma consulta de seleo.
Naturalmente, no obrigatria a seleo de todos os campos da
tabela. Pode-se selecionar qualquer quantidade desejada de campos.
O comando a seguir recupera apenas dois campos da tabela Estoque
do mesmo banco de dados:
SELECT Produto, [Quantidade Estocada] FROM Estoque
A Clusula WHERE
possvel tambm determinar que a seleo dos registros seja feita
com base num determinado critrio. Alis, essa a utilizao mais
comum. Para isso, ns adicionamos determinadas clusulas ao
comando SQL. A clusula bsica para a especificao de critrios de
seleo a clusula WHERE.
A clusula determina as condies de extrao dos registros. Assim,
na sua forma bsica, ela utiliza os operadores da linguagem para
determinar o mecanismo de seleo utilizado pelo comando. Um
exemplo da utilizao da clusula pode ser o que segue:
SELECT Produto, [Nome do produto] FROM Produtos WHERE
Categoria = 1
A clusula anterior, aplicada ao banco de dados definido para a
empresa Limpa Tudo, retorna os registros exibidos no exemplo
da Figura 15.8:
Figura 15.8: Uma consulta de seleo com clusula condicional
Costuma ser necessrio que uma consulta satisfaa a mltiplos
critrios de seleo. Por exemplo, voc pode desejar visualizar os
produtos da categoria 2 - Detergentes. Assim, voc escreve o seguinte
comando:
SELECT Produto, [Nome do Produto], [Preo de Venda] FROM
Produtos WHERE Categoria = 2
Voc deseja discutir com um cliente da Limpa Tudo uma grande
venda de um desses produtos. Sabe, porm, que o cliente no deseja
pagar mais que setenta centavos por unidade. Assim, voc solicita a
seguinte consulta:
SELECT Produto, [Nome do Produto], [Preo de Venda] FROM
Produtos WHERE [Preo de Venda] <= 0.70
Como voc pode notar, o que voc efetivamente deseja ainda um
subconjunto dos dados produzidos pelas duas queries. Na verdade,
apenas aquele subconjunto de registros comuns a ambas as
consultas. Para obter tal resultado, voc deve, evidentemente, compor
a clusula condicional de tal modo que apenas esse subconjunto
especfico seja retornado pelo dispositivo gerenciador. Assim, o
comando deve ser escrito da seguinte forma, que recupera to
somente os produtos desejados:
SELECT Produto, [Nome do Produto], [Preo de Venda] FROM
Produtos WHERE Categoria = 2 AND [Preo de Venda] <= 0.70
Lembre-se de que a estratgia fundamental, quando se trata da
utilizao da linguagem SQL no contexto de aplicaes cliente-
servidor, reduzir o universo de registros selecionados ao mnimo
possvel, de modo a melhorar a eficincia do trfego dos dados.
Assim, boa parte do esforo do programador na composio de
consultas de seleo estar voltado para a definio de clusulas
WHERE tais que reduzam ao mximo possvel o resultado da query.
No suponha que qualquer artifcio de programao utilizando a DAO
possa substituir a eficincia da linguagem SQL. Os modernos
gerenciadores de banco de dados relacionais possuem mecanismos
de otimizao eficientes e so capazes de criar estratgias de
recuperao as mais velozes no contexto do comando executado.
Especificando um Intervalo para os Registros
Uma outra necessidade comum a especificao de um intervalo de
valores de um determinado campo para a seleo dos registros.
Imaginemos que seja necessrio visualizar todas as vendas efetuadas
na segunda quinzena do ms de janeiro de 1998. Para isso
precisamos utilizar a clusula BETWEEN na condio lgica de
seleo. Veja o exemplo a seguir:
SELECT Vendas.Data, Produtos.[Nome do Produto],
Faturas.[Quantidade Vendida] FROM
(Vendas INNER JOIN Faturas ON
Vendas.Fatura = Faturas.Fatura)
INNER JOIN Produtos
ON Faturas.Produto = Produtos.Produto
WHERE (Vendas.Data BETWEEN CVDate('16/01/98')
AND CVDate('31/01/98'))
Especificando uma Lista de Condies
Suponhamos agora que voc deseje todos os produtos categorizados
como 1- Saponceo, 2 - Detergente e 5 -gua Sanitria. Isso pode ser
obtido pela seguinte clusula:
SELECT Produto, [Nome do Produto] FROM Produtos
WHERE Categoria = 1 OR Categoria = 2 OR Categoria = 5
Na verdade, o que se deseja aqui um conjunto de registros que
satisfaam a uma lista de condies alternativas. Uma forma mais
compacta de obter o mesmo resultado o comando:
SELECT Produto, [Nome do Produto] FROM produtos
WHERE Categoria IN (1, 2, 5)
Verificando a Ocorrncia de Valores NULL
Na definio da base de dados da Limpa Tudo, feita anteriormente,
especificamos uma tabela-filha Telefones dos Fornecedores, onde
armazenvamos tambm o nome dos empregados responsveis pelo
fornecimento. Voc se lembra de que o campo criado para representar
a informao - Contato - no era obrigatrio, podendo assumir valor
NULL. Alm disso, especificamos que diversos telefones e contatos
poderiam ser consignados a um mesmo fornecedor. Suponhamos
agora que seja necessrio visualizar os telefones e os contatos de
algumas empresas. O seguinte comando SQL poderia ser usado:
SELECT Fornecedor, Telefone, Contato
FROM [Telefones dos Fornecedores]
WHERE Fornecedor IN (23, 41, 168)
No entanto, voc no deseja telefones que no estejam associados a
nenhum contato. Assim, alguns registros da consulta resultante no
so necessrios e podem ser eliminados. A seguinte declarao no
inclui tais registros:
SELECT Fornecedor, Telefone, Contato
FROM [Telefones dos Fornecedores]
WHERE Fornecedor IN (23, 41,168)
AND Contato <> ""
O comando, utilizado com o Microsoft Jet, elimina os registros com
valor NULL para o campo Contato. No entanto, tais tipos de campos
podem variar de sistema para sistema, o que tornaria a consulta
menos porttil. Desse modo, a linguagem SQL implementa um
mecanismo genrico para testarmos a ocorrncia de um valor NULL.
Aquela consulta pode, ento, numa forma mais genrica, ser escrita
da seguinte forma, obtendo o mesmo resultado:
SELECT Fornecedor, Telefone, Contato
FROM [Telefones dos Fornecedores]
WHERE Fornecedor IN (23, 41, 168)
AND Contato IS NOT NULL
Ordenando as Consultas
No faz sentido, no modelo relacional, questionarmos a ordenao
fsica dos registros (linhas) numa tabela. O problema s passa a ter
significado no momento da recuperao dos dados, uma vez que a
ordenao s faz sentido para o usurio e no para o prprio modelo
lgico dos dados.
A linguagem SQL fornece a clusula ORDER BY visando a
especificao da ordem particular na qual os registros sero
retornados do dispositivo gerenciador de bancos de dados. O seguinte
comando retorna uma lista em ordem alfabtica de todos os clientes
da Limpa Tudo:
SELECT [Razo Social] FROM Clientes
ORDER BY [Razo Social]
Extraindo Dados de Mltiplas Tabelas
Quando tratamos da modelagem de dados, insistimos no fato de que
nenhuma informao redundante deveria ser mantida numa tabela.
Nestes casos, o tpico deveria ser dividido em duas ou mais tabelas,
estabelecendo-se um relacionamento entre elas atravs de um campo
comum a ambas. Isso significa que, via de regra, os dados
necessrios para a eficiente manipulao de uma base de dados
esto contidos em mais de uma tabela.
No h nenhuma complicao adicional em se extrair dados de
diversas tabelas armazenadas num mesmo banco de dados.
Simplesmente informe aps a clusula FROM o nome das diversas
tabelas necessrias. A partir da, passa a ser relevante declarar
explicitamente de qual tabela o campo deve ser extrado na clusula
SELECT. Isso feito precedendo o nome do campo pelo nome da
tabela e separando-os com o operador ponto.
No entanto, algumas consideraes devem ser feitas. Quando
separamos dados afins em mltiplas tabelas, geralmente as
relacionamos atravs de um campo-chave (a chave externa). Quando
isso acontece, no possvel simplesmente declarar as diversas
tabelas de onde os dados devem ser extrados sem determinar o tipo
de relacionamento desejado entre os campos-chave. Sendo assim,
deve haver um mecanismo para declarar o relacionamento entre as
tabelas. Um exemplo simples nos ajudar a ilustrar o problema.
Suponhamos que a Limpa Tudo precise mandar uma mala direta para
todos os seus clientes, divulgando os novos e fantsticos descontos
dados para seus produtos. Assim, necessrio retornar um endereo
completo na forma exigida pela empresa de correios. Como voc se
recorda, os campos necessrios para a mala direta - Razo Social,
Endereo, CEP, Cidade e UF - esto armazenados em duas tabelas -
Clientes e Localidades.
Voc se recorda tambm que estabelecemos uma relao um-para-
vrios entre ambas atravs do campo CEP, onde Clientes a tabela
dependente. Assim, nem todos os registros da tabela Localidades nos
interessam, apenas aqueles com uma correspondncia direta na
tabela Clientes. Esta correspondncia definida na expresso
Localidades.CEP = Clientes.CEP.
Vamos supor agora que nem todos os clientes da Limpa Tudo devem
ser includos na mala direta, apenas aqueles que adquiriram produtos
no ano de 1998. Assim, precisamos incluir na consulta tambm a
tabela Vendas. Os campos dessa tabela no sero utilizados na mala
direta; servem apenas para filtrar os registros da tabela Clientes.
Na modelagem do banco de dados, definimos que para cada registro
na tabela Clientes, poderiam existir vrios registros na tabela Vendas,
relacionados pela chave Clientes. A condio de relacionamento da
consulta , portanto, expressa pela relao Clientes.Cliente =
Vendas.Cliente. O relacionamento global entre as trs tabelas
componentes da mala direta pode ser graficamente expresso
pela Figura 15.9:
Figura 15.9: Gerando uma mala direta.
Como dissemos, a tabela Vendas ser utilizada somente como um
filtro para os registros da tabela Clientes. Queremos extrair somente
aqueles registros que satisfaam a duas condies:
Estejam, simultaneamente, em ambas as tabelas. Essa, como se
sabe, a condio relacionando as tabelas.
Estejam armazenados na tabela Vendas com uma data qualquer do
ano de 1998. A condio WHERE de filtro seria, portanto,
Vendas.Data > CVDate('01/01/98')
Essa complexa rede de relacionamentos deve ser expressa na
clusula FROM da nossa consulta. O mecanismo bsico para a
expresso desse critrio de relacionamento a clusula SQLINNER
JOIN... ON. Ns declaramos que a tabela A deve ser combinada
tabela B (INNER JOIN) sempre que os campos-chave
corresponderem a um determinado valor de comparao (ON). A
complexidade do relacionamento das tabelas do exemplo pode ser
expressa pelo aninhamento das clusulas INNER JOIN.
A clusula INNER JOIN combina registros de duas tabelas sempre
que campos comuns satisfaam a um determinado valor de
comparao. Note que a tentativa de utilizar campos Memo ou OLE
Object na comparao gera um erro. Campos numricos podem ser
comparados mesmo que possuam diferentes tipos de dados.
A extrao dos registros desejados do banco de dados da Limpa Tudo
pode ser feita utilizando a declarao SQL listada a seguir, onde deve
ser notado o aninhamento de ligaes:
SELECT Clientes.[Razo Social], Clientes.CGC,
Clientes.Endereo, Clientes.CEP, Localidades.Cidade,
Localidades.UF FROM (Localidades
INNER JOIN Clientes ON Localidades.CEP = Clientes.CEP)
INNER JOIN Vendas ON Clientes.Cliente = Vendas.Cliente
WHERE (Vendas.Data>CVDate('01/01/98'))
Em alguns casos, contudo, podemos querer selecionar todos os
registros de uma das tabelas, tenham ou no correspondncia com os
registros de outra. Nestes casos, utilizamos as
clusulasLEFTJOIN e RIGHTJOIN.
A clusula LEFT JOIN seleciona todos os registros da primeira tabela
( esquerda da declarao), mesmo que no tenham correspondncia
com os registros da segunda tabela. A clusulaRIGHT JOIN faz a
mesma coisa em sentido inverso, referenciando a segunda tabela (
direita da declarao).
Acessando Tabelas Externas
Algumas vezes, necessria a extrao de dados de tabelas
armazenadas em fontes de dados externas. Tais fontes representam
bancos de dados no nativos, mas acessveis pelo Microsoft Jet, tais
como dBase, Paradox, FoxPro, etc. Nestes casos, especificamos o
banco de dados e o tipo da conexo atravs da clusula IN. Por
exemplo, podemos selecionar todos os campos de arquivo dBase III
das seguintes maneiras:
SELECT * FROM Arquivo IN "Drive:\Diretrio" "dBase III;";
SELECT * FROM Arquivo IN "" [dBase III;
DATABASE=Drive:\Diretrio;];
Condies de filtragem e ordenaes podem ser especificadas
normalmente. Deve-se atentar, contudo, para as diferenas entre os
diversos tipos de bancos de dados e a maneira do Microsoft Jet
conect-los.
Filtrando Resultados de uma Consulta
H diferentes maneiras de filtrar e agrupar os dados numa consulta.
Para isso, a linguagem SQL incorpora um bom nmero de clusulas e
predicados com essa finalidade. Trataremos apenas das mais
utilizadas, a saber:
O predicado DISTINCT. Omite os registros contendo dados duplicados
dentro de uma seleo. Imagine que voc deseja uma viso
geogrfica dos clientes de uma empresa. Uma das possibilidades
pode ser, por exemplo, uma consulta selecionando somente o campo
Cidade da base de dados. Neste caso, faz sentido selecionar apenas
um registro para cada valor distinto obtido, eliminando-se a
redundncia. Um exemplo poderia ser a declarao SELECT
DISTINCT Cidade FROM Localidades.
O predicado TOP. Retorna somente uma determinada quantidade de
registros compondo o incio ou o fim de um intervalo especificado. Por
exemplo, suponha que voc deseje localizar os dez maiores clientes
da sua empresa. Isso poderia ser feito por uma declarao
como SELECT TOP 1O Cliente FROM Clientes ORDER BY
Faturamento DESC.
A clusula GROUP BY. Combina, num nico registro, registros com
um mesmo valor para um campo especificado. Caso se utilize as
funes SUM ou COUNT, um valor agregado criado para cada
registro que satisfaa a condio especificada. Por exemplo, para
obter uma consulta ordenada de itens em estoque, possvel utilizar a
declarao SELECT Produtos.[Nome do Produto],
Estoque.[Quantidade Estocada] FROM Estoque INNER JOIN
Produtos ON (Produtos.Produto = Estoque. Produto) AND
(Estoque.Produto = Produtos. Produto) GROUP BY
Produtos.[Nome do Produto], Estoque.[Quantidade Estocada].
A clusula HAVING. Especifica quais registros agrupados (por uma
clusula GROUP BY) sero retornados. Tais registros devero
satisfazer a uma condio especificada. Por exemplo, para obter
apenas os itens em estoque cuja quantidade inferior a 50, pode-se
utilizar a declarao SELECT Produtos.[Nome do Produto],
Estoque. [Quantidade Estocada] FROM Estoque INNER JOIN
Produtos ON (Produtos.Produto = Estoque.Produto) AND
(Estoque.Produto = Produtos.Produto) GROUP BY
Produtos.[Nome do Produto], Estoque.[Quantidade Estocada]
HAVING (Estoque.[Quantidade Estocada]<50).
Subconsultas e Consultas de Referncia Cruzada
No h, praticamente, limite para a complexidade de uma query. Ns
vimos um exemplo dessa complexidade quando enfocamos a clusula
INNER JOIN. H outros tpicos a abordar.
Subconsultas
Uma subconsulta simplesmente uma declarao SELECT dentro de
uma outra declarao SELECT ou declaraes de ao, vistas mais
adiante. possvel utilizar uma subconsulta nas mais diversas
circunstncias:
No lugar de uma expresso na lista de campos de uma declarao
SELECT;
Dentro de uma clusula WHERE;
Dentro de uma clusula HAVING.

Para selecionar os registros da consulta principal que satisfaam a
comparao com quaisquer dos registros da consulta secundria,
utilizamos os predicados ANY ou SOME. Para selecionar somente os
registros da consulta principal que satisfaam a comparao com
todos os registros da consulta secundria, utilizamos o
predicado ALL. Para selecionar somente os registros da consulta
principal para os quais existam valores idnticos na consulta
secundria, utilizamos o predicado IN.
Tentemos um exemplo simples. Queremos uma lista de todos os
fornecedores da Limpa Tudo cujos produtos, sejam eles quais forem,
tenham preo inferior a R$ 1,00. Podemos utilizar a seguinte consulta
para a seleo dos registros apropriados: SELECT * FROM
Fornecedores "WHERE Fornecedor = ANY (SELECT * FROM
[Produtos Por Fornecedor] WHERE [Preo de Compra] < 1@).
Consultas de Referncia Cruzada
A consulta de referncia cruzada utilizada quando desejamos
resumir dados em um formato de linhas e colunas. Com tais consultas,
usamos valores de um campo ou expresso particular como
cabealhos de coluna e cabealhos de linha, de modo a visualizar
dados num formato mais compacto do que com uma consulta seleo.
Para a criao de uma consulta de referncia cruzada, utilizamos a
instruo TRANSFORM antes da declarao SELECT usada para
recuperar os registros e especificamos a funo de agregao que
opera sobre o dado selecionado.
Consultas de Ao
Um conjunto amplo de operaes possvel com a SQL. Ela
particularmente eficiente no processamento de grandes massas de
registros. Vejamos alguns exemplos.
Consultas de Criao de Tabelas
possvel a criao de uma tabela a partir dos resultados de uma
consulta em particular. Neste caso, em vez de utilizamos o objeto
Recordset criado pelo comando SQL, fazemos com que ele crie uma
tabela onde os registros sero armazenados. Isto feito
acrescentando-se a clusula INTO instruo SELECT, especificando
o nome da tabela a ser criada.
As consultas de criao de tabela podem ser utilizadas para arquivar
registros antigos, fazer cpias de reserva ou de exportao para outro
banco de dados ou, ainda, como base para relatrios que exibem
dados de uma poca especfica.
Quando uma tabela criada a partir de uma consulta, os campos
dessa nova tabela herdam os tipos de dados e o tamanho do campo
de cada campo das tabelas de origem da consulta, mas nenhuma
outra propriedade de campo ou de tabela transferida. possvel,
contudo, definir um campo de chave primria para a nova tabela.
Para criar uma tabela temporria contendo os dez melhores clientes
da empresa, utilize o seguinte comando SQL: SELECT TOP
10 Cliente INTO [Melhores Clientes] FROM Clientes ORDER BY
Faturamento DESC.
Consultas de Anexao
possvel acrescentar registros de uma tabela ou consulta ao final de
uma outra tabela, no mesmo banco de dados ou em um diferente. So
as chamadas consultas de anexao, criadas utilizando-se o
comando INSERT INTO antes da declarao SELECT que gera a
consulta. Neste caso, especificamos a tabela onde os registros sero
anexados. Caso a tabela de destino se localize num outro banco de
dados, este dever ser especificado numa clusula IN.
Se a tabela qual se est anexando registros incluir um campo de
chave primria, os registros anexados precisam ter o mesmo campo,
ou um equivalente, do mesmo tipo de dados. O Microsoft Jet anexar
os registros se tanto os valores repetidos quanto os vazios resultarem
no campo de chave primria.
A seguinte declarao cria uma cpia de backup de uma das tabelas
da Limpa Tudo: INSERT INTO Clientes IN 'BACKUP.MDB' SELECT *
FROM Clientes.
Consultas de Atualizao de Tabelas
Uma consulta de atualizao altera um conjunto de registros de
acordo com o critrio especificado. utilizada para alterar um grupo
de registros especificados com critrios definidos. possvel a
utilizao de expresses numa consulta de atualizao para realizar
essas alteraes. Utilizamos a clusula UPDATE para especificar a
tabela a ser atualizada e a clusula SET para determinar os campos
que devero ser alterados e os respectivos valores a serem
considerados. A consulta utilizada como exemplo logo no incio deste
captulo uma consulta de atualizao de tabela.
Remoo de Registros
Uma consulta de excluso remove um conjunto de registros de acordo
com o critrio especificado. utilizada para excluir um grupo de
registros especificados com critrios definidos. possvel utilizar uma
consulta de excluso para excluir registros de uma tabela simples ou
de tabelas mltiplas, desde que o relacionamento entre elas seja do
tipo um para um. Para excluir registros de tabelas mltiplas em um
relacionamento um para vrios necessrio executar duas consultas.
Em alguns casos, executar consultas de excluso pode excluir
registros de tabelas relacionadas, mesmo que elas no estejam
includas na consulta. Isto pode acontecer quando a consulta contm
uma tabela que est do lado um de um relacionamento um para vrios
e a integridade referencial dos dados fora a excluso em cascata
para este relacionamento. Quando os registros desta tabela so
excludos, esto sendo excludos tambm os registros relacionados da
tabela "vrios".
A seguinte consulta remove todos os registros da tabela Clientes que
no adquiriram produtos da Limpa Tudo no ano de 1997: DELETE *
FROM Clientes WHERE Cliente = ANY ( SELECT * FROM Clientes
INNER JOIN Vendas ON Clientes.Cliente = Vendas.Cliente WHERE
Vendas.Data < CVDate(01/01/97)) .









OOP no Visual Basic
Embora este no seja um artigo extenso e ocupe uma pequena parte
no conjunto das informaes que lhe esto sendo enviadas neste CD,
considero-o especialmente interessante na medida em que pode
significar uma contribuio para a padronizao de suas aplicaes. O
tratamento do assunto no se esgotar aqui, mas ser continuado nas
atualizaes futuras a este pacote de Visual Basic. Voc poder
acessar essas atualizaes com sua senha de acesso nossa pgina
na Internet . O tema a ser tratado aqui a orientao a objeto, uma
abordagem relativamente nova no desenvolvimento de sistemas para
fins comerciais e que tem se tornado o tema do momento quando se
fala em metodologia de trabalho na rea de sistemas informatizados.
No pretendo fazer uma grande explanao sobre a OOP, mas
apenas introduzirei as idias bsicas da OOP para, em seguida,
apresentar uma forma que considero racional de organizar uma
aplicao em Visual Basic explorando os seus modernos recursos de
orientao a objeto. O modelo que discutirei est baseado na
arquitetura documento-vista, j velha conhecida dos programadores
de C++ que utilizam a biblioteca de classes de fundamentos da
Microsoft (MFC). No meio dos programadores em Visual Basic, no
entanto, este assunto pouco conhecido.
O que significa "Baseado em Objetos"?
Sob um ponto de vista superficial, a expresso "baseado em objetos"
significa que o software organizado como uma coleo de objetos
separados que incorporam tanto a estrutura como o comportamento
dos dados. Isto contrasta com a programao convencional, segundo
a qual a estrutura e o comportamento dos dados tm pouca
vinculao entre si. Existe alguma discordncia sobre quais so
exatamente as caractersticas exigidas pela abordagem baseada em
objetos, mas geralmente elas incluem quatro aspectos: identidade,
classificao, polimorfismo e herana.
Caractersticas dos Objetos
Identidade significa que os dados so subdivididos em entidades
discretas e distintas, denominadas objetos. Um pargrafo em um
documento, uma janela na minha estao de trabalho e a rainha
branca no jogo de xadrez so exemplos de objetos. Os objetos podem
ser concretos, como um arquivo em um sistema de arquivos, ou
conceituais, como uma norma de escalonamento em um sistema
operacional de multiprocessamento ou uma operao em um
programa. Cada objeto tem sua prpria identidade, que lhe inerente.
Em outras palavras, dois objetos so distintos mesmo que todos os
valores de seus atributos (como nome e tamanho) sejam idnticos.
No mundo real um objeto limita-se a existir, mas, no que se refere a
uma linguagem de programao, cada objeto dispe de um nico
indicador, pelo qual ele pode ser referenciado inequivocamente. O
indicador pode ser implementado de diversas maneiras, como um
endereo na memria, um elemento de uma matriz ou um valor
exclusivo de um atributo. As referncias dos objetos so uniformes e
independentes do contedo dos mesmos, permitindo a criao de
objetos mesclados, tal como um diretrio de um sistema de arquivos
que contenha tanto arquivos como subdiretrios.
Classificao significa que os objetos com a mesma estrutura de
dados (atributos) e o mesmo comportamento (operaes) so
agrupados em uma classe. Pargrafo, Janela e Pea de Xadrez so
exemplos de classes. Uma classe uma abstrao que descreve
propriedades importantes para uma aplicao e ignora o restante.
Qualquer escolha de classes arbitrria e depende da aplicao.
Cada classe descreve um conjunto possivelmente infinito de objetos
individuais. Cada objeto dito ser uma instncia de sua classe. Cada
instncia da classe tem seu prprio valor para cada atributo, mas
compartilha os nomes de atributos e operaes com as demais
instncias da mesma classe. Um objeto contm uma referncia
implcita sua prpria classe; ele "sabe que tipo de coisa ele ".
Polimorfismo significa que a mesma operao pode atuar de modos
diversos em classes diferentes. A operao move (mover), por
exemplo, pode atuar de modo diferente nas classes Janela e Pea de
Xadrez. Uma operao uma ao ou transformao que um objeto
executa ou a que ele est sujeito. Right-justify (justificar direita),
display (exibir) e move (mover) so exemplos de operaes. Uma
implementao especfica de uma operao por uma determinada
classe chamada de mtodo. Como uma operao baseada em
objetos polimrfica, pode haver mais de um mtodo para a sua
implementao.
No mundo real uma operao simplesmente uma abstrao de um
comportamento anlogo entre diferentes tipos de objetos. Cada objeto
"sabe como" executar suas prprias operaes. Entretanto, uma
linguagem de programao baseada em objetos seleciona
automaticamente o mtodo correto para implementar uma operao
com base no nome da operao e na classe do objeto que esteja
sendo operado. O usurio de uma operao no precisa saber
quantos mtodos existem para implementar uma determinada
operao polimrfica. Novas classes podem ser adicionadas sem que
se modifique o cdigo existente, so fornecidos mtodos para cada
operao aplicvel nas novas classes.
Herana o compartilhamento de atributos e operaes entre classes
com base num relacionamento hierrquico. Uma classe pode ser
definida de forma abrangente e depois ser refinada em sucessivas
subclasses mais definidas. Cada subclasse incorpora, ou herda, todas
as propriedades da sua superclasse e acrescenta suas prprias e
exclusivas caractersticas. As propriedades da superclasse no
precisam ser repetidas em cada subclasse. Por exemplo, Janela
Rolante e Janela Fixa so subclasses da superclasse Janela. Estas
duas subclasses herdam as propriedades de Janela, como uma regio
visvel na tela. Janela Rolante acrescenta uma barra de rolagem e
limites de rolagem. A capacidade de identificar propriedades comuns a
vrias classes de uma superclasse comum e de faz-las herdar as
propriedades da superclasse pode reduzir substancialmente as
repeties nos projetos e programas e uma das principais vantagens
dos sistemas baseados em objetos.
O Visual Basic e a OOP
A partir da verso 4, o Visual Basic teve um importante acrscimo
sua massa de recursos: as classes. Podendo criar suas prprias
classes, os programadores em Visual Basic passaram ter como
organizar suas aplicaes dentro de uma tica de programao
orientada para objetos. O problema agora passa a ser "o que fazer
para tirar o mximo de proveito deste novo recurso?". Acredito que
uma das fontes de resposta a esta pergunta pode ser buscada nas
prticas de programao em linguagens orientadas a objeto mais
tradicionais, como a C++. Por esta razo decidi examinar a j
conhecida arquitetura documento-vista, sobre a qual est baseada a
biblioteca de classes de fundamentos (MFC) que acompanha o Visual
C++. Nem tudo pode ser transposto para o Visual Basic, mas ainda
assim acredito que os ganhos em estruturao e racionalidade para as
aplicaes compensador.
A arquitetura documento-vista, como o prprio nome j diz, est
fundamentada na relao entre um documento e sua(s) vista(s). Por
documento entenda-se um conjunto de informaes gravadas em
disco e que podem ser tomadas como uma unidade a ser
apresentada. Por exemplo, um arquivo de texto pode ser tratado como
um documento, mas uma tabela dentro de um banco de dados Access
tambm pode ser tratada como um documento j que pode ser
tomada como uma unidade a ser apresentada.
Nessa relao o documento representado pela classe - CDocument
- que contm toda a funcionalidade para centralizar o controle das
diferentes formas da apresentao dos dados. As diferentes formas de
apresentao de um documento correspondem s suas vistas, e estas
so construdas a partir da classe CView. Cabe classe CDocument
manter uma coleo das suas vistas a cada momento. Quando uma
vista usada para modificar os dados em disco, a classe CDocument
informada pela vista da modificao e, se for o caso, pode ser
solicitada a comunicar todas as demais vistas para que se atualizem.
Quando uma vista fechada, antes de encerrar sua atividade, ela
comunica a classe CDocument para que faa a sua remoo da
coleo de vistas.
Cabe vista todo o trabalho de interao com o usurio seja na
apresentao dos dados na tela, seja na remessa de informaes do
documento para a impressora. Cada vista do documento um
formulrio com um conjunto de mtodos de uso comum, tais como:
localizar, substituir, copiar, colar, imprimir, visualizar impresso. Para
cada vista estes mtodos sero implementados de uma forma
compatvel com os dados que a vista apresenta e tambm com o
formato dessa apresentao. O importante que, sendo este conjunto
de mtodos nomeados de modo igual em todas as vistas, outros
objetos no tero que se comportar de modo diferente nas suas
relaes com as vistas a cada vez que se modifique a vista ativa na
aplicao. Por exemplo, a janela principal tem no menu Editar uma
srie de submenus que podem significar aes diferentes a serem
tomadas dependendo de qual vista de um documento esteja ativa no
momento. Copiar pode representar uma coisa se a vista ativa estiver
exibindo uma tabela em formato de grade, mas pode significar outra
coisa se o que estiver sendo exibindo for um grfico baseado na
tabela. No cabe, portanto, janela principal saber o que deve ser
copiado, mas sim vista ativa. Chamando o mtodo copiar da vista, a
janela principal lava as mos e deixa vista o trabalho de fazer a
cpia do que deve ser copiado. O mesmo vale para o menu Localizar,
por exemplo. Se uma vista exibe um documento tipo texto, a janela de
localizao de um tipo, mas se o que est sendo exibido um
recordset, evidentemente que a janela a ser exibida de outro tipo,
com outra funcionalidade. Seguindo esta linha de diviso de
responsabilidades, podemos levar nossas aplicaes a um alto grau
de reutilizao de cdigo e modularidade, alm de torn-las mais
rapidamente compreensveis na medida em que seguem um padro
que se repete.
A arquitetura documento-vista no pode responder por toda uma
aplicao. apenas uma relao central em torno da qual gravitam
outras classes que tm papel importante na estrutura da aplicao.
Por exemplo, algum tem que coordenar a criao e encerramento
dos documentos. Este trabalho feito por uma classe chamada
CDocTemplate. DocTemplate abreviatura para algo que, em
portugus, seria "modelo de documento". Um modelo de documento
rene algumas informaes importantes para a manipulao dos
documentos de um determinado tipo. Como um conjunto de
informaes gravadas em disco, o documento pode precisar ser
aberto como um arquivo. Isto exige a identificao do documento pela
extenso presente no nome do arquivo. Dependendo da extenso no
nome do arquivo, uma rotina diferente ser chamada para abri-lo e
uma vista apropriada ser criada para exibi-lo. Quem faz este trabalho
a classe CDocTemplate. Para cada tipo de documento presente em
uma aplicao, voc deve providenciar um objeto da classe
CDocTemplate inicializado com as informaes necessrias para
manipular aquele tipo de documento. Do mesmo modo que os objetos
da classe CDocument mantm uma coleo com referncias s suas
vistas de momento, os objetos CDocTemplate mantm uma coleo
de todos os objetos CDocument mantidos por eles a cada instante.
Os objetos CDocTemplates por sua vez, tambm precisam ser
coordenados dentro da aplicao. Quem se incumbe desta tarefa o
objeto App. No aquele que o Visual Basic lhe fornece, mas sim um
que voc cria para encapsular o objeto App do Visual Basic e
acrescentar-lhe outros atributos e capacidades. O objeto App mantm
uma coleo de todos os modelos de documentos presentes na
aplicao. No momento em que o usurio clica sobre o menu
Arquivo\Abrir, o objeto App solicitado a percorrer essa coleo em
busca de informaes para a caixa de dilogo. Cada objeto
CDocTemplate tem uma propriedade onde est armazenada uma
string de filtro a ser usada na caixa de dilogo Abrir Arquivo. Antes
que o objeto App mostre a caixa de dilogo Abrir Arquivo, ele coleta
estas strings para compor o conjunto de filtros de arquivos que a caixa
de dilogo deve possibilitar ao usurio abrir. O mesmo vale para o
menu Arquivo\Novo.
No estamos aqui nos aprofundando no assunto da forma devida, mas
apenas dando uma idia geral do que pode ser feito dentro dessa
linha de raciocnio. Temos um exemplo da aplicao destas idias no
projeto que se encontra no arquivo mfcnovb.zip. Apesar de estar
incompleto d para ter uma idia do que pode ser feito nesta linha.

Vous aimerez peut-être aussi