Sei sulla pagina 1di 247

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 capitulo 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 capitulos 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 Programs, e ento Visual Basic 6.0.
-ou-
Clique Iniciar na barra de tarefas.
Selecionar Programas
Use o Explorer do Windows para achar o arquivo executvel Visual Basic (VB6.exe).
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.

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.

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.)

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.

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.

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.

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.

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 capitulos.
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 capitulo 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.

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 capitulo 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 de
cdigo.
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 capitulos 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).

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 na 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.

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.

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 capitulo posterior.)

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 capitulo 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 s e 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.

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 na
Figura 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

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.)

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.

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.

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).

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.

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.

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.

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.

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.

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.

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
capitulo.) 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).

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.

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:

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 (capitulo 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:

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:

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.

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.9 ilustra os trs nveis de escopo de variveis.

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.

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 capitulo 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 capitulo 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 capitulo).
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 bem abaixo:

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 capitulo 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.

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.

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.

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.

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.

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 capitulo 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.

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:

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

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.

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.)

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.

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.

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.

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 capitulo 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.)

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 capitulo explora os objetos do Visual Basic, seus mtodos e suas propriedades.



Usando Procedimentos e Funes no Visual Basic
A maioria dos procedimentos que voc escreveu nos capitulos anteriores foram procedimentos de eventos - isto ,
eles foram projetados especialmente para responder a eventos especficos disparados pelo usurio ou pelo
sistema. Este capitulo 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 capitulo 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 capitulo
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:

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.)

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:

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:

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:

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 .

O projeto inicial do form, para o aplicativo Converso de Temperatura.

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.

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.

Cdigo do programa que pesquisa uma doninha pelo nome.

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.

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.

O projeto inicial do form para o aplicativo Evasivo.

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.

Cdigo de programa para o aplicativo Evasivo.

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:

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.

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 capitulo 11.)

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
capitulo 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.

O projeto inicial do form para o aplicativo Correio Eletrnico

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.

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.

Configurao de propriedades restantes usadas no aplicativo Correio Eletrnico.

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 Get seguida 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 por Get_ ). 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.


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.



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.

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.

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.

Modelagem de Dados
o momento de fundamentarmos toda a teoria discutida ao longo deste capitulo 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:

O tpico Produtos.
O segundo tpico a ser descrito o de Fornecedores, listado na Figura 13.3:

O tpico Fornecedores.
O prximo tpico abordado - os Clientes - fecha o conjunto de entidades bsicas representadas. Veja a 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:

O tpico Estoque.
Abordaremos agora o fluxo dirio de itens em estoque. A Figura 13.6 lista a definio do tpico Transaes:

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:

O tpico Fornecimento.
A Figura 13.8 lista o prximo tpico relevante - o pedido de Vendas:

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:

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:

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:

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:

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 na 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:

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:

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:

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.

Relacionamentos do tpico Produtos.

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.

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:

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:

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.

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.

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 capitulo 13. A Figura
14.2 lista as propriedades de cada campo da tabela:

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:

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:

A definio de tabela Clientes.
Propriedades para o ndice primrio da tabela:

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:


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 capitulo anterior. Vamos definir o
relacionamento entre a tabela Produtos e a tabela Produtos Por Fornecedor. A Tabela 3.5 lista as definies do
relacionamento:

As definies do relacionamento entre a tabela Produtos e a tabela Produtos Por Fornecedor.
O seguinte fragmento de cdigo cria o referido relacionamento:

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 capitulo, 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:

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:

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:

Funo CompactDatabase.


Funo para obter arquivo temporrio.

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:

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 capitulo. 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

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:

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:

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:

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:

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:

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:

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:

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.








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 capitulo
Este capitulo 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 capitulos 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 capitulo, 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 capitulo
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
capitulo 7.
Forms
Como voc aprendeu no capitulo 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:

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:

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 capitulo
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:

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 capitulos 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
capitulo especial para eles (capitulo 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:

Por mais estranho que possa parecer, o mtodo Print na realidade um mtodo grfico; voc encontrar maiores
informaes a respeito no capitulo 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.

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:

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:

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:

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.

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 capitulo 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.

A ferramenta Caixa de Imagem.

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.

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 capitulo 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:

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:

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:

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 na 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.

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 capitulo 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 capitulo 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.

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 capitulo 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
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:

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.

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.

A ferramenta Boto de Comando.

A ferramenta Caixa de Checagem.

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:


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.

Configurao de propriedades para o aplicativo Jogo.

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.

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.

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.)

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
capitulo 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.

O projeto do form do aplicativo Queijo.

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.

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:

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:


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 na Figura 5.36, indica como
proceder.

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.

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:

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.

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.

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.

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.

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 capitulo 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 capitulo 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 capitulo 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 capitulo 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 capitulo 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 capitulo 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 capitulos 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:

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 capitulo 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:

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:

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:

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.

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.

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.

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.

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.

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).


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.

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 operadordecomparao 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.

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 na Figura 6.14.

Configurao de propriedades para o aplicativo Banco.

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 capitulo
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:

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.

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 que ltimoValor. 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:

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):

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 capitulo 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.

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 capitulo 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 capitulo 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:

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.

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:

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:

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.

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








Depurao e Tratamento de Erros no Visual Basic
Este capitulo 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.

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.

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.)

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.

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.

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.

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
capitulo 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.)

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 capitulo 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:

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

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.

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 capitulo 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 capitulo 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).

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.

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).

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.

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.

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.

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.

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.

Cdigo de programa para desenhar uma grade 8 por 8.

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.

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.

Cdigo de programa para configurar cores de grfico com o uso do mtodo Line.

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.

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:

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
capitulo 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.

Traando uma linha com o mtodo Line.

Traando um retngulo com o mtodo Line.

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.

Traando uma elipse Stan Laurel com o mtodo Circle.

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.

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.

Traando um pedao de pizza com o mtodo CircIe.

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 capitulo,
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.)













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 capitulo, 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
capitulo 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:

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:

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:

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:

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:

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:

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:

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:

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 SQL INNER 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 clusulas LEFTJOIN 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 clusula RIGHT 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 capitulo 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.























O que h de novo no VB6.0
Um Rpido Exame do VB6
Obtendo Mais com os Controles Melhorados
o O Evento Validate e a Propriedade CausesValidation
o Novas e Excitantes Melhorias Grficas
Trabalhando com os Novos Controles
o Selecionando Datas com os Controles MonthView e DateTimePicker
o Criando Barras de Ferramentas Mveis com a CoolBar
o Usando Grficos com uma ImageCombo
o O Controle FlatScrollBar
Trabalhando com as Novas Caractersticas da Linguagem
o Objetos File System
o Novas Funes para Manipulao de Strings
o Criao Dinmica e Real de Controles
Aprendendo Sobre o VB e a Internet
Informando-se Sobre as Novas Capacidades de Manipulao de Dados
Novos Recursos para Programao com Objetos

Um Rpido Exame do VB6

Dizer que o Visual Basic 6.0 tem alguns novos recursos interessantes nada mais nada menos do que uma super
simplificao. O Visual Basic 6.0 tem tantos novos recursos em tantas reas que quase impossvel no cometer
este erro. Novos controles permitem que suas aplicaes incorporem a aparncia e funcionalidade encontradas no
Office 97 e no Iternet Explorer. Voc no mais precisa ter ao menos uma instncia de um controle no seu
formulrio para criar controles em tempo de execuo. Com o VB6, voc adiciona controles dinamicamente ao seu
projeto apenas com cdigo, e pode criar controles ActiveX mais enxutos e funcionais do que antes. Voc pode
mesmo criar aplicaes server-side que usam HTML dinmico com DLLs do tipo Internet Information Server.

Trabalhando com os Windows common controls
Muitos dos controles discutidos neste capitulo no so controles ActiveX intrnsecos (padres) . Portanto, eles
precisam ser adicionados ao seu projeto da caixa de dilogo Components (escolha Components do menu Project).
Quando voc abrir a caixa de dilogo Components, selecione Microsoft Windows Common Controls, Microsoft
Windows Common Controls-2, e Microsoft Windows Common Controls-3 da lista.

Obtendo Mais com os Controles Melhorados
Antes de olharmos nas adies completamente novas ao VB6, vamos examinar alguns melhoramentos nos
recursos da verso anterior.
O Evento Validate e a Propriedade CausesValidation
O primeiro melhoramento que afeta a todos os controles ActiveX intrnsecos a adio do evento Validate e da
propriedade CausesValidation. Antes do VB6, se voc tivesse que verificar se uma palavra havia sido digitada
corretamente em um TextBox, muito provavelmente iria programar o evento LostFocus do TextBox para ver se o
usurio havia
entrado com os dados pertinentes. Se ele no tivesse entrado com uma informao correta, voc poderia chamar
o mtodo SetFocus do controle no qual a validao estivesse ocorrendo para impedir que o usurio seguisse
adiante. s vezes a lgica desta programao pode causar problemas ao usurio. Se ele nunca conseguir entrar
com um dado pertinente, ele ficar preso quele controle - nem mesmo poder clicar em um boto de Ajuda. O
novo evento Validate e a propriedade CausesValidation servem para lidar com este tipo de problema.
A Listagem 2.1 mostra como usar o evento Validate para checar os dados de um TextBox. O cdigo se refere
ilustrao da Figura 2.1. Se os usurios no digitarem a palavra Cherries no primeiro TextBox, eles no podero
prosseguir para o segundo TextBox. Contudo, porque o valor da propriedade CausesValidation do
CommandButton configurada como False, os usurios podem clic-lo para obter ajuda sobre qual a palavra
correta a ser introduzida.

Usando a propriedade CausesValidation
Note o parmetro Cancel na Linha 1. O Visual Basic prov este parmetro com o procedimento de evento Validate
do controle. Se voc atribui o valor True ao parmetro Cancel (Linha 7), o foco do programa no poder ser
mudado do controle exceto se for para um controle que tenha a sua propriedade CausesValidation configurada
como False.

LISTAGEM 2.1 Permitindo Tratamento de Eventos nos Controles Durante a Validao de Dados
01 Private Sub Text1_Validate(Cancel As Boolean)
02 `Feito de tal modo que se o usurio no
03 `entrar com a palavra "Cherries" no TextBox
04 `o cursor ser retornado para este TextBox
05 If Text1.Text <> "Cherries" Then
06 MsgBox "Voc no pode ir adiante!"
07 Cancel = True
08 End If
09 End Sub
10 Private Sub Command1_Click()
11 Dim strMsg As String
12 Dim strQuote As String
13 strQuote = """"
14 `Cria uma mensagem instrucional
15 strMsg = "Voc deve digitar a palavra " & strQuote
16 strMsg = strMsg & "Cherries" & strQuote & " "
17 strMsg = strMsg & "no primeiro TextBox."
18 MsgBox strMsg, vbInformation, "Instrues"
19 `Voc pode clicar neste CommandButton
20 `mesmo que o parmetro Cancel
21 `do evento Validate seja posto em True,
22 `porque o valor da propriedade CauseValidation
23 `deste CommandButton esta em False.
24 End Sub


O procedimento de evento Validate permite-lhe checar os dados e ainda permite-lhe acessar outros controles
durante o processo de validao.
Novas e Excitantes Melhorias Grficas
O Visual Basic, como sempre, lhe permite usar grficos para dar mais vida aos seus programas, e a Microsoft
melhorou as capacidades grficas de muitos controles. Primeiramente o controle ImageList agora suporta arquivos
.gif. Este melhoramento substancial, porque quase todo controle que usa grficos tem um controle ImageList
associado a ele.
Os controles ListView e TabStrip foram melhorados para permitir que voc use imagens e cones para a decorao
e descrio. A Figura 2.2 exibe o novo controle ListView ao qual voc pode adicionar uma imagem de fundo na
rea de cliente. A figura de fundo pode ser centralizada, espalhada como um padro ou posicionada em qualquer
dos cantos. Voc pode adicionar check boxes aos objetos ListItems dentro do controle atribuindo True
propriedade CheckBoxes do ListView . Tambm possvel fazer com que as barras de rolagem do ListView
apaream no novo estilo flat pela atribuio de True propriedade FlatScrollBars.

Voc agora pode ter um grfico como figura de fundo na rea de cliente de um controle ListView.
A figura 2.3 mostra o novo controle TabStrip, que agora permite a colocao de grficos em cada tab. O controle
tambm tem uma nova propriedade, HotTracking, que voc pode configurar em tempo de projeto. Se voc
atribuir True propriedade HotTracking, a tab se destaca quando o mouse passado sobre ela. Como
mencionado anteriormente, como em todos os novos controles, o controle TabStrip tem um procedimento de
evento Validate.

O controle TabStrip foi melhorado para permitir cones em cada tab.
O controle Slider tem uma nova propriedade, Text. Quando voc atribuir uma string propriedade Text, essa
string aparece dentro de uma janela de ToolTip. A posio da janela ToolTip determinada pela propriedade
TextPosition do controle Slider (veja na Figura 2.4).

O controle Slider agora tem uma propriedade Text que exibe uma janela ToolTip.
Muitos melhoramentos foram feitos ao controle ToolBar. Agora possvel adicionar menus drop-down toolbar
usando um ButtonMenu. A propriedade Style suporta um atributo transparente (tbrTransparent) que permite que
os botes na toolbar apaream e comportem-se como os botes da toolbar do Internet Explorer. A figura 2.5
mostra o efeito do atributo transparente e uma coleo de botes em que cada boto tem seu prprio
ButtonMenu.

O controle ToolBar foi melhorado para permitir ButtonsMenus e hotspots. A pgina de propriedades permite-lhe
configurar a ToolBar num nvel de alto detalhamento.
Trabalhando com os Novos Controles
O Visual Basic distribudo com vrios novos controles ActiveX. Alguns destes controles aplicam-se a programas
stand-alone, outros aplicam-se ao desenvolvimento de projetos de acesso a dados em nvel empresarial. Nas
sees seguintes, voc ver os novos controles que se relacionam com os seus esforos de desenvolvimento de
projetos para desktop.
Selecionando Datas com os Controles MonthView e DateTimePicker
O VB6 tem dois controles que oferecem um novo modo de ver e selecionar datas: MonthView e DateTimePicker. O
que interessante sobre esses novos controles que eles permitem que as datas sejam vistas e selecionadas
dentro do contexto de um calendrio. O controle MonthView apresenta um calendrio completo que voc pode
percorrer de dia a dia ou de ms a ms. O controle DateTimePicker similar ao MonthView exceto que o
calendrio apresentado quando o usurio clica na seta para baixo do controle. A figura 2.6 mostra todos os
novos controles.

Todos os novos Windows common controls esto includos nos OCXs MSCOMCTRL.OCX, MSCOMCT2.OCX, e
COMCT332.OCX.
Criando Barras de Ferramentas Mveis com a CoolBar
O novo controle CoolBar similar s Coolbars que voc tem visto usando o Office 97 e o Internet Explorer. Uma
CoolBar uma toolbar que voc pode mover em um formulrio, e o controle CoolBar um container para outros
controles ActiveX. Assim voc pode oferecer aos seus usurios mais flexibilidade e utilidade pela incluso de
outros controles sua CoolBar. A figure 2.6 mostra uma CoolBar com trs objetos Band . A primeira Band contm
dois OptionButtons, a segunda contm um controle ToolBar com trs botes, e a terceira contm um controle
ComboBox. Em tempo de execuo voc pode mover as Bands pela rea interna da Coolbar do modo que quiser.

Bands da CoolBar
Uma band uma barra dentro de uma CoolBar. Uma CoolBar pode ter muitas bands que podem ser movidas
dentro da rea de cliente da CoolBar.

Usando Grficos com uma ImageCombo

Trabalhando com ImageLists
Uma ImageList um controle sem janela que voc usa para armazenar diferentes tipos de grficos: bitmaps, gifs,
cones, e assim por diante. Voc associa uma ImageList a um controle pelo assinalamento da ImageList em
questo propriedade ImageList do controle. Por exemplo, para assinalar uma ImageList chamada ImageList1 a
uma ImageCombo, o cdigo ImageCombo.ImageList = ImageList1.

O controle ImageCombo, novo com o Visual Basic 6, permite que incluamos grficos em uma ComboBox. Para
realizar isto, o Visual Basic apresenta um novo objeto, o ComboItem, o qual encapsula todas as propriedades de
layout e dados que so necessrias para trabalhar com uma ImageCombo. Um ComboItem tem uma propriedade
Text para exibio de strings de uma linha dentro da ImageCombo e uma propriedade Image que pode definir o
grfico a ser exibido em uma linha dentro da ImageCombo. Como ocorre com muitos dos novos controles grficos
ActiveX, a ImageCombo tem uma ImageList da qual ela referencia imagens.
Use o cdigo na Listagem 2.2 para adicionar um ComboItem que tem um grfico a uma ImageCombo.
LISTAGEM 2.2 Criando ComboItems e Adicionando-os a uma ImageCombo
01 Static i% `Um inteiro contador
02 Static imgi% `Um ndice para um grfico
03 `dentro de uma ImageList
04 Dim ci As ComboItem `Varivel para um
05 `ComboItem
06
07 `Obtm uma referncia a um objeto ComboItem usando
08 `o mtodo Add da coleo ComboItems.
09 Set ci = ImageCombo1.ComboItems.Add
10 `Assinalando dados
11 `ci.Text = "My Caption " & CStr(i%)
12 `Adiciona uma imagem referenciando um ndice na ImageList
13 `associada
14 ci.Image = imgi% + 1
15 `Esteja certo de que voc no excedeu o nmero de imagens
16 `na ImageList
17 If imgi% = ImageList1.ListImages.Count - 1 Then
18 imgi% = 0
19 Else
20 imgi% = imgi% + 1
21 End If
22 `Incrementa o contador de strings
23 i% = i% + 1
A figura 2.6 mostra o resultado de um clique sobre o boto cmdAddCbo. Note que a ImageCombo contm uma
imagem e uma string.
O Controle FlatScrollBar
O Visual Basic 6 oferece uma nova variao do j conhecido controle scrollbar: o FlatScrollBar. O FlatScrollBar
fundamentalmente o mesmo que o ScrollBar, exceto que o FlatScrollBar tem trs estilos de aparncia: o estilo
standard, um estilo tridimensional (beveled), e um estilo bidimensional que se torna tridimensional quando o
ponteiro do mouse passa sobre ele (veja a Figura 2.6).
Trabalhando com Novas Caractersticas da Linguagem
Em adio aos melhoramentos e aos novos controles ActiveX, o VB6 tambm oferece novos recursos dentro da
prpria linguagem Visual Basic.
File System Objects
Em verses anteriores do Visual Basic, se voc quisesse obter uma informao de um arquivo de sistema ou
realizar uma tarefa relacionada com arquivos de sistema, tal como escrever para um arquivo ou mudar um
diretrio, voc tinha um nmero de tcnicas disponveis, muitas das quais eram muito trabalhosas. No Visual
Basic 6, todas estas tarefas foram contidas dentro de um novo objeto, o FileSystemObject, que parte do Visual
Basic Scripting Library. Assim, quando voc aprender a usar este objeto dentro do VB6, voc poder facilmente
transferir seu conhecimento para criar scripts dentro do Internet Explorer ou Internet Information Server para
realizar programao a nvel do sistema. Mais sobre o FileSystemObject.

Internet Information Server
Internet Information Server (IIS) um programa complexo, cuja funo distribuir informao e arquivos pela
Internet. Um Internet server um computador fsico e um IIS um software que roda em um Internet server.
Voc pode usar o Visual Basic para escrever programas que so extenses de IIS, chamados Aplicaes IIS. Uma
aplicao IIS que roda em um Internet server chamada uma aplicao server-side.

O FileSystemObject bastante complexo. feito de um nmero de objetos e mtodos que encapsulam as funes
de arquivos de sistema, as quais voc usa para trabalhar com drive e arquivos em uma mquina local ou em uma
rede. A Tabela 2.1 descreve os novos objetos do FileSystemObject.

O componente Microsoft Scripting RunTime
Se voc planeja programar com o FileSystemObject, certifique-se de incluir uma referncia no seu projeto para o
componente Microsoft Scripting RunTime ActiveX. Voc inclui uma referncia ao MS Scripting RunTime atravs da
caixa de dilogo References (escolha References do menu Project). Ento selecione o Microsoft Scripting RunTime
na lista References.

TABLE 2.1 Objetos do FileSystemObject
Objeto Descrio
Drive Prov propriedades e mtodos para descrio e trabalho com drives locais e de rede.
File Prov propriedades e mtodos para trabalhar com arquivos
Folder Prov propriedades e mtodos para trabalhar com pastas
FileSystemObject
Prov propriedades e mtodos para a definio e o trabalho com colees de drives, pastas e
arquivos
TextStream Prov propriedades e mtodos que permitem a voc trabalhar com arquivos texto

No diretrio LivrosEmHtml\UsandoVisualBasic6.0\Cdigo dos Exemplos\ch02\Filesys do cd nmero 2, voc tem
um projeto que exemplifica o uso dos FileSystemObjects
Novas Funes Para Manipulao de Strings
O Visual Basic 6 prov vrias novas funes para trabalhar com strings (veja a Tabela 2.2).
TABELA 2.2 As Novas Funes de Strings
Funo Nome
(Tipo Retornado) Descrio
Filter Permite que voc filtre uma string para vrias
(string array) Substrings
FormatCurrency
(string)
Permite que voc formate uma string como currency
FormatDateTime
(string)
Permite que voc formate uma string como hora ou data
FormatPercent
(string)
Permite que voc formate uma string como um percentual
InStrRev (string)
Retorna a posio de uma string dentro de outra; diferentemente de InStr, InStrRev inicia
do final da string que est sendo pesquisada
Join (string) Combina os elementos de uma matriz de strings em uma nica string
MonthName (string)
Retorna o nome do ms quando voc tem o nmero do ms ( por exemplo, 1 retorna
janeiro)
Replace (string) Substitui substrings dentro de uma string
Round (string) Retorna um nmero arredondado conforme especificado
Split (string array) Quebra uma string em uma matriz de strings
StrReverse (string) Reverte a ordem de uma string - por exemplo, "cat" torna-se "tac"
WeekdayByName
(string)
Retorna o dia da semana
Como voc pode ver na Tabela 2.2, algumas das novas funes de strings retornam matrizes de strings. A
capacidade de uma funo retornar uma matriz tambm um novo recurso do VB6.
Cada nova funo listada na Tabela 2.2 poderia render uma seo de um capitulo dedicado somente a isto.
Claramente, tal descrio vai alm do escopo deste capitulo, mas se voc necessitar de maiores detalhes sobre
como usar uma funo especfica de strings, leia a documentao que acompanha o VB6.
Criao Dinmica de Controles

On-the-fly versus runtime
A expresso on-the-fly usada quando voc est criando alguma coisa enquanto o programa est em execuo.
Uma outra expresso para o estado de um programa em execuo runtime.

Em verses anteriores do VB voc criava controles on-the-fly usando matrizes de controles. Um inconveniente
para a criao de controles com uma matriz de controles era que ao menos um controle tinha que estar presente
no formulrio para que voc pudesse criar outros dinamicamente. Isto j no mais verdade no VB6; voc pode
criar um controle em runtime puramente com cdigo usando o mtodo Add da coleo Controls.
A Listagem 2.3 mostra o cdigo que voc deve usar para criar um boto de comando puramente com cdigo, sem
ter que arrastar um boto de comando da ToolBox inicialmente.
LISTAGEM 2.3 -- O Novo Mtodo Add Para a Coleo Controls
01 Option Explicit
02 `WithEvents um modo de dizer ao programa para
03 `reconhecer todos os eventos associados
04 `ao CommandButton tais como o evento click.
05 Private WithEvents cmdMyButton As CommandButton
06
07 Private Sub Form_Load()
08 Set cmdButton = Controls.Add("VB.CommandButton", _ "Button")
09 With mdButton
10 .Visible = True
11 .Width = 3000
12 .Caption = "Uma real surpresa"
12 .Top = 1000
14 .Left = 1000
15 End With
16 End Sub
17
18 Sub cmdButton _Click()
19 cmdButton.Caption = "Enfim, OOP real!
20 End Sub
Aprendendo Sobre VB e a Internet

Trabalhando com DHTML
Dynamic Hypertext Markup Language uma extenso da HTML (Hypertext Markup Language), a linguagem da
Internet. Todos os navegadores Web, independentemente do fabricante, usa HTML para decodificar a informao
passada atravs da Internet que apresentada ao usurio final. DHTML d uma adiante HTML permitindo que
se faa um alto grau de programao. Assim , com DHTML voc pode enviar cdigo via Internet que permite aos
usurios finais mover coisas com o mouse pelo monitor do computador, esconder outras, ou mesmo excluir itens.

O Visual Basic foi posicionado de uma forma bastante inteligente no desenvolvimento para a Internet. Voc pode
usar VBScript para escrever aplicaes que rodam no seu computador desktop com o Internet Explorer. Tambm
pode usar VBScript no lado servidor para trabalhar com o Internet Explorer. O Visual Basic 6 apurou o foco no
desenvolvimento para a Internet; ele estende suas possibilidades de escrever aplicaes server-side para o
Microsoft Internet Information Server introduzindo um tipo de projeto chamado IIS Applications. Tambm, o
Visual Basic estende e simplifica a DHTML (Dynamic Hypertext Markup Language, a linguagem usada por todos os
navegadores Web) pela introduo de um tipo de projeto chamado DHTML Applications.
Uma aplicao IIS um programa em Visual Basic que reside que reside no lado servidor como uma extenso do
Internet Application Server. Uma aplicao IIS chamada por um computador cliente via Internet. Embora a
aplicao IIS envie dados de volta ao cliente requisitante atravs de HTML, o clculo real no lado servidor feito
pelo uso de cdigo compilado em Visual Basic. Esta melhoria significativa; antes disto, aplicaes IIS eram
escritas em C++ ou, se voc quisesse programar IIS, voc tinha que faze-lo com VBScript sob Active Server
Pages (ASP).

O Ambiente Integrado de Desenvolvimento do VB
IDE abrevia Integrated Development Environment (Ambiente Integrado de Desenvolvimento). O IDE do
Visual Basic sua plataforma de trabalho, onde voc escreve e depura o cdigo, bem como manipula suas
aplicaes.

Uma aplicao DHTML um projeto que exibe um Designer do Visual Basic, uma ferramenta que automatiza a
escrita de cdigo em VB. O Designer de aplicaes DHTML permitem-lhe escrever cdigo dentro do IDE do Visual
Basic. Voc pode obter o real DHTML no servidor Web IIS na forma de uma DLL ActiveX. Isto significativo por
que DHTML diferente do cdigo em VB em alguns detalhes. Assim, voc est se livrando de trabalhos internos
do IIS e do VB para traduzir VB em DHTML em tempo de execuo.
Um problema com a programao para a Internet que a programao dinmica no armazena estados por
natureza. A interao anloga a uma chamada telefnica. Cada vez que voc contata um servidor na Internet,
como se voc estivesse fazendo uma chamada telefnica para um estranho que no tem nenhum conhecimento
prvio da informao passada em uma chamada anterior. Portanto, trabalhar com um corpo de dados que
precisam ser transmitidos de sesso a sesso torna-se difcil. O Visual Basic use uma nova caracterstica do
Internet Explorer, o Global Property Bag, para permitir que voc divida a informao de sesso em sesso.
A Microsoft estendeu o Setup Wizard em um conjunto de novas ferramentas para que a publicao da sua
aplicao e sua distribuio de um servidor Web se torne mais fcil. Estas ferramentas - o Web Publishing Wizard
e o Package and Deployment Wizard- vm como parte da sua compra quando voc adquire a sua verso do VB6.
Informando-se Sobre as Novas Capacidades de Manipulao de Dados
O Visual Basic 6 oferece suporte para ActiveX Data Objects (ADO). Em verses anteriores do VB, o acesso a dados
era manipulado sob o guarda-chuva dos Data Access Objects (DAO) e dos Remote Data Access Objects (RDO).
ADO combinou e ampliou essas tecnologias. ADO mais fcil de usar e tem um escopo maior de implementao.
Voc pode usar ADO para conectar-se a um banco de dados em um computador local ou a um servidor de banco
de dados remoto. Tambm lhe permite acessar mais tipos de dados - e-mail, por exemplo.
A tecnologia atual de ADO est contida no novo ADO Data Control. O ADO DataControl pode parecer o mesmo que
o Data Control de verses anteriores, mas quando voc olhar na pgina de propriedades do controle (veja a figura
2.8) voc ver uma significativa diferena. O ADO Data Control permite-lhe conectar um banco de dados desktop
ou um servidor ODBC em uma rede, ou voc pode criar uma nova coneco a um outro banco de dados.

O ADO data control combina a funcionalidade do DAO e RDO, bem como permite o acesso a tipos de dados no
tradicionais tais como e-mails ou arquivos dentro do sistema de arquivos.
Em adio ao ADO, o Visual Basic 6 tambm vem com um novo conjunto de ferramentas e tecnologias que fazem
o acesso a dados mais fcil. O Data Environment Designer permite-lhe ver e manipular dados em vrios bancos
de dados. Porque data environments so objetos no seu pleno direito, voc pode us-los como se fossem um
controle Data. Voc pode at mesmo ligar outros controles, tais como TextBox ou Labels a um controle Data.
Alguns novos controles de dados permitem que voc tire vantagem dos melhoramentos intrnsecos ao ADO Data
Control. O DataGrid permite que voc veja seus dados em um formato de linhas e colunas. O DataList e o
DataCombo so similares ao DBList e ao DBCombo em verses anteriores do VB; voc pode us-los para obter
uma lista de dados de um controle ADO na forma de uma ListBox ou ComboBox. Voc tambm pode usar os
controles mais avanados FlexGrid e FlexGrid Hierrquico para obter uma clara viso de dados complexos. O
Visual Basic tambm oferece um novo Data Setup Wizard para tornar a distribuio de suas aplicaes de banco
de dados em larga-escala mais fcil.
O Visual Basic 6 melhorou suas capacidade s de gerao de relatrios com o Data Report Designer (veja a Figura
2.9), que lhe permite criar, visualizar e imprimir relatrios no Visual Basic como se fossem feitos no Access (Se
voc j trabalhou no Access 97, achar o Data Report Designer muito familiar.) Voc posiciona controles de
relatrio da nova Data Reports Toolbox (VB tambm tem novas caractersticas no IDE) sobre o formulrio do Data
Report. Ento invoca o mtodo PrintReport() do Data Report.

O Data Report Designer traz as facilidades de gerao de relatrios do Access 97 para o Visual Basic.
Novos Recursos Para Programao com Objetos
O Visual Basic 6 tem tornado a criao de classes e controles ActiveX uma atividade mais ampla. Agora voc pode
salvar os dados das suas classes de uma sesso para outra em uma Property Bag. Voc pode tambm criar dois
novos tipos de classes customizadas para trabalhar com dados, Data Sources e Data Consumers. Estes tipos de
classes de dados comportam-se de modo parecido com os ADO Data Objects, exceto que elas permitem maior
flexibilidade para se ajustarem s suas necessidades particulares.
Com respeito aos controles ActiveX de usurio, voc pode agora fazer controles ActiveX de peso leve no Visual
Basic 6. Estes tipos de controles so sem janela e assim requerem menos recursos do sistema que os ActiveX
completos. Para determinar se um controle ActiveX sem dvida sem janela, o Visual Basic prov uma nova
propriedade, HasDC.

Usando add-ins
Um add-in uma ferramenta do Visual Basic que os programadores de VB fazem para outros programadores de
VB. Um add-in escrito em VB e pode rodar somente dentro de IDE do Visual Basic. O Application Wizard um
add-in, como tambm o Data Forms Wizard.

Provavelmente as adies mais teis ao Visual Basic 6 foram os novos assistentes que se somaram a ele. A Tabela
2.3 descreve abreviadamente cada novo assistente e add-in.
TABELA 2.3 Os Assistentes e Add-Ins do Visual Basic 6
Assistente/Add-
In
Descrio
Todas as Edies
Package e
Deployment
Ajuda a preparar e distribuir a sua
Wizard Aplicao para uso em desktop ou rede.
Application
Wizard
Ajuda a criar uma estrutura para a sua aplicao. Ele
automaticamente adiciona menus, toolbars, arquivos de
recursos, controles ActiveX intrnsecos e controles data.
Wizard Manager
Ajuda-o a organizar os vrios assistentes que voc acessa no seu
IDE.
Edies
Profissional e
Enterprise

Data Object
Wizard
Ajuda a criar data objects ligados a data controls e controles
ActiveX customizados.
Class Builder
Utility
Ajuda a criar classes visualmente.
ToolBar Wizard
Ajuda na criao visual de toolbars customizadas para os seus
formulrios
Data Form Wizard
Ajuda na criao de formulrios com controles que referenciam
dados em um banco de dados.
Add-In Designer Ajuda na criao de add-ins para o VB.
Property Page
Wizard
Ajuda na criao de dilogos de propriedades para controles
ActiveX que voc cria no VB.
T-SQL Debugger
Ajuda na depurao de cdigo que voc escreve para o banco de
dados Microsoft SQL Server.
API Viewer
Ajuda no trabalho com declaraes (funes), constantes e tipos
de dados da API do Windows.
ActiveX Control Ajuda a fazer controles ActiveX.
Interface Wizard













Introduo ao Modelo do File System Object no VB
Um novo recurso do Visual Basic o File System Object, que fornece uma ferramenta baseada em objetos para
trabalhar com pastas e arquivos. Isto permite que voc use a sintaxe familiar de mtodos e propriedades de
objetos com um conjunto rico de propriedades, mtodos e eventos para fazer o processamento destes elementos.
O modelo de objetos do FSO lhe d a habilidade de criar, alterar, mover e excluir pastas e detectar se uma pasta
particular existe, e, existindo, onde. Tambm permite que voc obtenha informaes sobre as pastas tais como
seus nomes, a data em que foram criadas ou modificadas pela ltima vez e assim por diante.
O modelo de objetos do FSO faz o processamento de arquivos muito mais fcil
tambm. Quando est processando arquivos, voc primeiramente tem como meta armazenar informao num
formato eficiente tanto na ocupao de espao como no acesso. Voc precisa ser capaz de criar arquivos, incluir e
atualizar e obter sada com eles. Se voc usar os recursos de um banco de dados, isto pode ocasionar uma sobre
carga de trabalho para a sua aplicao. Por muitas razes voc pode no querer todo aquele aparato de acesso a
dados no seu sistema ou o seu acesso aos dados pode no requerer todas os recursos de um sistema gerenciador
de banco de dados. Neste caso, armazenar seus dados num arquivo binrio ou de texto pode ser a soluo mais
eficiente.
O modelo de objetos do FSO, que est contido na Scripting type library (Scrrun.Dll), suporta criao de arquivos
de texto e sua manipulao atravs do objeto TextStream. Ele ainda no suporta a criao e manipulao de
arquivos binrios. Para manipular arquivos binrios, use o comando Open com o sinalizador Binary.
Os Objetos FSO
O modelo FSO contm estes objetos:
Objeto Descrio
Drive
Permite que voc obtenha informaes dos drives anexados ao sistema, tais como
quanto de espao est disponvel, qual o seu nome compartilhado e etc. Note que um
drive no necessariamente um disco rgido. Ele pode ser um drive de CD-ROM, um
disco de RAM ou algo mais. Tambm no necessrio que um drive esteja fisicamente
ligado ao sistema. Ele pode estar logicamente conectado atravs de uma LAN, por
exemplo.
Folder
Permite que voc crie, exclua, mova pastas e consulte o sistema sobre seus nomes,
caminhos e outras informaes.
Files
Permite que voc crie, exclua, mova arquivos e consulte o sistema sobre seus nomes,
caminhos e outras informaes
FileSystemObject
O principal objeto do grupo, repleto de mtodos que lhe possibilitam criar, excluir, obter
informaes sobre e manipular genericamente drives, pastas e arquivos. Muitos dos
mtodos associados a este objeto duplicam aqueles de outros objetos.
TextStream Habilita-o para ler e gravar arquivos texto.
Programando com o Modelo de Objetos FSO
A programao com o FSO envolve trs tarefas principais:
Usar o mtodo CreateObject , ou declarar uma varivel como do tipo FileSystemObject usando o operador
New para criar um objeto FileSystemObject.
Usar o mtodo apropriado no recm criado objeto.
Acessar as propriedades do objeto.
O modelo de objetos FSO est contida na biblioteca Scripting, que est localizada no arquivo Scrrun.Dll. Se voc
no tem uma referncia a ele, crie uma marcando na caixa de dilogo References o item "Microsoft Scripting
Runtime".
Criando um FileSystemObject
O primeiro passo criar o objeto FileSystemObject com o qual se vai trabalhar. Voc pode faze-lo de duas
maneiras:
Criando uma varivel do tipo FileSystemObject :
Dim fso As New FileSystemObject
ou
Usado o mtodo CreateObject para criar um objeto FileSystemObject:
Set fso = CreateObject("Scripting.FileSystemObject")
Na sintaxe acima, Scripting o nome da biblioteca de tipos e FileSystemObject o nome do objeto do qual voc
quer criar uma instncia.
Nota: O primeiro mtodo funciona apenas no Visual Basic, enquanto o segundo funciona tanto no Visual Basic
como no VBScript.
Usando o Mtodo apropriado
O prximo passo usar o mtodo apropriado do objeto FileSystemObject. Por exemplo, se voc quer criar um
novo objeto, voc pode tanto usar o mtodo CreateFolder ou CreateTextFile. (O modelo de objetos
FileSystemObject no suporta a criao ou excluso de drives)
Se quer excluir objetos, voc pode usar os mtodos DeleteFile ou DeleteFolder do objeto FileSystemObject, ou o
mtodo Delete dos objetos File e Folder.
Usando os mtodos apropriados, voc pode tambm copiar e mover arquivos e pastas.
Note que parte da funcionalidade do FileSystemObject redundante. Por exemplo, voc pode copiar um arquivo
tanto usando o mtodo CopyFile do FileSystemObject quanto o mtodo Copy do objeto File. Os mtodos fazem o
mesmo. Ambos existem para dar a mxima flexibilidade de programao.
Acessando Drives, Arquivos e Pastas Existentes
Para Ter acesso a um drive, arquivo ou pasta existente, use o mtodo "get" apropriado do FileSystemObject.
GetDrive
GetFolder
GetFile
Por exemplo:
Dim fso As New FileSystemObject, fil As File
Set fil = fso.GetFile("c:\test.txt")
Note, contudo, que no necessrio usar os mtodos "get" para os objetos recm criados, j que as funes de
criao retornam uma referncia ao recm criado objeto. Por exemplo, se voc criar uma nova pasta usando
CreateFolder, no tem que usar o mtodo GetFolder para acessar suas propriedades tais como Name, Size, Path e
outras mais. Basta atribuir a uma varivel o retorno da funo CreateFolder para ter acesso aos seus mtodos,
propriedades e eventos:
Private Sub Create_Folder()
Dim fso As New FileSystemObject, fldr As Folder
Set fldr = fso.CreateFolder("C:\MyTest")
MsgBox "Created folder: " & fldr.Name
End Sub
Acessando as Propriedades do Objeto
Uma vez que voc tem uma referncia a um objeto, pode acessar as suas propriedades . Por exemplo, digamos
que voc queira obter o nome de uma pasta em particular. Primeiro voc cria uma instncia do objeto e obtm
uma referncia a ele com o mtodo apropriado (neste caso, o mtodo GetFolder, j que a pasta j existe):
Set fldr = fso.GetFolder("c:\")
Agora que voc tem uma referncia ao objeto Folder e pode checar sua propriedade Name:
Debug.Print "Nome da pasta : "; fldr.Name
Se voc quer saber quando foi feita a ltima modificao em um arquivo, use a seguinte sintaxe:
Dim fso As New FileSystemObject, fil As File
Set fil = fso.GetFile("c:\detlog.txt") ' Obtm um objeto File para consulta.
Debug.Print "ltima modificao no arquivo: "; fil.DateLastModified
Trabalhando com Arquivos
Voc pode trabalhar com arquivos no Visual Basic 6 usando tanto usando os modernos recursos do modelo FSO
como os antigos recurso j existentes. Independente do tipo de arquivo voc pode move-lo, copia-lo ou exclui-lo.
H duas principais categorias de manipulao de arquivos:
Criao, adio ou remoo de dados e leitura de arquivos.
Movimentao, cpia e excluso de arquivos.
Criao e Adio de Dados com os FileSystemObjects
H trs caminhos para criar arquivos de texto sequenciais (s vezes referido como "text stream"). Um caminho
usar o mtodo CreateTextFile. Para criar um arquivo de texto vazio:
Dim fso As New FileSystemObject, fil As File
Set fil = fso.CreateTextFile("c:\testfile.txt", True)
Nota O modelo FSO no suporta ainda a criao de arquivos randmicos ou binrios. Para criar estes tipos de
arquivos, use o comando Open com o argumento Random ou Binary.
Um outro meio usar o mtodo OpenTextFile do FileSystemObject com o flag ForWriting ligado:
Dim fso As New FileSystemObject, ts As New TextStream
Set ts = fso.OpenTextFile("c:\test.txt", ForWriting)
Ou voc pode usar o mtodo OpenTextStream com o flag ForWriting ligado:
Dim fso As New FileSystemObject, fil As File, ts As TextStream
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateTextFile ("test1.txt")
Set fil = fso.GetFile("test1.txt")
Set ts = fil.OpenAsTextStream(ForWriting)
Adicionando Dados ao Arquivo
Uma vez que o arquivo esteja criado, voc pode adicionar dados a em trs etapas:
1. Abra o arquivo texto para a gravao de dados
2. Grave os dados
3. Feche o arquivo
Para abrir o arquivo, voc tem que usar um de dois mtodos: OpenAsTextStream do objeto File , ou o mtodo
OpenTextFile do objeto FileSystemObject .
Para gravar dados para o arquivo texto, use ou o mtodo Write ou WriteLine do objeto TextStream. A nica
diferena entre Write e WriteLine que WriteLine adiciona caracteres de final de linha string gravada. Se voc
quiser adicionar novas linhas ao arquivo de texto, use o mtodo WriteBlankLines.
Par fechar um arquivo aberto, use o mtodo Close do objeto TextStream. Aqui vai um exemplo de como abrir um
arquivo, usar os trs mtodo de gravao e o seu fechamento:
Sub Create_File()
Dim fso, txtfile
Set fso = CreateObject("Scripting.FileSystemObject")
Set txtfile = fso.CreateTextFile("c:\testfile.txt", True)
txtfile.Write ("This is a test. ") ' Write a line.
' Write a line with a newline character.
txtfile.WriteLine("Testing 1, 2, 3.")
' Write three newline characters to the file.
txtfile.WriteBlankLines(3)
txtfile.Close
End Sub
Lendo Arquivos com os FileSystemObjects
Para ler dados de um arquivo texto, use os mtodos Read, ReadLine ou ReadAll do objeto TextStream.
Tarefa Mtodo
Ler um nmero especfico de caracteres de um arquivo. Read
Ler uma linha inteira(at, mas no incluindo, o
caractere de nova linha)
ReadLine
Ler o contedo total de um arquivo texto ReadAll

Se voc usar os mtodos Read ou ReadLine e quiser saltar uma poro particular de dados, voc pode usar os
mtodos Skip ou SkipLine.
O texto resultante dos mtodos de leitura armazenado em uma string que pode ser exibida num controle,
manipulada por operadores de strings ( Tais como Left, Right, e Mid), concatenada e assim por diante.
Nota: A constante vbNewLine contm um caracter ou caracteres ( dependendo do sistema operacional) para
avanar o cursor para o incio da prxima linha (carriage-return/linefeed). Esteja consciente de que o final de
algumas strings pode conter estes caracteres no imprimveis.
Exemplo
Sub Read_Files()
Dim fso As New FileSystemObject, txtfile, _
fil1 As File, ts As TextStream
Set txtfile = fso.CreateTextFile("c:\testfile.txt", True)
MsgBox "Gravando arquivo"
' Write a line.
Set fil1 = fso.GetFile("c:\testfile.txt")
Set ts = fil1.OpenAsTextStream(ForWriting)
ts.Write "Hello Mundo"
ts.Close
' L o contedo do arquivo.
Set ts = fil1.OpenAsTextStream(ForReading)
s = ts.ReadLine
MsgBox s
ts.Close
End Sub
Movendo, Copiando, e Excluindo Arqiuvos
O modelo FSO tem dois mtodos tando para mover, copiar ou excluir arquivos.
Tarefa Mtodo
Mover um arquivo
File.Move ou
FileSystemObject.MoveFile
Copiar um arquivo
File.Copy ou
FileSystemObject.CopyFile
Excluir um arquivo
File.Delete ou
FileSystemObject.DeleteFile
Exemplo
Este exemplo cria um arquivo texto no diretrio raiz do drive C, grava alguma informao nele, move o para um
diretrio chamado \tmp, faz uma cpia dele em um diretrio chamado \temp, e ento exclui as cpias de ambos
os diretrios.
Para rodar este exemplo, esteja certo de que voc tem diretrios chamados \tmp e \temp no seu diretrio raiz do
drive C.

Sub Manip_Files()
Dim fso as New FileSystemObject, txtfile, fil1, fil2
Set txtfile = fso.CreateTextFile("c:\testfile.txt", True)
MsgBox "Gravando arquivo"
' Grava uma linha.
txtfile.Write ("Isto um teste.")
' Fecha o arquivo.
txtfile.Close
MsgBox "Move o arquivo para c:\tmp"
' Obtm uma referncia para o arquivo no diretrio
' raiz de C
Set fil1 = fso.GetFile("c:\testfile.txt")
' Move para \tmp directory.
fil1.Move ("c:\tmp\testfile.txt")
MsgBox "Copiando para c:\temp"
' Copy the file to \temp.
fil1.Copy ("c:\temp\testfile.txt")
MsgBox "Excluindo"
' Obtm referncias para os arquivos.
Set fil1 = fso.GetFile("c:\tmp\testfile.txt")
Set fil2 = fso.GetFile("c:\temp\testfile.txt")
' Exclui os arquivos.
fil1.Delete
fil2.Delete
MsgBox "Tudo terminado!"
End Sub
















Iniciando com ADO no Visual Basic
Este capitulo contm uma srie de tpicos que apresentam o novo padro de acesso a dados do VB 6.0: ActiveX
Data Objects ( ADO ). Por razes de compatibilidade so preservados os padres DAO e RDO, mas para novos
projetos recomendado que j se faa uso do padro ADO.
Solues para Acesso a Dados Locais
O Problema
Voc deseja uma simples e consistente interface de programao que possibilite as aplicaes terem acesso e
modificar uma larga variedade de fontes de dados. Uma fonte de dados pode ser to simples quanto um arquivo
de texto, complexa como um cluster de bancos de dados heterogneos ou algo ainda por ser inventado. Alm
disto, uma interface de programao no deve presumir os meios de acesso e manipulao da fonte de dados.
Embora estas sejam as suas necessidades especficas, a fonte de dados tpica um banco de dados relacional que
suporta o padro ODBC e manipulada com comandos escritos em SQL.
A soluo genrica que a Microsoft oferece para este problema a OLE DB, um conjunto de interfaces do tipo
Component Object Model (COM) que prov acesso uniforme a dados armazenados em diferentes fontes de
informao. Contudo, a interface de programao da OLE DB feita para prover tima funcionalidade numa larga
variedade de aplicaes, ela no atende ao requisito de simplicidade.
Voc precisa de uma interface que seja uma ponte entre sua aplicao e a OLE DB. ActiveX Data Objects (ADO)
esta ponte.
A Soluo
ADO define um modelo de programao - a seqncia necessria para acessar e modificar uma fonte de dados. O
modelo de programao sumariza toda a funcionalidade da ADO.
O modelo de programao sugere um modelo de objetos - o conjunto de objetos que correspondem ao modelo de
programao e o implementam. Objetos possuem mtodos que realizam alguma operao sobre dados e
propriedades que tanto representam algum atributo dos dados ou controlam o comportamento de algum mtodo
do objeto.
Associados aos objetos esto os eventos, que so notificaes de que alguma operao ocorreu ou est para
ocorrer.
Modelo Bsico de Programao ADO
O ADO prov os meios para que voc realize a seguinte seqncia de aes:
1. Conecte uma fonte de dados. Opcionalmente voc pode garantir-se de que todas as mudanas nos dados
da fonte ocorram com sucesso ou no ocorram de modo algum.
2. Especificar um comando para ter acesso fonte de dados, opcionalmente com parmetros variveis ou
opcionalmente com otimizaes para performance.
3. Executar o comando.
4. Se o comando faz com que os dados sejam retornados na forma de registros de uma tabela, armazenar os
registros em um cache que voc pode facilmente examinar, manipular ou alterar.
5. Se apropriado, atualizar a fonte de dados com mudanas no cache de registros.
6. Prover uma forma geral de detectar erros ( usualmente como resultado de se fazer uma conexo ou
executar um comando).
Normalmente voc ir percorrer todos estes passos no modelo de programao. Contudo, vale a pena observar
que a ADO flexvel o bastante para que voc possa realizar trabalho de valor executando apenas parte do
modelo. Por exemplo, voc poderia armazenar dados de um arquivo direto em um cache de registros, ento usar
os recursos da ADO apenas para examinar os dados.
O Modelo de Programao ADO em Detalhes
Os seguintes elementos so partes fundamentais do modelo ADO de programao:
Connection
Command
Parameter
Recordset
Field
Error
Property
Collection
Event
Connection
O acesso da sua aplicao a uma fonte de dados se d atravs de uma conexo, o ambiente necessrio para a
troca de dados. Sua aplicao pode ter acesso a uma fonte de dados diretamente (s vezes chamado de sistema a
duas camadas), ou indiretamente ( s vezes chamado de sistema a trs camadas) atravs de um intermedirio
como o Microsoft Information Server.
O modelo de objetos realiza o conceito de conexo atravs do objeto Connection.
Uma transao delimita o incio e fim de uma srie de operaes de acesso aos dados que ocorrem ao longo de
uma conexo. A ADO garante que as mudanas nos dados resultantes de operaes em uma transao ocorram
todas bem sucedidas ou no ocorra nenhuma.
Se voc cancela uma transao ou uma das operaes da transao falha, o resultado final ser como se
nenhuma operao tivesse sido executada. A fonte de dados estar tal como estava antes do incio da transao.
O modelo de objetos no engloba explicitamente o conceito de uma transao, mas representa-a com um
conjunto de mtodos do objeto Connection.
ADO acessa dados e servios de provedores OLE DB. O objeto Connection usado para especificar um provedor
particular e qualquer parmetro necessrio.
Command
Um comando executado em uma conexo estabelecida manipula a fonte de dados de alguma forma. Normalmente
se usa um comando para executar procedimentos armazenados em que se adiciona, exclui ou atualiza dados na
fonte de dados ou retorna dados na forma de registros de uma tabela.
O modelo de objetos realiza o conceito de comando com o objeto Command A existncia do objeto Command d
ADO a possibilidade de otimizar a execuo do comando.
Parameter
Freqentemente comandos requerem partes variveis, parmetros, que podem ser alterados antes que voc
execute o comando. Por exemplo, voc poderia executar o mesmo comando de obteno de dados repetidas
vezes, mas cada vez variando a sua especificao da informao a ser retornada.
Parmetros so especialmente teis para executar comandos que se comportam como funes. Neste caso voc
sabe o que o comando faz, mas no necessariamente como faz. Por exemplo, voc emite um comando para fazer
uma transferncia bancria que debita uma conta e credita outra. Voc especifica a quantidade de dinheiro a ser
transferida como um parmetro.
O modelo de objetos realiza o conceito de parmetro com o objeto Parameter.
Recordset
Se o seu comando uma consulta que retorna dados na forma de registros de informaes em uma tabela (isto ,
trata-se de uma consulta retornadora de registros) estes registros sero postos em uma memria local.
O modelo de objetos reconhece esta memria como um objeto Recordset . Contudo no h nenhum objeto que
represente um nico registro de um Recordset.
O Recordset o meio bsico de examinar e modificar dados em registros. O objeto Recordset lhe permite:
Especificar quais registros esto disponveis para exame.
Navegar pelos registros.
Especificar a ordem em que se poder navegar pelos registros.
Adicionar, alterar ou excluir registros.
Atualizar a fonte de dados com registros mudados.
Gerenciar o estado geral do Recordset.
Field
Um registro em um Recordset consiste de um ou mais campos. Se voc visualizar um Recordset como uma grade
bi-dimensional, os campos so empilhados para formar colunas. Cada campo (coluna) tem entre os seus atributos
um nome, tipo de dado e um valor. este valor que contm o dado da fonte de dados.
O modelo de objetos realiza o conceito de campo com o objeto Field.
Para modificar dados em fontes de dados, voc modifica o valor de objetos Field nos registros do Recordset.
Finalmente as mudanas no Recordset so propagadas para a fonte de dados. Como uma opo, os mtodos de
gerenciamento de transaes no objeto Connection podem garantir que as alteraes se dem como um todo ou
falhem como um todo.
Error
Erros podem ocorrer a qualquer hora na sua aplicao, habitualmente como resultado de no ser possvel
estabelecer uma conexo, executar um comando ou realizar uma operao em um objeto em estado vlido ( por
exemplo, tentando usar um Recordset que ainda no foi inicializado).
O modelo de objetos representa o erro com o objeto Error.
Qualquer que seja o erro que acontece, ele produz um ou mais objetos Error. O prximo erro que ocorrer
descartar os objetos Error atuais.
Property
Cada objeto ADO tem um conjunto de propriedades nico que descreve ou controla o comportamento daquele
objeto.
H dois tipos de propriedades: intrnsecas e dinmicas. Propriedades intrnsecas so parte do objeto e esto
sempre disponveis. Propriedades dinmicas so adicionadas coleo Properties dos objetos ADO pelo provedor
de dados subjacente e existem apenas enquanto o provedor estiver sendo usado.
O modelo de objetos representa a propriedade pelo objeto Property..
Collection
ADO prov colees, um tipo de objeto que convenientemente contm outros objetos de um tipo particular. Os
objetos em uma coleo podem ser referenciados com um mtodo da coleo tanto pelo nome, por uma string,
pela ordem ou por um nmero inteiro.
ADO oferece quatro tipos de colees:
O objeto Connection tem a coleo Errors, que contm todos os objetos Error criados em resposta a uma
nica falha envolvendo a fonte de dados
O objeto Command tem a coleo Parameters, que contm todos os objetos Parameter que se aplicam ao
objeto Command.
O objeto Recordset tem a coleo Fields, que contm todos os objetos Field que definem as colunas do
objeto Recordset.
Em adio os objetos Connection, Command, Recordset e Field todos tm a coleo Properties, que contm
todos os objetos Property que se aplicam aos seus respectivos objetos containers.
Objetos ADO possuem propriedades as quais voc atribui ou recupera valores com tipos de dados comuns como
INTEGER, CHARACTER ou BOOLEAN. No entanto, til pensar de certas propriedades como retornando valores do
tipo de dados "COLLECTION OBJECT". O objeto Collecttion, por sua vez , tem mtodos para armazenar e retornar
outros objetos adequados para a coleo.
Por exemplo, voc pode pensar do objeto Recordset como tendo a propriedade Properties que retorna um objeto
coleo. Esta coleo tem mtodos para armazenar e retornar objetos Property descrevendo atributos daquele
Recordset
Events
ADO 2.5 apresenta o conceito de eventos no modelo de programao. Eventos so notificaes de que certas
operaes esto para ocorrer ou j ocorreram. Voc pode usar eventos , em geral, para eficientemente orquestrar
uma aplicao consistindo de diversas tarefas no sincronizadas.
O modelo de objetos no inclui eventos explicitamente, mas representa-os como chamadas a rotinas de
tratamento de eventos.
Tratadores de eventos chamados antes que uma operao se inicie oferecem a voc a oportunidade de examinar
ou modificar os parmetros da operao entrar com um cancelamento ou deixar que a operao se complete.
Tratadores de eventos chamados aps uma operao se completar notifica-o do trmino de uma operao
assncrona. ADO 2.5 apresenta varias operaes que foram melhoradas para opcionalmente serem executadas de
modo assncrono Por exemplo, uma aplicao que inicie a operao assncrona Recordset.Open notificada por
um evento de execuo completa quando a operao se conclui.
H duas famlias de eventos:
ConnectionEvents-Eventos so disparados quando se iniciam transaes na conexo , so encerradas ou
canceladas, quando Commands so executados e quando conexes iniciam ou terminam.
RecordsetEvents-Eventos so disparados para informarem o progresso de uma operao de recuperao
de dados, quando voc navega pelos registros do objeto Recordset, quando voc altera um campo em um
registro de um recordset, muda um registro em um recordset ou faz qualquer mudana no recordset
inteiro.

Sumrio do Modelo de Objetos ADO
Sumrio de Objetos ADO
Objeto Descrio
Connection Suporta a troca de dados.
Command Representa uma instruo SQL.
Parameter Representa um parmetro de uma instruo SQL.
Recordset Suporta a navegao e manipulao de dados.
Field Representa uma coluna de um Recordset.
Error Representa um erro em uma conexo.
Property Representa uma caracterstica de um objeto ADO.
Sumrio das Colees ADO
Coleo Descrio
Errors Todos os objetos Error criados em resposta a uma nica falha em uma conexo.
Parameters Todos os objetos Parameter associados com um objeto Command.
Fields Todos os objetos Field associados a uma objeto Recordset.
Properties
Todos os objetos Property associados com um objeto Connection, Command,
Recordset ou Field.
Sumrio dos Eventos ADO
ConnectionEvents Descrio
BeginTransComplete,
CommitTransComplete,
RollbackTransComplete
Gerenciamento de Transao -Notificao de que a
transao corrente na conexo foi iniciada, encerrada
ou cancelada.
WillConnect, ConnectComplete, Disconnect
Gerenciamento de Conexo -Notificao de que a
conexo corrente ser iniciada ou foi iniciada ou
encerrou.
WillExecute, ExecuteComplete
Gerenciamento de Execuo de Comando -Notificao
de que a execuo do comando corrente na conexo
ser iniciado ou terminou.
InfoMessage
Informacional-Notificao de que h informao
adicional sobre a operao corrente.

RecordsetEvents Descrio
FetchProgress, FetchComplete
Retorna Status-Notificao do progresso de uma
operao de recuperao de dados ou de que a
operao de recuperao foi concluda
WillChangeField, FieldChangeComplete
Gerenciamento de Mudana de
Campo-Notificao de que o valor do campo corrente
ser mudado ou j mudou.
WillMove, MoveComplete, EndOfRecordset
Gerenciamento de Navegao-Notificao de que a
posio atual do registro do recordset ir mudar, mudou
ou encontrou o fim do arquivo.
WillChangeRecord, RecordChangeComplete
Gerenciamento de Mudana de Registro -Notificao de
que algo no registro atual do Recordset mudou ou ser
mudado.
WillChangeRecordset, RecordsetChangeComplete
Gerenciamento de Mudana de Recordset-Notificao
de que algo no Recordset atual ser mudado ou j
mudou.
Data Environment Designer
O Viual Basic 6 lhe oferece a possibilidade de definir em tempo de projeto todo o conjunto de objetos ADO que
voc necessitar usar em sua aplicao. Para ajudar na configurao desses objetos lhe fornecido o Data
Environment Designer. Com uma interface grfica fcil de usar, o Data Environment Designer lhe permite criar
objetos Connection para acessar vriadas fontes de dados e, em cada conexo criada, definir objetos Command
para acessar os dados das fontes conectadas. Para incluir o Data Environment Designer em sua aplicao, basta
seleciona-lo no menu Project\More ActiveX Designers ...\Data Environment. O Data Environment ser adicionado
ao seu projeto e sua tela ser imediatamente apresentada conforme a Figura 19.1.

A janela do Data Environment Designer
Um objeto do tipo Connection automaticamente criado e adicionado janela do DE. Voc pode configurar essa
conexo para usa-la e adicionar novas conexes estrutura de rvore montada pelo DE para exibir seus objetos.
Para configurar uma conexo, clique com o boto direito sobre ela e selecione Properties no menu popup. Ser
apresentada a janela de configurao das propriedades da conexo. Veja na Figura 19.2.

A janela de configurao do objeto Connection.
Nessa janela voc definir o provedor de acesso aos dados conforme o tipo de dado a ser acessado. Feita a
escolha e clicando no boto Next, lhe ser exibida a tab Connection (Figura 19.3). Neste ponto, voc escolhe o
banco de dados a ser acessado e introduz as informaes de password e username (se necessrias). Clicando no
boto Test Connection, voc testa se a conexo est funcionando adequadamente.

Definindo a fonte de dados para a conexo.
Para que sua conexo tenha um nome mais expressivo do que Connection1, voc s precisa clicar sobre o nome
da conexo na janela do DE. O nome entra em modo de edio e voc pode altera-lo como faria com o nome de
um arquivo na janela do Windows Explorer.
Mas de nada servir sua conexo se voc no criar os comandos que extrairo os dados que lhe interessam
acessar em suas fontes de dados. Isto feito com a criao de objetos Command e vinculando os a esta ou
aquela conexo. Para adicionar um objeto Command, clique no boto apropriado na barra de ferramentas do DE
ou clique com o boto direito do mouse sobre o objeto Connection ou sobre o Data Environment. No menu popup,
selecione Add Command.
ento a vez de configurar as propriedades do objeto Command. Para faze-lo, d um clique com o boto direito
do mouse sobre o objeto Command a ser configurado. No menu popup que surgir, selecione Properties. A janela
de configurao do objeto Command surgir como na Figura 19.4.

A janela de configurao do objeto Command
Nessa janela voc criar uma vinculao do objeto Command com uma das conexes existentes no seu projeto e
indicar o objeto de origem dos dados a serem pesquisados pelo Command na fonte de dados da conexo. Isto
pode ser feito selecionando o objeto de uma combo box ou criando uma instruo de SQL. Feita essa
configurao, ser possvel definir outras propriedades do objeto Command percorrendo as demais tabs da janela.
Note que os objetos Command e Connection cumprem no modelo de objetos ADO papis equivalentes aos dos
objetos Workspace e Querydef no modelo DAO. Objetos Command e Connection criados no Data Environment so
de acesso global dentro do projeto, mas instncias desses objetos tambm podem ser criadas com cdigo dentro
de sua aplicao para serem usadas em contextos de mdulo ou procedimento. Para isso preciso - caso o Data
Environment Designer no esteja includo no projeto - fazer uma referncia Microsoft ActiveX Data Objects
Library 2.5 na janela References.

Potrebbero piacerti anche