Você está na página 1de 118

Microsoft Visual Basic 6

Introduo
Quando se pensa em Windows, algumas palavras nos vm cabea, tais como: interface grfica, objetos, cones, janelas, mouse, botes, etc., e, como o prprio nome diz, janelas. Alis, uma verdadeira confuso de janelas: maximizadas, restauradas ou minimizadas; pop-ups, modais ou no-modais; caixas de mensagem ou de dilogo; janelas mes e janelas filhas. Logicamente, ento, o ponto de partida para a programao em ambiente Windows s poderia ser uma janela, pois atravs dela que o usurio vai interagir com um sistema. O Microsoft Visual Basic um pacote para desenvolvimento de aplicaes visuais para ambiente Windows baseado na linguagem de programao Basic. orientado a eventos, o que quer dizer que trata ocorrncias que do incio a alguma rotina de trabalho: o programa fica parado at que algo acontea. Quer dizer tambm que ele permite o uso de objetos, mas no a sua criao, pois no uma linguagem orientada a objetos. Objetos so estruturas que combinam propriedades e mtodos. As propriedades so caractersticas dos objetos, que podem ser acessadas e/ou alteradas pelo programador tanto em tempo de projeto (quando o projeto est sendo desenvolvido) quanto em tempo de execuo (quando o aplicativo est sendo executado). J os mtodos so rotinas internas ao objeto que servem para executar determinadas aes. Para exemplificar, pense em uma bicicleta azul. A cor azul uma caracterstica da bicicleta, ou uma propriedade dela. J um mtodo seria o ato de pedalar, que a rotina necessria para fazer a bicicleta andar. Para programao em VB, usamos uma verso da linguagem Basic estruturada para a construo de procedimentos e funes que podem estar associados aos eventos dos objetos de sua aplicao. O VB tambm faz uma verificao automtica de sintaxe dos comandos, e possui recursos avanados de compilao e rastreamento de erros.

Iniciando o VB
Clique no boto Iniciar do Windows, depois em Programas, e procure uma opo chamada Microsoft Visual Basic 6.0. Clique nela, e ser exibida durante alguns segundos uma tela de apresentao do VB, enquanto o software est sendo carregado. Depois disso, aparecer uma janela onde voc deve indicar o tipo de projeto que dever ser iniciado:

Microsoft Visual Basic 6

Para iniciar um novo projeto, escolha a opo Standard EXE na aba New. As demais opes dessa aba iniciam outros tipos de projetos, que no sero abordados nesse curso por tratarem-se de programao avanada, como a criao de controles ActiveX; A aba Existing serve para abrir um projeto j existente; Finalmente, a aba Recent contm os projetos mais recentemente utilizados, e pode ser usada para abrir um deles de maneira mais rpida que na aba Existing.

A tela do VB
Ao se utilizar o VB, tem-se a impresso que estamos esculpindo nossa aplicao diretamente no Windows. Isto se deve ao fato de que ele no possui uma janela que ao ser maximizada ocupe toda a rea de trabalho. Na verdade, o VB constitudo apenas por uma barra de ttulos, uma barra de menus e uma barra de ferramentas (veja a figura na prxima pgina). Dessa forma, quando construmos os nossos formulrios estamos vendo exatamente como eles aparecero no Windows. As janelas auxiliares, que podem ser a caixa de ferramentas, a janela de propriedades, a janela imediata, etc., aparecem flutuando na rea de trabalho do Windows. Os principais componentes da interface do VB so os seguintes:

A janela Projeto (Project)


No VB, sempre que pensamos em uma aplicao, pensamos em um projeto, que o conjunto dos arquivos que compem a aplicao. Esses arquivos podem ser formulrios ou mdulos. Existem outros arquivos que compem um projeto, tais como controles customizados (Custom Controls), bibliotecas de funes, etc. Entretanto, estes no so parte integrante do arquivo que o VB gera. No VB, cada componente de um projeto est em um arquivo separado, que pode ser visualizado e acessado atravs da janela Projeto.

Formulrios (Forms)
No VB, as janelas so chamadas de formulrios. Sempre que se comea a desenvolver uma nova aplicao, o VB nos fornece um formulrio vazio como ponto de partida, e atribui a ele o nome provisrio de Form1. Podemos inserir diversos tipos de controles neste formulrio, controles estes que esto representados por botes na caixa de ferramentas.

A caixa de ferramentas (Toolbox)


Procure na figura a caixa de ferramentas do VB. Ela geralmente est esquerda do formulrio, e contm os botes correspondentes aos controles que podem ser adicionados a ele.

Controles
Os controles so arquivos com extenso OCX e constituem a base da programao visual do VB, alm de poderem ser utilizados em qualquer outro aplicativo ou linguagem que aceite objetos com esse padro. Existem dois tipos bsicos de controles: internos ou padronizados e personalizados ou customizados. Basicamente, os controles padronizados fazem parte do corpo do VB e so disponibilizados na caixa de ferramentas quando se inicia um novo projeto. J os customizados podem ou no ser fornecidos junto com o VB, dependendo da verso utilizada, e precisam ser includos no projeto pelo programador - quando se inclui um controle customizado em um projeto, aparece um novo boto na caixa de ferramentas. Alis, qualquer pessoa pode criar um controle OCX (o prprio VB permite isso), existindo inclusive vrios deles que so comerciais, desenvolvidos por software-houses especializadas. A utilizao dos dois tipos de controles rigorosamente a mesma: ambos possuem propriedades e mtodos, respondem a eventos, aparecem na caixa de ferramentas, e so manipulados da mesma forma. A diferena que os customizados no esto disponveis enquanto no forem explicitamente incorporados caixa de ferramentas do VB pelo programador. Mas, depois que isso acontece, tudo fica transparente.

A propriedade Name
A propriedade Name determina o nome de um objeto. Todos os objetos dentro de um projeto, incluindo formulrios e controles, precisam ter um nome, pois atravs desse nome que nos referimos a eles quando estamos escrevendo o cdigo. Quando voc inicia o VB, o formulrio apresentado recebe o nome genrico de Form1; da mesma maneira, os controles recebem nomes genricos: Command1, Command2, CommandN

Microsoft Visual Basic 6

para os botes de comando; Text1, Text2, TextN para as caixas de texto, e assim por diante. recomendvel, porm, que os objetos recebam nomes mais descritivos e de fcil memorizao e identificao, especialmente aqueles usados com muita freqncia, como caixas de texto e labels. Em casos especiais barras de botes, timers, barras de status e outros, usados mais raramente esse cuidado pode ser dispensado.

As janelas do VB

A propriedade Name de um objeto deve sempre iniciar com uma letra, possuir no mximo 40 caracteres, e pode incluir nmeros e o caracter sublinhado _, mas no pode incluir espaos nem sinais de pontuao. Existe uma conveno usada para a nomeao dos objetos, normalmente adotada como regra pelos programadores VB, que determina a adoo de um prefixo de duas ou trs letras minsculas identificando o tipo do objeto, seguido do nome propriamente dito. Por exemplo: se voc quiser chamar um formulrio de Aviso e usar a conveno, dever determinar para a propriedade Name o valor frmAviso, pois frm o prefixo que identifica um formulrio. O uso regular dessa conveno ajuda na documentao de um projeto, facilitando muito sua manuteno. Veja na tabela a seguir os prefixos convencionais utilizados para a propriedade Name dos objetos mais comuns do VB: Objeto..........................................................................................................Prefixo..............................Exemplo Formulrio......................................................................................................frm.................................frmMenu Caixa de Figura (PictureBox)..........................................................................pic....................................picFoto Legenda (Label)...............................................................................................lbl.............................lblResultado Caixa de Texto (TextBox)................................................................................txt...................................txtAviso Moldura (Frame).............................................................................................fra..............................fraConceito Boto de Comando (CommandButton)..........................................................cmd.............................cmdApagar Caixa de Verificao (CheckBox)...................................................................chk..............................chkNegrito Boto de Opo (OptionButton).....................................................................opt...................................optSexo

Microsoft Visual Basic 6

Objeto..........................................................................................................Prefixo..............................Exemplo Caixa de Combinao (ComboBox)................................................................cbo.............................cboCidades Caixa de Listagem (ListBox)...........................................................................lst................................lstClientes Barra de Rolagem Horizontal (HScrollBar)...................................................hsb..................................hsbIdade Barra de Rolagem Vertical (VScrollBar)........................................................vsb...................................vsbTaxa Temporizador (Timer).....................................................................................tmr...............................tmrAlarme Caixa de Listagem de Unidades (DriveListBox).............................................drv............................drvUnidades Caixa de Listagem de Diretrios (DirListBox)................................................dir................................dirDestino Caixa de Listagem de Arquivos (FileListBox)................................................fil...............................filArquivos Forma (Shape).................................................................................................shp...........................shpQuadrado Linha (Line).....................................................................................................lin................................linDiviso Caixa de Imagem (Image)..............................................................................img.................................imgCarro Controle de Dados (DataControl)...................................................................dat................................datBancos Grid.................................................................................................................grd.............................grdConsulta Menu..............................................................................................................mnu...............................mnuEditar Banco de Dados (DataBase)............................................................................db.......................dbContabilidade Conjunto de Registros (RecordSet)..................................................................rs................................rsDespesas Conexo com provedor de dados (Connection)..............................................cnn................................cnnDados

Microsoft Visual Basic 6

Lio 1: Primeiros Passos


Nessa lio vamos criar nossa primeira aplicao no VB. Precisaremos seguir os seguintes passos: 1. Criao da interface com o usurio: para isso, voc vai usar os controles da caixa de ferramentas, que sero inseridos nos formulrios de modo desenhar a interface; 2. Definio das propriedades dos objetos: aps a insero dos controles, voc deve definir as propriedades com as quais eles devem ser iniciados quando o programa for executado; 3. Codificao dos eventos: escrever a programao Basic necessria para que o programa responda corretamente aos eventos que vo ocorrer durante sua execuo.

Criao da interface com o usurio


Vamos ento para a primeira etapa do processo de criao do nosso programa: criar a interface com o usurio. Para isso voc vai precisar dos seguintes controles: Apontador (Pointer): esse no bem um controle, e sim uma ferramenta usada para inserir, movimentar e/ou dimensionar os diversos objetos de uma aplicao. Boto de comando (CommandButton): sua funo principal executar comandos quando clicado. , provavelmente, o controle mais usado em programao visual. Boto de opo (OptionButton): usado para determinar se uma informao verdadeira ou falsa, somente um boto pode estar ligado, num dado momento, para cada conjunto desses controles. Legenda (Label): serve para exibir um texto que no pode ser editado pelo usurio, como uma mensagem ou o rtulo de um campo a ser digitado. Caixa de figura (PictureBox): permite a exibio de figuras e o agrupamento controles, tais como botes de comando, em formulrios do tipo MDI (que sero estudados mais adiante). Bem, mos obra: 1. Inicie o Windows e o VB, se ainda no o fez. Na janela New Project, escolha a opo Standard EXE da aba New: ser exibida a tela do VB com um formulrio em branco; 2. Insira um boto de comando nesse formulrio. Para isso, voc pode agir de duas maneiras: dar um click no cone CommandButtom da caixa de ferramentas e arrastar o mouse sobre o formulrio de modo a definir o tamanho desejado para o boto, ou ento dar um duplo click no cone (nesse caso o boto ser inserido no centro do formulrio com um tamanho padronizado):

3. Usando o mesmo procedimento, insira trs botes de opo (OptionButtom) e posicione-os um abaixo do outro do lado esquerdo do formulrio, de modo a ficar parecido com o exemplo a seguir:

Microsoft Visual Basic 6

10

4. Ao lado dos botes, insira trs caixas de figura (PictureBox). Desenhe-as como quadrados de aproximadamente 1 centmetro de lado; 5. Insira agora trs Labels direita das caixas de figura, indo at perto da borda direita do formulrio. Seu formulrio deve estar parecido com esse:

6. No menu File, selecione Save Project. Como a primeira vez que o projeto ser gravado, aparece a caixa de dilogo Save File As, onde devemos informar o nome que ser dado ao formulrio; 7. Digite Hello e selecione Save. Seu formulrio foi gravado em um arquivo chamado Hello.FRM; 8. Aparece ento a caixa de dilogo Save Project As, onde devemos informar o nome que ser dado ao projeto. Digite Hello novamente e selecione Save. Seu projeto foi gravado no arquivo Hello.VBP; Meus parabns! Voc terminou a criao de sua primeira interface com o usurio no VB. Vamos agora passar segunda fase do nosso programa, que a definio de propriedades para os objetos do formulrio.

Definio das propriedades dos objetos


Antes de comear, verifique se a janela Propriedades (Properties) est aberta. Caso no esteja, voc pode abr-la pressionando F4 ou selecionando a opo Properties do menu View. A definio de propriedades um processo muito simples, basta seguir os seguintes passos: 1. D um click no objeto cujas propriedades voc quer mudar (voc tambm pode clicar com o boto direito sobre ele, e escolher a opo Properties do menu de contexto); 2. Clique na propriedade que deseja alterar;

Microsoft Visual Basic 6

11

3. Digite o novo valor para a propriedade. Algumas propriedades possuem uma caixa de combinao em que voc pode indicar sua opo. Outras abrem uma caixa de dilogo, como a propriedade Picture de uma caixa de figura quando isso acontecer, ser indicado por um boto com reticncias ... ao lado do valor da propriedade. Seguindo os passos acima, altere as propriedades dos objetos do nosso formulrio, de acordo com a tabela: Objeto Formulrio Nome (propriedade Name) frmHello Outras Propriedades = Valor Caption = Hello, World! Icon = FACE05.ICO (obs.: os cones do VB normalmente so encontrados na pasta C:\Arquivos de Programas\Microsoft Visual Studio\Commom\Graphics\Icons, e o arquivo citado est na subpasta Misc) Caption = Im Happy! Caption = Im Ok Caption = Im Sad Picture = FACE03.ICO Visible = False Appearance = 0 Flat BorderStyle = 0 None Picture = FACE02.ICO Visible = False Appearance = 0 Flat BorderStyle = 0 None Picture = FACE04.ICO Visible = False Appearance = 0 Flat BorderStyle = 0 None Caption = (em branco) Font = Times New Roman, Negrito, tamanho 12 Caption = Font = Times New Roman, Negrito, tamanho 12 Caption = Font = Times New Roman, Negrito, tamanho 12 Caption = &Exit Style = 1 Graphical Picture = TRFFC14.ICO (procure na subpasta Traffic do diretrio de cones do VB)

Boto de opo Boto de opo Boto de opo Caixa de figura

optHappy optOk optSad picHappy

Caixa de figura

picOk

Caixa de figura

picSad

Label Label Label

lblHappy lblOk lblSad

Boto de comando cmdExit

Note que usamos o caracter & na definio da propriedade Caption do boto cmdExit. Fazemos isso quando queremos habilitar o acionamento de um controle pela tecla ALT. No formulrio, o rtulo do boto Exit com a letra E sublinhada, indicando que podemos acion-lo atravs da combinao de teclas ALT+E. Verifique se voc fez tudo corretamente, comparando seu formulrio com o exemplo abaixo:

Microsoft Visual Basic 6

12

Bem, vamos conhecer melhor as propriedades que usamos nesses controles, e algumas outras interessantes:

Propriedade Caption
Uma boa traduo para Caption rtulo: para um formulrio, Caption determina o texto que ser exibido na barra de ttulo, e tambm abaixo do cone do aplicativo, se ele for minimizado. Para um controle, determina o texto exibido dentro ou prximo a ele. Quando um objeto criado o contedo de Caption igual ao nome padro atribudo pelo VB ao controle.

Propriedade Picture
A propriedade Picture determina o nome de um arquivo grfico para ser exibido pelo controle. Como voc j viu, podemos escolher o arquivo grfico desejado em uma janela de dilogo que aberta quando clicamos no boto com ... (reticncias) exibido por Picture. Os formatos grficos suportados pelo VB 4 so: cones (arquivos de extenso ICO), Windows Metafile (extenso WMF o formato dos cliparts do Word), Bitmap (extenso BMP o formato dos arquivos criados pelo Paint do Windows), e arquivos JPG e GIF (muito usados em pginas da Internet). No caso do boto de comando, Picture s tem efeito se a propriedade Style for igual a 1 Graphical.

Propriedade Style
Essa propriedade indica o estilo da aparncia do controle. No caso dos botes de comando, os valores possveis so 0 Standard e 1 Graphical. Na prtica, a diferena que, alterando o estilo do CommandButton para Graphical, ser permitida a exibio de cones, enquanto que em Standard somente texto poder ser exibido por ele. Vrios controles possuem a propriedade Style, sendo que os valores possveis variam de um tipo para outro.

Propriedade Visible
Como o prprio nome indica, essa propriedade define se um controle deve ou no estar visvel em um determinado momento. Ela s pode assumir os valores True (verdadeiro) ou False (falso);

Propriedade Enabled
No usamos essa propriedade em nosso projeto, mas vamos cit-la agora para evitar confuses com Visible. Voc j reparou quando abre uma janela qualquer do Windows e aparece um boto ou uma opo de menu cujo rtulo est com uma cor mais apagada, indicando que aquele controle no est acessvel no momento? A propriedade Enabled quem faz isso: ela habilita (quando True) ou no (quando False) o acesso ao controle em um determinado momento. Um exemplo: voc cria um boto Ok para ser utilizado quando forem fornecidos alguns valores necessrios para se realizar um clculo. Voc pode usar Enabled para desabilitar o boto Ok at que o usurio tenha fornecido esses valores, pois s depois disso ele poder us-lo.

Propriedade Appearance
A propriedade Appearance define a aparncia do controle no formulrio. Ela s pode ser modificada em tempo de projeto, e normalmente s pode assumir dois valores: 0 Flat (o controle ter a mesma aparncia do formulrio, no haver destaque) ou 1 3D (o controle ser exibido em perspectiva 3D).

Propriedade BorderStyle
Essa propriedade normalmente aplicada ao formulrio, e, como o prprio nome indica, define o estilo de sua borda. Existem seis tipos de bordas, sendo que alguns controles tambm possuem a propriedade BorderStyle, mas no todos os tipos. Os tipos de bordas so os seguintes: 0 None (Nenhuma); 1 - Fixed Single (Fixa Simples): indica que o formulrio no ser dimensionvel, ou seja, o usurio no poder alterar o tamanho no formulrio em tempo de execuo. 2 Sizable (Dimensionvel); 3 - Fixed Dialog (Dilogo Fixo): o formulrio no possuir os botes Maximizar e Minimizar, e, alm disso, no ser dimensionvel. o estilo da borda das caixas de dilogo do Windows;

Microsoft Visual Basic 6

13

4 - Fixed ToolWindow (Ferramenta Fixa): esse tipo no possui o menu de controle e os botes Maximizar e Minimizar. No dimensionvel, e mostra somente o boto Fechar e a barra de ttulo com a fonte reduzida. Alm disso, o formulrio no aparece na barra de tarefa do Windows. 5 - Sizable ToolWindow (Ferramenta Dimensionvel): semelhante a Fixed ToolWindow, s que dimensionvel.

Propriedade StartUpPosition
Aplicada ao formulrio, essa propriedade determina sua posio na tela do computador quando for acionado. Os valores possveis so: 0 Manual: a posio inicial ser a mesma que o formulrio ocupa em tempo de projeto; 1 Center Owner: a posio inicial ser o centro do formulrio principal da aplicao, quando temos mais de um formulrio no projeto; 2 Center Screen: a posio inicial ser o centro da tela do computador; 3 Windows Default: o Windows determinar a posio inicial do formulrio.

Propriedade Font
A propriedade Font permite a formatao da fonte usada nas propriedades Text e Caption. Quando voc clica em Font, aberta a janela de formatao de fontes do Windows, de modo que voc poder aplicar fonte, tamanho e efeitos ao texto das propriedades citadas. Essa propriedade no pode ser alterada em tempo de execuo, mas para isso o VB fornece algumas propriedades relacionadas a Font, que so as seguintes: FontBold (Negrito), FontItalic (Itlico), FontStrikethru (Riscado) e FontUnderline (Sublinhado): podem assumir os valores True (liga o efeito) ou False (desliga o efeito); FontName (Nome da Fonte): indica o nome da fonte a ser aplicada ao controle; FontSize (Tamanho da Fonte): recebe um valor numrico referente ao tamanho a ser aplicado em uma fonte True Type. Obs.: com exceo de Font, essas propriedades s podem ser alteradas em tempo de execuo.

Codificao dos eventos


Essa a etapa na qual vamos agora fazer nosso programa funcionar. Como j foi dito anteriormente, o Visual Basic uma linguagem orientada a eventos, o que quer dizer que os objetos respondem a eventos que contm a codificao necessria. Cada evento contm uma subrotina (ou procedure) associada a ele. Ou seja, a codificao ser feita em procedures de acordo com a ao que o programa dever executar quando um determinado evento ocorrer. Antes de escrever uma procedure, voc precisa dizer ao VB para qual objeto deseja escrev-la. A maneira mais simples de se fazer isso dando um duplo click sobre o objeto desejado, e a janela Cdigo (Code) ser apresentada. Na janela Cdigo temos trs destaques: Quando aberta, a janela Cdigo apresenta a procedure correspondente ao evento padro do objeto. Por exemplo: o evento padro de um boto de comando o Click, portanto quando abrirmos a janela Cdigo de um boto de comando o evento que aparecer ser o Click. Porm, no caso do evento padro no conter nenhuma codificao, mas outro qualquer sim, ento a janela ser aberta nesse outro evento; Na parte superior da janela temos duas caixas de combinao. A da esquerda, chamada Object, contm os nomes de todos os objetos do nosso formulrio, e da direita, chamada Proc, uma lista com todas as procedures associados ao objeto atualmente selecionado; Existe uma opo na caixa Object chamada General, que a princpio s contm uma procedure, chamada Declarations. Esse no um objeto, e sim uma Seo: uma parte do programa onde so escritas instrues especiais, como declarao de variveis e funes de uso geral. Quando estamos programando em VB, freqente a necessidade de se modificar o valor das propriedades dos objetos em tempo de execuo. Para fazer isso, o VB refere-se s propriedades de um objeto da seguinte maneira:
Objeto.Propriedade = <valor>

Microsoft Visual Basic 6

14

Mas vamos fazer a codificao do nosso projeto. Comecemos pelo boto cmdExit: para escrever o cdigo necessrio ao seu funcionamento, siga os seguintes passos: 1. D um duplo click sobre o boto cmdExit: a janela Cdigo se abre no evento Click:

2. Escreva o seguinte cdigo:


Private Sub cmdExit_Click() End End Sub

A primeira linha da procedure indica seu nome cmdExit_Click e sua classe Private (privada). A ltima linha indica o fim da procedure, atravs do comando End Sub. Entre o nome da procedure e o comando End Sub que escrevemos a codificao necessria, que nesse caso resumiu-se ao comando End (que nome sugestivo, no?), cuja funo encerrar a execuo do programa. Vamos agora testar nosso programa. Para isso, basta clicar no boto Start da barra de ferramentas ou ento pressionar a tecla F5. Teste o funcionamento de seu aplicativo: se tudo foi feito corretamente, quando voc clicar no boto Exit o programa ser encerrado e voc retornar ao VB. Uma observao: quando estamos criando um formulrio ou escrevendo cdigo dizemos que estamos em tempo de projeto; quando estamos executando um programa dizemos que estamos em tempo de execuo. Essa diferenciao importante, pois existem algumas propriedades que no podem ter seu valor alterado em tempo de execuo.

Planejando a codificao
Planejamento a palavra chave para ns, programadores, quando chegamos na fase de escrever a programao do aplicativo. Antes de comear a codificao de um programa voc precisa saber o que ele deve fazer e quando: identificar quais os eventos que podem ser acionados pelo usurio e como eles vo influenciar a execuo do aplicativo, para poder assim program-los de maneira a chegar ao resultado desejado. Vamos ento planejar nosso primeiro aplicativo: Temos em nosso formulrio trs botes de opo, que serviro para indicar nosso humor matinal; Temos tambm trs caixas de figura, inicialmente invisveis, cada uma delas contendo uma carinha diferente, e trs Labels que no contm texto nenhum; Quando clicarmos em um boto qualquer, a figura e o texto correspondente a ele devero aparecer, e a figura e o texto dos outros botes no devero mais ser exibidos; Voc j deve ter percebido que o evento que vamos trabalhar o Click dos botes de opo, pois ele que vai gerar as aes necessrias para cumprirmos nosso planejamento. Agora que j sabemos o que fazer, vamos escrever a codificao para isso: 1. D um duplo-click no boto de opo optHappy. A janela Cdigo ser aberta e a procedure optHappy_Click exibida; 2. Digite os comandos indicado:
Private Sub optHappy_Click() picHappy.Visible = True picOk.Visible = False picSad.Visible = False lblHappy.Caption = "I'm going to Disneyworld!" lblOk.Caption = Empty lblSad.Caption = Empty End Sub

Microsoft Visual Basic 6

15

Obs.: Empty uma funo do VB que retorna uma string vazia (nula). 3. D um click na lista Object e escolha o objeto optOk. Se a procedure exibida pela janela Cdigo no for a optOk_Click, selecione-a na lista Proc; 4. Digite a procedure:
Private Sub optOk_Click() picHappy.Visible = False picOk.Visible = True picSad.Visible = False lblHappy.Caption = Empty lblOk.Caption = "I'm Ok today." lblSad.Caption = Empty End Sub

5. Selecione agora o objeto optSad e a procedure optSad_Click, e escreva o cdigo para ela (voc pode usar os recursos de copiar e colar do Windows):
Private Sub optSad_Click() picHappy.Visible = False picOk.Visible = False picSad.Visible = True lblHappy.Caption = Empty lblOk.Caption = Empty lblSad.Caption = "Goodbye, cruel world..." End Sub

6. Pressione F5 para executar o programa. Se voc digitou tudo corretamente, o VB exibir seu formulrio na tela, como no exemplo a seguir:

7. D um click no boto com o rtulo Im Happy e veja se o resultado o esperado:

Microsoft Visual Basic 6

16

8. Verifique o funcionamento dos outros botes de opo. Se algo estiver errado, confira a codificao e execute o aplicativo novamente.

Criando um arquivo executvel


O ltimo passo de qualquer projeto a criao do arquivo executvel. Ou voc vai entregar para o cliente os arquivos que o compem? Alm das razes monetrias bvias, voc no vai correr o risco de um curioso qualquer alterar ou copiar o cdigo que voc tanto suou para criar, vai? Alm disso, se voc no criar um executvel, o cliente dever possuir um cpia do VB instalada em sua mquina para poder rodar o aplicativo, o que no l muito prtico. A criao de arquivos executveis feita pela opo Make <nome do projeto>.exe do menu File: 1. Escolha a opo Make hello.exe do menu File do VB. Uma caixa de dilogo ser exibida, onde voc dever informar o nome do arquivo executvel, caso queira mud-lo. Aps indicar o nome, clique em Ok; 2. Crie um atalho para o arquivo executvel na rea de trabalho do Windows. Veja que, como cone do atalho, ser exibida a carinha feliz.

Package and Deployment Wizard


A criao do executvel, apesar de importante, ainda no suficiente para a distribuio de uma aplicao desenvolvida em VB. Como voc sabe, o Windows um sistema composto de inmeros arquivos e programas, cada qual com sua funo especfica, sendo que alguns so necessrios para a execuo de aplicativos. Alm disso, o programa escrito em VB no tem o poder de rodar sozinho, mesmo aps a criao do mdulo executvel: para funcionar, necessita de algumas bibliotecas chamadas de run-time, e dos arquivos OCX que esto gravados no diretrio do Windows. Chamamos a esses arquivos de dependncias. Mas, como saber quais so as dependncias de um aplicativo? Um dos utilitrios que acompanham o VB em suas verses comerciais o Package and Deployment Wizard, cuja funo justamente resolver esse problema. Ele cria um programa de instalao para sua aplicao, que vai copiar para a mquina onde o programa for instalado todos os arquivos de run-time, DLLs e OCXs que ele precisar, da mesma maneira que em um aplicativo comercial. O uso desse utilitrio muito simples:

Microsoft Visual Basic 6

17

1. Na caixa Select Project, selecione o projeto para o qual deve ser criado o programa de instalao; 2. Clique no boto Package para iniciar o assistente; 3. Voc dever responder algumas perguntas (por exemplo, o nome da opo que ser criada no menu Iniciar do Windows) sendo que para a maioria delas no necessrio fazer qualquer alterao. Devemos porm destacar uma delas na qual deve-se indicar, se for o caso, o nome dos arquivos externos ao projeto que tambm precisam ser copiados. O caso mais comum o de arquivos de banco de dados, quando da primeira instalao do aplicativo; 4. Depois que voc responder essas perguntas, dever indicar em que unidade e (se for o caso) em que pasta onde devem ser gravados os arquivos da instalao. Se voc indicar uma unidade de disquetes, o Wizard criar os disquetes de instalao automaticamente; 5. Pronto, o Wizard resolve todas as dependncias e cria o programa de instalao para voc.

Microsoft Visual Basic 6

18

Lio 2: Entrada e Sada de Dados


Entrada e sada so dois conceitos importantssimos em Processamento de Dados, pois envolvem a interao do usurio com a mquina: por entrada, entende-se toda solicitao ou fornecimento de dados ao computador pelo operador, e por sada, o retorno pelo computador do resultado obtido. Nessa lio voc vai aprender a implementar esses dois conceitos em seus programas.

Caixas de Texto
Em programao visual, existem vrias maneiras de se permitir a entrada de dados, mas a principal o uso das caixas de texto (TextBox). Seu evento padro o Change, que ocorre sempre que acontece uma digitao, e a propriedade principal a Text. Vejamos ento algumas propriedades importantes:

Propriedade Text
A propriedade Text de uma caixa de texto armazena o texto contido na rea de edio. Ela pode ser alterada pelo usurio em tempo de execuo, o que permite ento a digitao de dados no programa. Como a propriedade Text armazena textos, quando houver a necessidade do dado a ser digitado ser numrico teremos que converter seu contedo usando funes especficas para esse fim.

Propriedade MaxLength
Essa propriedade serve para determinar o tamanho mximo em caracteres do dado digitado em uma caixa de texto. Por exemplo: sabendo que a digitao em uma caixa de texto chamada txtNome no pode ter mais de 30 caracteres, determinamos para a MaxLength de txtNome o valor 30. Se MaxLength no for definida, o valor padro zero, e no haver limite para a digitao no campo.

Propriedade Multiline
A funo dessa propriedade permitir ou no a digitao de mais de uma linha em uma caixa de texto. Os valores possveis so True (Multiline habilitada) ou False. Com MuliLine = True, quando Enter for pressionada, a digitao passa para a prximo linha. Alm disso, a propriedade Alignment de uma caixa de texto s funciona de Multiline estiver habilitada.

Propriedade PasswordChar
Eis uma propriedade muito interessante: voc j digitou uma senha em um programa qualquer em que aparece na caixa um caractere especial (normalmente um *) ao invs daquele digitado? Quem faz isso PasswordChar: basta informar em seu valor o caracter desejado, e o efeito ser exatamente esse.

Propriedades ForeColor e BackColor


A propriedade ForeColor define a cor da fonte usada no texto exibido pelo controle, e BackColor indica a cor do fundo de um objeto. Essas propriedades recebem como valor um cdigo numrico ou hexadecimal que representa a cor desejada. Em tempo de projeto, para alter-las a maneira mais simples clicar sobre a propriedade que deve ser modificada e depois no boto com as reticncias que aparece ao lado do cdigo da cor atual. Uma janela com as opes de cores disponveis se abre e basta escolher a que mais lhe agrade. Para alterar seus valores em tempo de execuo, so usadas as funes RGB e QBColor, que estudaremos mais adiante. Para exemplificar o uso das TextBoxes, vamos elaborar o projeto de uma calculadora simples: 1. Inicie um novo projeto; 2. Dimensione o formulrio e insira os controles necessrios de modo a ficar parecido com o modelo da prxima pgina;

Microsoft Visual Basic 6

19

3. Altere as propriedades dos objetos: Objeto Formulrio Caixa de Texto Caixa de Texto Caixa de Texto Label Nome frmCalculadora txtNum1 txtNum2 txtResultado lblMultiplicao Outras Propriedades = Valor Caption = Calculadora BorderStyle = 1 Fixed Single StartUpPosition = 2 Center Screen Text = (em branco) MaxLenght = 10 Text = MaxLenght = 10 Text = Caption = X (maisculo) Font = Arial, Negrito, tamanho 16 Style = 1 Graphical Picture = Misc\MISC22.ICO Caption = &Limpar

Boto de Comando cmdIgual Boto de Comando cmdLimpar

Nesse projeto, digitaremos um nmero em txtNum1 e outro em txtNum2. Quando clicarmos em cmdIgual, o resultado da multiplicao aparecer em txtResultado. Para limpar as caixas de texto, clicaremos em cmdLimpar. O projeto ir trabalhar, portanto, basicamente com dois eventos: Click em cmdIgual (=) Click em cmdLimpar (Limpar) No se preocupe com o clculo agora, pois voltaremos a esse assunto na prxima lio. Vamos ento escrever a codificao do nosso programa: 1. D um duplo click no boto cmdIgual e entre com o seguinte cdigo:
Private Sub cmdIgual_Click() vValor1 = Val(txtNum1.Text) vValor2 = Val(txtNum2.Text) txtResultado.Text = vValor1 * vValor2 End Sub

2. Alterne para a procedure cmdLimpar_Click e digite os comandos a seguir:


Private Sub cmdLimpar_Click() txtResultado.Text = Empty txtNum1.Text = Empty txtNum2.Text = Empty End Sub

3. Execute o projeto. Para testar, entre com um nmero qualquer em txtNum1, outro em txtNum2, d um click no boto =, e o resultado da multiplicao aparecer em txtResultado; 4. Grave o formulrio como frmCalc e o projeto como Calc. Obs.: voc deve ter percebido que na codificao foram usados alguns recursos novos: por enquanto, o que nos interessa que vValor1 e vValor2 so variveis, e Val uma funo de converso.

Sada de Dados
Voc j usou na lio anterior um dos principais meios de exibio de dados do VB: o controle Label. Ele tem, nesse caso, uma vantagem muito grande sobre as caixas de texto, fcil de perceber: execute novamente

Microsoft Visual Basic 6

20

o programa Calc, faa um clculo qualquer e clique com o mouse sobre a caixa de texto txtResultado. Agora escreva alguma coisa: a digitao aceita, o que, convenhamos, no l muito recomendvel para a exibio de dados. J um label no permite digitao, resolvendo esse problema. Vamos ento alterar nosso programa: 1. Apague do formulrio a caixa txtResultado; 2. Inclua um label em seu lugar, e altere suas propriedades para: Name = lblResultado Caption = (em branco) Alignment = 2 Center BorderStyle = 0 None BackStyle = 1 Opaque BackColor = (clique nas reticncias e escolha a cor branca) 3. Altere a ltima linha da procedure cmdIgual_Click para:
lblResultado.Caption = vValor1 * vValor2

4. Altere a primeira linha da procedure cmdLimpar_Click para:


lblResultado.Caption = Empty

5. Execute o programa, faa um clculo qualquer e tente alterar o resultado: como o label no permite digitao, isso no mais possvel.

Sada Formatada
muito comum a necessidade de se aplicar mscaras para a exibio dos dados. Isso fica claro quando, em nossa calculadora, um clculo resulta em um valor alto, pois no existem separadores de milhar ou decimal. O VB possui algumas funes especficas para a formatao de dados de sada:

Funo Format
A funo Format usada na aplicao de mscaras em dados numricos ou datas. Sua sintaxe a seguinte:
Format(<expresso>,<formato>)

Onde Expresso o dado a ser formatado e Formato a mscara que ser aplicada a ele, e o resultado ser uma string correspondente expresso formatada com a mscara. Veja alguns exemplos: Formato 0 0,00 #,##0 #,##0.0 $#,##0;($#,##0) $#,##0.00;($#,##0.00) 0% 0.00E+00 5 positivo 5 5,00 5 5,0 $5 $5,00 500% 5,00E+00 5 negativo -5 -5,00 -5 -5,0 ($5) ($5,00) -500% -5,00E+00 5 decimal 1 0,50 1 0,5 $1 $0,50 50% 5,00E-1

Em formato o nmero 0 ser mostrado ou trocado pelo caractere em sua posio, j o sustenido (#) no ser mostrado. Podemos usar smbolos na mscara, como no exemplo: $ , % e E (que representa exponenciao). Note que a separao de milhares e decimais na mscara deve ser feita no padro americano, ou seja, , para separao de milhares e . para decimais, mas o resultado vai seguir as configuraes feitas na opo Internacional do Painel de Controle do Windows. Format tambm pode ser usada para formatao de data e hora: Formato d/m/yy dd-mm-yyyy dd-ddd hh:mm AM/PM h:mm:ss a/p d/m/yy h:mm Exibio 10/7/96 01-Jun-1996 02-Dom 08:50 AM 8:50:20 a 03/12/95 9:30 Formato General Date Long Date Medium Date Short Date Long Time Medium Time (12 horas) Short Time (24 horas) Exibio 06/09/96 9:40:18 Sexta, 9 de setembro de 1996 09-set-96 09/09/96 9:40:19 09:40 AM 09:40

Microsoft Visual Basic 6

21

Funes UCase e LCase


Essas funes so usadas na converso de textos em letras maisculas (UCase) ou minsculas (LCase).

Funo StrConv
A funo StrConv tambm usada na formatao de strings, mas mais flexvel que UCase e LCase, pois recebe um parmetro que indica como deve ser feita a converso de maisculas para minsculas e viceversa. Esse parmetro pode ser: 1 vbUpperCase: converte a string em caracteres maisculos. O mesmo que UCase; 2 vbLowerCase: converte a string em caracteres minsculos. O mesmo que LCase; 3 vbProperCase: converte em letra maiscula a primeira letra de cada palavra na seqncia de caracteres, e as demais em minsculas. Por exemplo: Funo UCase(MICROSOFT Visual basic) ou StrConv(MICROSOFT Visual basic, vbUpperCase) LCase(MICROSOFT Visual basic) ou StrConv(MICROSOFT Visual basic, vbLowerCase) StrConv(MICROSOFT Visual basic, vbProperCase) Vamos alterar a exibio do resultado na calculadora: 1. Abra a janela Cdigo no evento Click do boto cmdIgual; 2. Altere a ltima linha da procedure como segue:
lblResultado.Caption = Format(vValor1 * vValor2, ###,##0.00)

Exibio MICROSOFT VISUAL BASIC microsoft visual basic Microsoft Visual Basic

3. Execute o programa e teste a alterao; 4. Grave seu trabalho. Guarde-o com cuidado, pois esse projeto ser usado novamente na prxima lio.

Microsoft Visual Basic 6

22

Lio 3: Fundamentos da Linguagem


Como j foi dito anteriormente, a programao em VB feita atravs de uma verso da linguagem Basic estruturada. essa linguagem que comearemos a estudar a partir de agora. Nessa lio, veremos a criao e o uso de variveis e constantes, e a razo da existncia dos computadores: clculos. Estudaremos tambm um conceito muito importante em programao visual: o foco.

Variveis
Varivel uma rea da memria que identificamos com um nome e onde podem ser guardados dados com possibilidade de alterao em tempo de execuo. O nome de uma varivel pode ter at 255 caracteres, deve comear com uma letra e tem que ser nico. O nome pode conter nmeros e sublinhados, e no pode ser uma palavra reservada. Nesse texto adotaremos como padro iniciar todos os nomes de variveis com a letra v. Por exemplo: para uma varivel que identifica uma quantidade poderemos adotar o nome vQuantidade. Existem vrios tipos de variveis, dependendo do dado que queremos que ela armazene: Tipo Byte Boolean Date Integer Long Single Double Currency String Variant Tamanho (Bytes) 1 2 8 2 4 4 8 8 varivel varivel Sufixo nenhum nenhum nenhum % & ! # @ $ nenhum Faixa de Dados 0 a 255 True (-1) ou False (0) 1/Jan/100 a 31/Dez/9999 -32.768 a 32.767 -2.147.483.647 a 2.147.483.647 -3,402823E38 a -1,401298E-45; 1,401298E-45 a 3,402823E38 -1,79769313486232E308 a -4,94065645841247E-324; 4,94065645841247E-324 a 1,79769313486232E308 -922.337.203.685.477,5808 a 922.337.203.685.477,5807 Qualquer dado alfanumrico Qualquer tipo de dado: ser assumido o tipo e tamanho mais apropriado ao dado a ela atribudo

A coluna Sufixo contm caracteres que servem para indicar o tipo da varivel desejada, quando a usamos pela primeira vez. Por exemplo: para iniciar uma varivel de nome vTroco e declar-la como sendo do tipo Currency, poderemos usar a linha de comando:
vTroco@ = 0

Uma observao: internamente, o tipo Date um nmero do tipo Long que representa uma data, sendo que a parte inteira desse nmero indica a data propriamente dita, e a parte decimal a hora.

Declarao de Variveis
Declarar uma varivel indicar ao VB que deve ser reservada uma rea na memria para o armazenamento de um dado, e de que tipo ser esse dado. Existem trs maneiras de declarar variveis: 1. Inicializar a varivel onde ela for necessria. Como o VB no obriga a declarao de variveis, podemos simplesmente atribuir um valor a ela e a varivel assumir o tipo mais adequado para o dado que est sendo armazenado: o que chamamos de declarao implcita; 2. Usar o mesmo mtodo acima, porm indicando o tipo da varivel atravs dos sufixos, na primeira vez em que a utilizarmos; 3. Usar os comandos Dim, Static, Private ou Public para alocar o espao na memria para a varivel e indicar seu tipo. A sintaxe a mesma para todos os comandos:
<comando> Varivel1, Varivel2, Varivel3, ..., VarivelN As <tipo>

Tambm podemos obrigar a declarao de todas as variveis de uma aplicao, o que muito interessante, pois declarar variveis uma prtica de programao altamente recomendvel. Para isso usamos o comando Option Explicit na seo Declarations do formulrio ou mdulo de programao.

Microsoft Visual Basic 6

23

Escopo das Variveis


Escopo so os pontos da aplicao de onde podemos acessar a varivel. O escopo de uma varivel determinado pelo comando usado em sua declarao (Dim, Static, Private ou Public): Variveis Locais: so reconhecidas apenas pela procedure na qual foram declaradas. Diferentes procedures podem ter variveis locais com o mesmo nome sem que isso cause conflitos, pois quando uma procedure encerrada o contedo de suas variveis locais ser perdido. A declarao de variveis locais feita com os comandos Dim ou Private. Importante: variveis com declarao implcita sero sempre locais; Variveis Estticas: so variveis locais cujo contedo ser retido ao trmino da procedure. Nesse caso, quando a procedure que contm uma varivel esttica for executada novamente, a varivel no ser reinicializada e seu contedo ser o mesmo que ela continha quando a procedure foi encerrada da ltima vez. Para declarar uma varivel como esttica usa-se o comando Static; Variveis Privadas: compartilham informaes entre todas as procedures em um mdulo de programao ou formulrio, mas no para outros mdulos ou formulrios. A declarao de variveis privadas feita com os comandos Dim ou Private na seo Declarations de um formulrio ou mdulo de programao; Variveis Pblicas: esto disponveis para todos os mdulos de programao e formulrios do aplicativo. Para a declarao de variveis pblicas usamos o comando Public. Obs.: por uma questo de compatibilidade com verses anteriores do VB, tambm pode ser usado o comando Global para declarao de variveis pblicas.

Inicializao de Variveis
De modo geral, para inicializar uma varivel basta atribuir um contedo a ela. Obviamente, esse contedo deve ser compatvel com o tipo usado na declarao da varivel. Para dados numricos basta indicar o valor desejado:
vSalrioBase = 1200

Valores reais devem usar o ponto para separao da parte decimal, jamais a vrgula, mesmo que a configurao do Painel de Controle do Windows indique o contrrio:
vPi = 3.1416

Dados tipo String devem vir entre aspas:


vNomeEscola = CEMEP

Dados tipo Date so identificados pelo caracter # (sustenido) no seu incio e fim. Por exemplo: para armazenar a data 15/07/1998 em uma varivel, podemos usar o comando:
vDataCurso = #15/07/1998#

Constantes
Constantes tambm so posies de memria que tm as mesmas caractersticas das variveis e podem ser dos mesmos tipos, mas, como o prprio nome indica, no podem ter seu valor alterado durante a execuo do programa. So teis para guardar parmetros e valores que sero usados em vrias procedures do sistema, pois com elas podemos centralizar a atribuio desses valores em alguns poucos locais, o que facilita muito a programao. Por exemplo: quando um cliente compra um sistema, obviamente pretende que o nome de sua empresa aparea nos relatrios emitidos por ele. Se voc incluir o nome da empresa em cada programa de relatrio, e depois vender esse sistema para outro cliente, ter que rastre-lo todo a procura dessas ocorrncias e fazer as alteraes necessrias. Mas, se voc definir uma constante pblica no incio do sistema contendo o nome da empresa, s ter que fazer uma alterao. Constantes s podem ser declaradas com os comandos Public (constantes pblicas) ou Private (constantes privadas ou locais). A sintaxe usada na sua criao :
<escopo> Const NomeDaConstante As <tipo> = <valor>

Por exemplo:
Public Const Pi As Single = 3.1415926535

Microsoft Visual Basic 6

24

Constantes de Sistema
O VB possui diversas constantes pr-definidas, chamadas de Constantes de Sistema, que podem ser usadas a qualquer momento pelo programador. A principal vantagem de seu uso a clareza da codificao e a conseqente facilidade de manuteno. Um bom exemplo do uso desse tipo de constante o de uma aplicao que trate com dias da semana. Se a comparao do nmero do dia da semana de uma data com 1 for verdadeira, saberemos que esse dia um domingo, pois o VB identifica um domingo pelo valor 1. Existe uma constante de sistema, de nome vbSunday, cujo valor 1, que foi criada justamente para ser usada em casos como esse: ao invs do programador comparar o dia da semana com 1 e ter que se lembrar a toda hora que 1 domingo, pode comparar com vbSunday, e seu cdigo ficar muito mais legvel. A lista completa das constantes de dias da semana a seguinte: Constante vbSunday vbMonday vbTuesday vbWednesday vbThursday vbFriday vbSaturday Valor 1 2 3 4 5 6 7 Dia da semana Domingo Segunda Tera Quarta Quinta Sexta Sbado

Um observao importante que uma constante de sistema facilmente identificvel, pois seu nome geralmente comea com vb repare na tabela acima. Voc tambm j viu algumas delas na lio anterior, quando estudamos a funo StrConv: os valores vbUpperCase, vbLowerCase e vbProperCase so constantes de sistema cujos valores so, respectivamente, 1, 2 e 3. Estudaremos mais algumas delas durante o curso.

Funes de Converso
Como j vimos anteriormente, a entrada de dados feita pelas caixas de texto, obrigando o uso de conversores quando houver necessidade do dado ser numrico ou data. Os conversores so funes que recebem dados de um tipo e os convertem em outro. Cada tipo de converso tem uma funo correspondente. Por exemplo: no podemos usar um conversor de string para Byte se sabemos que o texto representa um valor maior que 255, pois esse o valor limite do tipo Byte: o tamanho do dado no ser suportado na converso. A tabela a seguir mostra as funes para converso de dados tipo String em numricos. Considere que a vari-vel vPi contm um texto correspondente ao valor de (3.1415926535): Funo/Sintaxe Val(<string>) CInt(<string>) CLng(<string>) CSng(<string>) CDbl(<string>) CCur(<string>) Exemplo Val(vPi) Cint(vPi) CLng(vPi) CSng(vPi) CDbl(vPi) Ccur(vPi) Tipo Resultante Long Integer Long Single Double Currency Resultado da converso 3 3 3 3.14159 3.1415926536 3.1416

Observao: as funes Val e CLng diferem-se na converso de um dado no numrico: Val a nica funo que consegue tratar um dado String que no represente um valor. Nesse caso, ela retornar zero. As outras funes, inclusive CLng, geram um erro de execuo se forem usadas para esse tipo de converso. A converso de um dado tipo String em uma data feita pela funo CDate. Essa funo tambm gera um erro de execuo se o texto a ser convertido no representar uma data vlida. Veja sua sintaxe e um exemplo de utilizao:
CDate(<data>) ' Define a data: vDia = "12/02/1969" ' Converte vDia para vDataNasc, do tipo Date. vDataNasc = CDate(vDia)

Obs.: as linhas iniciadas com o apstrofo (') so comentrios.

Microsoft Visual Basic 6

25

O VB tambm possui uma funo para converso de expresses numrica ou data em dados tipo String: a funo Str, cuja sintaxe :
Str(<valor>)

Por exemplo: o resultado da linha de comando Str(3.1416) ser o texto 3.1416.

Operadores
Depois que o programa recebe dados do usurio, o prximo passo fazer algo com esses dados, normalmente clculos. Qualquer tipo de clculo envolve uma operao; portanto, os comandos especiais para trabalhar com dados so chamados operadores. O VB fornece cinco tipos de operadores:

Operadores Aritmticos
So os operadores matemticos clssicos, que permitem somar, subtrair, multiplicar e dividir nmeros ou variveis que contenham nmeros: Operador Funo = Nesse caso, atribuio de valor + Soma de dois nmeros Subtrao de dois nmeros Inverso de positivo/negativo * Multiplicao de dois nmeros / Diviso de dois nmeros, sendo que o resultado ser um nmero com ponto flutuante (decimal), como 5.8547 \ Diviso de dois nmeros, sendo que o resultado ser um nmero inteiro Mod Resto da diviso inteira de um nmero por outro ^ Exponenciao Exemplo Varivel = 0 vSoma = X + Y vSalLiq = vSalBruto vImposto vNegativo = vPositivo vTotal = vPreo * vQuantidade vTeste = 1910 / 25 (vTeste ser igual a 76.4) vTeste = 1910 \ 25 (vTeste ser igual a 76) vTeste = 1910 Mod 25 (vTeste ser igual a 10) vQuadrado = vNmero ^ 2

Operador de String
O mais simples de todos. o operador &, que realiza a concatenao (unio) de dois ou mais dados tipo String. Veja um exemplo:
vLinguagem = Visual & Basic

O comando acima resulta em Visual Basic, pois o dado aps o operador agrupado por este ao final do primeiro, resultando na unio de ambos: foram concatenados. Tambm pode ser usado para isso o operador +, mas recomenda-se usar & porque este converte dados de outros tipos antes da concatenao, evitando erros de execuo.

Operadores de Datas
So aqueles que permitem efetuar clculos com dados tipo Date. Como as datas so representadas internamente pelo VB como nmeros, podemos obter outras datas somando valores a elas, ou ento determinar o nmero de dias entre uma data e outra atravs de subtrao. Veja a tabela: Operador Funo Exemplo + Obter a partir da soma de uma data inicial e um nmero vVencimento = Date + 30 (Date uma outra data. O nmero ser entendido como retorna a data de hoje, qual sero quantidade de dias. somados trinta dias) Obter a diferena em dias entre duas datas vAtraso = vPagto vVenc (vAtraso receber o nmero de dias entre o vencimento e o pagamento) Um lembrete: como o tipo Date tambm serve para indicar horas, para clculos de horas usamos os mesmos operadores, mas trabalhamos com a parte decimal das variveis ou expresses.

Microsoft Visual Basic 6

26

Operadores Lgicos
So aqueles que manipulam os valores lgicos True (verdadeiro) e False (falso). O VB tambm representa esses valores como 1 e 0, respectivamente. No entraremos em muitos detalhes com esses operadores agora, pois eles sero mais bem estudados quando abordarmos as estruturas de controle. Operador Funo And E lgico: retorna verdadeiro se todos os valores da expresso forem verdadeiros e falso em qualquer outro caso Or Ou lgico: retorna falso somente se todos os valores da expresso forem falsos e verdadeiros em qualquer outro caso Xor Ou lgico exclusivo: a diferena desse operador para Or que, se todos os valores da expresso forem verdadeiros, ele retorna falso (no h erro, isso mesmo!) Not No lgico: nega, ou melhor, inverte o valor lgico da expresso Exemplo Expresso1 And Expresso2 Expresso1 Or Expresso2 Expresso1 Xor Expresso2 Expresso1 = Not Expresso2

Operadores de Comparao
Servem para a comparao de dados. Assim como os operadores lgicos, estudaremos melhor esse assunto juntamente com as estruturas de controle. Operador < <= > >= = <> Funo Menor que Menor ou igual a Maior que Maior ou igual a Nesse caso, igual a Diferente de Exemplo Expresso1 < Expresso2 Expresso1 <= Expresso2 Expresso1 > Expresso2 Expresso1 >= Expresso2 Expresso1 = Expresso2 Expresso1 <> Expresso2

Muito cuidado ao comparar strings com os operadores = e <>, pois duas strings so iguais apenas se forem absolutamente idnticas. Isso quer dizer que, se voc fizer a comparao a = A, o resultado ser falso, pois a (minsculo) possui um cdigo ASCII diferente de A (maisculo), e portanto no so iguais.

O Foco
No Windows, apenas uma janela (formulrio) ou controle pode, num dado instante, receber aes (cliques) do mouse ou entradas via teclado. Dizemos que esse objeto possui o foco (focus, em ingls). O foco geralmente indicado por uma legenda ou moldura destacada, ou ento pelo cursor estar posicionado no controle, e pode ser alterado pela ao do usurio ou atravs de cdigo. Quando um objeto recebe o foco, ocorre o evento Got-Focus, e quando ele o perde ocorre o evento LostFocus. Outra caracterstica importante a ser observada que, quando um programa VB executado, o cursor se posiciona no primeiro controle que voc inseriu no formulrio. Por exemplo: se o primeiro controle a ser inserido foi o txtNum1, quando voc iniciar o aplicativo nele que o cursor estar posicionado. Usando a tecla Tab, o cursor vai se alternando entre os campos, sempre seguindo a ordem em que os controles foram colocados no formulrio. Isso chama-se ordem de tabulao e determinada pela propriedade TabIndex dos controles.

Propriedade TabIndex
Como j foi dito, conforme voc insere controles em um formulrio eles recebem uma ordem para recebimento do foco, que o valor da propriedade TabIndex. O primeiro controle receber o valor 0 para TabIndex, o segundo 1, e assim por diante. Essa ordem pode ser mudada pelo programador, bastando alterar o valor de TabIndex de modo a ajust-la. No caso de ser digitado para TabIndex um valor j pertencente a outro controle, o VB vai reorganiz-los automaticamente. TabIndex no pode ser alterada em tempo de execuo.

Microsoft Visual Basic 6

27

Propriedade TabStop
Essa propriedade impede o acesso ao controle pela tecla Tab se estiver desligada. Isso acontece porque TabStop determina se o controle deve ou no atender ordem de tabulao. Mas importante ressaltar que TabStop no evita que o usurio acesse o controle usando o mouse. Os valores possveis para TabStop so True (TabStop ligada) ou False (TabStop desligada).

Propriedade Default
Existem, nas aplicaes para Windows, botes de comando que podem ser acionados pela tecla Enter, independente da ordem de tabulao, como os botes Ok das caixas de dilogo do Windows. Quem determina o acionamento do boto por Enter a propriedade Default, que pode receber os valores True ou False. O objeto cuja propriedade Default for igual a True aparecer com um contorno mais espesso, dando a indicao que, se Enter for pressionada, ele ser acionado.

Mtodo SetFocus
Para posicionar o foco em um determinado objeto em tempo de execuo usamos o mtodo SetFocus, sendo que somente formulrios ou controles visveis podem receb-lo. A sintaxe a seguinte:
objeto.SetFocus

Modificando a Calculadora
Vamos agora aplicar o que aprendemos: 1. Se ainda no o fez, abra a VB e o projeto da calculadora que iniciamos na lio anterior; 2. Execute o aplicativo e verifique se a ordem de tabulao corresponde seguinte: txtNum1 = 0, txtNum2 = 1, cmdIgual = 2 e cmdLimpar = 3. Se necessrio, altere as propriedades TabIndex dos controles para que fiquem de acordo com a ordem indicada; 3. No formulrio da calculadora, selecione o boto cmdIgual e pressione a tecla Delete. Lembra-se que havia programao associada a ele? E agora que esse objeto apagado, para onde ela foi? 4. Abra a janela Cdigo e procure a seo General do formulrio. Note que a lista Proc agora contm, alm da seo Declarations, a procedure cmdIgual_Click, que est l como uma procedure geral. Uma procedure geral aquela que pode ser chamada por qualquer outra procedure do formulrio, ou seja, funciona como uma subrotina ou funo. Ela no executada por estar associada a um objeto e a partir de um evento, e sim quando chamada. Estudaremos isso melhor na prxima lio; 5. Agora altere o formulrio da calculadora como no exemplo:

6. Altere as propriedades dos novos objetos seguindo a tabela:

Microsoft Visual Basic 6

28

Objeto Nome Label Label1 Label Label2 Boto de Comando cmdMultiplicar Boto de Comando cmdDividir Boto de Comando cmdSomar Boto de Comando cmdSubtrair

Outras Propriedades = Valor Caption = Primeiro Nmero: Caption = Segundo Nmero: Style = 1 Graphical Picture = Misc\MISC20.ICO Style = 1 Graphical Picture = Misc\MISC21.ICO Style = 1 Graphical Picture = Misc\MISC18.ICO Style = 1 Graphical Picture = Misc\MISC19.ICO

7. Chame a janela Cdigo e procure a procedure cmdIgual_Click (est na seo Declarations, lembra-se?) e altere seu nome para cmdMultiplicar_Click. Ao trmino da alterao, o cdigo do antigo boto cmdIgual ser associado ao boto cmdMultiplicar (veja nas caixas de combinao da janela Cdigo); 8. Altere a procedure cmdMultiplicar para que fique de acordo com a codificao a seguir. Note que foi includa na programao a declarao das variveis como do tipo Single, e a funo de converso usada foi substituda pela CSng, que apropriada a esse tipo:
Private Sub cmdMultiplicar_Click() Dim vValor1 As Single Dim vValor2 As Single vValor1 = CSng(txtNum1.Text) vValor2 = CSng(txtNum2.Text) lblResultado.Caption = Format(vValor1 * vValor2, "###,##0.00") End Sub

9. Selecione todo o texto da procedure, menos o cabealho e End Sub, e copie para a rea de transferncia usando a opo Copy do menu Edit ou teclando Ctrl+C; 10. Abra a janela cdigo no evento Click de outro boto e cole o trecho de programao usando a opo Paste do menu Edit ou ento Ctrl+V; 11. Faa as alteraes necessrias para que o boto funcione corretamente; 12. Repita esse procedimento para os outros operadores; 13. Grave seu trabalho e teste o aplicativo.

Microsoft Visual Basic 6

29

Lio 4: Estruturas de Controle


Assim como em outras linguagens, como C ou Pascal, o VB tambm possui estruturas de tomada de deciso e para controle de repetio (loops). Nessa lio aprenderemos a lidar com essas estruturas e tambm mais alguns recursos da linguagem.

Estruturas de Deciso
Estruturas de deciso so aquelas que permitem o desvio do fluxo do programa de acordo com uma condio. As estruturas de deciso do VB so similares s encontradas em outras linguagens:

Estrutura If...Then
Executa um comando ou uma srie de comandos de acordo com uma condio. Se a condio no for verdadeira, os comandos sero ignorados e a execuo do programa passa para o prximo comando aps a estrutura. Essa estrutura pode ser escrita de duas maneiras:
If <condio> Then <comando>

ou:
If <condio> Then <comando1> <comando2> ... <comandoN> End If

O que diferencia as duas estruturas o nmero de comandos executados se <condio> for verdadeira. Na primeira somente um comando executado, por isso esse comando pode vir logo aps a palavra reservada Then, e o comando End If no necessrio. Exemplo:
If txtNome.Text = Empty Then MsgBox Um nome deve ser digitado!

Na segunda vrios comandos devem ser executados se a condio for verdadeira, ento cada comando dever ser escrito em uma linha e o comando End If deve ser usado para fechar a estrutura. Veja dois exemplo:
If txtNome.Text = Empty Then MsgBox Um nome deve ser digitado! End If If vSaldoMdio > 1000 Then lblStatus.Caption = Cliente Especial vTaxaJuros = 0.015 End If

Estrutura If...Then...Else
Semelhante ao If...Then, porm contm um ou mais comandos para serem executados no caso da condio ser falsa, indicados pelo Else da sintaxe:
If <condio> Then <comandos para condio verdadeira> Else <comandos para condio falsa> End If

A condio testada, e, se for verdadeira, o primeiro conjunto de comandos ser executado. Se for falsa, o segundo conjunto ser executado. Exemplo:
If vSaldoMdio > 1000 Then lblStatus.Caption = Cliente Especial vTaxaJuros = 0.015 Else lblStatus.Caption = Cliente Comum vTaxaJuros = 0.018 End If

Microsoft Visual Basic 6

30

Estrutura Select Case


Quando houver a necessidade de se testar um nmero maior de situaes o VB nos oferece a estrutura Select Case, que possibilita a construo de cdigo mais eficiente e legvel do que um encadeamento de Ifs. Sua sintaxe a seguinte:
Select Case <expresso> Case <valor1> <comandos para valor1> Case <valor2> <comandos para valor2> ... Case <valorN> <comandos para valorN> [Case Else] [<comandos>] End Select

Valor1, valor2, valorN so os valores que a expresso pode assumir: se a expresso assumir o valor1 os comandos para o valor1 sero executados, se assumir valor2 os comandos para valor2 sero executados, e assim por diante. Se o valor assumido no for nenhum dos valores indicados, os comandos aps o Case Else sero executados. interessante destacar que Case Else opcional. Exemplo:
Select Case vCodigoCliente Case 1 lblStatus.Caption = vTaxaJuros = 0.012 Case 2 lblStatus.Caption = vTaxaJuros = 0.015 Case 3 lblStatus.Caption = vTaxaJuros = 0.018 Case Else lblStatus.Caption = End Select Cliente Preferencial Cliente Especial Cliente Comum Cdigo Invlido

Estrutura If...ElseIf
Essa uma variao do comando If que possui uma sintaxe muito parecida com o Select Case:
If <expresso1> Then <comandos para expresso1> ElseIf <expresso2> Then <comandos para expresso2> ElseIf <expresso3> Then <comandos para expresso3> ... ElseIf <expressoN> Then <comandos para expressoN> [Else] [<comandos>] End If

Por exemplo: o comando que codificamos com Select Case, se escrito com If...ElseIf, ficaria assim:
If vCodigoCliente = 1 Then lblStatus.Caption = Cliente Preferencial vTaxaJuros = 0.012 ElseIf vCodigoCliente = 2 Then lblStatus.Caption = Cliente Especial vTaxaJuros = 0.015 ElseIf vCodigoCliente = 3 Then lblStatus.Caption = Cliente Comum vTaxaJuros = 0.018 Else lblStatus.Caption = Cdigo Invlido End Select

Microsoft Visual Basic 6

31

Comando With
Esse um comando muito til quando temos vrias instrues que sero aplicadas a um mesmo objeto. Ele informa ao VB qual objeto deve ser considerado sempre que em um comando qualquer no houver nenhuma indicao da aplicao de uma propriedade, mtodo ou campo. Sua sintaxe :
With <objeto> <comandos a serem aplicado em objeto> End With

mais fcil entender vendo um exemplo prtico: suponhamos que voc precisa aplicar uma srie de comandos a uma caixa de texto:
txtTeste.Visible = True txtOutra.Visible = False txtTeste.FontName = Arial txtTeste.FontSize = 20 txtTeste.FontBold = True txtTeste.Text = Isso um teste.

Com o comando With, voc poderia escrever o mesmo trecho de programao da seguinte maneira:
With txtTeste .Visible = True txtOutra.Visible = False .FontName = Arial .FontSize = 20 .FontBold = True .Text = Isso um teste. End With

Todas as propriedades onde no foi indicada a caixa de texto txtTeste esto sendo aplicadas ela da mesma maneira, devido ao comando With. Note que a instruo aplicada txtOutra no mudou, mesmo estando dentro do conjunto de comandos contidos entre o With e o End With. importante destacar que podem existir um bloco With dentro de outro, sendo que o mais interno ter efeito sobre todos os objetos a ele subordinados enquanto no for encontrado um End With fechando-o. Antes e depois do bloco mais interno, quem tem efeito o With mais externo.

Evento Load
Load o evento que ocorre quando um formulrio lido. Usamos Load normalmente para a inicializao de variveis privadas ou ento para escrever comandos e rotinas que devem ser executadas logo que o formulrio aberto. Ou melhor: no evento Load de um formulrio usamos comandos e rotinas cuja execuo necessria ao seu funcionamento e de seus controles de uma maneira geral.

O Aplicativo TesteCor
Vamos testar o que aprendemos em um novo aplicativo. Ele funcionar assim: quando um boto de comando for clicado, a cor do texto de um label mudar para a prxima cor numa escala pr-definida, e o rtulo desse label dever informar qual a cor atual. Por exemplo: se a cor atual for 2 Verde, passar a ser 3 Ciano. Um outro boto far o processo inverso, ou melhor: a cor passar a ser a anterior na escala. Mas qual a melhor maneira de codificar esse processo todo? Vejamos: Algumas cores sero modificadas a cada vez que um dos botes for clicado. Ento, precisamos guardar o cdigo da cor atual em uma varivel que possa ser acessada por vrias procedures, j que cada evento ligado a uma procedure. Resumindo: precisamos de variveis privadas. Existe tambm uma seqncia de comandos repetida para alguns botes: a mudana de uma das cores do label e a exibio do nome dessa cor. Ento, podemos criar uma subrotina que contenha essa seqncia de comandos e possa ser chamada pela procedure Click de um dos botes, de modo a no haver necessidade de repetio de cdigo.

Microsoft Visual Basic 6

32

Funes QBColor e RGB


Essas funes geram cores de acordo com valores que representam cdigos associados a elas. A diferena entre ambas que QBColor s aceita os valores de 0 a 15, cada um representando uma cor diferente, enquanto RGB permite a composio de uma cor pela mistura das cores bsicas Vermelho (Red), Verde (Green) e Azul (Blue), da seu nome. A quantidade de vermelho, verde e azul que deve ser usada na composio da cor representada por valores inteiros que variam de 0 a 255. Veja as sintaxes:
QBColor(<cdigo>) RGB(<vermelho>,<verde>,<azul>)

Os cdigos aceitos por QBColor so os seguintes: Cdigo 0 1 2 3 Cor Preto Azul Verde Ciano Cdigo 4 5 6 7 Cor Vermelho Magenta Amarelo Branco Cdigo 8 9 10 11 Cor Cinza Azul Claro Verde Claro Ciano Claro Cdigo 12 13 14 15 Cor Vermelho Claro Magenta Claro Amarelo Claro Branco Brilhante

Na tabela abaixo esto os valores de vermelho, verde e azul necessrios para se conseguir algumas cores com a funo RGB: Cor Desejada Preto Azul Verde Azul Claro Vermelho Magenta Amarelo Branco Vermelho 0 0 0 0 255 255 255 255 Verde 0 0 255 255 0 0 255 255 Azul 0 255 0 255 0 255 0 255

Como voc com certeza j percebeu, em nosso caso a funo QBColor a que melhor se encaixa. Mas vamos comear a trabalhar: crie o formulrio de acordo com o exemplo:

Altere as propriedades dos objetos: Objeto Formulrio Label Label Nome FrmTeste Label1 Label2 Outras Propriedades = Valor Caption = Teste das Cores StartUpPosition = 2 Center Screen Caption = Cor do Texto: Caption = Cor do Fundo:

Microsoft Visual Basic 6

33

Objeto Label

Nome LblTeste

Label Label Boto de Comando Boto de Comando Boto de Comando Boto de Comando

LblTexto LblFundo cmdTextoAnt cmdTextoProx cmdFundoAnt cmdFundoProx

Outras Propriedades = Valor Caption = Teste das Cores Alignment = 2 Center BackColor = Branco BorderStyle = 1 Fixed Single Font = Arial, Negrito, tamanho 20 Caption = 0 Preto BorderStyle = 1 Fixed Single Font = Negrito Caption = 15 Branco Brilhante BorderStyle = 1 Fixed Single Font = Negrito Caption = Anterior Caption = Prxima Caption = Anterior Caption = Prxima

Sendo assim, vamos criar nossa codificao: 1. Abra a janela Cdigo na seo Declarations. Vamos declarar as variveis privadas:
Dim vCorTexto As Integer Dim vCorFundo As Integer

2.

D agora um duplo click sobre uma rea do formulrio que no contenha nenhum controle. A janela Cdigo aberta no evento Load do objeto Form, aonde vamos inicializar as variveis que declaramos no item anterior:

Private Sub Form_Load() vCorTexto = 0 vCorFundo = 15 End Sub

3. Acesse a procedure Click do boto cmdTextoAnt e escreva os comandos abaixo:


Private Sub cmdTextoAnt_Click() vCorTexto = vCorTexto - 1 If vCorTexto < 0 Then vCorTexto = 15 MudaCorTexto End Sub

Note como o comando If...Then foi usado: j que s existe um comando aps Then, End If no foi necessrio. No entanto, poderamos escrever essa estrutura da seguinte maneira, com o mesmo resultado:
If vCorTexto < 0 Then vCorTexto = 15 End If

Voc deve ter percebido tambm que temos algo novo nessa procedure: o comando MudaCorTexto. Na verdade, isso a chamada a uma subrotina, aquela que citamos quando estvamos planejando nosso aplicativo. Podemos criar uma subrotina atravs da opo Add Procedure do menu Tools: o VB abre uma caixa de dilogo onde devemos informar, entre outras coisas, o nome da subrotina que ser criada (veja a figura na prxima pgina), mas existe uma maneira mais simples:

Criando uma Subrotina


A criao de subrotinas pode ser feita diretamente na janela Cdigo, bastando para isso fazer a declarao da procedure (ou funco veremos mais adiante). Subrotinas podem ser declaradas como privadas ou pblicas. Usamos a palavra reservada Sub para inicar uma procedure, e o comando End Sub para fech-la. 1. Com a janela Cdigo aberta, escolha a opo General na caixa de combinao Object. Proc deve estar na seo Declarations; 2. Declare a procedure MudaCorTexto escrevendo o cabealho a seguir:
Public Sub MudaCorTexto()

Microsoft Visual Basic 6

34

A janela Add Procedure

3. Note que, quando terminar a declarao, o prprio VB insere o comando End Sub fechando a procedure, que deve estar parecida com a da figura abaixo:

4. Vamos ento escrever os comandos da subrotina:


Private Sub MudaCorTexto() lblTeste.ForeColor = QBColor(vCorTexto) With lblTexto Select Case vCorTexto Case 0 .Caption = "0 - Preto" Case 1 .Caption = "1 - Azul" Case 2 .Caption = "2 - Verde" Case 3 .Caption = "3 - Ciano" Case 4 .Caption = "4 - Vermelho" Case 5 .Caption = "5 - Magenta" Case 6 .Caption = "6 - Amarelo" Case 7 .Caption = "7 - Branco" Case 8 .Caption = "8 - Cinza" Case 9 .Caption = "9 - Azul Claro" Case 10 .Caption = "10 - Verde Claro" Case 11 .Caption = "11 - Ciano Claro" Case 12 .Caption = "12 - Vermelho Claro" Case 13 .Caption = "13 - Magenta Claro" Case 14 .Caption = "14 - Amarelo Claro" Case Else .Caption = "15 - Branco Brilhante"

Microsoft Visual Basic 6

35

End Select End With End Sub

5. Execute o aplicativo, teste o funcionamento do boto e verifique se est de acordo com o planejado. 6. Escreva a procedure cmdTextoProx_Click: note que ela quase igual do boto cmdTextoAnt, s que muda para a prxima cor na escala:
Private Sub cmdTextoProx_Click() vCorTexto = vCorTexto + 1 If vCorTexto > 15 Then vCorTexto = 0 'Chamada da subrotina: MudaCorTexto End Sub

7.

Escreva agora as procedures para os eventos click dos botes cmdFundoAnt e cmdFundoProx, e a subrotina a ser chamada por elas, que deve ter o nome de MudaCorFundo. A propriedade a ser alterada para exibir a nova cor a BackColor;

8. Teste o funcionamento de todos os botes e verifique se est de acordo com nosso planejamento. 9. Salve o formulrio com o nome de frmTeste e o projeto com o nome de TesteCor.

Estruturas de Repetio
As Estruturas de Repetio permitem que uma ou mais linhas de cdigo sejam executadas um determinado nmero de vezes ou at que uma condio seja verdadeira. Resumindo: criam loops.

Estruturas Do While
A estrutura Do While (faa enquanto) permite que um determinado bloco de comandos seja executado enquanto uma condio for verdadeira. Existem dois tipos de estruturas Do While: Loop com teste a priori: como voc sabe, esse tipo de loop testa sua condio de trmino antes da execuo dos comandos que esto nele contidos, o que implica na possibilidade desses comandos no serem executados, caso a condio de trmino seja satisfeita logo de incio. A sintaxe para a criao de loops com teste a priori em VB usando Do While a seguinte:
Do While <condio> <comandos> Loop

Loop com teste a posteriori: j esse tipo de loop testa sua condio de trmino aps a execuo dos comandos nele contidos, ou seja, os comandos sero executados ao menos uma vez, mesmo que a condio de trmino seja satisfeita logo de incio. A sintaxe de Do While com teste a posteriori a seguinte:
Do <comandos> Loop While <condio>

Veja exemplos da estrutura Do While usando os dois tipos de loop para a mesma operao:
Do While vTotal < 500 vTotal = vTotal + Quantidade Loop Do vTotal = vTotal + Quantidade Loop While vTotal < 500

Estruturas Do Until
Do Until quer dizer faa at que. Essa estrutura difere da anterior por executar os comandos do loop enquanto a condio for falsa. Tambm existem duas sintaxes para Do Until: Loop com teste a priori:
Do Until <condio> <comandos> Loop Do <comandos> Loop Until <condio>

Loops com teste a posteriori:

Microsoft Visual Basic 6

36

Para que a diferena entre as duas estruturas fique mais clara, vamos alterar os exemplos usados em Do While para estruturas Do Until. Note que foi necessria uma mudana na formulao da condio de trmino do loop para obtermos o mesmo efeito:
Do Until vTotal >= 500 vTotal = vTotal + Quantidade Loop Do vTotal = vTotal + Quantidade Loop Until vTotal >= 500

Estrutura For Next


Essa estrutura deve ser usada quando se conhece de antemo o nmero de vezes que o loop ser executado. Sua sintaxe a seguinte:
For <contador> = <valor inicial> To <valor final> [Step <valor do incremento>] <comandos> Next <contador>

Onde: Contador uma varivel que ser usada para controlar o nmero de vezes que o loop ser executado; Valor Inicial o primeiro valor que a varivel de controle assumir; Valor Final o ltimo valor que o contador assumir na execuo do loop; Valor do Incremento o valor que ser somado ou subtrado (pois podemos usar valores negativos) do contador a cada vez que Next for executado. Ao entrar em um loop For Next o VB faz com que o contador seja igual ao valor de incio. A cada vez que os comandos so executados e a estrutura atinge o Next, o contador incrementado pelo valor indicado em Step (que opcional se no for declarado ser assumido o valor 1) e comparado com o valor final indicado. Se o contador ultrapassar o valor final, o loop ser terminado, caso contrrio a seqncia de comandos ser executada novamente. Exemplo: a estrutura abaixo calcula a soma dos nmeros de 1 a 100:
vSoma = 0 For i = 1 To 100 vSoma = vSoma + i Next i

Com uma pequena mudana na estrutura, somaremos apenas os nmeros mpares entre 1 e 100:
vSoma = 0 For i = 1 To 100 Step 2 vSoma = vSoma + i Next i

Comando Exit
O comando Exit permite que um loop ou uma subrotina sejam abandonados (terminem antes do final normal de sua execuo). A sintaxe do comando Exit exige que indiquemos que estrutura queremos abandonar, assim: Para abandonar um loop Do Para abandonar um loop For Para abandonar uma subrotina Sub Para abandonar uma subrotina Function : Exit : Exit : Exit : Exit
Do For Sub Function

And, Or, Xor e Not


Os operadores lgicos And, Or, Xor e Not (E, Ou, Ou exclusivo e No) so normalmente usados em estruturas de controle para estabelecer uma relao entre duas ou mais condies em uma mesma expresso. Como j vimos na lio 2, a funo desses operadores a seguinte: And faz uma combinao das condies, retornando verdadeiro somente se todas as condies da expresso forem verdadeiras. Or funciona de maneira contrria: a expresso s ser falsa se todas as condies forem falsas.

Microsoft Visual Basic 6

37

Xor semelhante a Or, mas retorna falso se todas as condies forem verdadeiras. Not inverte a condio de verdadeiro para falso e vice-versa. Veja a tabela de resultados: Operador And Condio 1 Verdadeiro Verdadeiro Falso Falso Verdadeiro Verdadeiro Falso Falso Verdadeiro Verdadeiro Falso Falso Verdadeiro Falso Condio 2 Verdadeiro Falso Verdadeiro Falso Verdadeiro Falso Verdadeiro Falso Verdadeiro Falso Verdadeiro Falso Resultado Verdadeiro Falso Falso Falso Verdadeiro Verdadeiro Verdadeiro Falso Falso Verdadeiro Verdadeiro Falso Falso Verdadeiro

Or

Xor Not

O Aplicativo Fatorial
Para testar o uso das estruturas de repetio, vamos escrever um pequeno aplicativo para calcular o fatorial de um nmero inteiro (n!), que o resultado da multiplicao dos nmeros inteiros de 1 at n. Exemplo: 5! = 1 2 3 4 5 = 120

Veja o modelo e a tabela de propriedades no incio da prxima pgina. A codificao do aplicativo envolve apenas um evento: quando o usurio clicar em cmdCalcular ou teclar Enter o fatorial do nmero digitado em txtNmero ser calculado e exibido em lblFatorial. 1. Inicie um novo projeto; 2. Formate o formulrio e altere as propriedades dos objetos como a seguir:

Objeto Formulrio Label Label Caixa de Texto Label

Nome frmFatorial Label1 Label2 txtNmero lblFatorial

Outras Propriedades = Valor Caption = Fatorial StartUpPosition = 2 Center Screen Caption = Digite um nmero: Caption = O fatorial desse nmero : Text = Caption = Alignment = 2 Center BackColor = Branco BorderStyle = 1 Fixed Single Caption = Calcular Default = True

Boto de Comando cmdCalcular

Microsoft Visual Basic 6

38

3. Abra a janela Cdigo no evento Click do boto Calcular e escreva os comandos para o clculo:
Private Sub cmdCalcular_Click() Dim vNmero As Double, vFatorial As Double vNmero = Val(txtNmero.Text) If vNmero < 0 Then Beep lblFatorial.Caption = Empty Else If vNmero = 0 Or vNmero = 1 Then lblFatorial.Caption = 1 Else vFatorial = 1 Do vFatorial = vFatorial * vNmero vNmero = vNmero - 1 Loop Until vNmero <= 1 lblFatorial.Caption = Str(vFatorial) End If End If txtNmero.SetFocus End Sub

Observaes: Por definio, 0! = 1; O comando Beep faz com que o computador emita um sinal sonoro (um apito). Note o uso do operador Or no segundo If: poderamos escrever a condio vNmero <= 1 ao invs da expresso usada, j que nesse ponto temos a certeza que vNmero no negativo (veja o If anterior), mas fizemos isso para exemplificar o uso de Or; Como exerccio de fixao, reescreva o loop do clculo do fatorial usando as estruturas Do While e For Next. Tente tambm modificar as estruturas de teste a posteriori para teste a priori. 4. Grave o formulrio com o nome de frmFator e o projeto com o nome de Fatorial.

Microsoft Visual Basic 6

39

Lio 5: Tratamento de Erros de Execuo


Eis um assunto importantssimo: tratamento de erros irrecuperveis de execuo. Quando um erro irrecupervel acontece, o VB emite uma mensagem informando o erro e encerra a execuo do aplicativo. Esses erros acontecem sob vrias condies: um arquivo no encontrado, incompatibilidade entre tipos de variveis, uma chamada de funo invlida, falta de memria, etc. fcil conferirmos essa caracterstica: execute a calculadora que fizemos na lio 2 e, ao invs de um nmero, digite uma letra qualquer nas caixa de textos. Quando voc executar um clculo, uma caixa de mensagem com os dizeres Run-time Error aparecer informando o tipo do erro que ocorreu, e o aplicativo ser encerrado. Nessa lio aprenderemos a trabalhar com esses erros de modo que, mesmo que um deles acontea, o aplicativo no seja encerrado. Adicionalmente, aprenderemos a usar as caixas de mensagem e de entrada da dados do VB.

Comando On Error
Esse comando a chave para o tratamento de erros no VB: sua funo a de desviar o fluxo da execuo de uma procedure para um pargrafo em caso de erro irrecupervel. Sua sintaxe a seguinte:
On Error GoTo <nome_de_pargrafo>

O pargrafo para o qual o fluxo ser desviado deve obrigatoriamente fazer parte da mesma procedure, e deve estar posicionado no final da mesma, antes do comando End Sub. O nome do pargrafo identificado por ser terminado com dois pontos :.

Comando Resume
O comando Resume indica ao VB que o aplicativo deve continuar a ser executado mesmo em caso de erro irrecupervel. Veja a sintaxe:
Resume <destino>

Sendo que o <destino> da execuo no obrigatrio. Se no for informado, a execuo passa para a prxima instruo na seqncia normal do programa. As opes para <destino> so: Next: produz um desvio para a prxima instruo na seqncia normal da execuo do aplicativo; 0: faz com que o execuo retorne ao incio da procedure atual (parmetro recursivo); Nome_De_Pargrafo: desvia a execuo para um pargrafo da procedure atual.

Objeto Err
O objeto Err indica o cdigo do erro irrecupervel ocorrido, atravs da propriedade Number, de tipo Integer. Pelo cdigo informado por Err.Number podemos identificar o erro e escrever os comandos necessrios para que o aplicativo continue funcionando. Outra propriedade interessante do objeto Err a Description, que contm a descrio do erro ocorrido. Para obter a lista completa com os cdigos dos erros tratveis do VB, acesse o menu Help e escolha a seqncia Contents Trappable Errors Miscellaneous Messages. Vejamos ento um exemplo da utilizao desses recursos:
Public Sub Exemplo_Erro() Dim vQualquer As Integer On Error GoTo Erro_Na_Converso vQualquer = CInt(txtNmero.Text) Erro_Na_Converso: If Err.Number = 13 Then '13 o cdigo de erro para Tipo Incompatvel de Dados: vQualquer = 0 Resume Next End If End Sub

Microsoft Visual Basic 6

40

Como j citamos anteriormente, a funo CInt gera um erro irrecupervel em caso de tipo incompatvel de dados (Type Mismatch) na tentativa de converso de uma string que no represente um valor. Na procedure Exemplo_Erro estamos dizendo para o VB que, se isso acontecer, a execuo deve ser desviada para o pargrafo Erro_Na_Converso, onde testamos o valor de Err.Number e escrevemos a codificao necessria para que o programa continue normalmente. O comando Resume Next indica ento ao VB que a execuo deve ser desviada para a prxima instruo na seqncia normal da programao.

Caixas de Mensagem
At agora falamos sobre o tratamento de erros mas no informamos ao usurio o que exatamente aconteceu, o que muito importante em qualquer aplicativo que se preze. Uma das formas que o VB nos oferece para fornecer mensagens ao usurio so as caixas de mensagens padronizadas. Por exemplo: supondo que o campo Nome de um aplicativo qualquer no possa ser deixado em branco pelo operador, se isso acontecer, poderamos exibir na tela uma caixa de mensagem como a da figura:

Caixas de mensagem padronizadas como essa podem ser obtidas com o comando MsgBox e a funo MsgBox. Veja a sintaxe de ambos:
MsgBox <mensagem>,<tipo>,<ttulo> <varivel> = MsgBox(<mensagem>,<tipo>,<ttulo>)

Onde: Mensagem: uma string com a mensagem a ser exibida pela caixa. Esse o nico parmetro obrigatrio da sintaxe. No nosso exemplo: O campo Nome deve ser preenchido!; Tipo: um valor obtido a partir da soma dos cdigos que especificam o nmero e o tipo dos botes exibidos pela caixa, o cone a ser utilizado, o boto default e a modalidade de exibio da caixa. No nosso exemplo esse valor 4144. Esse valor tambm pode ser obtido a partir de algumas constantes de sistema. Veja a seguir uma lista com os valores admitidos e seu significado; Ttulo: uma string a ser exibida como ttulo da caixa. No nosso exemplo: Aviso; Varivel (somente para a funo): nome da varivel que receber o nmero do boto selecionado pelo usurio. Veja a seguir as constantes de sistema usadas para se obter o tipo da caixa com seus respectivos valores: Constante vbOKOnly vbOKCancel vbAbortRetryIgnore vbYesNoCancel vbYesNo vbRetryCancel vbCritical vbQuestion vbExclamation vbInformation vbDefaultButton1 vbDefaultButton2 vbDefaultButton3 Valor 0 1 2 3 4 5 16 32 48 64 0 256 512 Descrio Exibe somente o boto OK. Exibe os botes OK e Cancelar. Exibe os botes Abortar, Repetir e Ignorar. Exibe os botes Sim, No e Cancelar. Exibe os botes Sim e No. Exibe os botes Repetir e Cancelar. Exibe o cone Mensagem Crtica : Exibe o cone Consulta de Aviso: Exibe o cone Mensagem de Aviso: Exibe o cone Mensagem de Informao: O primeiro boto o default. O segundo boto o default. O terceiro boto o default.

Microsoft Visual Basic 6

41

Constante vbDefaultButton4 vbApplicationModal vbSystemModal

Valor Descrio 768 O quarto boto o default. 0 Janela restrita do aplicativo: o usurio deve responder caixa de mensagem antes de continuar o trabalho no aplicativo atual. 4096 Janela restrita do sistema: todos os aplicativos so suspensos at que o usurio responda caixa de mensagem.

No nosso exemplo, o valor 4144 pois usamos apenas o boto Ok (0), o cone Exclamao (48), o boto Ok o default por ser o nico (0), e a modalidade sistema (4096). Ento, 0 + 48 + 0 + 4096 = 4144. O comando completo para se obter a caixa de mensagem do exemplo a seguinte:
MsgBox O campo Nome deve ser preenchido!, 4144, Aviso

Podemos tambm usar as constantes correspondentes configurao desejada:


MsgBox O campo Nome deve ser preenchido!, _ vbOk + vbExclamation + vbDefaultButton1 + vbSystemModal, Aviso

Ou ento apenas aquelas que tero algum efeito na configurao (so diferentes de zero):
MsgBox O campo Nome deve ser preenchido!, _ vbExclamation + vbSystemModal, Aviso

Ou ainda uma varivel:


vConf = vbExclamation + vbSystemModal MsgBox Nome deve ser preenchido!, vConf, Aviso

Obs.: o smbolo _ (subscrito) indica continuao da codificao na prxima linha.

Identificando o boto selecionado


A diferena entre o comando MsgBox e a funo MsgBox que a funo retorna um nmero inteiro representando o boto selecionado pelo usurio na caixa de mensagem. Assim, podemos identificar esse boto e executar a ao correspondente a ele. Veja os valores retornados por MsgBox: Constante vbOK vbCancel vbAbort vbRetry vbIgnore vbYes vbNo Valor 1 2 3 4 5 6 7 Descrio Selecionado o boto Ok. Selecionado o boto Cancelar. Selecionado o boto Abortar. Selecionado o boto Repetir. Selecionado o boto Ignorar. Selecionado o boto Sim. Selecionado o boto No.

Por exemplo: suponha um aplicativo qualquer que possua um boto de comando para encerrar sua execuo, mas que antes disso solicite ao usurio uma confirmao. A programao para isso poderia ser a seguinte:
Private Sub cmdFechar_Click() Dim vOk As Integer vOk = MsgBox("Tem certeza que deseja encerrar o programa?", 36, "Sada") If vOk = 6 Then End End If End Sub

Ou ento, se usarmos as constantes de sistema:


Private Sub cmdFechar_Click() Dim vOk As Integer vOk = MsgBox("Tem certeza que deseja encerrar o programa?", _ vbYesNo + vbQuestion, "Sada") If vOk = vbYes Then End End If End Sub

Em qualquer dos casos, a caixa de mensagem resultante da funo MsgBox acima a seguinte:

Microsoft Visual Basic 6

42

Mas qual a vantagem de se usar constantes de sistema se a codificao fica maior? A resposta : documentao! Leia novamente os dois trechos de programao e seja honesto: qual deles ficou mais fcil de entender?

Caixas de Entrada de Dados


Alm das caixas de mensagem o VB dispe de outro tipo de caixa de dilogo padronizada: as caixas de entrada de dados, que so obtidas com a funo InputBox. A sintaxe dessa funo a seguinte:
<varivel> = InputBox(<mensagem>,<ttulo>,<valor padro>)

Onde: Mensagem: nico parmetro obrigatrio, um texto a ser exibida dentro da caixa como legenda; Ttulo: uma string a ser exibida como ttulo da caixa; Valor padro: o valor que a varivel deve receber de InputBox caso o usurio no digite nada. Importante: a funo InputBox sempre retorna um dado tipo string, portanto se voc precisar de um dado de qualquer outro tipo dever convert-lo. Por exemplo: suponha um boto de comando que permita a digitao de um desconto para a emisso de uma nota fiscal de compra. A programao desse boto poderia ser a seguinte:
Private Sub cmdDesconto_Click() Dim vDesconto As String vDesconto = InputBox("Digite o valor do desconto:", _ "Digitao de desconto") End Sub

A InputBox resultante dessa programao a da figura abaixo:

O Aplicativo Carro
Para usar os conceitos vistos nessa lio, vamos criar um aplicativo que calcule o valor da prestao mensal para financiamento de automvel. Antes de comear, vamos estudar um novo controle que ser usado em nosso projeto:

Caixa de Imagem (ImageBox)


Esse controle muito semelhante a uma PictureBox, pois tambm exibe figuras ou cones nos formulrios. A principal diferena que responde ao evento Click, funcionando como um boto de comando quando clicado. Outra diferena importante a propriedade Stretch, que pode aceitar os valores True e False: quando Stretch = True, o tamanho da imagem ser ajustado ao tamanho da caixa de imagem, permitindo a exibio de figuras que devido ao seu tamanho no caberiam em um formulrio. Se Stretch = False, ento o tamanho da ImageBox que ser ajustado ao da figura. Bem, vamos comear: inicie um novo projeto e formate o formulrio de acordo com o modelo:

Microsoft Visual Basic 6

43

As propriedades dos objetos so as seguintes: Objeto Formulrio Caixa de Imagem Nome frmCarro imgCarro Outras Propriedades = Valor Caption = Financiamento de Automvel StartUpPosition = 2 Center Screen Stretch = True BorderStyle = 1 Fixed Single Picture = CARRO.WMF (Procure na pasta ClipArt\Popular do diretrio do MS-Office) Caption = Valor do Financiamento (R$): Caption = Entrada (R$): Caption = Juros / ms (%): Caption = N de meses: Caption = Valor Financiado (R$): Caption = Prestao Mensal (R$): Caption = Alignment = 2 Center BackColor = Branco BorderStyle = 1 Fixed Single Caption = Alignment = 2 Center BackColor = Branco BorderStyle = 1 Fixed Single Text = Text = Text = Text = Caption = &Calcular Enabled = False Caption = &Fechar Enabled = False TabStop = False

Label Label Label Label Label Label Label

Label1 Label2 Label3 Label4 Label5 Label6 lblValFinanciado

Label

lblPrestMensal

Caixa de Texto txtValor Caixa de Texto txtEntrada Caixa de Texto txtJuros Caixa de Texto txtMeses Boto de Comando cmdCalcular Boto de Comando cmdFechar

Inicialmente o boto Calcular estar desabilitado pois s aps a digitao de todos os dados necessrios o clculo da prestao mensal poder ser feito. A frmula para esse clculo a seguinte:

Prestao Mensal = Valor Financiado * Juros * (1 + Juros)Meses (1 + Juros)Meses - 1

Microsoft Visual Basic 6

44

Antes de comear a programar, vamos conhecer um evento que ser necessrio para nossa codificao:

Evento KeyPress
Sempre que pressionada uma tecla, estando o foco sobre um controle, ocorre o evento KeyPress. Associada a ele est a varivel KeyAscii, que carregada com o cdigo ASCII da tecla pressionada. Dessa maneira podemos identificar quando o usurio usa uma tecla qualquer, e, se for o caso, escrever um cdigo a ser executado quando essa tecla for utilizada. Por exemplo: podemos fazer com que o foco passe para outro controle quando a tecla Enter for pressionada numa caixa de texto. Sabendo-se que o cdigo ASCII da tecla Enter 13, correspondente constante vbKeyReturn, o cdigo para isso poderia ser o seguinte:
Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then Text2.SetFocus End Sub

Propriedade KeyPreview
Essa propriedade dos formulrios indica se, quando pressionada uma tecla qualquer, ela deve ser ou no identificada pelo formulrio. Os valores possveis so True (habilita a verificao das teclas pelo formulrio) e False (desabilita). Usando esse recurso e a funo SendKeys, podemos fazer o Enter funcionar em qualquer campo, atravs do evento KeyPress do formulrio (as linhas precedidas pelo apstrofo so comentrios):
Private Sub Form_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then 'Identifica o Enter SendKeys "{Tab}" 'Grava no buffer do teclado um Tab KeyAscii = 0 'Zera KeyAscii para eliminar o Enter End If End Sub

Na procedure acima, a cada vez que o usurio teclar Enter em um controle para o qual no surta efeito, ele ser substitudo por uma tabulao, e o foco passar para o prximo controle na seqncia de TabIndex. Mas vamos codificar o aplicativo: 1. Abra a janela Cdigo e acesse a seo Declarations. Vamos declarar as variveis que recebero os dados digitados como privadas, pois elas sero acessadas por vrias procedures:
Dim Dim Dim Dim vValor As Currency vEntrada As Currency vJuros As Single vMeses As Integer

2. V agora ao evento Form_Load. Vamos inicializar as variveis:


Private Sub Form_Load() vValor = 0 vEntrada = 0 vJuros = 0 vMeses = 0 End Sub

3. Em tempo de execuo, faremos com que o foco passe de uma caixa de texto para outra quando teclarmos Enter. Para isso vamos alterar o evento KeyPress do formulrio. D um duplo clique sobre uma parte vazia do formulrio e procure o evento KeyPress na lista de procedures; 4. Escreva a procedure como segue:
Private Sub Form_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then SendKeys "{Tab}" KeyAscii = 0 End If End Sub

5. Vamos testar o evento KeyPress: execute o aplicativo e d um Enter na caixa de texto txtValor. Nada aconteceu? porque a propriedade KeyPreview do formulrio no est habilitada. Saia do aplicativo para fazer a correo; 6. Altere o valor da propriedade KeyPreview do formulrio para True;

Microsoft Visual Basic 6

45

7. Teste o aplicativo novamente: se tudo correu bem, o foco passou para a caixa txtEntrada. Desta, o foco vai para txtJuros, e assim por diante. Aps testar em todos os controles, saia do aplicativo para podermos continuar; 8. Agora vamos fazer a codificao necessria para carregar a varivel vValor. Como voc pode observar, como o tipo de vValor Currency, usaremos a funo CCur para converter o texto contido em txtValor para a varivel, o que pode gerar um erro irrecupervel de execuo se txtValor contiver qualquer texto que no represente um valor. Devemos ento usar uma rotina de tratamento de erro para evitar problemas. Mas, onde escrever essa rotina? Podemos fazer isso no evento LostFocus do controle, pois assim uma mensagem de erro ser exibida assim que txtValor perder o foco, se esta contiver um dado invlido. Abra a janela cdigo no evento LostFocus do controle txtValor e escreva a codificao a seguir:
Private Sub txtValor_LostFocus() On Error GoTo Valor_Errado vValor = CCur(txtValor.Text) Valor_Errado: If Err = 13 Then MsgBox "Dado invlido na digitao do valor do financiamento", _ vbExclamation + vbSystemModal, "Aviso" txtValor.Text = InputBox("Informe o valor correto do financiamento:", _ "Valor do Financiamento") Resume 0 End If End Sub

Note que usamos a funo InputBox() para solicitar ao usurio que digite um dado vlido em caso de erro de execuo; Note tambm que o comando Resume seguido do valor 0, o que vai fazer com que o VB retorne ao incio da procedure em caso de erro e refaa a converso do contedo de txtValor. Isso importante pois, caso o usurio insista em escrever um dado invlido na caixa de entrada, o processo todo ser repetido. 9. Vamos testar nossa procedure. Execute o aplicativo e escreva um texto qualquer na caixa txtValor. Digamos, aaa. O resultado deve ser o da figura a seguir:

10. Clicando no boto Ok, dever aparecer a caixa de entrada:

Microsoft Visual Basic 6

46

11. Agora digite um valor correto, como 12000. O texto aparecer na caixa txtValor e o foco passar para txtEntrada. Saia do aplicativo para continuarmos a programao; 12. Usando a procedure txtValor_LostFocus como base, escreva as rotinas para o evento LostFocus das outras caixas de texto. Lembre-se que a varivel vJuros do tipo Single, e portanto voc deve usar a funo CSng para a converso. Alm disso, o valor obtido deve ser dividido por 100, pois um percentual. J para a varivel vMeses, que Integer, voc dever usar a funo CInt; 13. Aps isso, ainda falta escrevermos a rotina de clculo que ser chamada pelo boto cmdCalcular. V at a seo Declarations e adicione uma subrotina de nome Prestao; 14. Na subrotina Prestao escreva a seguinte codificao (note o uso do operador And):
Public Sub Prestao() Dim vValFinanciado As Currency Dim vPrestMensal As Currency If vValor <> 0 And vJuros <> 0 And vMeses <> 0 Then If vEntrada >= vValor Then MsgBox "O valor da Entrada deve ser menor que o do Financiamento", _ vbExclamation + vbSystemModal, "Aviso" lblValFinanciado.Caption = Empty lblPrestMensal.Caption = Empty txtEntrada.SetFocus Exit Sub End If vValFinanciado = vValor - vEntrada vPrestMensal = vValFinanciado * vJuros * (1 + vJuros) ^ vMeses / _ ((1 + vJuros) ^ vMeses - 1) lblValFinanciado.Caption = Format(vValFinanciado, "###,##0.00") lblPrestMensal.Caption = Format(vPrestMensal, "###,##0.00") cmdCalcular.Enabled = True cmdFechar.Enabled = True Else lblValFinanciado.Caption = Empty lblPrestMensal.Caption = Empty End If End Sub

Observaes: O primeiro If verifica se todos os dados necessrios para o clculo esto disponveis; O segundo If verifica se o valor da entrada no maior ou igual ao do financiamento, pois seno o resultado do clculo seria uma prestao negativa (se que isso existe...);

Microsoft Visual Basic 6

47

A propriedade Enabled dos botes de comando s foi habilitada dentro dessa rotina pois assumimos que o usurio far ao menos um clculo quando acionar o programa. 15. Agora s falta fazer com que o boto cmdCalcular execute a subrotina:
Private Sub cmdCalcular_Click() Prestao End Sub

16. Voc tambm pode fazer que, aps o primeiro clculo, toda vez que um valor for alterado os resultados sejam imediatamente atualizados. Para isso, altere a procedure txtValor_LostFocus como a seguir:
Private Sub txtValor_LostFocus() On Error GoTo Valor_Errado vValor = CCur(txtValor.Text) ' s incluir a linha abaixo: Prestao Valor_Errado: If Err = vbKeyReturn Then MsgBox "Dado invlido na digitao do valor do financiamento", _ vbExclamation + vbSystemModal, "Aviso" txtValor.Text = InputBox("Informe o valor correto do financiamento:", _ "Valor do Financiamento") Resume 0 End If End Sub

17. Faa o mesmo para as outras caixas de texto; 18. Nosso aplicativo est praticamente terminado. S falta a programao do boto cmdFechar. Nesse boto, vamos solicitar ao usurio uma confirmao de que ele realmente deseja sair do programa, usando a funo MsgBox:
Private Sub cmdFechar_Click() Dim vOk As Integer vOk = MsgBox("Tem certeza que deseja encerrar o programa?", _ vbYesNo + vbQuestion, "Sada") If vOk = vbYes Then End End Sub

19. Grave o formulrio com o nome de frmCarro e o projeto com o nome de Carro; 20. Por fim, execute o aplicativo e teste-o bem. Procure usar vrios valores diferentes nas caixas de texto para observar os resultados. Tente tambm entrar com dados invlidos e verifique se o comportamento do projeto o esperado. Se necessrio, faa os ajustes na programao para que seu funcionamento seja perfeito.

Microsoft Visual Basic 6

48

Lio 6: Iniciando a Construo de um Sistema


Um projeto em VB um conjunto de objetos. At agora trabalhamos com apenas um objeto em cada projeto: o formulrio. Sim, o formulrio tambm um objeto: voc no reparou que ele tambm possui propriedades e responde a mtodos? Obviamente, em um aplicativo mais complexo, como ser o caso do sistema de Controle de Bibliotecas que comearemos a desenvolver nessa lio, alm do formulrio principal existem outros destinados a entrada de dados, exibio de mensagens ou de resultados de consultas, etc. Existem outros tipos de objetos que podem ser adicionados ao projeto, como mdulos de programao, relatrios, controles ActiveX e mdulos de classe. O que os caracteriza o fato de serem gravados em arquivos separados. Assim, o projeto pode ser considerado como um conjunto de arquivos, cada um deles correspondente a um objeto.

Trabalhando com Vrios Formulrios


Quando estamos desenvolvendo um projeto do qual vrios formulrios faro parte, obviamente vamos precisar adicionar a ele formulrios novos e, muitas vezes, prontos. Alm disso, uma aplicao Windows freqentemente trabalha com outros tipos de formulrios, diferentes daquele que usamos at agora.

Adicionando formulrios ao projeto


Para incluir um novo formulrio ou um formulrio existente em um projeto, siga os seguintes passos: Abra o menu Project do VB; Escolha a opo Add Form: a janela Add Form ser aberta, com vrias opes de tipos de formulrios:

Se desejar acrescentar um formulrio j existente, clique na aba Existing e indique sua localizao; Se o formulrio ainda no existe (formulrio novo), voc deve escolher um dos tipos da aba New. Para um formulrio padro, escolha a opo Form. Em ambos os casos, o formulrio ser includo na lista Forms da janela Projeto. A partir desse momento, ele poder ser manipulado como outro qualquer. Vejamos alguns recursos necessrios a esse trabalho:

Mtodo Show
Esse mtodo usado para carregar e exibir um formulrio. Sua sintaxe :
<formulrio>.Show <modalidade>

Microsoft Visual Basic 6

49

Onde <formulrio> o nome do formulrio, e <modalidade> indica se o formulrio ser exibido como modal ou no. Um formulrio modal aquele que deve ser obrigatoriamente encerrado para que o aplicativo continue: enquanto ele estiver ativo, nenhuma outra janela ou aplicativo pode ser acessado. Para indicar se o formulrio deve ser exibido como modal usamos a constante de sistema vbModal:
frmMeuForm.Show vbModal

Se a modalidade for omitida, ser assumida como no-modal.

Mtodo Refresh
Durante a execuo do sistema, s vezes acontece uma situao que impede a exibio correta do formulrio. Normalmente, isso ocorre quando alteramos um objeto de um formulrio que j est sendo exibido em uma procedure externa a ele, ou ento quando estamos executando aes que demandam uma certa quantidade de recursos do sistema, como na abertura de arquivos. O mtodo Refresh corrige esse problema simplesmente provocando a reconstruo imediata do formulrio. Outros objetos, como os controles Data, tambm aceitam o mtodo Refresh.

Comando Unload
O comando Unload fecha um formulrio e devolve o controle do sistema ao formulrio que o chamou. Sua sintaxe muito simples: basta indicar o nome do formulrio. Exemplo:
Unload frmMeuForm

Eliminando formulrios do projeto


Para excluir um formulrio do projeto, basta clicar com o boto direito do mouse sobre o nome do formulrio na janela Projeto e escolher a opo Remove <nome do formulrio> no menu de contexto.

Formulrios MDI
Um formulrio MDI (Multiple-Document Interface) funciona como uma janela que contm outros formulrios a ela subordinadas (chamados de MDIChild), atuando em background para uma aplicao. Para criar um formulrio MDI voc deve escolher a opo Add MDI Form no menu Project do VB. Por suas caractersticas, o formulrio principal de uma aplicao freqentemente criado como MDI. Veja as principais: Uma aplicao pode conter apenas um formulrio MDI, mas pode conter vrios MDI Child Forms; Se o formulrio MDIChild contm uma estrutura de menus, a barra de menu do formulrio MDI automaticamente atualizada e o menu exibido passa a ser o do MDIChild ativo. Falaremos mais sobre menus logo adiante; Se o formulrio MDI minimizado, todos os formulrios MDIChild abertos tambm so; Se um formulrio MDIChild minimizado, aparece como um cone no rodap do MDI; A maioria das propriedades, mtodos e eventos dos formulrios MDI so os mesmos de um formulrio comum, mas um MDI no pode ser aberto como modal; Um formulrio MDI s pode conter menus e o controle PictureBox, ou ento controles customizados preparados para isso. Voc pode usar outros controles no formulrio MDI apenas se criar uma PictureBox e ento inserir esses controles dentro dela, como se fosse uma moldura; Um formulrio MDIChild no aceita a propriedade StartUpPosition.

Propriedade MDIChild
Essa propriedade indica se um formulrio ser exibido como MDIChild ou no. A propriedade MDIChild s tem efeito quando existe no projeto um formulrio MDI. Nesse caso, qualquer outro formulrio que no o MDI (obviamente) poder ser configurado como MDIChild. Quando o valor de MDIChild True, o formulrio poder ser maximizado, minimizado ou movido dentro do formulrio principal (MDI). Assim como o MDI, um formulrio MDIChild no pode ser aberto como modal. MDIChild no pode ser alterada em modo de execuo, e o valor padro False.

Microsoft Visual Basic 6

50

Startup Object
O objeto de abertura (ou Startup Object) o primeiro objeto a ser executado quando iniciamos um aplicativo. Quando criamos um novo projeto, o formulrio Form1 definido como objeto de abertura, por ser o primeiro objeto a fazer parte dele. Mas qualquer formulrio pode ser configurado como Startup. Para alterar o objeto de abertura, siga as instrues a seguir: Abra o menu Project; Escolha a opo Project Properties: ser exibida a janela Project Properties:

A caixa de combinao Startup Object contm os objetos que podem ser configurados como Startup: note que s so exibidos os formulrios contidos no projeto (alm da sub Main, que estudaremos mais adiante); Indique na combo qual ser o objeto de abertura e clique em Ok.

Menus
A barra de menus um dos mais importantes componentes de um aplicativo Windows. O VB dispe de uma poderosa e prtica ferramenta para o projeto de menus: o Editor de Menu (Menu Editor veja a figura da prxima pgina). Com ele, em poucos passos voc pode criar menus que funcionam exatamente como nos aplicativos mais conhecidos. Existem algumas regras de padronizao que devem ser seguidas na criao de menus para os aplicativos Windows: O usurio j sabe o que esperar em determinados menus, quando presentes em um aplicativo. No menu Editar, por exemplo, ele espera encontrar ao menos as opes Copiar, Recortar e Colar. Outros menus tambm possuem opes padronizadas: Abrir, Salvar e Imprimir so freqentemente encontradas no menu Arquivo; As opes da barra de menus devem permitir o acesso atravs da combinao Alt+Letra Sublinhada; Para as opes mais comuns interessante que existam teclas de atalho. Mas, cuidado: algumas teclas de atalho tambm so padronizadas no Windows. Por exemplo: Ctrl+C o atalho para copiar algo para a rea de transferncia, no importa qual seja o aplicativo; Itens relacionados devem ser agrupados e separados dos demais por barras separadoras. Exemplo: as opes Localizar, Localizar Prximo e Substituir do menu Editar do WordPad;

Microsoft Visual Basic 6

51

A janela Menu Editor

Quando o item leva o usurio a uma caixa de dilogo, seu rtulo deve ser seguido de reticncias (...). Quando leva a um submenu, deve ser seguido de uma seta ; Itens selecionveis, como a opo Rgua do menu Exibir do WordPad, devem ser precedidos pela marca de seleo quando estiverem ativos; Quando algum pr-requisito para o funcionamento de uma opo no estiver sendo cumprido, ela deve aparecer desabilitada. Por exemplo: se no houver texto selecionado, as opes Copiar e Recortar no devem estar disponveis. Para acessar a janela Menu Editor, o formulrio deve estar selecionado. Escolha ento a opo no menu Tools do VB, acione a combinao Ctrl+E ou escolha o boto Menu Editor na barra de ferramentas. Vamos descrever alguns componentes da janela Menu Editor: Caption: neste campo deve ser digitado o rtulo que aparecer na barra de menus ou dentro do menu: corresponde propriedade Caption de um controle; Name: neste campo informamos o valor da propriedade Name do menu; ShortCut: permite a definio de uma tecla de atalho; Checked: permite a definio da propriedade Checked (marca de seleo); Enabled e Visible: o mesmo que as propriedades Enabled e Visible dos controles; Index: quando o menu fizer parte de uma matriz, permite indicar seu ndice; Botes Up e Down: permitem a movimentao do menu selecionado para cima ou para baixo, mudando sua posio na barra; Botes Left e Right: permitem a mudana de nvel do menu, ou seja: se a opo aparecer na barra de menu ou se far parte de um submenu. Podem ser criados at quatro nveis;

Microsoft Visual Basic 6

52

Boto Next: move a seleo para a prxima linha, se houver. Se no houver, insere uma nova linha no final da lista; Boto Insert: insere uma nova linha acima da selecionada; Boto Delete: exclui da lista a linha selecionada.

O Aplicativo Bibliotecrio
Para exercitar os vrios assuntos que veremos nessa lio, vamos iniciar a construo no nosso sistema, que chamaremos de Bibliotecrio: 1. Inicie um novo projeto; 2. Remova a formulrio Form1 do projeto; 3. Adicione ao projeto um formulrio MDI, e altere suas seguintes propriedades: Name: frmBiblio Caption: Bibliotecrio Controle de Acervo de Bibliotecas BackColor: Amarelo Claro (ou outra de sua preferncia mas no escolha uma cor muito forte para no ofuscar o coitado do usurio); Icon: Writing\Books01.ICO; WindowState: 2 - Maximized 4. Configure-o como Startup Object. Aproveite que j est na janela Project Properties e altere tambm a propriedade Project Name para Bibliotecrio. Essa propriedade equivale a um rtulo a ser exibido na janela Project para identificao do projeto, mas sua definio no obrigatria; 5. Salve o formulrio com o nome de FrmBiblio e o projeto como Bibliotecario; 6. Abra a janela Menu Editor; 7. Defina os campos para a primeira opo do nosso menu: Caption = &Cadastros e Name = mnuCadastros; 8. Clique no boto Next para passar para a prxima linha:

9. O prximo item a opo Livros do menu Cadastros: Caption: &Livros Name: mnuCadLivros

Microsoft Visual Basic 6

53

10. Clique no boto Ok e veja o resultado. Note que as opes esto no mesmo nvel, pois a opo Livros est ao lado de Cadastros. O correto seria que Livros fosse um item do menu Cadastros; 11. Acione novamente o Menu Editor e selecione a linha que contm o menu Livros; 12. Clique na seta para a direita. O nvel do menu Novo foi alterado, e agora est abaixo do menu Cadastro:

13. Clique no boto Ok e observe se o resultado agora o esperado; 14. Inclua mais dois trs opes ao menu Cadastros: Caption: &Usurios Name: mnuCadUsuarios Caption: &Categorias Name: mnuCadCategorias Caption: &Editoras Name: mnuCadEditoras

Microsoft Visual Basic 6

54

15. Vamos incluir agora uma barra separadora. Selecione a opo Editoras e clique no boto Next; 16. Indique para a propriedade Caption um hfen (-), e altere Name para BS1 (de Barra Separadora n 1). Clique em Next; 17. Para terminar o menu Cadastros, vamos incluir nele uma opo para sair do sistema: Caption: &Sair do Sistema Name: mnuSair 18. Clique no boto Ok e confira o menu. Faa correes, se necessrio; 19. Adicione as demais opes do menu de acordo com a tabela abaixo:
&Operaes ....&Emprstimo de Livros ....&Devoluo de Livros C&onsultas ....&Livros ........&Todos ................por A&utor ........por &Categoria ........por E&ditora ................&Emprestados ........Em &Atraso ....&Usurios ....&Categorias ....&Editoras &Relatrios ....&Livros ....&Usurios ....&Categorias ....&Editoras &? ....&Sobre o Bibliotecrio

Caption:

mnuOperacoes mnuEmprestimos mnuDevolucoes mnuConsultas mnuConLivros mnuConTodos BS2 mnuLivrosPorAutor mnuLivrosPorCategoria mnuLivrosPorEditora BS3 mnuConEmprestados mnuConAtrasados mnuConUsuarios mnuConCategorias mnuConEditoras mnuRelatrios mnuRelLivros mnuRelUsuarios mnuRelCategorias mnuRelEditoras mnuHelp mnuSobre

Name:

20. Verifique o funcionamento do menu. Note que na barra devem constar cinco opes: Cadastros, Operaes, Consultas, Relatrios e ?. Alm disso, nos menus Consultas e Relatrios, o item Livros leva a submenus. Seu formulrio agora deve estar parecido com o do exemplo a seguir:

Microsoft Visual Basic 6

55

21. Faa ajustes, se necessrio; 22. Salve o formulrio como frmBiblio e o projeto como Bibliotecario.

Associando Codificao a um Menu


Um menu se comporta como outro objeto qualquer do VB, quanto codificao. S um evento associado a um menu: o Click. Para exemplificar, vamos fazer a codificao do menu mnuSair: 1. Em tempo de projeto, clique sobre o menu Cadastros para abri-lo; 2. Clique sobre a opo Sair (no necessrio o duplo-click); 3. A janela Cdigo aberta. Escreva a procedure correspondente:
Private Sub mnuSair_Click() Dim vOk as Integer vOk = MsgBox("Confirma o encerramento do sistema?", _ vbYesNo + vbQuestion + vbApplicationModal, "Sada") If vOk = vbYes Then End End Sub

4. Execute o aplicativo e verifique o funcionamento da procedure.

Formulrios Splash
A maioria dos aplicativos para Windows (como o Word e o prprio VB) exibe uma janela com diversas informaes sobre o produto enquanto ele carregado. Essa janela chamada de Splash Window, ou tela de Splash. O VB 6 permite a criao dessas telas com muita facilidade. Para esses casos, o VB nos oferece um modelo de formulrio pronto, configurado e com a programao necessria para funcionar como aqueles dos aplicativos comerciais. Vamos ento criar um formulrio Splash em nosso aplicativo: 1. Abra a janela Add Form; 2. Lembra-se que na aba New h vrios tipos disponveis de formulrios? Um deles chamado de Splash Screen. essa opo que usaremos para criar nossa tela de Splash. Escolha Splash Screen, e o formulrio abaixo ser adicionado ao projeto:

Microsoft Visual Basic 6

56

3. Voc pode alterar o tamanho do formulrio e seus objetos vontade, incluir novos labels e figuras, apagar os que no forem necessrios, enfim, deixar o formulrio ao seu gosto. Veja como ficou o meu:

Obs.: os formulrios padronizados, como os que estamos usando, quando inseridos no projeto normalmente j trazem algum tipo de programao pr-definida. Deve-se ento verificar essa programao e alter-la, ou apag-la se no for necessria, para evitar erros da execuo. 4. Grave o novo formulrio como frmSplash.

O Controle Timer
Existe um problema em nosso projeto: no existe em frmSplash nenhum objeto que possa ser usado para acionar o frmBiblio, como um boto de comando. Mas o VB oferece um controle cujo funcionamento se encaixa perfeitamente em casos como esse: o controle Timer, que usado em situaes de execuo de um ou mais comandos a intervalos de tempo regulares. Por exemplo: atualizar os registros exibidos em uma tela de consulta de um sistema multiusurio a cada 10 segundos. O controle Timer s responde ao evento Timer.

Propriedade Interval
A propriedade Interval do controle Timer determina o intervalo de tempo, medido em milisegundos, da ocorrncia do evento Timer. do tipo Integer, portanto o maior valor possvel 65.535, o que equivale a pouco mais de 1 minuto. O valor default 1.000 milisegundos, ou 1 segundo. Esse controle pode ser posicionado em qualquer lugar do formulrio, pois no exibido durante a execuo do aplicativo.

Microsoft Visual Basic 6

57

Em nosso sistema, usaremos um Timer para provocar uma pausa de 5 segundos, durante a qual ser exibida nossa tela de Splash: 1. Adicione um Timer ao frmSplash; 2. Altere o valor da propriedade Interval do Timer para 5000; 3. D um duplo click sobre o controle Timer e faa a codificao do evento Timer conforme segue:
Private Sub Timer1_Timer() Unload Me frmBiblio.Show End Sub

Obs.: Me equivalente ao nome do formulrio em uso. Assim, ao invs de ficarmos escrevendo o nome do formulrio para acessar suas propriedades e mtodos durante a codificao, podemos escrever simplesmente Me em seu lugar que o resultado ser o mesmo. 4. Execute o projeto e veja: seu aplicativo agora tem uma tela de Splash! 5. Grave seu trabalho.

Formulrios About
Outro modelo de formulrio pr-definido que o VB nos oferece o About Form, usado para a confeco daquelas janelas Sobre.... Para adicion-lo o processo o mesmo do Splash. Vamos inserir no projeto um formulrio do tipo About: 1. Abra a janela Add Form e escolha na aba New a opo About Dialog; 2. O formulrio a seguir ser inserido em seu projeto. Note os botes de comando: Ok fecha o formulrio e System Info abre a janela de Informaes do Sistema do Windows:

3. Modifique-o ao seu gosto, mas cuidado com o evento Load: ele altera o rtulo de alguns labels. Se voc mudar esses labels, apague as linhas correspondentes a eles em Form_Load. Veja como ficou o meu:

Microsoft Visual Basic 6

58

4. Grave o formulrio como frmAbout; 5. Abra o formulrio frmBiblio e escreva o comando para exibir frmAbout em mnuSobre_Click:
Private Sub mnuSobre_Click() frmAbout.Show vbModal End Sub

6. Execute o aplicativo. No formulrio principal, escolha a opo Sobre no menu e veja se o formulrio frm-About est funcionando corretamente; 7. Grave seu trabalho. Continuaremos o desenvolvimento do sistema na prxima lio.

Microsoft Visual Basic 6

59

Lio 7: Controles Customizados


At agora s usamos em nosso projeto controles padronizados, aqueles que aparecem na caixa de ferramentas quando iniciamos o VB. Mas no so apenas esses os controles disponveis para uso em nossos projetos. Muito pelo contrrio, existe uma infinidade de outros controles no mercado, muitos deles comerciais e desenvolvidos por empresas especializadas. Alguns desses controles adicionais, chamados de customizados, so fornecidos junto com o pacote do VB e podem ser usados livremente na construo de aplicativos. Os controles customizados no aparecem na caixa de ferramentas: eles devem ser adicionados ao projeto para serem usados. Uma vez que isso feito, porm, eles se comportam da mesma maneira que qualquer controle padronizado. Mas no v adicionando controles vontade em seu projeto, pois, como so arquivos OCX separados, para cada um deles que voc usar seu aplicativo vai engordar alguns Kbytes. Assim sendo, s adicione aqueles controles que realmente ir usar.

Adicionando um Controle Customizado


Vamos ento adicionar um controle customizado ao nosso aplicativo. Se ainda no o fez, inicie o VB e abra o projeto Bibliotecario: 1. No menu Project do VB, escolha a opo Components, ou ento tecle Ctrl+T: a janela Components ser aberta: ela permite que controles customizados sejam adicionados ao projeto:

2. Procure e marque a opo Microsoft Windows Commom Controls 6.0; 3. Clique no boto Aplicar: repare que alguns cones novos, como os da figura ao lado, foram inseridos na caixa de ferramentas; 4. Clique em Ok. A partir de agora, voc poder usar qualquer um dos Microsoft Windows Commom Controls em seu projeto como qualquer outro controle.

Microsoft Visual Basic 6

60

Criando Uma Barra de Ferramentas


Sem dvida um dos recursos mais comuns nos aplicativos para Windows a barra de botes ou de ferramentas - o prprio VB as tem em profuso. A principal finalidade dessas barras a de facilitar o acesso do usurio aos comandos mais comuns do aplicativo.

O Controle ToolBar
Um dos controles customizados que acabamos de adicionar o ToolBar, que permite a criao de barras de botes com muita facilidade. Ele responde ao evento Click, e a identificao do boto clicado feita pelo seu nmero de ndice. Para criar os botes, ToolBar trabalha em conjunto com outro controle:

O Controle ImageList
O controle ImageList tambm faz parte dos Microsoft Windows Commom Controls e, como seu prprio nome indica, serve para criar uma lista de imagens que ser associada a um outro controle, como uma ToolBar. Esse controle no responde a nenhum evento e no aparece no formulrio durante a execuo do aplicativo. Depois que a ImageList associada a um controle, no pode mais ser alterada, a menos que a associao seja excluda. Vamos ento criar uma barra de botes em nosso projeto: 1. Em tempo de projeto, abra o formulrio frmBiblio; 2. Adicione ao formulrio uma ImageList. No se preocupe com a posio em que ela vai ficar, pois como j disse ela no aparecer durante a execuo do aplicativo; 3. Clique com o boto direito do mouse sobre a ImageList; 4. No menu de contexto que se abre, escolha a opo Properties. A janela de propriedades da ImageList ser exibida:

5. Na aba General definimos o tamanho em pixels das imagens da lista. Compare os tamanhos: 16 x 16:

32 x 32: 48 x 48:

Microsoft Visual Basic 6

61

6. Na aba Images inserimos as imagens que faro parte da lista:

7. Para adicionar imagens, clicamos no boto Insert Picture e para excluir uma imagem no boto Remove Picture. Clique em Insert Picture e adicione o cone Writing\Books02.ICO:

Obs.: note que, aps adicionar o cone, o campo Index passou a indicar o valor 1. Esse o nmero de ndice da imagem na lista, atravs do qual fazemos a associao da imagem com o boto da ToolBar. 8. Adicione as seguintes imagens na lista. Procure respeitar a ordem na incluso, para que o ndice corresponda corretamente imagem desejada quando estivermos criando a barra de botes: Misc\Misc28.ICO (Index 2) Writing\Book04.ICO (Index 3) Writing\Books04.ICO (Index 4) Traffic\Trffc14.ICO (Index 5) 9. Se voc fez tudo corretamente, sua ImageList deve estar parecida com o exemplo a seguir:

Microsoft Visual Basic 6

62

10. Clique no boto Ok para retornar ao formulrio; 11. Adicione ao formulrio uma ToolBar. Note que esse controle automaticamente posicionado no topo da rea de trabalho do formulrio, logo abaixo da barra de menus; 12. A configurao da ToolBar feito como na ImageList: clique com o boto direito do mouse sobre o controle e escolha a opo Properties; 13. Na aba General definimos as propriedades que determinam a aparncia da Toolbar. As principais so:

ImageList: indica o nome da ImageList que ser usada na criao da barra de botes. Escolha a opo ImageList1, que deve ser a nica disponvel; Appearance: determina a aparncia da barra, que pode ser em perspectiva 3D (opo 1 - cc3D) ou integrada rea de trabalho do formulrio (opo 0 ccFlat). Escolha 3D; BorderStyle: indica se a barra ter borda (opo 1 ccFixedSingle) ou no (opo 0 ccNone). A aparncia final da borda depende da propriedade Appearance. Escolha None;

Microsoft Visual Basic 6

63

Style: indica o estilo dos botes da barra: pode ser 0 tbrStandard, em que eles sero apresentados como pequenos botes de comando, ou 1 tbsFlat, em que os botes tero a mesma aparncia das barras de ferramentas do VB. Escolha Flat. 14. Na aba Buttons configuramos cada um dos botes da barra. Para inserir um boto, clicamos em Insert Button, e para remover clicamos em Remove Button. Clique no boto Insert Button; 15. Vamos definir as propriedades do boto que inserimos. As principais propriedades dos botes so: Index: indica o ndice do boto na barra, pelo qual ele ser identificado quando for clicado. Normalmente no alteramos o valor essa propriedade; Caption: define um rtulo para o boto. Deixe em branco, assim s ser exibido o cone no boto; ToolTipText: texto a ser exibido em uma pequena etiqueta explicativa quando o ponteiro do mouse ficar parado por alguns instantes sobre o boto. Escreva Cadastro de Livros nessa propriedade (obs.: quase todos os controles do VB possuem essa propriedade); Image: indica o nmero da imagem da ImageList a ser exibida por esse boto. Indique o valor 1, que corresponde ao primeiro cone da ImageList; Visible e Enabled: o mesmo que as propriedades Visible e Enabled dos demais controles. 16. Sua configurao do boto 1 deve estar assim:

17. Insira mais quatro botes na barra, conforme a tabela a seguir: Boto 2 3 4 5 Propriedades = Valor ToolTipText = Cadastro de Usurios Image = 2 ToolTipText = Emprstimo de Livros Image = 3 ToolTipText = Devoluo de Livros Image = 4 ToolTipText = Sai do Sistema Image = 5

18. Clique no boto Ok. Seu formulrio deve estar parecido com o do exemplo a seguir:

Microsoft Visual Basic 6

64

19. Salve seu trabalho.

Programando a Barra de Ferramentas


A programao dos botes da barra de botes muito simples: como a barra s responde ao evento Click, basta que identifiquemos qual boto foi clicado e fazer a codificao correspondente. Como j vimos, a identificao do boto feita pela propriedade Index. Vamos ento programar o boto Sair: 1. D um duplo click sobre a barra de botes para abrir a janela Cdigo no evento Click da barra; 2. Note que a procedure recebe um parmetro, chamado Button, que indica em que boto aconteceu o click. Testaremos ento o ndice desse parmetro (propriedade Index) para saber qual foi o boto clicado em breve estudaremos a propriedade Index mais detalhadamente:
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button) If Button.Index = 5 'Foi clicado o boto Sair: mnuSair_Click End If End Sub

3.

Repare que, se o boto for o nmero 5, chamaremos a subrotina mnuSair_Click, ou seja, estamos desviando a execuo para o evento Click do menu Sair, pois a programao em ambos os casos a mesma. Isso pode ser feito vontade, pois os eventos dos controles tambm so subrotinas como quaisquer outras, e portanto podem ser executadas sempre que necessrias;

4. Teste o aplicativo e verifique se o boto est funcionando como previsto; 5. Salve seu trabalho. Os demais botes da barra sero programados conforme os formulrios a que eles se referem forem sendo construdos nas prximas lies.

Microsoft Visual Basic 6

65

Lio 8: Bancos de Dados


Sempre que trabalhamos com qualquer linguagem temos a inteno de guardar as informaes geradas para a obteno de algum resultado, ou ento para consult-las quando forem necessrias. Assim, elas devem ser gravadas em arquivos criados para esse fim, chamados de Bancos de Dados, ou sero perdidas aps o encerramento do programa que as gerou. Existem vrios softwares especficos para o gerenciamento desses arquivos no mercado, e cada um deles possui padres prprios de armazenamento de dados. Exemplos de Sistemas Gerenciadores de Bancos de Dados (SGDB) so o SQL Server, o Dataflex, o FoxPro, o Oracle, o Access, etc. O VB pode acessar arquivos de dados de vrios formatos diferentes, incluindo os citados, mas vamos utilizar o MDB do Access. Esse formato nativo do VB, tanto que o utilitrio para a criao de bancos de dados que o acompanha, chamado Visual Data Manager, uma verso reduzida do Access. Alis, bastante reduzida: suas funes limitam-se criao e manipulao de bancos de dados e de suas tabelas. Nesse texto, assumimos que voc j conhece o Access o suficiente para a criao do banco de dados, das tabelas e das consultas que vamos utilizar. Caso no o possua instalado em sua mquina, use ento o Visual Data Manager, acessando-o pelo menu Add-Ins do VB.

Mtodos de Acesso
Basicamente, um mtodo de acesso o meio pelo qual associamos um tipo especial de varivel chamado de varivel objeto ao banco de dados. Elas so chamadas de objeto porque possuem propriedades e respondem a mtodos, permitindo assim a manipulao dos dados. O mtodo de acesso usado tradicionalmente pelo VB o DAO (ou Data Access Object), que consiste na abertura de suas tabelas e execuo de comandos atravs das variveis objeto. Porm, a partir da verso 6 do VB a Microsoft introduziu um novo mtodo, chamado de ADO (ou ActiveX Data Objects), pelo qual o aplicativo se comunica com o gerenciador de banco de dados atravs de um provedor em uma conexo de rede, mesmo que a aplicao e o SGBD estejam rodando localmente. As operaes de incluso, excluso, alterao e seleo de dados so executadas a partir de comandos SQL enviados pelo aplicativo ao SGBD atravs do provedor (veremos o que SQL e como us-la nas prximas lies). Em nosso projeto, usaremos o mtodo ADO.

Objeto ADO Connection


Connection a varivel objeto que representa a conexo propriamente dita. Normalmente declarada como pblica (portanto, em um mdulo de programao) com o tipo ADODB.Connection. Porm, antes de ver como criar uma conexo ADO, devemos estudar alguns conceitos bsicos:

Propriedade ConnectionString
Essa propriedade do objeto Connection uma string formada pelo nome do provedor usado e pelos parmetros necessrios para estabelecer a conexo com o SGBD.

O Provedor
A funo do provedor , como j disse, permitir a conexo do aplicativo com o banco de dados. Essa conexo do tipo OLEDB, ou Object Linking and Enbedding Database. Portanto, na verdade o que acontece quando nos conectamos ao banco de dados via ADO a vinculao de um objeto ao banco, que passa a responder s propriedades e mtodos do objeto a ele vinculado. Esse vnculo se assemelha a uma conexo de rede, ou seja: o banco de dados no um arquivo que pode ser manipulado diretamente, mas mantm um canal de comunicao com seu aplicativo pela qual as operaes sero executadas. como uma ligao telefnica: voc pode conversar com as outras pessoas, mas no pode abra-las. Existe um provedor especfico para cada SGBD. No nosso caso, como usaremos uma base Access, o provedor ser o Microsoft Jet OLEDB Provider. So necessrios alguns parmetros para se estabelecer a conexo, que variam de acordo com o provedor, mas no caso do Jet os parmetros necessrios so trs: Data Source: nome e o caminho completo (path) do arquivo MDB a ser conectado; User ID: identificao do usurio;

Microsoft Visual Basic 6

66

Password: senha do usurio. Obviamente, os dois ltimos podem ser omitidos se o banco no estiver protegido por senha.

Abrindo e fechando a conexo


Aps definir a ConnectionString, podemos estabelecer a conexo aplicando o mtodo Open ao objeto Connection. Veja um exemplo de conexo ADO usando o Jet:
Dim cnnTeste As New ADODB.Connection cnnTeste.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\Sistema\Dados.mdb;" cnnTeste.Open

Obs.: 4.0 a verso do Jet para o Access 2000. Para fechar a conexo existe o mtodo Close, mas ao invs de us-lo aconselhvel a remoo da varivel da memria usando a palavra-chave Nothing e o comando Set:
Set cnnTeste = Nothing

Objeto ADO Command


Um comando ADO uma varivel objeto que contm a definio do comando a ser executado pelo provedor no banco de dados. Ele necessrio para qualquer operao ou manipulao dos dados do banco (uma seleo de registros, por exemplo), pois nele que definimos as configuraes exigidas pelo provedor para executar o comando SQL correspondente. Entre essas configuraes, devemos destacar as seguintes:

Propriedade ActiveConnection
Contm o nome da conexo ADO ativa a ser usada para execuo do comando.

Propriedades CommandText e CommandType


CommandText uma string que contm o comando a ser executado pelo objeto command, e CommandType indica seu tipo, ou melhor, como CommandText ser avaliado em tempo de execuo pelo objeto Command. CommandType pode ser um dos seguintes: adCmdUnknown: indefinido (default). adCmdText: string que representa um comando SQL vlido; adCmdTableDirect: nome de uma tabela; adCmdStoredProc: nome de uma stored procedure (o equivalente a uma consulta ao do Access) ou de uma view (que equivale a uma consulta seleo); adExecuteNoRecords: indica que CommandText um comando ou stored procedure que no retorna nenhum registro. Por exemplo, um comando de insero de registros em uma tabela. Caso algum registro seja retornado, ele ser desprezado. Sempre deve ser combinado com adCmdText or adCmdStoredProc.

Executando o comando
A execuo do comando ADO feita pelo mtodo Execute. Veja um exemplo:
Dim cnnComando As New ADODB.Command With cnnComando .ActiveConnection = cnnTeste .CommandType = adCmdStoredProc .CommandText = "spAtualizaSaldo" .Execute End With

Note o uso das propriedades: como o tipo informado em CommandType adCmdStoredProc, o provedor interpreta o texto contido em CommandText (spAtualizaSaldo) como sendo o nome de uma stored procedure, que ser executada.

Microsoft Visual Basic 6

67

Objetos Recordset
Um Recordset a representao lgica de um conjunto de registros, da seu nome. Pode receber todos os registros de uma tabela, o resultado de uma consulta, ou ainda uma seleo de dados feita por um comando SQL. O recordset tambm uma varivel objeto, assim, para fazer a associao com o conjunto de registros desejado deve ser usado o comando Set e o mtodo Execute em um comando ADO. Veja um exemplo:
Dim cnnComando As New ADODB.Command Dim rsSelecao As New ADODB.Recordset With cnnComando .ActiveConnection = cnnTeste .CommandType = adCmdTableDirect .CommandText = "Clientes" Set rsSelecao = .Execute End With

Em nosso exemplo, o recordset rsSelecao ser associado tabela Clientes, e assim todos os seus registros e campos podero ser acessados atravs de rsSelecao. Note que informamos que Clientes o nome de uma tabela atravs do valor adCmdTableDirect em CommandType. Para se referir a um campo de um Recordset, devemos usar o caractere !. Por exemplo: para atribuir o valor do campo Preo de um Recordset chamado rsProdutos a uma varivel, poderamos usar o seguinte comando:
vPreo = rsProdutos!Preo

Para fechar um Recordset, novamente usamos o comando Set e a palavra chave Nothing, da mesma maneira que fizemos com o Command:
Set rsSelecao = Nothing

Veja a seguir as principais propriedades e mtodos do Recordset:

Propriedades BOF e EOF


Essas propriedades indicam se o apontador de registros est posicionado no incio ou no fim da tabela. BOF retorna True se o apontador estiver no incio da tabela, e EOF retorna True se estiver no final da tabela. Em qualquer outro caso, ambas retornam False.

Propriedade AbsolutePosition
Essa propriedade retorna o nmero do registro corrente na tabela.

Propriedade RecordCount
Retorna o nmero de registros que contidos no Recordset.

Mtodos Move (MoveFirst, MoveLast, MoveNext e MovePrevious)


Esses mtodos fazem a movimentao seqencial do apontador de registros dentro do Recordset: MoveFirst move o apontador para o primeiro registro do Recordset; MoveLast move o apontador para o ltimo registro do Recordset; MoveNext move o apontador para o prximo registro; MovePrevious move o apontador para o registro anterior.

Mdulos de Programao
Como vimos na lio anterior, existem vrios tipos de objetos que podem ser adicionados ao projeto. Um dos mais usados o mdulo de programao, que um arquivo texto com extenso BAS contendo procedures, funes e declaraes de uso geral no sistema. Um uso muito freqente a declarao de variveis pblicas. Variveis Connection so freqentemente declaradas como pblicas, para que no seja necessria a criao de uma conexo com o banco a cada vez que precisarmos usar um command se a conexo pblica, podemos usar sempre a mesma.

Microsoft Visual Basic 6

68

Para adicionar um mdulo de programao ao projeto, usamos a opo Add Module do menu Project do VB. A operao da janela Add Module a mesma da Add Form:

Usando o Banco de Dados


Para comear, criaremos um novo banco de dados no Access com o nome de Biblio. Ele conter quatro tabelas, que devem conter as estruturas descritas a seguir (siga fielmente os nomes das tabelas e os nomes e propriedades dos campos, para que a codificao do projeto funcione corretamente): Tabela: Categorias Nome do Campo CodCategoria (Chave primria) NomeCategoria

Tipo Nmero Texto

Propriedades Tamanho = Inteiro Longo Tamanho = 35

Tabela: Editoras Nome do Campo CodEditora (Chave primria) NomeEditora Tabela: Livros Nome do Campo CodLivro (Chave primria) Titulo Autor CodEditora CodCategoria AcompCD AcompDisquete Idioma Observacoes Emprestado CodUsuario DataEmprestimo DataDevolucao

Tipo Nmero Texto

Propriedades Tamanho = Inteiro Longo Tamanho = 35

Tipo Nmero Texto Texto Nmero Nmero Sim/No Sim/No Nmero Memorando Sim/No Nmero Data/Hora Data/Hora

Propriedades Tamanho = Inteiro Longo Tamanho = 50 Tamanho = 35 Tamanho = Inteiro Longo Tamanho = Inteiro Longo Tamanho = Byte Tamanho = Inteiro Longo Formato = Data Abreviada Formato = Data Abreviada

Microsoft Visual Basic 6

69

Tabela: Usuarios Nome do Campo CodUsuario (Chave primria) NomeUsuario Endereco Cidade Estado CEP Telefone

Tipo Nmero Texto Texto Texto Texto Texto Texto

Propriedades Tamanho = Inteiro Longo Tamanho = 35 Tamanho = 60 Tamanho = 25 Tamanho = 2 Tamanho = 9 Tamanho = 15

Aps a criao do banco de dados, vamos criar a conexo no sistema Bibliotecrio: 1. Abra o VB e o projeto Bibliotecario, se ainda no o fez; 2. Precisamos adicionar s referncias do projeto a biblioteca que permite a utilizao dos objetos ADO. Abra o menu Project do VB e escolha a opo References:

3. O VB abre uma janela chamada References. Note que j existem algumas referncias marcadas. Para adicionar uma nova, basta clicar na checkbox ao lado de seu nome. Para remover uma referncia, remova a marca de seleo (obs.: o VB no permite a remoo de uma biblioteca que esteja em uso); 4. A biblioteca que usaremos a Microsoft ActiveX Data Objects Library Existem vrias verses dessa biblioteca, dependendo da verso do Jet que estiver instalada em sua mquina. Se houver mais de uma, procure sempre utilizar a mais recente (na figura est sendo usada a verso 2.5). Clique em Ok; Vamos declarar a varivel Connection como pblica. Para isso, precisamos de um mdulo de programao. Abra o menu Project e escolha a opo Add Module;

5.

6. Aps adicionar o mdulo abra-o na janela Cdigo, e na seo Declarations escreva o comando:
Public cnnBiblio As New ADODB.Connection

7. Grave o mdulo de programao com o nome de Biblio.BAS; 8. Vamos abrir a conexo com o banco de dados no evento Timer do formulrio de Splash. Abra o formulrio frmSplash na janela Cdigo; 9. Altere a procedure Timer1_Timer para que fique como a seguir:
Private Sub Timer1_Timer() On Error GoTo errConexao cnnBiblio.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;" & _ "Data Source=" & App.Path & "\Biblio.mdb;" cnnBiblio.Open

Microsoft Visual Basic 6

70

Unload Me frmBiblio.Show Exit Sub errConexao: With Err If .Number <> 0 Then MsgBox "Houve um erro na conexo com o banco de dados." & _ vbCrLf & "O sistema ser encerrado.", _ vbCritical + vbOKOnly + vbApplicationModal, _ "Erro na conexo" .Number = 0 Set cnnBiblio = Nothing End End If End With End Sub

Obs.: note que no trecho acima usamos a verso 3.51 do Jet. Note tambm o uso de App.Path em Data Source: App o objeto Application, e Path uma propriedade que retorna a pasta onde a aplicao est instalada. Portanto, App.Path informa ao provedor que o arquivo Biblio.MDB est localizado na mesma pasta da aplicao. 10. interessante fechar a conexo quando encerramos o sistema. Abra ento o formulrio frmBiblio na janela Cdigo e escreva o evento Unload, que ocorre quando o formulrio fechado:
Private Sub MDIForm_Unload(Cancel As Integer) Set cnnBiblio = Nothing End Sub

11. Grave seu trabalho. Repare que ainda no usamos nenhum comando ADO, s nos conectamos ao banco de dados. Antes de fazer isso, vamos estudar um pouco de SQL, que o assunto da prxima lio.

Microsoft Visual Basic 6

71

Lio 9: Manipulao de Registros


Nessa lio, vamos estudar a programao necessria para executar as operaes bsicas de manipulao de registros, que so: seleo, incluso, alterao e excluso. Usaremos como base para nosso estudo a tabela de Usurios, pois como ela possui apenas um campo numrico, e todos os demais so do tipo texto, a mais simples de trabalhar com os controles que conhecemos at aqui. importante ressaltar que no constar nessa apostila os formulrios e a programao referentes s tabelas Editoras e Categorias, pois sero praticamente iguais quelas que vamos elaborar para a de Usurios. Ficar para voc, portanto, desenvolver essas rotinas como exerccio de fixao.

Um Pouco de SQL
Antes de comear a trabalhar no formulrio, precisamos conhecer um pouco da linguagem SQL. A SQL (Structure Query Language Linguagem de Consulta Estruturada) uma linguagem comum de gerenciamento de bancos de dados relacionais criada para padronizar o tratamento dos dados em todos os sistemas que obedeam ao padro SQL vigente. Isso quer dizer que os mesmos comandos SQL que voc usa no Access podem ser aplicados na maioria dos SGBDs de arquitetura cliente-servidor existentes no mercado. importante destacar, porm, que a SQL no uma linguagem de programao comum, usada para a criao de sistemas e aplicativos, e sim uma linguagem voltada exclusivamente para aplicaes em bancos de dados relacionais. No vamos abordar SQL a fundo nesse texto, pois no esse o objetivo do curso. Veremos apenas os comandos principais, que permitam aplicao que estamos construindo executar as operaes bsicas de manuteno de bancos de dados.

Comando SELECT
SELECT o comando para selecionar dados no banco de dados e retornar as informaes solicitadas como um conjunto de registros. Certamente o comando SQL mais utilizado. Sua sintaxe bsica :
SELECT * FROM <tabela> [WHERE <condio>] [ORDER BY <ordem>];

Ou ento:
SELECT campo1, campo2, campo3, ..., campoN FROM <tabela> [WHERE <condio>] [ORDER BY <ordem>];

Onde: *: indica que todos os campos da tabela devem ser selecionados; Lista de campos: indica que somente os campos especificados devem ser selecionados; Tabela: nome da tabela que contm os dados a serem selecionados; Condio (opcional): expresso lgica que indica que somente os registros que atendam ela devem ser selecionados pelo comando SELECT; Ordem (opcional): lista de campos, separados por vrgulas, que indicam a ordem de classificao dos registros selecionados. Ao executar esta operao, o provedor procura no banco de dados a tabela especificada, extrai as colunas escolhidas, seleciona as linhas que satisfazem a condio e finalmente classifica as linhas resultantes na ordem especificada. importante destacar que, apesar de WHERE e ORDER BY serem opcionais e podermos us-los em separado, no caso de ambos serem utilizados obrigatoriamente WHERE dever vir antes de ORDER BY. Veja alguns exemplos: Para selecionar todos os campos da tabela de funcionrios:
SELECT * FROM Funcionarios;

Se quiser ordenar os regitros em ordem alfabtica, poderia usar:


SELECT * FROM Funcionarios ORDER BY Nome;

Microsoft Visual Basic 6

72

Para selecionar apenas os campos Nome e Departamento da mesma tabela:


SELECT Nome, Departamento FROM Funcionarios;

Para filtrar apenas os funcionrios do departamento RH:


SELECT Codigo, Nome FROM Funcionarios WHERE Departamento = RH;

Usando WHERE e ORDER BY juntos:


SELECT Codigo, Nome FROM Funcionarios WHERE Departamento = RH ORDER BY Nome;

Em um primeiro momento, usaremos o comando SELECT para selecionar apenas um registro por vez. Nas prximas lies, principalmente quando falarmos de consultas, estaremos estudando-o com um pouco mais de profundidade.

Comando INSERT
INSERT o comando SQL usado para adicionar registros a uma tabela. Sua sintaxe a seguinte:
INSERT INTO <tabela> (campo1, campo2, campo3, ..., campoN) VALUES (valor1, valor2, valor3, ..., ValorN);

Onde: Tabela: o nome da tabela em que o novo registro deve ser inserido; Lista de campos: os nomes dos campos nos quais os dados devem ser gravados; Lista de valores: dados a serem gravados nos campos, sendo que cada valor inserido no campo correspondente posio do valor na lista: valor1 em campo1, valor2 em campo2, e assim por diante. No necessrio indicar valores para todos os campos da tabela. Quando um dado no forem designado para um campo qualquer, o valor padro definido nas propriedades dos campos omitidos ser inserido pelo Jet. Se no existir um valor padro, ento ser inserido Null (nulo) nas colunas omitidas. Nesse caso, o campo deve suportar o valor nulo. Os registros so sempre adicionados no final da tabela. O ponto-e-vrgula faz parte da sintaxe de todo comando SQL. chamado de terminador, e serve para indicar o fim do comando. Para alguns provedores (como o Jet) ele dispensvel. Veja um exemplo que cria um novo registro numa tabela chamada Funcionrios:
INSERT INTO Funcionrios (Codigo, Nome, Sobrenome, Titulo) VALUES (73, 'Andr', 'Pereira', 'Estagirio');

Comando UPDATE
UPDATE faz a atualizao de registros de uma tabela, de acordo com uma condio. Devemos indicar quais campos sero atualizadados. Sua sintaxe :
UPDATE <tabela> SET <campo> = <valornovo> [WHERE <condio>];

Onde: Tabela: nome da tabela cujos registros devem ser alterados: Campo: nome do campo onde deve ser gravado o novo valor. Podem ser alterados vrios campos ao mesmo tempo; Valornovo: valor ou expresso cujo resultado ser gravado no campo indicado; Condio (opcional): expresso lgica que indica quais registros devem ser afetados pelo comando Update. Mas cuidado! Se no for especificada uma condio, Update vai alterar TODOS os registros da tabela. Veja alguns exemplos: Para alterar o campo nome do registro cujo campo cdigo igual a 15 na tabela Funcionrios:
UPDATE Funcionrios SET Nome = 'Jos Lima' WHERE Codigo = 15;

Para calcular o preo de venda de todos os registros de uma tabela chamada Produtos: UPDATE Produtos SET PrecoVenda = (PrecoCusto * 1.25);

Microsoft Visual Basic 6

73

Comando DELETE
Realiza a excluso de registros da tabela indicada. Veja a sintaxe:
DELETE FROM <tabela> [WHERE <condio>];

Onde: Tabela: nome da tabela da qual os registros so excludos; Condio (opcional): expresso lgica que indica quais registros devem ser excludos. Apesar de ser opcional, extremamente importante especificar uma condio, pois em caso contrrio TODOS os registros da tabela sero excludos. Veja um exemplo:
DELETE FROM Funcionrios WHERE Titulo = 'Estagirio';

Esse exemplo exclui todos os registros da tabela Funcionrios cujo ttulo seja Estagirio. Bem, agora que j vimos os comandos SQL que vamos precisar, comeemos a trabalhar. Inclua um novo formulrio no projeto e formate-o como no exemplo a seguir:

Altere as propriedades dos objetos conforme a tabela: Objeto Formulrio Nome frmCadUsuarios Outras Propriedades = Valor Caption = Cadastro de Usurios BorderStyle = 1 Fixed Single Icon = Misc\Misc28.ICO KeyPreview = True MDIChild = True Text = MaxLength = 5 Text = MaxLength = 35 Text = MaxLength = 60 Text = MaxLength = 25 Text = MaxLength = 2 Text = MaxLength = 15 Text = MaxLength = 9

Caixa de texto Caixa de texto Caixa de texto Caixa de texto Caixa de texto Caixa de texto Caixa de texto

txtCodUsuario txtNomeUsuario txtEndereco txtCidade txtEstado txtTelefone txtCEP

Microsoft Visual Basic 6

74

Objeto ImageList

Nome ImageList1

Outras Propriedades = Valor Tamanho das imagens: 32 x 32 pixels Imagens: 1 = Computer\Disk04.ICO 2 = Writing\Erase02.ICO 3 = Computer\Trash01.ICO 4 = Traffic\Trffc14.ICO ImageList = ImageList1 Appearance = 1 cc3D BorderStyle = 0 ccNone Style = 1 tbrFlat Boto 1: ToolTipText = Grava o registro atual Image = 1 Boto 2: ToolTipText = Limpa os dados digitados Image = 2 Boto 3: ToolTipText = Exclui o registro atual Image = 3 Enabled = False (desmarcar) Boto 4: ToolTipText = Retorna ao menu principal Image = 4

ToolBar

ToolBar1

O funcionamento bsico do formulrio ser o seguinte: Aps a digitao do cdigo do usurio, ser feita uma pesquisa para verificar se o cdigo existe ou no na tabela. Se existir, os dados do registro sero exibidos nos campos do form e podero ser alterados. Caso contrrio, ser considerado como um cdigo novo, ou seja, uma operao de incluso; O boto Excluir s dever estar habilitado quando o registro estiver em modo de alterao; Quando o boto Gravar for clicado, dever ser feita uma crtica nos dados digitados antes da gravao, para identificar possveis erros de digitao e impedir a gravao nesse caso; Quando o boto Limpar for clicado, qualquer dado constante nos campos do formulrio ser apagado. Vamos agora escrever a codificao. Siga os passos: 1. Inicialmente, escreveremos as procedures referentes aos eventos do formulrio. Abra a janela cdigo a partir do formulrio frmCadUsuarios e programe os eventos Load e KeyPress conforme abaixo:
Private Sub Form_Load() 'Centraliza o formulrio na rea de trabalho do MDI: Me.Left = (frmBiblio.ScaleWidth - Me.Width) / 2 Me.Top = (frmBiblio.ScaleHeight - Me.Height) / 2 End Sub Private Sub Form_KeyPress(KeyAscii As Integer) 'Se a tecla Enter foi pressionada, passa o foco para o prximo controle na 'seqncia de TabIndex: If KeyAscii = vbKeyReturn Then SendKeys "{Tab}" KeyAscii = 0 End If End Sub

Obs.: como um formulrio MDIChild no aceita a propriedade StartUpPosition, escrevemos no evento Load a codificao necessria para centralizar o form dentro da rea de trabalho do MDI. As propriedades ScaleWidth e ScaleHeight retornam, respectivamente, a largura e a altura da rea de trabalho do formulrio.

Microsoft Visual Basic 6

75

2. Vamos iniciar a programao das operaes de manuteno de registros. Nossa primeira preocupao deve ser como identificar se estamos fazendo uma incluso ou uma alterao. A maneira mais simples criando uma varivel privada que informe se o registro existe ou no na tabela. Abra a janela Cdigo na seo Declaration e declare a varivel:
Dim vInclusao As Boolean

3. Agora vamos pesquisar na tabela o cdigo digitado pelo operador. Faremos isso no evento LostFocus do campo txtCodUsuario:
Private Sub txtCodUsuario_LostFocus() Dim cnnComando As New ADODB.Command Dim rsSelecao As New ADODB.Recordset On Error GoTo errSelecao 'Verifica se foi digitado um cdigo vlido: If Val(txtCodUsuario.Text) = 0 Then MsgBox "No foi digitado um cdigo vlido, verifique.", _ vbExclamation + vbOKOnly + vbApplicationModal, "Erro" Exit Sub End If Screen.MousePointer = vbHourglass With cnnComando .ActiveConnection = cnnBiblio .CommandType = adCmdText 'Monta o comando SELECT para selecionar o registro na tabela: .CommandText = "SELECT * FROM Usuarios WHERE CodUsuario = " & _ txtCodUsuario.Text & ";" Set rsSelecao = .Execute End With With rsSelecao If .EOF And .BOF Then 'Se o recordset est vazio, no retornou registro com esse cdigo: LimparDados 'Identifica a operacao como Incluso: vInclusao = True Else 'Seno, atribui aos campos os dados do registro: txtNomeUsuario.Text = !NomeUsuario txtEndereco.Text = !Endereco txtCidade.Text = !Cidade txtEstado.Text = !Estado txtCEP.Text = !CEP txtTelefone.Text = Empty & !Telefone 'Identifica a operacao como Alterao: vInclusao = False 'Habilita o boto Excluir: Toolbar1.Buttons(3).Enabled = True End If End With 'Desabilita a digitao do campo cdigo: txtCodUsuario.Enabled = False Saida: 'Elimina o command e o recordset da memria: Set rsSelecao = Nothing Set cnnComando = Nothing Screen.MousePointer = vbDefault Exit Sub errSelecao: With Err If .Number <> 0 Then MsgBox "Houve um erro na recuperao do registro solicitado.", _ vbExclamation + vbOKOnly + vbApplicationModal, "Aviso" .Number = 0 GoTo Saida End If End With End Sub

Microsoft Visual Basic 6

76

Repare como foi montado o comando SELECT: informando clusula WHERE o cdigo a pesquisar por concatenao. Mas continuemos a programao do formulrio: 4. LimparDados uma subrotina para apagar os campos do formulrio (menos o cdigo):
Private Sub LimparDados() 'Apaga o contedo dos campos do formulrio: txtNomeUsuario.Text = Empty txtEndereco.Text = Empty txtCidade.Text = Empty txtEstado.Text = Empty txtCEP.Text = Empty txtTelefone.Text = Empty End Sub

5. J podemos fazer a codificao da barra de botes. Note as chamadas a subrotinas:


Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button) 'Verifica qual foi o boto clicado: Select Case Button.Index Case 1 'Boto Gravar: GravarDados Case 2 'Boto Limpar: LimparTela Case 3 'Boto Excluir: ExcluirRegistro Case 4 'Boto Retornar: Unload Me End Select End Sub

6. GravarDados, como o prprio nome indica, a subrotina de gravao dos dados digitados. Nela vamos identificar o tipo de operao que devemos executar (incluso ou alterao) e montar o comando SQL correspondente:
Private Sub GravarDados() Dim cnnComando As New ADODB.Command Dim vConfMsg As Integer Dim vErro As Boolean On Error GoTo errGravacao 'Inicializa as variveis auxiliares: vConfMsg = vbExclamation + vbOKOnly + vbSystemModal vErro = False 'Verifica os dados digitados: If txtNomeUsuario.Text = Empty Then MsgBox "O campo Nome no foi preenchido.", vConfMsg, "Erro" vErro = True End If If txtEndereco.Text = Empty Then MsgBox "O campo Endereo no foi preenchido.", vConfMsg, "Erro" vErro = True End If If txtCidade.Text = Empty Then MsgBox "O campo Cidade no foi preenchido.", vConfMsg, "Erro" vErro = True End If If txtEstado.Text = Empty Then MsgBox "O campo Estado no foi preenchido.", vConfMsg, "Erro" vErro = True End If If txtCEP.Text = Empty Then MsgBox "O campo CEP no foi preenchido.", vConfMsg, "Erro" vErro = True End If 'Se aconteceu um erro de digitao, sai da sub sem gravar: If vErro Then Exit Sub

Microsoft Visual Basic 6

77

Screen.MousePointer = vbHourglass With cnnComando .ActiveConnection = cnnBiblio .CommandType = adCmdText 'Verifica a operao e cria o comando SQL correspondente: If vInclusao Then 'Incluso: .CommandText = "INSERT INTO Usuarios " & _ "(CodUsuario, NomeUsuario, Endereco, Cidade, " & _ "Estado, CEP, Telefone) VALUES ('" & _ txtCodUsuario.Text & ",'" & _ txtNomeUsuario.Text & "','" & _ txtEndereco.Text & "','" & _ txtCidade.Text & "','" & _ txtEstado.Text & "','" & _ txtCEP.Text & "','" & _ txtTelefone.Text & "');" Else 'Alterao: .CommandText = "UPDATE Usuarios SET " & _ "NomeUsuario = '" & txtNomeUsuario.Text & "'," & _ "Endereco = '," & txtEndereco.Text & "'," & _ "Cidade = '," & txtCidade.Text & "'," & _ "Estado = '," & txtEstado.Text & "'," & _ "CEP = '," & txtCEP.Text & "'," & _ "Telefone = '," & txtTelefone.Text & "' " & _ "WHERE CodUsuario = " & txtCodUsuario.Text & ";" End If .Execute End With MsgBox "Gravao concluda com sucesso.", _ vbApplicationModal + vbInformation + vbOKOnly, _ "Gravao OK" 'Chama a sub que limpa os dados do formulrio: LimparTela Saida: Screen.MousePointer = vbDefault Set cnnComando = Nothing Exit Sub errGravacao: With Err If .Number <> 0 Then MsgBox "Houve um erro durante a gravao dos dados na tabela.", _ vbExclamation + vbOKOnly + vbApplicationModal, "Erro" .Number = 0 GoTo Saida End If End With End Sub

7. LimparTela tambm uma subrotina, que limpa totalmente o formulrio para uma nova digitao:
Private Sub LimparTela() 'Chama a sub LimparDados para limpar os campos do formulrio: LimparDados 'Desabilita o boto Excluir: Toolbar1.Buttons(3).Enabled = False 'Apaga o contedo do campo CodUsuario e lhe passa o foco: txtCodUsuario.Text = Empty txtCodUsuario.SetFocus End Sub

8. Falta ainda a subrotina de excluso de registros. Essa um pouco mais simples:


Private Sub ExcluirRegistro() Dim cnnComando As New ADODB.Command Dim vOk As Integer On Error GoTo errExclusao

Microsoft Visual Basic 6

78

'Solicita confirmao da excluso do registro: vOk = MsgBox("Confirma a excluso desse registro?", _ vbApplicationModal + vbDefaultButton2 + vbQuestion + vbYesNo, _ "Excluso") If vOk = vbYes Then Screen.MousePointer = vbHourglass With cnnComando .ActiveConnection = cnnBiblio .CommandType = adCmdText 'Cria o comando SQL: .CommandText = "DELETE FROM Usuarios WHERE CodUsuario = " & _ txtCodUsuario.Text & ";" .Execute End With MsgBox "Registro excludo com sucesso.", _ vbApplicationModal + vbInformation + vbOKOnly, _ "Excluso OK" 'Chama a sub que apaga todos os campos do formulrio: LimparTela End If Saida: Screen.MousePointer = vbDefault Set cnnComando = Nothing Exit Sub errExclusao: With Err If .Number <> 0 Then MsgBox "Houve um erro durante a excluso do registro.", _ vbExclamation + vbOKOnly + vbApplicationModal, "Erro" .Number = 0 GoTo Saida End If End With End Sub

9. Para terminar a codificao desse formulrio falta apenas codificar o evento LostFocus dos campos cujo contedo queremos formatar antes de gravar:
Private Sub txtNomeUsuario_LostFocus() 'Converte a primeira letra de cada palavra digitada em maiscula, 'e as demais em minsculas: txtNomeUsuario.Text = StrConv(txtNomeUsuario.Text, vbProperCase) End Sub Private Sub txtCidade_LostFocus() txtCidade.Text = StrConv(txtCidade.Text, vbProperCase) End Sub Private Sub txtEndereco_LostFocus() txtEndereco.Text = StrConv(txtEndereco.Text, vbProperCase) End Sub Private Sub txtEstado_LostFocus() 'Converte a sigla do Estado digitada em letras maisculas: txtEstado.Text = UCase(txtEstado.Text) End Sub Private Sub txtCEP_LostFocus() 'Formata o CEP digitado: txtCEP.Text = Format(txtCEP.Text, "00000-000") End Sub

10. Finalmente, abra o formulrio frmBiblio na janela Cdigo e codifique o evento Click do menu mnuCadUsuarios:
Private Sub mnuCadUsuarios_Click() frmNovoArtista.Show End Sub

Microsoft Visual Basic 6

79

11. Altere o evento Click da ToolBar para chamar esse mesmo formulrio quando for clicado o boto n 1:
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button) If Button.Index = 1 Then frmCadLivros.Show ElseIf Button.Index = 5 Then mnuSair_Click End If End Sub

12. Teste o aplicativo. No caso de algum erro, verifique cuidadosamente a construo dos comandos SQL, pois uma simples vrgula fora do lugar ou faltando faz com que um comando no funcione. Aproveite para incluir alguns usurios em seu banco de dados; 13. Grave esse formulrio com o nome de frmCadUsuarios; 14. Baseado na programao vista nessa lio, crie os formulrios para manuteno dos cadastros de Categorias e de Editoras.

Microsoft Visual Basic 6

80

Lio 10: Mais Controles


Alm de caixas de textos e labels, podemos usar para alimentar os campos das tabelas quaisquer outros controles que permitam a entrada de dados. Em nosso caso, vendo a estrutura da tabela de Livros, encontraremos alguns campos que se encaixam nessa situao. Vejamos: Os campos CodEditora e CodCategoria esto relacionados, respectivamente, s tabelas Editoras e Categorias, e portanto podemos montar caixas de combinao onde o operador possa fazer sua escolha; Os campos AcompCD e AcompDisquete so do tipo Sim/No, e portanto podemos usar caixas de verificao para marcar e desmarcar essas opes; O campo Idioma, do tipo Byte, receber um valor entre 0 e 2 que indicar o idioma em que est escrito o livro, sendo que 0 = Portugus, 1 = Ingls e 2 = Outro. Como no podem ser marcadas dois ou mais idiomas ao mesmo tempo, podemos montar para esse campo um grupo de botes de opo. Nessa lio estudaremos esses novos controles, enquanto elaboramos mais alguns formulrios do projeto Bibliotecrio. Adicionalmente, veremos como abrir consultas criadas no Access em um projeto VB.

Caixas de Listagem
Uma caixa de listagem oferece ao usurio uma lista de opes entre as quais ele deve obrigatoriamente efetuar sua escolha. Se o nmero de itens no couber no espao ocupado pela caixa no formulrio, uma barra de rolagem vertical ser automaticamente exibida. Um exemplo de caixa de listagem encontrado numa das telas do assistente para instalao de impressoras do Windows: o usurio deve escolher uma das impressoras apresentadas na lista:

Caixas de listagem para escolha de impressora do Windows

Caixas de Combinao
As caixas de combinao, tambm chamadas simplesmente de combo, tm esse nome por serem uma mistura de caixa de texto com caixa de listagem. O usurio tanto pode escolher um item da lista como digitar um valor diretamente na caixa de texto. As principais diferenas entre uma ComboBox e uma ListBox so duas, dependendo do tipo de caixa de combinao usado: a combo pode permitir ao usurio escolher uma opo que no consta da caixa e ocupar menos espao no formulrio que uma caixa de listagem:

A propriedade que determina o tipo da caixa de combinao a Style. Existem trs tipos diferentes: 0 DropDown Combo: o tipo mais comum: permite tanto a escolha de um item da lista como a digitao diretamente na caixa de texto, inclusive de um dado no constante da lista. A lista fica oculta e exibida quando se clica no boto ao lado da caixa de texto. o estilo do nosso exemplo; 1 Simple Combo: nesse estilo a caixa de listagem permanentemente exibida. O usurio pode digitar diretamente na caixa de texto, mas a vantagem da economia de espao perdida.

Microsoft Visual Basic 6

81

2 DropDown List: bastante parecida com uma caixa de listagem comum. O usurio no pode digitar na caixa de texto, que serve apenas para exibir o item selecionado. Como no aceita digitao, no pode ser escolhida uma opo que no conste da lista. As demais propriedades e mtodos das caixas de listagem e de combinao so comuns entre elas. Vejamos as principais:

Propriedade List
A propriedade List contm um array cujos elementos so os itens da caixa de listagem ou de combinao. Ela pode fornecer um determinado item atravs de seu ndice, que inicia-se em 0. Sua sintaxe :
NomeDaCaixa.List(<ndice>)

Onde <ndice> o nmero do ndice do item desejado.

Propriedade ListCount
Essa propriedade, que tambm no est disponvel em tempo de projeto, usada para se obter o nmero de itens da caixa de listagem ou de combinao.

Propriedade ListIndex
A propriedade ListIndex retorna o nmero do ndice do item atualmente selecionado da caixa de listagem ou de combinao. Se no foi selecionado nenhum item, ela retorna o valor 1.

Propriedade Text
A propriedade Text tambm pode ser usada para se obter o item atualmente selecionado da caixa de listagem ou de combinao, s que, como o prprio nome indica, ela retorna o texto do item selecionado, ao invs do ndice.

Propriedade ItemData
Eis uma propriedade muito interessante: para entender sua utilidade, imagine a seguinte situao: no cadastro de Livros temos um campo chamado CodEditora, que, como j dissemos, ser obtido a partir de uma caixa de combinao no formulrio que vamos construir. Acontece que (como voc deve ter reparado) o campo numrico e o item exibido pela combo um texto, que portanto no poder ser gravado nesse campo. ItemData serve exatamente para resolver esse problema, pois ela armazena dados numricos associados aos itens da combo. Assim, quando adicionarmos uma editora caixa, aproveitaremos para gravar o cdigo dessa editora na propriedade ItemData, e quando uma editora for selecionada gravaremos no registro o contedo de ItemData. A sintaxe dessa propriedade a seguinte:
<expresso> = NomeDaCaixa.Itemdata.<ndice>

Onde <expresso> uma varivel ou campo tipo Long, e <ndice> o nmero do ndice do item desejado.

Propriedade Sorted
Essa propriedade determina se os itens sero exibidos em ordem alfabtica ou no. Os valores possveis so True (a lista ser exibida em ordem alfabtica) ou False (os itens sero exibidos na mesma ordem em que foram includos na lista).

Mtodo AddItem
Para adicionarmos itens a uma caixa de listagem ou combinao, usamos o mtodo AddItem. Veja a sintaxe:
NomeDaCaixa.AddItem <item>[,<ndice>]

Onde: Item o nome do item a ser adicionado lista. Se for um texto deve vir entre aspas; ndice opcional: se for especificado, o item ser adicionado lista com o nmero de ndice indicado. O valor 0 indica a primeira posio, 1 o segundo, e assim por diante. Se no for informado, o item ser adicionado ao final da lista. muito til quando trabalhamos com a propriedade ItemData. Veja alguns exemplos:

Microsoft Visual Basic 6

82

Para adicionar o item Melancia a uma caixa de listagem chamada lstFrutas:


lstFrutas.AddItem Melancia

Para adicionar o mesmo item na primeira posio da caixa de listagem:


lstFrutas.AddItem Melancia,0

Para adicionar o texto contido em uma caixa de texto caixa de listagem:


lstFrutas.AddItem txtFruta.Text

Mtodo RemoveItem
O mtodo RemoveItem exclui um item de uma caixa de listagem ou combinao. Veja sua sintaxe:
NomeDaCaixa.RemoveItem <ndice>

Onde <ndice> o ndice do item que deve ser excludo da lista. Por exemplo: para excluir o item com ndice 4 da caixa de listagem lstFrutas, o comando seria o seguinte:
lstFrutas.RemoveItem 4

Caixas de Verificao
Esse tipo de controle normalmente usado para habilitar e desabilitar opes no exclusivas. Ou seja: quando voc inclui mais de uma caixa de verificao em um formulrio, voc pode marcar uma, duas, trs, todas, ou nenhuma. Sua principal propriedade a Value, que indica se a caixa est ou no habilitada, e pode assumir trs valores: 0 Unchecked (desabilitado), 1 Checked (habilitado), e 2 Grayed. Essa ltima ocorre quando a caixa est marcada apenas para uma parte de uma seleo de texto, por exemplo.

Botes de Opo
J usamos esse controle no nosso primeiro aplicativo, lembra-se? Era ele que indicava nosso humor matinal no programa Hello, que elaboramos na lio 1. Ele tambm serve para indicar opes, s que dessa vez exclusivas, ou seja, somente um boto de opo pode estar habilitado de cada vez. A propriedade Value tambm a mais importante para esse controle, e pode assumir os valores True e False. Os botes de opo podem ser agrupados de modo a conseguirmos determinar vrias opes com eles ao mesmo tempo: somente um boto pode estar habilitado em um determinado momento, mas se temos em um formulrio mais de um grupo de botes, em cada um deles pode existir um boto ligado. Esse efeito conseguido com o uso de molduras.

Molduras
Eis um controle curioso: basicamente, uma moldura (ou Frame) no serve para nada alm de criar bordas nas quais outros controles so inseridos, agrupando-os. Mas est justamente a sua grande utilidade: quando os controles so agrupados em frames eles passam a funcionar de maneira integrada. Por exemplo: se voc criar uma moldura, inserir nela alguns labels, e depois disso mov-la para outra rea do formulrio, os labels sero movidos junto com a moldura, pois esto subordinados a ela. Mas, cuidado! Para que isso acontea, imprescindvel que os controles sejam desenhados dentro da moldura. Nada de dar duplo click em um controle e depois mov-lo para dentro da frame. Ele no ser incorporado pela moldura, e continuar sendo um controle independente. A incorporao tambm no funcionar se uma das bordas do controle for desenhada para fora da moldura, mesmo que a maior parte esteja dentro dela.

A Propriedade Index
Como vimos no incio do curso, cada objeto em um formulrio deve possuir um nome, sendo que no podem existir dois objetos com o mesmo nome. Mas podemos criar um control array (vetor de controles) que um conjunto de controles do mesmo tipo com o mesmo nome, que so acessados atravs de um ndice atribudo a cada um deles. Por exemplo: quando usamos botes de opo da mesma maneira que no aplicativo Hello, temos que escrever uma procedure Click para cada um dos botes, pois eles so objetos independentes entre si (lembra-se?). Se ao invs disso crissemos um vetor com esse grupo de botes, todos possuiriam o mesmo nome, e a procedure Click seria comum a todos eles. Bastaria ento identificar em qual deles o usurio

Microsoft Visual Basic 6

83

clicou, atravs da propriedade Index. Foi o que fizemos com os botes da ToolBar nos formulrios do projeto Bibliotecrio. Para testar o uso do control array, inicie um novo projeto e insira no formulrio um label com o nome de lblTeste. Logo em seguida, insira outro label e atribua a ele o mesmo nome, lblTeste. O VB exibir a seguinte caixa de dilogo:

Traduzindo: Voc j possui um controle chamado lblTeste. Voc quer criar um vetor de controles?. Responda Sim, e o VB renomear o primeiro label para lblTeste(0) e o segundo para lblTeste(1). O valor entre parnteses o da propriedade Index de cada um dos controles: 0 e 1, respectivamente. A partir desse momento, quando o objeto for referenciado voc dever indicar o ndice do label que est querendo usar. Por exemplo: para mudar a propriedade Caption do primeiro label, poderamos escrever o comando como a seguir:
lblTeste(0).Caption = Esse o primeiro objeto do vetor

Quando trabalhamos com vetores, os eventos do control array passam a receber um parmetro chamado Index, do tipo Integer, que recebe o valor da propriedade Index do controle que gerou o evento. Por exemplo: abra a janela Cdigo no evento Click de um dos labels. Vamos escrever um comando que mostre uma mensagem no label que foi clicado. Para isso, vamos identific-lo atravs do parmetro Index:
Private Sub lblTeste_Click(Index As Integer) If Index = 0 Then lblTeste(0).Caption = "Voc clicou aqui" lblTeste(1).Caption = Empty Else lblTeste(0).Caption = Empty lblTeste(1).Caption = "Voc clicou aqui" End If End Sub

Uma outra maneira de usar o parmetro Index:


Private Sub lblTeste_Click(Index As Integer) lblTeste(Index).Caption = "Um texto qualquer" End Sub

Por fim, no confunda o parmetro Index, que nada mais que uma varivel recebida pela procedure, com a propriedade Index, que contm o nmero do ndice do controle no vetor. Observao: depois de criar um vetor, para fazer com que um de seus componentes volte a ser um controle independente, deve-se renome-lo e depois apagar o valor da propriedade Index. Depois da apresentao dos controles que sero usados no formulrio de cadastramento de Livros, podemos comear a trabalhar. Adicione um novo formulrio ao projeto, formate-o como no modelo da prxima pgina e altere as propriedades dos objetos conforme a tabela a seguir (note que existe um control array para o idioma): Objeto Formulrio Nome frmCadLivros Outras Propriedades = Valor Caption = Cadastro de Livros BorderStyle = 1 Fixed Single Icon = Misc\Books02.ICO KeyPreview = True MDIChild = True Text = MaxLength = 5 Text = MaxLength = 50

Caixa de texto Caixa de texto

txtCodLivro txtTitulo

Microsoft Visual Basic 6

84

Modelo do formulrio do Cadastro de Livros

Objeto Caixa de texto Caixa de Combinao Caixa de Combinao Caixa de texto Moldura Caixa de Verificao Caixa de Verificao Moldura Boto de Opo Boto de Opo Boto de Opo Image

Nome txtAutor cboEditora cboCategoria txtObservacoes Frame1 chkAcompCD chkAcompDisquete Frame2 optIdioma optIdioma optIdioma ImageList1 Imagens

Outras Propriedades = Valor Text = MaxLength = 35 Style = 2 DropDown List Style = 2 DropDown List Text = MultiLine = True ScroolBars = 2 Vertical Caption = Acompanha: Caption = CD Caption = Disquete Caption = Idioma: Caption = Portugus Index = 0 Value = True Caption = Ingls Index = 1 Caption = Outro Index = 2 Tamanho das imagens: 32 x 32 pixels 1 = Computer\Disk04.ICO 2 = Writing\Erase02.ICO 3 = Computer\Trash01.ICO 4 = TRAFFIC\TRFFC14.ICO ImageList = ImageList1 Appearance = 1 cc3D BorderStyle = 0 ccNone Style = 1 tbrFlat ToolTipText = Grava o registro atual Image = 1 ToolTipText = Limpa os dados digitados Image = 2 ToolTipText = Exclui o registro atual Image = 3 Enabled = False (desmarcar) ToolTipText = Retorna ao menu principal Image = 4

ToolBar

ToolBar1

Boto 1 Boto 2 Boto 3 Boto 4

Microsoft Visual Basic 6

85

Grave o formulrio com o nome de frmCadLivros, e vamos ento iniciar a programao. A maior parte dela segue a mesma lgica do cadastro de usurios, ento comearemos pelos controles que estamos estudando agora: 1. Vamos precisar de algumas variveis privadas para armazenar os valores das caixas de combinao e de verificao e dos botes de opo. Abra a janela Cdigo na seo Declarations e escreva os comandos:
Dim Dim Dim Dim vInclusao As Boolean vCodEditora, vCodCategoria As Long vAcompCD, vAcompDisquete As Boolean vIdioma As Byte

2. Escreva a procedure Form_KeyPress para permitir a mudana dos campos pela tecla Enter; 3. No evento Form_Load vamos inicializar as variveis privadas:
Private Sub Form_Load() Me.Left = (frmBiblio.ScaleWidth - Me.Width) / 2 Me.Top = (frmBiblio.Height - Me.Height) / 2 'Inicializa as variveis auxiliares: vCodEditora = 0 vCodCategoria = 0 vAcompCD = False vAcompDisquete = False vIdioma = 0 End Sub

4. A programao das caixas de verificao muito simples: quando acontecer um click, verificamos se foi marcada ou desmarcada, e alteramos o valor da varivel correspondente para True ou False, conforme o caso. Abra ento a janela cdigo dando um duplo-click sobre chkAcompCD:
Private Sub chkAcompCD_Click() 'Verifica se chkAcompCD est ou no marcada, e atribui a vAcompCD o valor 'correspondente: If chkAcompCD.Value = vbChecked Then vAcompCD = True Else vAcompCD = False End If End Sub

5. Programe o evento Click da caixa de verificao chkAcompDisquete conforme a procedure acima; 6. A programao para os botes de opo ainda mais fcil: basta atribuir varivel o valor do parmetro Index:
Private Sub optIdioma_Click(Index As Integer) 'Atribui varivel vIdioma o valor do parmetro index, pois esse contm o 'ndice do boto que foi clicado: 0 = Portugus, 1 = Ingls e 2 = Outros: vIdioma = Index End Sub

7. O prximo passo fazer a programao das caixas de combinao. Vamos aproveit-lo para aprender como criar recordsets a partir de consultas do Access. Por enquanto, grave seu trabalho e saia do VB;

Acionando Consultas do Banco de Dados


Muitas vezes utilizamos dados obtidos atravs de outros objetos do banco de dados que no sejam as tabelas, normalmente de consultas. No caso do Access, isso acontece muito quando precisamos de dados de tabelas relacionadas, ou com muitos critrios de seleo, pois mais simples criar uma consulta que elaborar o comando SQL correspondente. A execuo de uma consulta a partir da aplicao VB muito simples: 1. Abra o Access e o banco de dados Biblio; 2. Crie uma nova consulta conforme o modelo da prxima pgina; 3. Salve a consulta com o nome de EditorasEmOrdemAlfabetica; 4. Aproveite para criar tambm a consulta CategoriasEmOrdemAlfabetica, com os campos CodCategoria e NomeCategoria;

Microsoft Visual Basic 6

86

A consulta EditorasEmOrdemAlfabetica

5. Saia do Access, abra o VB e o projeto Bibliotecario; 6. Vamos criar as procedures para carregar as combos no mdulo de programao como pblicas. Mas, se elas no sero criadas no formulrio, como faremos para que reconheam as combos, que so objetos locais? Simples: passaremos o nome da combo a ser carregada como parmetro para a procedure. Abra a janela Cdigo no mdulo de programao Biblio; 7. Escreva a procedure ComboEditoras conforme segue:
Public Sub ComboEditoras(NomeCombo As ComboBox) Dim cnnComando As New ADODB.Command Dim rsTemp As New ADODB.Recordset Dim i As Integer On Error GoTo errComboEditoras 'Executa a consulta EditorasEmOrdemAlfabetica: With cnnComando .ActiveConnection = cnnBiblio .CommandType = adCmdStoredProc .CommandText = "EditorasEmOrdemAlfabetica" Set rsTemp = .Execute End With With rsTemp 'Verifica se existe alguma editora cadastrada: If Not (.EOF And .BOF) Then 'Se existe, ento posiciona o apontador no primeiro registro do rs: .MoveFirst 'Inicializa a varivel i que ser usada como ndice para a 'propriedade ItemData: i = 0 While Not .EOF 'Adiciona um item combo com o nome da editora: NomeCombo.AddItem !Descrio, i 'Grava na propriedade ItemData desse o cdigo da editora: NomeCombo.ItemData(i) = !Cdigo 'Vai para o prximo registro do rs: .MoveNext 'Incrementa i: i = i + 1 Wend End If End With Saida: Set cnnComando = Nothing Set rsTemp = Nothing

Microsoft Visual Basic 6

87

Exit Sub errComboEditoras: With Err If .Number <> 0 Then MsgBox "No foi possvel a leitura da tabela de Editoras:", _ , vbInformation + vbOKOnly + vbApplicationModal, _ "Erro ao carregar ComboBox" .Number = 0 GoTo Saida End If End With End Sub

Obs.: NomeCombo o parmetro que vai receber a caixa de combinao a ser carregada. Assim, declaramos seu tipo como ComboBox. dessa maneira que passamos objetos como parmetros para subrotinas: indicando qual o tipo desse objeto. Se voc no souber o tipo do objeto, declare o parmetro como Variant, dessa maneira o tipo ser assumido dinamicamente na passagem do parmetro. 8. Usando CarregaEditoras como base, crie um outra subrotina chamada CarregaCategorias executando a consulta CategoriasEmOrdemAlfabetica; 9. Abra o formulrio frmCadLivros e acrescente a seguinte programao ao final do evento Form_Load, para fazer o carregamento das combos a partir das procedures que acabamos de criar:
'Chama a procedure ComboEditoras e passa a combo cboEditora como 'parmetro: ComboEditoras cboEditora 'O mesmo para cboCategorias: ComboCategorias cboCategoria 'Garante que nenhum item esteja selecionado nas combos: cboEditora.ListIndex = -1 cboCategoria.ListIndex = -1

10. Devemos agora programar o evento Click das combos para atribuir o cdigo do item escolhido varivel correspondente. Comecemos por cboEditoras (ateno: o evento padro de uma combo o Change, mas a programao abaixo deve ser feita no evento Click, ento cuidado para faz-la corretamente):
Private Sub cboEditora_Click() With cboEditora 'Verifica se foi selecionado um item da combo: If .ListIndex <> -1 Then 'Se foi, atribui varivel vCodEditora o contedo da 'propriedade ItemData: vCodEditora = .ItemData(.ListIndex) Else 'Seno, zera a varivel: vCodEditora = 0 End If End With End Sub

Obs.: como queremos armazenar na varivel o cdigo referente ao item selecionado, cujo ndice indicado por ListIndex, usamos essa propriedade como parmetro para ItemData. 11. Baseado na procedure acima, escreva a programao para o evento Click da combo cboCategoria; 12. O prximo passo apresentar os dados do registro selecionado nos campos do formulrio em caso de alterao. Como no cadastro de usurios, isso ser programado no evento LostFocus de txtCodLivro:
Private Sub txtCodLivro_LostFocus() Dim cnnComando As New ADODB.Command Dim rsSelecao As New ADODB.Recordset Dim vCod As Long Dim i As Integer On Error GoTo errSelecao 'Converte o cdigo digitado para pesquisa: vCod = Val(txtCodLivro.Text) 'Se no foi digitado um cdigo vlido, sai da sub: If vCod = 0 Then Exit Sub Screen.MousePointer = vbHourglass

Microsoft Visual Basic 6

88

'Tenta selecionar o registro na tabela de livros: With cnnComando .ActiveConnection = cnnBiblio .CommandType = adCmdText .CommandText = "SELECT * FROM Livros WHERE CodLivro = " & vCod & ";" Set rsSelecao = .Execute End With With rsSelecao If .EOF And .BOF Then 'Se o recordset est vazio, no encontrou registro com esse cdigo: LimparDados 'Identifica a operacao como incluso: vInclusao = True Else 'Seno, atribui aos campos e variveis auxiliares os dados do 'registro: txtTitulo.Text = !Titulo txtAutor.Text = !Autor vCodEditora = !CodEditora vCodCategoria = !CodCategoria vAcompCD = !AcompCD vAcompDisquete = !AcompDisquete vIdioma = !Idioma 'Como Observacoes no um campo obrigatrio, devemos impedir a 'atribuio do valor nulo (se houver) caixa de texto: txtObservacoes = Empty & !Observacoes 'Exibe os dados das variveis nos controles correspondentes: With cboEditora 'Elimina a seleo atual: .ListIndex = -1 'Como ListCount retorna o nmero de itens da combo, 'ListCount - 1 igual ao ndice do ltimo item. Portanto, o 'loop abaixo ser executado para todos os itens da combo 'atravs de seu ndice: For i = 0 To (.ListCount - 1) If vCodEditora = .ItemData(i) Then 'Se ItemData for igual ao cdigo atual, 'seleciona o item e sai do loop: .ListIndex = i Exit For End If Next i End With With cboCategoria .ListIndex = -1 For i = 0 To (.ListCount - 1) If vCodCategoria = .ItemData(i) Then .ListIndex = i Exit For End If Next i End With 'Se vAcompCD = True, marca chkAcompCD, seno desmarca: chkAcompCD.Value = IIf(vAcompCD, vbChecked, vbUnchecked) chkAcompDisquete.Value = IIf(vAcompDisquete, vbChecked, vbUnchecked) 'Marca o boto de opo correspondente ao idioma atual: optIdioma(vIdioma).Value = True 'Habilita o boto Excluir: Toolbar1.Buttons(3).Enabled = True 'Identifica a operao como Alterao: vInclusao = False End If End With 'Desabilita a digitao do cdigo: txtCodLivro.Enabled = False Saida: 'Elimina o command e o recordset da memria: Set rsSelecao = Nothing

Microsoft Visual Basic 6

89

Set cnnComando = Nothing Screen.MousePointer = vbDefault Exit Sub errSelecao: With Err If .Number <> 0 Then MsgBox "Erro na recuperao do registro solicitado:", _ vbExclamation + vbOKOnly + vbApplicationModal, "Aviso" .Number = 0 GoTo Saida End If End With End Sub

13. Na sub LimparDados eliminamos as selees e marcaes dos controles que estamos estudando:
Private Sub LimparDados() 'Apaga o contedo dos campos do formulrio: txtTitulo.Text = Empty txtAutor.Text = Empty txtObservacoes.Text = Empty 'Elimina a seleo das combos: cboEditora.ListIndex = -1 cboCategoria.ListIndex = -1 'Desmarca as caixas de verificao: chkAcompCD.Value = vbUnchecked chkAcompDisquete.Value = vbUnchecked 'Marca a opo Portugus em optIdioma: optIdioma(0).Value = True 'Reinicializa as variveis auxiliares: vCodEditora = 0 vCodCategoria = 0 vAcompCD = False vAcompDisquete = False vIdioma = 0 End Sub

14. Na sub GravarDados, passamos para os campos os dados das variveis auxiliares:
Private Sub GravarDados() Dim cnnComando As New ADODB.Command Dim vSQL As String Dim vCod As Long Dim vConfMsg As Integer Dim vErro As Boolean On Error GoTo errGravacao 'Converte o cdigo digitado para gravao: vCod = Val(txtCodLivro.Text) 'Verifica os dados digitados: vConfMsg = vbExclamation + vbOKOnly + vbApplicationModal vErro = False If vCod = 0 Then MsgBox "O campo Cdigo no foi preenchido.", vConfMsg, "Erro" vErro = True End If If txtTitulo.Text = Empty Then MsgBox "O campo Ttulo no foi preenchido.", vConfMsg, "Erro" vErro = True End If If txtAutor.Text = Empty Then MsgBox "O campo Autor no foi preenchido.", vConfMsg, "Erro" vErro = True End If If vCodEditora = 0 Then MsgBox "No foi selecionada uma Editora.", vConfMsg, "Erro" vErro = True End If If vCodCategoria = 0 Then MsgBox "No foi selecionada uma Categoria.", vConfMsg, "Erro"

Microsoft Visual Basic 6

90

vErro = True End If 'Se aconteceu um erro de digitao, sai da sub sem gravar: If vErro Then Exit Sub Screen.MousePointer = vbHourglass 'Constri o comando SQL para gravao: If vInclusao Then 'Se uma incluso: vSQL = "INSERT INTO Livros (CodLivro, Titulo, Autor, CodEditora, " & _ "CodCategoria, AcompCD, AcompDisquete, Idioma, Observacoes) " & _ "VALUES (" & vCod & ",'" & _ txtTitulo.Text & "','" & _ txtAutor.Text & "'," & _ vCodEditora & "," & _ vCodCategoria & "," & _ vAcompCD & "," & _ vAcompDisquete & "," & _ vIdioma & ",'" & _ txtObservacoes.Text & "');" Else 'Seno, alterao: vSQL = "UPDATE Livros SET Titulo = '" & txtTitulo.Text & _ "', Autor = '" & txtAutor.Text & _ "', CodEditora = " & vCodEditora & _ ", CodCategoria = " & vCodCategoria & _ ", AcompCD = " & vAcompCD & _ ", AcompDisquete = " & vAcompDisquete & _ ", Idioma = " & vIdioma & _ ", Observacoes = '" & txtObservacoes.Text & _ "' WHERE CodLivro = " & vCod & ";" End If 'Executa o comando de gravao: With cnnComando .ActiveConnection = cnnBiblio .CommandType = adCmdText .CommandText = vSQL .Execute End With MsgBox "Gravao concluda com sucesso.", _ vbApplicationModal + vbInformation + vbOKOnly, _ "Gravao OK" 'Chama a sub que limpa os dados do formulrio: LimparTela Saida: Screen.MousePointer = vbDefault Set cnnComando = Nothing Exit Sub errGravacao: With Err If .Number <> 0 Then MsgBox "Erro durante a gravao dos dados no registro." & vbCrLf & _ "A operao no foi completada." , _ vbExclamation + vbOKOnly + vbApplicationModal, _ "Operao cancelada" .Number = 0 GoTo Saida End If End With End Sub

15. O restante da programao para esse formulrio semelhante quela feita em frmCadUsuarios:
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button) Select Case Button.Index Case 1 GravarDados Case 2 LimparTela

Microsoft Visual Basic 6

91

Case 3 ExcluirRegistro Case 4 Unload Me End Select End Sub

Private Sub txtAutor_LostFocus() 'Converte a primeira letra de cada palavra digitada em maiscula, 'e as demais em minsculas: txtAutor.Text = StrConv(txtAutor.Text, vbProperCase) End Sub

Private Sub txtTitulo_LostFocus() txtTitulo.Text = StrConv(txtTitulo.Text, vbProperCase) End Sub

Private Sub ExcluirRegistro() Dim cnnComando As New ADODB.Command Dim vOk As Integer Dim vCod As Long On Error GoTo errExclusao 'Solicita confirmao da excluso do registro: vOk = MsgBox("Confirma a excluso desse registro?", _ vbApplicationModal + vbDefaultButton2 + vbQuestion + vbYesNo, _ "Excluso") If vOk = vbYes Then Screen.MousePointer = vbHourglass 'Se confirmou, converte o cdigo digitado: vCod = Val(txtCodLivro.Text) 'Executa a operao: With cnnComando .ActiveConnection = cnnBiblio .CommandType = adCmdText .CommandText = "DELETE FROM Livros WHERE CodLivro = " & vCod & ";" .Execute End With MsgBox "Registro excludo com sucesso.", _ vbApplicationModal + vbInformation + vbOKOnly, _ "Excluso OK" LimparTela End If Saida: Screen.MousePointer = vbDefault Set cnnComando = Nothing Exit Sub errExclusao: With Err If .Number <> 0 Then MsgBox "Erro durante a excluso do registro." & vbCrLf & _ "A operao no foi completada.", _ vbExclamation + vbOKOnly + vbApplicationModal, _ "Operao cancelada" .Number = 0 GoTo Saida End If End With End Sub

Microsoft Visual Basic 6

92

Private Sub LimparTela() LimparDados Toolbar1.Buttons(3).Enabled = False txtCodLivro.Text = Empty txtCodLivro.SetFocus End Sub

1. Faa no formulrio principal a programao necessria para que o menu mnuCadLivros e o boto n 1 da ToolBar abram o formulrio frmCadLivros; 16. Grave seu trabalho; 17. Teste o funcionamento do formulrio. Aproveite para adicionar alguns livros ao banco de dados.

Microsoft Visual Basic 6

93

Lio 11 Datas e Relacionamentos


Uma das preocupaes que todo programador deve ter : como manter a integridade das informaes do meu banco de dados? Por isso to importante a verificao dos dados digitados antes da gravao de um registro. Mas existem casos que essa verificao deve ser mais cuidadosa: na gravao de datas e quando existe um relacionamento entre as tabelas envolvidas. Nessa lio aprenderemos como tratar os dados nessas situaes.

Gravao de Datas
Como j dissemos quando da apresentao dos tipos de dados admitidos pelo VB, para ele um dado tipo data nada mais que um dado numrico com um formato especial que representa uma data. Devido a essa particularidade, para que possamos manipular datas corretamente no VB foram criadas algumas funes especficas. Vejamos as principais: CDate: ns j estudamos essa funo quando falamos das funes de converso. Ela converte uma string em uma data, se possvel. Date: essa funo retorna a data corrente do sistema, no formato especificado no Painel de Controle do Windows. IsDate: verifica se uma expresso pode ser convertida em uma data, e nesse caso retorna True, ou False caso contrrio. A expresso pode ser um dado string, numrico, data ou variant. Sua sintaxe :
IsDate(<expresso>)

Observao: tambm existem funes de verificao para outros tipos de dados. As principais so: IsNumeric, para verificar se um dado numrico, IsEmpty, para verificar se uma string est vazia, e IsNull, para verificar se uma expresso nula.

Verificando os Relacionamentos
Os SGBD's atuais so em sua grande maioria do tipo relacional, ou seja, baseados no conceito de relacionamento entre tabelas para permitir a recuperao de informaes impedindo redundncia de dados. Um relacionamento uma ligao entre a chave primria de uma tabela e uma chave estrangeira que contenha o mesmo dado em outra tabela. A tabela que contm a chave primria chamada de origem do relacionamento, e a que contm a chave estrangeira chamada de destino do relacionamento. O problema que, para que um relaciomento funcione corretamente preciso no destino no existam dados sem correspondncia na tabela de origem. Isso implica que: Na incluso ou alterao de registros na origem, a chave primria no pode ser repetida; Na incluso ou alterao de registros no destino, deve-se verificar se existe o registro correspondente chave estrangeira na origem; A alterao ou excluso de registros na origem no deve ser permitida no caso de existirem registros relacionados no destino, a no ser que seja uma atualizao em cascata (onde os registros correspondentes no destino tambm sero afetados pela operao executada na origem). A esse conjunto de regras damos o nome de Integridade Referencial. Os SGBD's mais modernos incluindo a o Access fazem a checagem de integridade referencial automaticamente, impedindo anomalias nas informaes do banco. Mas isso no elimina a necessidade de checarmos os dados digitados. Por exemplo: em nosso sistema, no emprstimo de um livro, o operador informa o cdigo do usurio que o est retirando. Devemos verificar se esse cdigo existe na tabela de usurios, pois se enviarmos ao banco um cdigo de usurio invlido, e os recursos de checagem de integridade referencial do banco estiverem ativados, a gravao no ser realizada e o banco retornar um erro de execuo. Para aplicar esses conceitos, vamos criar o formulrios de emprstimo de livros do sistema Bibliotecrio. Note que nesse formulrio ser solicitada a digitao dos cdigos do livro e do usurio, e portanto vamos precisar verific-los antes de gravar o registro:

Microsoft Visual Basic 6

94

1. Adicione um novo formulrio ao projeto e formate-o como no modelo:

A tabela abaixo contm as propriedades dos objetos: Objeto Formulrio Nome frmEmprestimos Outras Propriedades = Valor Caption = Emprstimos de Livros BorderStyle = 1 Fixed Single Icon = Misc\Book04.ICO KeyPreview = True MDIChild = True txtCodLivro Text = MaxLength = 5 lblTitulo Caption = txtCodUsuario Text = MaxLength = 5 lblNomeUsuario Caption = txtDataEmprestimo Text = MaxLength = 10 txtDataDevolucao Text = MaxLength = 10 cmdOk Caption = &Ok Style = 1 Graphical Picture = Misc\Checkmrk.ICO cmdCancelar Caption = &Cancelar Style = 1 Graphical Picture = Computer\W95mbx01.ICO cmdRetornar Caption = &Retornar Style = 1 Graphical Picture = Traffic\Trffc14.ICO

Caixa de texto Label Caixa de texto Label Caixa de texto Caixa de texto Boto de Comando Boto de Comando Boto de Comando

2. Grave o novo formulrio com o nome de frmEmprestimos; 3. Escreva as procedures Form_KeyPress e cmdRetornar_Click como j estudamos anteriormente; 4. No evento Load, vamos inicializar os campos txtDataEmprestimo e txtDataDevolucao. Note o uso da funo Format:
Private Sub Form_Load() Me.Left = (frmBiblio.ScaleWidth - Me.Width) / 2 Me.Top = (frmBiblio.Height - Me.Height) / 2 'Atribui caixa txtDataEmprestimo a data atual do sistema: txtDataEmprestimo.Text = Format(Date, "Short Date") 'Atribui caixa txtDataDevolucao a data atual do sistema + 15 dias: txtDataDevolucao.Text = Format((Date + 15), "Short Date") End Sub

5. No evento LostFocus da caixa txtCodLivro, verificaremos se o cdigo digitado vlido, e exibiremos o ttulo do livro em lblTitulo:
Private Sub txtCodLivro_LostFocus() Dim cnnComando As New ADODB.Command Dim rsSelecao As New ADODB.Recordset Dim vCod As Long On Error GoTo errSelecao

Microsoft Visual Basic 6

95

'Converte o cdigo digitado: vCod = Val(txtCodLivro.Text) 'Se no foi digitado um cdigo vlido, sai da sub: If vCod = 0 Then Exit Sub Screen.MousePointer = vbHourglass 'Seleciona o livro solicitado: With cnnComando .ActiveConnection = cnnBiblio .CommandType = adCmdText .CommandText = "SELECT * FROM LIVROS WHERE CodLivro = " & vCod & ";" Set rsSelecao = .Execute End With With rsSelecao If .EOF And .BOF Then 'Se no encontrou o livro, deixa o ttulo do livro em branco: lblTitulo.Caption = Empty Else 'Se encontrou, exibe o ttulo do livro em lblTitulo: lblTitulo.Caption = !Titulo 'Verifica se o livro j est emprestado: If !Emprestado Then 'Se est, impede novo emprstimo: MsgBox "Esse livro j est emprestado, verifique.", _ vbExclamation + vbOKOnly + vbSystemModal, "Erro" 'Volta o foco ao cdigo para redigitao: txtCodLivro.SetFocus End If End If End With Saida: Set rsSelecao = Nothing Set cnnComando = Nothing Screen.MousePointer = vbDefault Exit Sub errSelecao: With Err If .Number <> 0 Then MsgBox "Houve um erro na recuperao do registro solicitado.", _ vbExclamation + vbOKOnly + vbApplicationModal, "Aviso" .Number = 0 GoTo Saida End If End With End Sub

6. A codificao para o campo txtCodUsuario um pouco mais simples:


Private Sub txtCodUsuario_LostFocus() Dim cnnComando As New ADODB.Command Dim rsSelecao As New ADODB.Recordset Dim vCod As Long On Error GoTo errUsuario vCod = Val(txtCodUsuario.Text) If vCod = 0 Then Exit Sub Screen.MousePointer = vbHourglass With cnnComando .ActiveConnection = cnnBiblio .CommandType = adCmdText .CommandText = "SELECT NomeUsuario FROM Usuarios " & _ "WHERE CodUsuario = " & vCod & ";" Set rsSelecao = .Execute End With With rsSelecao If .EOF And .BOF Then MsgBox "Cdigo do usurio invlido, verifique.", _ vbExclamation + vbOKOnly + vbSystemModal, "Erro" lblNomeUsuario.Caption = Empty txtCodUsuario.SetFocus Else

Microsoft Visual Basic 6

96

'Se encontrou, exibe o nome do usurio em lblNomeUsuario: lblNomeUsuario.Caption = !NomeUsuario End If End With Saida: Set rsSelecao = Nothing Set cnnComando = Nothing Screen.MousePointer = vbDefault Exit Sub errUsuario: With Err If .Number <> 0 Then MsgBox "Houve um erro na recuperao do usurio solicitado.", & _ vbExclamation + vbOKOnly + vbApplicationModal, "Aviso" .Number = 0 GoTo Saida End If End With End Sub

7. No evento LostFocus de txtDataEmprestimo, antes de formatar a digitao, precisamos verificar se o texto do campo ou no um data vlida. Para isso usaremos IsDate:
Private Sub txtDataEmprestimo_LostFocus() Dim vDataDevolucao As Date With txtDataEmprestimo If .Text <> Empty Then 'Verifica se o dado digitado pode ser uma data: If Not IsDate(.Text) Then 'Se o dado digitado no pode ser uma data, assume a do sistema: .Text = Date Else 'Seno, formata a data digitada: .Text = Format(.Text, "Short Date") End If 'Atribui caixa txtDataDevolucao a data digitada + 15 dias: vDataDevolucao = CDate(.Text) + 15 txtDataDevolucao.Text = Format(vDataDevolucao, "Short Date") End If End With End Sub

8. O mesmo vale para txtDataDevolucao:


Private Sub txtDataDevolucao_LostFocus() 'Formata a data digitada: With txtDataDevolucao If .Text <> Empty Then If Not IsDate(.Text) Then 'Se o dado digitado no pode ser uma data, assume 'a data do sistema + 15 dias: .Text = Date + 15 Else 'Seno, formata a data digitada: .Text = Format(.Text, "Short Date") End If End If End With End Sub

9. O boto Ok grava os dados do emprstimo no cadastro de livros:


Private Sub cmdOk_Click() Dim cnnComando As New ADODB.Command Dim vCodLivro, vCodUsuario As Long Dim vDataEmprestimo, vDataDevolucao As Date Dim vConfMsg As Integer Dim vErro As Boolean On Error GoTo errGravacao

Microsoft Visual Basic 6

97

'Converte os dados digitados: vCodLivro = Val(txtCodLivro.Text) vCodUsuario = Val(txtCodUsuario.Text) vDataEmprestimo = CDate(txtDataEmprestimo.Text) vDataDevolucao = CDate(txtDataDevolucao.Text) 'Verifica os dados digitados: vConfMsg = vbExclamation + vbOKOnly + vbSystemModal vErro = False If vCodLivro = 0 Then MsgBox "O campo Cdigo do Livro no foi preenchido.", vConfMsg, "Erro" vErro = True End If If lblTitulo.Caption = Empty Then 'Se lblTitulo estiver em branco, o cdigo do livro informado no foi 'encontrado na tabela: MsgBox "O campo Cdigo do Livro no contm um dado vlido.", _ vConfMsg, "Erro" vErro = True End If If vCodUsuario = 0 Then MsgBox "O campo Cdigo do Usurio no foi preenchido.", vConfMsg, "Erro" vErro = True End If If vDataEmprestimo >= vDataDevolucao Then MsgBox "A Data de Devolucao informada menor ou igual Data de " & _ Emprstimo, verifique.", vConfMsg, "Erro" vErro = True End If 'Se aconteceu um erro de digitao, sai da sub sem gravar: If vErro Then Exit Sub Screen.MousePointer = vbHourglass 'Executa a SP de devoluo de livros: With cnnComando .ActiveConnection = cnnBiblio .CommandType = adCmdText .CommandText = "UPDATE Livros SET CodUsuario = " & vCodUsuario & _ ", Emprestado = True, DataEmprestimo = " & vDataEmprestimo & _ ", DataDevolucao = " & vDataDevolucao & " WHERE CodLivro = " & _ vCodLivro & ";" .Execute End With MsgBox "Esse livro foi emprestado a " & lblNomeUsuario & " com sucesso.", _ vbApplicationModal + vbInformation + vbOKOnly, "Emprstimo OK" 'Chama a subrotina cmdCancelar_Click para limpar os campos do formulrio: cmdCancelar_Click Saida: Screen.MousePointer = vbDefault Set cnnComando = Nothing Exit Sub errGravacao: With Err If .Number <> 0 Then MsgBox "Erro durante a gravao dos dados no registro." & _ vbCrLf & "A devoluo desse livro no foi completada.", _ vbExclamation + vbOKOnly + vbApplicationModal, _ "Emprstimo cancelado" .Number = 0 GoTo Saida End If End With End Sub

10. Finalmente, o boto Cancelar apaga os dados do formulrio sem grav-los:


Private Sub cmdCancelar_Click() 'Cancela a digitao atual e limpa todos os campos do formulrio: txtCodLivro.Text = Empty lblTitulo.Caption = Empty

Microsoft Visual Basic 6

98

txtCodUsuario.Text = Empty lblNomeUsuario.Caption = Empty txtDataEmprestimo.Text = Format(Date, "Short Date") txtDataDevolucao.Text = Format((Date + 15), "Short Date") txtCodLivro.SetFocus End Sub

11. Abra o formulrio frmBiblio e faa a programao necessria para que o menu mnuEmprestimos e o boto n 3 da ToolBar abram o formulrio frmEmprestimos; 12. Grave seu trabalho; 13. Teste a programao emprestando alguns livros.

Joins
No haveria razo para relacionar tabelas se no pudssemos recuperar as informaes mais facilmente. Em SQL, usamos o comando SELECT e a clusula JOIN para exibir dados de tabelas relacionadas. A sintaxe de SELECT com JOIN a seguinte:
SELECT <lista de campo> FROM <destino> <INNER ou RIGHT ou LEFT> JOIN <origem> ON <chave estrangeira> = <chave primria>;

A primeira linha contm um comando SELECT comum. A segunda linha indica o tipo de JOIN que deve ser usado: INNER: sero selecionadas para exibio somente as linhas que contenham dados de ambas as tabelas; RIGHT: sero selecionadas para exibio todas as linhas da tabela que est a direita (right) do JOIN, ou seja, da origem do relacionamento, mesmo que no existam dados correspondentes no destino; LEFT: sero selecionadas para exibio todas as linhas da tabela que est a esquerda (left) do JOIN, ou seja, do destino do relacionamento, mesmo que no existam dados correspondentes na origem; Por exemplo: a tabela de livros no contm o nome da editora. Mas podemos exib-lo juntamente aos dados do livro, com o seguinte comando:
SELECT Livros.*, Editoras.NomeEditora FROM Livros INNER JOIN Editoras ON Livros.CodEditora = Editoras.CodEditora;

Note que, como estamos trabalhando com mais de uma tabela, precisamos identificar de que tabela vem o campo desejado, atravs do ponto .. Isso fica bem evidente no campo CodEditora, que existe em ambas as tabelas: para indicar o campo da tabela de Livros, usamos Livros.CodEditora. A indicao Livros.* indica todos os campos da tabela Livros. Outro exemplo: o comando abaixo exibe todos os usurios cadastrados, e o ttulo do livro quando o usurio estiver com algum emprestado:
SELECT Usuarios.*, Livros.Titulo FROM Usuarios LEFT JOIN Livros ON Usuarios.CodLivro = Livros.CodLivros;

interessante destacar que JOIN pode ser combinado com outras clusulas do comando SELECT, como WHERE e ORDER BY, sem nenhum problema. Como exemplo, vamos alterar o comando acima para ordenar o resultado pelo ttulo do livro:
SELECT Livros.*, Editoras.NomeEditora FROM Livros INNER JOIN Editoras ON Livros.CodEditora = Editoras.CodEditora ORDER BY Livros.Titulo;

Mas vamos aplicar o que aprendemos: o prximo passo em nosso sistema a devoluo de livros. Para isso vamos apagar as datas de devoluo e emprstimo do registro correspondente ao livro que est sendo devolvido, e assim liber-lo para outro emprstimo. Vejamos como fazer isso: 1. Adicione ao projeto um novo formulrio, formate-o como o modelo da prxima pgina e defina as propriedades dos objetos conforme a tabela; 2. Grave o novo formulrio com o nome de frmDevolucoes; 3. Escreva na procedure Form_Load os comandos para centralizar o formulrio; 4. Crie as procedures Form_KeyPress e cmdRetornar_Click do novo formulrio como estudamos nas lies anteriores;

Microsoft Visual Basic 6

99

Objeto Formulrio

Nome frmDevolucoes

Caixa de texto Label Label Label Boto de Comando Boto de Comando Boto de Comando

txtCodLivro lblTitulo lblCodUsuario lblNomeUsuario cmdOk cmdCancelar cmdRetornar

Outras Propriedades = Valor Caption = Devolues de Livros BorderStyle = 1 Fixed Single Icon = Misc\Books04.ICO KeyPreview = True MDIChild = True Text = MaxLength = 5 Caption = Caption = Caption = Caption = &Ok Style = 1 Graphical Picture = Misc\Checkmrk.ICO Caption = &Cancelar Style = 1 Graphical Picture = Computer\W95mbx01.ICO Caption = &Retornar Style = 1 Graphical Picture = Traffic\Trffc14.ICO

5. A programao do campo txtCodLivro nesse formulrio um pouco mais complicada que no anterior, pois aqui devemos exibir tambm os dados do usurio, j que obviamente seu cdigo no ser digitado. Veja como ficou:
Private Sub txtCodLivro_LostFocus() Dim cnnComando As New ADODB.Command Dim rsLivro As New ADODB.Recordset Dim vCod As Long On Error GoTo errSelecao vCod = Val(txtCodLivro.Text) If vCod = 0 Then Exit Sub Screen.MousePointer = vbHourglass 'Seleciona o livro solicitado: With cnnComando .ActiveConnection = cnnBiblio .CommandType = adCmdText .CommandText = "SELECT Livros.*, Usuarios.NomeUsuario " & _ "FROM Livros LEFT JOIN Usuarios " & _ "ON Livros.CodUsuario = Usuarios.CodUsuario " & _ "WHERE Livros.CodLivro = " & vCod & ";" Set rsLivro = .Execute End With With rsLivro If .EOF And .BOF Then 'Se no encontrou o livro, deixa os labels em branco: lblTitulo.Caption = Empty lblCodUsuario.Caption = Empty lblNomeUsuario.Caption = Empty Else 'Se encontrou, exibe os dados do livro e do usurio: lblTitulo.Caption = !Titulo

Microsoft Visual Basic 6

100

lblCodUsuario.Caption = Empty & !CodUsuario lblNomeUsuario.Caption = Empty & !NomeUsuario 'Verifica se o livro est emprestado: If Not !Emprestado Then 'Se no est, impede a devoluo: MsgBox "Esse livro no est emprestado, verifique.", _ vbExclamation + vbOKOnly + vbSystemModal, "Erro" 'Volta o foco ao cdigo para redigitao: txtCodLivro.SetFocus End If End If End With Saida: Set rsLivro = Nothing Set cnnComando = Nothing Screen.MousePointer = vbDefault Exit Sub errSelecao: With Err If .Number <> 0 Then MsgBox "Erro na recuperao do registro solicitado." & vbCrLf & _ vbExclamation + vbOKOnly + vbApplicationModal, "Aviso" .Number = 0 GoTo Saida End If End With End Sub

6. O boto Ok, nesse formulrio, apaga os dados gravados nos campos de emprstimo do cadastro de livros:
Private Sub cmdOk_Click() Dim cnnComando As New ADODB.Command Dim vCod As Long On Error GoTo errGravacao vCod = Val(txtCodLivro.Text) 'Verifica o cdigo digitado: If vCod = 0 Then MsgBox "O campo Cdigo do Livro no foi preenchido.", _ vbExclamation + vbOKOnly + vbSystemModal, "Erro" Exit Sub End If If lblTitulo.Caption = Empty Then MsgBox "O campo Cdigo do Livro no contm um dado vlido.", _ vbExclamation + vbOKOnly + vbSystemModal, "Erro" Exit Sub End If Screen.MousePointer = vbHourglass With cnnComando .ActiveConnection = cnnBiblio .CommandType = adCmdText .CommandText = "UPDATE Livros SET Emprestado = False, " & _ "CodUsuario = Null, " & _ "DataEmprestimo = Null, " & _ "DataDevolucao = Null " & _ "WHERE CodLivro = " & vCod & ";" .Execute End With MsgBox "A devoluo do livro " & lblTitulo & " foi efetuada com sucesso.", _ vbApplicationModal + vbInformation + vbOKOnly, "Devoluo OK" cmdCancelar_Click Saida: Screen.MousePointer = vbDefault Set cnnComando = Nothing Exit Sub

Microsoft Visual Basic 6

101

errGravacao: With Err If .Number <> 0 Then MsgBox "Erro durante a gravao dos dados no registro." & vbCrLf & _ "A devoluo desse livro no foi completada.", _ vbExclamation + vbOKOnly + vbApplicationModal, _ "Devoluo cancelada" .Number = 0 GoTo Saida End If End With End Sub

7. S faltou a procedure cmdCancelar_Click:


Private Sub cmdCancelar_Click() txtCodLivro.Text = Empty lblTitulo.Caption = Empty lblCodUsuario.Caption = Empty lblNomeUsuario.Caption = Empty txtCodLivro.SetFocus End Sub

8. Grave o formulrio; 9. Abra o frmBiblio e escreva a programao necessria para o menu mnuDevolucoes e para o boto n 4 da ToolBar. Ambos devem abrir o formulrio frmDevolucoes; 10. Teste o aplicativo e veja se est tudo funcionando como esperado.

Microsoft Visual Basic 6

102

Lio 12: Controles de Dados


Nessa lio construiremos os formulrios de consultas do sistema Bibliotecrio. Para isso, aprenderemos a usar os controles de dados (ou ADO Data Controls), o Microsoft DataGrid e os Microsoft DataList Controls. Eles facilitam muito nossa vida quando precisamos fazer consultas base de dados do sistema.

O Controle ADODC
O controle ADODC (ou ADO Data Control) permite a manipulao de bases de dados via ADO de maneira muito fcil e rpida, pois ele permite vincular controles como caixas de texto e labels diretamente aos campos do banco de dados. A grande vantagem de seu uso a possibilidade de fazer a manuteno dos registros da base com bem pouca programao. A maior desvantagem a pouca flexibilidade que oferece para tratamento dos dados. ADODC um controle customizado: para utiliz-lo adicione ao projeto o componente Microsoft ADO Data Control. A maneira mais simples de configurar o ADODC pela janela de propriedades, acionada com o boto direito do mouse:

Um pequena descrio das abas: General e Authentication: contm parmetros de configurao da conexo com o banco de dados; RecordSource: contm o tipo e a origem dos dados que sero vinculados ao ADODC; Color e Font: servem para customizar a aparncia do controle. As principais propriedades do ADODC so:

Propriedade ConnectionString (aba General)


Nessa propriedade criamos a string de conexo do ADODC com o banco de dados. Normalmente, a mesma string usada na conexo principal. O boto Build, visvel na figura acima, aciona um assistente que constri a string a partir de algumas indicaes, como por exemplo o nome do arquivo MDB.

Propriedades UserName e Password (aba Authentication)


Essas propriedades, como voc j deve ter percebido, contm respectivamente o nome do usurio e a senha para conexo ao banco de dados. Podem ser informadas tambm pelo assistente Build da aba General.

Propriedade CommandType (aba RecordSource)


Informa o tipo do comando ADO que ser criado pelo controle. Os tipos so os mesmos admitidos pelo objeto ADO Command.

Microsoft Visual Basic 6

103

Propriedade RecordSource (aba RecordSource)


Informa o texto do comando a ser executado pelo controle ADODC. Dependendo do tipo informado em CommandType, pode ser o nome de uma tabela ou de uma consulta, ou ento um comando SQL.

Propriedades DataSource e DataField


Essas no so propriedades do controle ADODC, e sim dos controles que podem ser vinculados a ele. DataSource informa o nome do controle de dados ao qual ser ligado, e DataField qual campo ser acessado.

Mtodo Refresh
Existem casos em que necessrio alterar o RecordSource do controle de dados em tempo de execuo, via programao. Acontece que a atualizao do recordset do ADODC no automtica numa situao dessas. Para que o recordset seja atualizado e os dados sejam exibidos corretamente de acordo com o novo RecordSource, aplicamos ao ADODC o mtodo Refresh. Vamos criar um pequeno aplicativo para exemplificar o uso do controle ADODC: 1. Inicie um novo projeto; 2. Crie o formulrio conforme o modelo e a tabela de propriedades:

Objeto Formulrio

Nome frmTesteData

Boto de comando cmdFechar ADODC Adodc1 Label lblCodigo Label lblNome

Outras Propriedades = Valor Caption = Tabela de Editoras BorderStyle = 1 Fixed Single StartupPosition = 2 Center Screen Caption = &Fechar Caption = Editoras Caption = BorderStyle = 1 Fixed Single BackColor = Windows BackGround Caption = BorderStyle = 1 Fixed Single BackColor = Windows BackGround

3. Vamos usar a janela de propriedades para configurar a conexo do ADODC. Clique sobre ele com o boto direito do mouse e escolha a opo ADODC Properties; 4. Clique no boto Build (ao lado do campo Connection String). O VB abre a janela do assistente de conexo (veja a figura na prxima pgina); 5. Na aba Provedor, escolha a verso mais recente do Jet que estiver disponvel (na figura a verso a 4.0) e clique no boto Avanar; 6. Na aba Conexo, informe no item 1 o nome do banco de dados Biblio.MDB, no nosso caso. No se esquea de informar o caminho completo (use o boto com as reticncias, mais simples); 7. Ainda na aba Conexo, o item 2 pede o nome do usurio (o assistente sugere Admin) e a senha. Como nosso banco no tem senha, deixe como est;

Microsoft Visual Basic 6

104

8. Clique no boto Testar Conexo. Se voc receber a mensagem Teste de conexo concludo com xito, a conexo est pronta; 9. Clique em Ok: o assistente informa a string de conexo para a propriedade ConnectionString, j com todos os parmetros necessrios; 10. Como nosso banco de dados no tem senha, no precisamos alterar nada em Authentication. Clique na aba RecordSource; 11. Em CommandType, selecione a opo 2 adCmdTable: a linha Table or Stored Procedure Name habilitada; 12. Em Table or Stored Procedure Name, selecione a tabela de Editoras (veja o exemplo):

13. Clique em OK a configurao do ADODC est pronta; 14. Selecione o label lblCodigo. Na janela de propriedades, escolha em DataSource o Adodc1 e em DataField o campo CodEditora; 15. Faa o mesmo para o label lblNome, obviamente selecionando o campo NomeEditora; 16. Grave o formulrio com o nome de frmData e o projeto como TesteData.

Microsoft Visual Basic 6

105

Sabe qual a programao que precisaremos fazer para esse aplicativo? Nenhuma! A no ser a do boto Fechar, obvio. Execute o aplicativo e veja como ele funciona: basta clicar nos botes do contole de dados e os labels so atualizados de modo a exibir os campos do registro em que o apontador estiver posicionado:

Voc deve estar achando o ADO Data Control uma maravilha. Realmente, ele facilita muito as coisas, mas no se entusiasme demais: como j disse, ele no muito flexvel quando o assunto a manuteno de uma base de dados em um aplicativo realmente srio, razo pela qual no utilizado pelos programadores profissionalmente. Pelo menos no para isso: logo veremos uma aplicao realmente prtica.

O Controle DataGrid
Esse controle ADO, que trabalha vinculado a um ADODC, lembra uma planilha em que linhas e colunas definem clulas. Cada linha vinculada a um registro e cada coluna corresponde a um campo do recordset do ADODC. Tambm um controle customizado, e portanto para poder utiliz-lo voc deve adicionar o componente Microsoft DataGrid Control. Assim como o ADODC, mais fcil configur-lo pela janela de propriedades, mas nesse caso as opes da janela variam de acordo com o conjunto de dados que ser apresentado. Um recurso muito interessante do DataGrid a opo Retrieve Fields do menu de contexto (aquele menu acionado pelo boto direito do mouse). Aps a vinculao do DataGrid ao ADODC, Retrieve Fields configura automaticamente as colunas do grid de acordo com os campos do recordset. Vamos ento elaborar uma consulta com o DataGrid. Antes, porm, criaremos uma consulta no Access, que ser acessada pelo formulrio de consulta ao cadastro de usurios: 1. Entre no Access e abra o banco de dados Biblio; 2. Inicie a criao de uma nova consulta em modo estrutura; 3. Adicione a tabela Usuarios; 4. Mova todos os campos da tabela para o grid da consulta; 5. Altere a classificao do campo NomeUsuario para Crescente; 6. Mude os nomes das colunas indicadas (deixe as outras como esto): Cdigo, para o campo CodUsuario; Nome, para o campo NomeUsuario; Endereo, para o campo Endereco; UF, para o campo Estado. 7. Compare sua consulta com o exemplo da prxima pgina; 8. Grave a consulta com o nome de ConsultaUsuarios; 9. Execute a consulta e verifique se est funcionando corretamente (veja o exemplo); 10. Aproveite para criar consultas semelhantes para as tabelas Categorias e Editoras; 11. Saia do Access, abra novamente o VB e o projeto Bibliotecario;

Microsoft Visual Basic 6

106

ConsultaUsuarios em modo estrutura

ConsultaUsuarios sendo executada no Access

12. Adicione um novo formulrio e formate-o conforme o modelo:

Microsoft Visual Basic 6

107

13. Altere as propriedades dos objetos: Objeto Formulrio Nome frmConUsuarios Outras Propriedades = Valor Caption = Consulta Cadastro de Usurios BorderStyle = 1 Fixed Single Icon = Misc\Misc28.ICO MDIChild = True Caption = datUsuarios Visible = False ConnectionString = crie com o assistente CommandType = 2 adCmdTable Table or Stored Procedure Name = ConsultaUsuarios DataSource = datUsuarios Caption = &Retornar Style = 1 Graphical Picture = Traffic\Trffc14.ICO

ADODC

datUsuarios

DataGrid grdUsuarios Boto de comando cmdRetornar

14. Clique com o boto direito do mouse sobre o DataGrid. No menu de contexto, escolha Retrieve Fields. O VB pede uma confirmao antes de fazer a configurao do grid: responda Ok, e seu DataGrid deve estar parecido com o da figura:

15. Clique novamente com o boto direito sobre grdUsuarios e escolha a opo Properties (veja a figura na prxima pgina); 16. A aba General contm opes de funcionamento e aparncia do DataGrid. Desmarque a opo AllowUpdate, que permite a alterao de dados diretamente no grid, o que no recomendvel em uma consulta. As opes AllowAddNew e AllowDelete tambm devem estar desmarcadas, e servem, respectivamente, para permitir a incluso e a excluso de registros; 17. A aba Keyboard contm opes de navegao pelo teclado. No ser necessria nenhuma alterao; 18. A aba Columns permite a definio dos ttulos das colunas do grid, e a qual campo do conjunto de dados a coluna deve ser vinculada. Retrieve Fields j faz a configurao dessas opes automaticamente, e portanto somente se quiser alterar o ttulo de alguma coluna voc precisar mudar algo;

19. A aba Layout permite configurar opes de exibio para cada coluna. Na combo Column, escolha a coluna 0 Cdigo;

Microsoft Visual Basic 6

108

20. Uma opo interessante Alignment, que define o alinhamento do texto dentro da clula. As opes disponveis so: 0 dbgLeft: texto alinhado esquerda; 1 dbgRight: texto alinhado direita; 2 dbgCenter: texto centralizado no espao da clula; 3 dbgGeneral: usa o alinhamento definido como padro nas opes do VB; Por default, todas as colunas so alinhadas esquerda. Altere o alinhamento dessa coluna para 2 dbgCenter; 21. Faa o mesmo para as colunas 4 UF, 5 CEP e 6 Telefone; 22. Outra opo muito usada Width, que determina a largura da coluna. Retrieve Fields altera a largura de acordo com o valor retornado pela origem dos dados, mas com freqncia precisamos ajust-la manualmente. Para isso, basta digitar em Width o novo valor desejado (em twips). Defina a largura das colunas como indicado: 0 Cdigo: 600 1 Nome: 3500 2 Endereo: 6000 3 Cidade: 2500 4 UF: 350 5 CEP: 900 6 Telefone: 1500 23. No vamos alterar nada nas abas Color e Font; 24. A aba Split define como ser apresentado o foco nas linhas e colunas do grid. Uma opo interessante MarqueeStyle, que altera a exibio do foco nas linhas. Altere para 4 dbgHighlightRowRaiseCell, para que toda a linha seja destacada; 25. Finalmente, a aba Format define a formatao dos dados das colunas. Retrieve Fields tambm altera essas definies conforme os dados de origem, mas comum a necessidade de ajustes. Para alterar a formatao, devemos escolher a coluna na combo correspondente e depois indicar o formato desejado para essa coluna. Em nosso caso no ser necessrio nenhuma alterao. 26. Clique em Ok a configurao do DataGrid est pronta; 27. Abra a janela Cdigo no evento Form_Load. Alm dos comandos de centralizao do form, vamos alterar a propriedade ConnectionString do ADODC em tempo de execuo. Isso necessrio devido a uma limitao do controle de dados: quando definimos a ConnectionString pelo assistente, indicamos o caminho e o nome do banco de dados a ser conectado, e essa informao gravada na configurao do ADODC. Se o nome do arquivo MDB for alterado, ou trocarmos a pasta onde est gravado, o controle no ser capaz de encontr-lo, e ser gerado um erro de execuo. Isso especialmente preocupante em um ambiente de rede, onde o caminho de um arquivo depende do mapeamento feito nas estaes. Para evitar esse problema, indicamos ao ADODC que use para conectar-se ao banco a mesma string da conexo pricipal:
Private Sub Form_Load() Me.Left = (frmBiblio.ScaleWidth - Me.Width) / 2 Me.Top = (frmBiblio.ScaleHeight - Me.Height) / 2 datUsuarios.ConnectionString = cnnBiblio.ConnectionString End Sub

28. Escreva a codificao necessria ao evento cmdRetornar_Click; 29. Grave o novo formulrio com o nome frmConUsuarios; 30. Abra o formulrio frmBiblio e programe a procedure de menu mnuConUsuarios_Click; 31. Teste a consulta. Voc deve ter um resultado parecido com esse:

Microsoft Visual Basic 6

109

Bem, com o cadastro de usurios foi fcil. E para o cadastro de livros, em que existem cdigos relacionados s outras tabelas do banco, qual o procedimento? Vejamos: 1. Entre novamente no Access e abra o banco de dados Biblio; 2. Inicie a criao de uma nova consulta em modo estrutura; 3. Adicione todas as tabelas do banco; 4. Relacione as tabelas: Categorias e Livros pelo campo CodCategoria; Editoras e Livros pelo campo CodEditora; Usuarios e Livros pelo campo CodUsuario; 5. Clique com o boto direito do mouse sobre o relacionamento entre as tabelas Usuarios e Livros; 6. No menu de contexto, selecione a opo Propriedades da Associao; 7. Escolha a opo 2:

Microsoft Visual Basic 6

110

8. Adicione os campos CodLivro, Titulo, Autor, NomeEditora, NomeCategoria, NomeUsuario, DataEmprestimo e DataDevolucao ao grid; 9. Altere a classificao do campo Ttulo para Crescente; 10. Altere os ttulo das colunas: Cdigo, para o campo CodLivro; Ttulo, para o campo Titulo; Editora, para o campo NomeEditora; Categoria, para o campo NomeCategoria; Usurio, para o campo NomeUsuario; Emprstimo, para o campo DataEmprestimo; Devoluo, para o campo DataDevolucao. 11. Grave a consulta com o nome de ConsultaTodosLivros; 12. Sua consulta deve ter ficado parecida com a da figura:

13. Execute a consulta e verifique se est funcionando corretamente; 14. Saia do Access e abra novamente o VB e o projeto Bibliotecario; 15. Adicione um novo formulrio ao projeto; 16. Baseado na consulta de usurios, inclua os objetos no formulrio e configure o ADODC e o DataGrid para executar a consulta ConsultaTodosLivros; 17. Escreva a procedure Form_Load conforme a do formulrio frmConUsuarios. No se esquea do boto de sada do form; 18. Grave seu trabalho. Ao novo formulrio d o nome de frmConLivros; 19. No formulrio principal programe a opo de menu mnuConTodosLivros para acionar o frmConLivros; 20. Execute o aplicativo e teste a consulta. Compare com o exemplo da prxima pgina. Em nosso projeto temos duas opes no menu Consultas para as quais podemos paorveitar esse mesmo formulrio: Livros Emprestados e Livros em Atraso. Para fazer isso, primeiramente vamos criar mais duas consultas no Access: 1. Abra o banco de dados Biblio; 2. Na aba Consultas, clique com o boto direito do mouse sobre a consulta ConsultaTodosLivros; 3. Cole com o nome de ConsultaLivrosEmprestados; 4. Abra a consulta ConsultaLivrosEmprestados em modo estrutura; 5. Adicione o campo Emprestado ao grid da consulta; 6. Desmarque a opo Mostrar; 7. Na linha Critrio do campo Emprestado, escreva Verdadeiro. Isso far com que apenas os livros emprestados sejam selecionados pela consulta. Veja na figura ao lado se fez tudo corretamente; 8. Grave a consulta e retorne aba Consultas;

Microsoft Visual Basic 6

111

A consulta de Livros Cadastrados sendo executada

9. Selecione a ConsultaLivrosEmprestados, copie e cole com o nome de ConsultaLivrosEmAtraso; 10. Na linha Critrio do campo DataDevolucao, escreva <=Agora(), para que sejam selecionados apenas os registros com data de devoluo at hoje:

11. Verifique na figura se est tudo certo e grave a consulta: 12. Feche o Access e retorne ao projeto Biblioteario; 13. Para identificar qual consulta devemos abrir no formulrio frmConLivros, criaremos uma varivel pblica no mdulo de programao Biblio. Acrescente o seguinte comando na seo Declarations do mdulo:
Public vConLivros As String

14. Altere a procedure mnuConTodosLivros_Click:


Private Sub mnuConTodosLivros_Click() 'Atribui varivel vConLivros o nome da consulta correspondente opo 'de menu escolhida: vConLivros = "ConsultaTodosLivros" frmConLivros.Show End Sub

15. Crie as procedures mnuConLivrosEmprestados e mnuConLivrosEmAtraso conforme segue:


Private Sub mnuConLivrosEmAtraso_Click() vConLivros = "ConsultaLivrosEmAtraso" 'Altera o ttulo do formulrio de consulta de livros: frmConLivros.Caption = "Consulta Livros Emprestados em Atraso" frmConLivros.Show End Sub

Microsoft Visual Basic 6

112

Private Sub mnuConLivrosEmprestados_Click() vConLivros = "ConsultaLivrosEmprestados" frmConLivros.Caption = "Consulta Livros Emprestados" frmConLivros.Show End Sub

16. Altere as seguintes linhas do evento Form_Load do formulrio frmConLivros para que fique assim:
Private Sub Form_Load() Me.Left = (frmBiblio.ScaleWidth - Me.Width) / 2 Me.Top = (frmBiblio.ScaleHeight - Me.Height) / 2 datLivros.ConnectionString = cnnBiblio.ConnectionString 'Altera o RecordSource do ADODC para usar como origem o contudo da 'varivel vConLivros: datLivros.RecordSource = vConLivros 'Atualiza o recordset de datLivros de acordo com o novo RecordSource: datLivros.Refresh End Sub

17. Execute uma dessas consultas que acabamos de criar e veja se est funcionando corretamente. O exemplo a seguir a consulta de livros em atraso:

18. Grave seu trabalho.

Os Controles DataList e DataCombo


Esses controles ADO so muito interessantes: DataList uma caixa de listagem vinculada a um controle de dados. Seus itens sero preenchidos com os dados de um dos campos do recordset do controle de dados. DataCombo uma caixa de combinao que usa o mesmo princpio. Ambos so controles customizados, e para adicion-los caixa de ferramentas marque a opo Microsoft DataList Controls na janela Components. DataList e DataCombo tm as mesmas propriedades das caixas de listagem e combinao comuns e mais algumas especficas para trabalhar com o controle de dados:

Propriedades RowSource e ListField


Essas propriedades indicam, respectivamente, o nome do ADODC que deve ser vinculado DataList ou DataCombo e o nome do campo que ser usado como origem para os itens da caixa.

Microsoft Visual Basic 6

113

Propriedades DataSource e DataField


No caso especfico de DataList e DataCombo, essas propriedades servem para atualizar o registro do recordset de um outro controle de dados, (que no o mesmo vinculado s propriedades RowSource e ListField), de modo a sincronizar ambos os controles Data: assim, conforme um item selecionado na caixa, os dois controles Data estaro apontando para o registro correspondente em seus respectivos recordsets.

Propriedade BoundColumn
Define qual campo do recordset o controle retornar quando um item for selecionado. Por exemplo: se um recordset tem dois campos, digamos Cdigo e Nome, com certeza voc vai preferir que seja exibido na caixa o campo Nome, mas pode ser que v utilizar nas operaes de banco de dados o campo Cdigo. Voc pode ento indicar para a propriedade ListField o campo Nome, e para BoundColumn o campo Cdigo. Dessa maneira, quando o usurio escolher um item na caixa, o campo retornado por BoundColumn para aquele registro ser Cdigo, apesar do item estar exibindo o nome.

Propriedade BoundText
Contm o texto do item que est selecionado na caixa. Mas vamos pr esse conceitos em prtica, elaborando as ltimas consultas ao cadastro de livros. Vamos comear pela consulta de Livros por Autor. Veja o modelo do novo formulrio:

As propriedades dos objetos so as seguintes: Objeto Formulrio Nome frmConLivrosPorAutor Outras Propriedades = Valor Caption = Consulta Livros por Autor BorderStyle = 1 Fixed Single Icon = Writing\Books02.ICO MDIChild = True Caption = datLivros Visible = False ConnectionString = crie com o assistente CommandType = 1 adCmdText CommandText = SELECT * FROM ConsultaTodosLivros;

ADODC

datLivros

Microsoft Visual Basic 6

114

Objeto ADODC

Nome datAutores

DataCombo

cboAutores

DataGrid grdLivros Boto de comando cmdRetornar

Outras Propriedades = Valor Caption = datAutores Visible = False ConnectionString = crie com o assistente CommandType = 1 adCmdText CommandText = SELECT DISTINCT Autor FROM Livros ORDER BY Autor; RowSource = datAutores ListField = Autor BoundColumn = Autor Style = 2 dbcDropdownList DataSource = datLivros Caption = &Retornar Style = 1 Graphical Picture = Traffic\Trffc14.ICO

Duas observaes importantes: Na propriedade CommandType do datLivros definimos 1 adCmdText para poder usar um comando SQL que ser criado em tempo de execuo, de modo a selecionar apenas os livros do autor escolhido; Na propriedade CommandText do datAutores usamos a clusula DISTINCT no comando SELECT, para eliminar linhas repetidas no resultado do comando SQL. DISTINCT faz com que, quando forem selecionados pelo comando SELECT dois ou mais registros exatamente iguais, apenas um ser retornado, eliminando repetio. Fizemos isso para que no existam autores duplicados na combo. O funcionamento dessa consulta ser assim: na DataCombo sero exibidas os nomes dos autores, e conforme o operador for alternando entre eles, os livros do autor selecionado sero exibidos no grid. Ser necessrio, portanto, filtrar os registros da tabela de livros de acordo com o autor escolhido na combo. Vamos comear: 1. Use Retrieve Fields para formatar o grid. Lembre-se de alterar o tamanho das colunas e o alinhamento dos campos da mesma maneira que fizemos nas consultas anteriores; 2. Escreva a procedure para o evento Click do boto Retornar; 3. No evento Load do formulrio, escreva os comandos para atribuir a ConnectionString aos controles de dados:
Private Sub Form_Load() Me.Left = (frmBiblio.ScaleWidth - Me.Width) / 2 Me.Top = (frmBiblio.ScaleHeight - Me.Height) / 2 datAutores.ConnectionString = cnnBiblio.ConnectionString datLivros.ConnectionString = cnnBiblio.ConnectionString End Sub

4. O prximo passo fazer com que o grid seja atualizado com os livros do autor selecionado. Para isso usaremos o eventos Click da combo:
Private Sub cboAutores_Click(Area As Integer) datLivros.RecordSource = "SELECT * FROM ConsultaTodosLivros " & _ "WHERE Autor = '" & cboAutores.BoundText & "';" datLivros.Refresh End Sub

5. Grave esse formulrio com o nome de frmConLivrosPorAutor; 6. Abra o formulrio frmBiblio e escreva a procedure para o evento Click do menu mnuLivrosPorAutor; 7. Teste a consulta. Veja que, conforme voc escolhe um autor, o grid automaticamente atualizado com seus respectivos livros. Caso no exista nenhum livro cadastrado para o autor, o grid no apresentar nenhum registro. Compare com a figura a seguir:

Microsoft Visual Basic 6

115

8. Seguindo o mesmo procedimento, crie as consultas de livros por Editora e por Categoria. Grave-os respectivamente com os nomes de frmConLivrosPorEditora e frmConLivrosPorCategoria; 9. Teste as consultas que voc criou e veja se esto funcionando corretamente; 10. Grave seu trabalho.

Microsoft Visual Basic 6

116

Lio 13: Relatrios


Quem j criou relatrios no Access sabe como uma ferramenta grfica facilita esse tipo de trabalho. E vai se sentir em casa no VB: a partir da verso 6 do Visual Basic, a Microsoft introduziu duas novas ferramentas que juntas permitem a criao de relatrios de maneira visual, muito semelhante ao construtor de relatrios do Access. Nessa ltima lio, aprenderemos como usar essas ferramentas construindo um dos relatrios do nosso sistema de controle de bibliotecas.

Usando o Data Environment


A primeira ferramenta que vamos estudar o Data Environment Designer, cuja funo estabelecer conexes e comandos de acesso ADO a bancos de dados (Data Environment quer dizer ambiente de dados) e que podem ser usados posteriormente por formulrios e relatrios do projeto. Vejamos passo a passo como criar e configurar o Data Environment: 1. Se ainda no o fez, abra o VB e o projeto Bibliotecrio; 2. No menu Project, escolha a opo More ActiveX Designers; 3. Escolha agora a opo Data Environment. O VB adiciona um Data Environment ao projeto, de nome DataEnvironment1. Voc pode criar quantos forem necessrios, cada um ligado a uma fonte de dados:

4. Vamos alterar o nome do Data Environment: na janela de propriedades, altere a propriedade Name para DataBiblio; 5. Vinculado ao Data Environment existe sempre ao menos um objeto Connection veja na figura: o que acabamos de adicionar chama-se Connection1. Vamos renome-lo: clique com o boto direito do mouse sobre Connection1 e escolha a opo Rename; 6. Altere o nome para cnnLivrosCadastrados; 7. O prximo passo criar a conexo com o banco de dados: clique novamente com o boto direito do mouse e escolha a opo Properties; 8. Crie a conexo da mesma forma que fizemos nas lies anteriores; 9. Clique mais uma vez com o boto direito do mouse e escolha a opo Refresh: se voc fez tudo certo, a linha de status est indicando que o objeto Connection est conectado ao banco:

10. Devemos agora adicionar um objeto Command. Clique com o boto direito e escolha Add Command;

Microsoft Visual Basic 6

117

11. Altere o nome do comando para cmdLivrosCadastrados:

12. Clique com o boto direito sobre o comando e escolha a opo Properties:

13. Na aba General definimos a origem dos dados: em Database Object informamos qual o tipo do objeto que ser acessado pelo comando: Table (tabela), View (consulta) ou Stored Procedure, e tambm seu nome. A opo SQL Statement serve para usar um comando SQL; 14. Escolha Database Object, e o tipo View; 15. Em Object Name, escolha ConsultaTodosLivros; 16. Como no precisamos alterar nada nas outras abas, clique em Ok; 17. Clique no sinal + que aparece ao lado do nome do comando para visualizar as colunas da consulta:

Microsoft Visual Basic 6

118

18. Grave seu trabalho. Ao Data Environment d o nome de DataBiblio. Note que a extenso do arquivo DSR (de Designers). Bem, a primeira parte do servio est pronta. Vejamos agora como criar o relatrio propriamente dito:

Usando o Data Report


A ferramenta para design de relatrios do VB o Data Report. Sua operao muito simples, baseada no recurso arrastar-e-soltar do Windows. Vejamos como us-lo: 1. No menu Project escolha a opo Add Data Report; 2. O objeto DataReport1 adicionado ao projeto, e a caixa de ferramentas passa a exibir os controles suportados pelo relatrio:

3. Note que o formulrio est dividido em 5 partes (ou sees), chamadas de Report Sections: Report Header: cabealho a ser impresso no incio do relatrio; Page Header: cabealho a ser impresso no incio de cada pgina; Detail: corpo do relatrio, ou linha de detalhe: rea onde sero inseridos os dados do relatrio; Page Footer: rodap a ser impresso no final de cada pgina; Report Footer: rodap a ser impresso no final do relatrio. 4. Cada seo tem propriedades e mtodos que permitem formatar o relatrio conforme necessrio, alm do prprio objeto DataReport basta clicar na rea que queremos formatar para ver suas propriedades na janela Properties. Clique no ttulo da janela do DataReport para ver suas propriedades; 5. Altere a propriedade Name para rptLivrosCadastrados; 6. A propriedade DataSource indica o Data Environment que deve ser usado como origem dos dados. Escolha o DataBiblio (deve ser nico disponvel); 7. Em DataMember informamos cmdLivrosCadastrados; o comando a ser executado pelo relatrio: escolha o

8. Agora clique com o boto direito do mouse sobre o DataReport e escolha a opo Retrieve Structure: note que o nome da seo Detail mudou para cmdLivrosCadastrados_Detail; 9. Feche as sees Report Header e Report Footer, pois no vamos us-las. Para fazer isso arraste a barra que contm o nome da seo para cima (diminuindo a rgua) at fech-la. 10. J podemos incluir campos em nosso relatrio. Abra as janelas do Data Environment e do Data Report lado a lado, de forma a poder visualizar ambas ao mesmo tempo (mais ou menos como na figura a seguir):

Microsoft Visual Basic 6

119

11. Arraste o campo Cdigo da janela do Data Environment para dentro da seo Detail: note que, alm do campo, o ttulo da coluna tambm adicionado ao relatrio:

12. Aumente a altura da seo Page Header para uns 3 centrmetros (para isso arraste a barra para baixo); 13. Arraste o label que contm o ttulo do campo (na figura o da esquerda) para a seo Page Header: 14. Repita o processo para os campos Ttulo, Autor, Editora e Categoria; 15. Acerte a largura dos campos. Para isso clique sobre o campo e altere a propriedade Width ou ento arraste a borda do campo at a largura desejada; 16. Altere a largura do ttulo de cada coluna para a mesma do campo correspondente; 17. Reposicione os campos e os ttulos. Se necessrio aumente a largura do relatrio: para isso arraste a borda direita do relatrio at a largura desejada, mas ateno rgua para no ultrapassar as medidas do papel (usaremos o tamanho Carta em modo Paisagem): Tamanho Carta: 21,5 x 28 cm; Tamanho A4: 21 x 29,7 cm; Tamanho Ofcio: 21,5 x 35,5 cm. Obs.: voc pode melhorar o posicionamento dos campos clicando com o boto direito sobre o relatrio e desmarcando a opo Snap to Grid; 18. Clique sobre o campo Codigo e altere a propriedade Aligment para 2 rptJustifyCenter, para centralizar o dado no campo; 19. Centralize tambm os ttulos dos campos da mesma maneira;

Microsoft Visual Basic 6

120

20. Altere a fonte (propriedade Font) dos ttulos das colunas para Arial, itlico, tamanho 10; 21. Altere a fonte dos campos para Arial tamanho 10; 22. Seu relatrio deve estar parecido com o do exemplo:

23. Procure na caixa de ferramentas o cone rptLabel e insira um na seo Page Header ele vai conter o ttulo do nosso relatrio; 24. Altere a propriedade caption do label para Relao de Livros Cadastrados; 25. Faa-o ocupar toda a largura do relatrio; 26. Altere a fonte do label para Times New Roman, negrito, tamanho 16; 27. Confira seu relatrio com o exemplo abaixo:

28. Procure agora o cone do controle rptLine; 29. Desenhe uma linha na seo Page Header, abaixo dos ttulos das colunas; 30. Desenhe outra linha, de mesmo comprimento, na seo Page Footer (aumente um pouco essa seo, se achar necessrio); 31. Se desejar, voc pode mudar o estilo da linha alterando a propriedade BorderStyle. Veja como ficou: 32. Existem alguns controles especiais, que so inseridos atravs do boto direito do mouse, como por exemplo a data do sistema. Vamos inser-la: clique com o boto direito e escolha Insert Control;

Microsoft Visual Basic 6

121

33. Escolha agora a opo Current Date (Short Format), que insere a data no formato curto do Windows; 34. Posicione o campo da data esquerda, acima do ttulo do campo cdigo e alinhada com ele; 35. Outro controle interessante o nmero da pgina. Acione novamente o menu Insert Control e escolha agora a opo Current Page Number; 36. Alinhe o nmero do pgina direita do relatrio, na mesma altura da data; 37. Diminua seu tamanho para um espao de aproximadamente 3 caracteres; 38. Altere o alinhamento para centralizado; 39. Insira mais um label do lado esquerdo do nmero da pgina; 40. Altere a propriedade caption desse label para Pgina: (sem as aspas); 41. Altere o alinhamento do label para 1 rptJustifyRight; 42. Diminua a altura da seo Detail para a mesma dos campos nela contidos; 43. Se quiser incluir mais labels e formataes, esteja a vontade... 44. O layout do relatrio est pronto. Veja como ficou o meu:

45. Grave o relatrio com o nome de rptLivrosCadastrados note que a extenso do arquivo a mesma do Data Environment, ou seja, DSR; 46. Precisamos agora fazer nosso relatrio funcionar. Abra o formulrio frmBiblio; 47. Escreva a programao da opo de menu Relatrios Livros para informar o orientao do papel e acionar o relatrio:
Private Sub mnuRelLivros_Click() With rptLivrosCadastrados 'A propriedade Orientation informa a orientao do papel para impresso 'do relatrio, e o valor rptOrientLandscape define modo Paisagem: .Orientation = rptOrientLandscape

Microsoft Visual Basic 6

122

'Para exibir o resultado do Data Report usamos o mtodo Show: .Show End With End Sub

Obs.: para impresso em modo Retrato normalmente no necessrio alterar a propriedade Orientation, mas se precisar use a constante rptOrientPortrait. 48. Para evitar problemas de conexo, precisamos alterar a ConnectionString do DataEnvironment. Abra o formulrio frmSplash; 49. Na procedure Timer1_Timer, localize o comando:
cnnBiblio.Open

50. Escreva abaixo dela a linha a seguir:


DataBiblio.cnnLivrosCadastrados.ConnectionString = cnnBiblio.ConnectionString

51. Grave seu trabalho; 52. Execute o programa e o relatrio de Livros. Se estiver tudo Ok, o resultado ser parecido com esse:

Pronto! Agora s falta voc criar os outros relatrios do sistema (Usurios, Categorias e Editoras) e ele estar terminado. Com isso chegamos ao final do nosso curso. Espero sinceramente que tenha gostado, e que aproveite bem tudo que aprendeu. Parabns e boa sorte!!! Lus Carlos Ballaminut