Вы находитесь на странице: 1из 84

CAPÍTULO I

1 - CRIAÇÃO DE UM PROGRAMA
Um programa de computador é um conjunto de instruções que informam à máquina o que deve ser feito, para
que determinado objetivo seja alcançado. Para se criar um programa, utilizamos uma linguagem de programação.
Como exemplo de linguagens temos Pascal, Cobol, C.
Após o advento do Windows, o computador passou a apresentar um ambiente gráfico, enquanto que na época
do DOS tínhamos um ambiente texto.
No Windows as coisas ocorrem disparadas por eventos: clicar o cursor do mouse sobre um botão, apertar um
conjunto de teclas, etc. Como a linguagem Visual Basic foi desenvolvida para criar programas para o Windows,
dizemos que ela é orientada a eventos. Esse conceito será facilmente compreendido quando começarmos a
programar efetivamente em VB.

2 - AS PARTES DE UM PROGRAMA
Um programa pode ser dividido em duas partes: a interface visual e o processamento da informação. Nas
linguagens antigas, para se criar a interface era necessário escrever linhas de código, e só era possível ver o resultado
quando o programa estivesse realmente sendo executado. No VB, a interface é criada visualmente, sem que nenhuma
linha de código precise ser escrita, e o resultado é visto no mesmo instante em que ela está sendo criada.

3 - AMBIENTE DE PROGRAMAÇÃO VB

O ambiente de programação de uma linguagem é o conjunto de facilidades colocadas à disposição do


programador, para que a tarefa de escrever um programa seja facilitada. O ambiente de programação do VB é
composto dos seguintes elementos:

3.1) Barra de menu


Como todos os aplicativos for Windows, a barra de menu do VB apresenta as opções de menu clássicas (File,
Edit, ...), além das específicas (View, Run, Debug, ...). Durante o curso será visto a utilização das diversas opções.

fig 1.1 - Barra de Menu

3.2) Barra de ferramentas (atalho para as opções de menu)


Caixa com diversos botões que representam atalhos para as ações de menu. Também serão utilizadas durante
o curso. Assim como a barra de menus, a barra de Ferramentas também é um objeto comum nos programas que rodam
no Windows.

fig 1.2 - Barra de Ferramentas

3.3) Caixa de ferramentas (ToolBox)


A Caixa de Ferramenta mostra os controles que você pode adicionar ao seu projeto. Imagine um aplicativo que
execute no Windows, ele certamente contém muitos objetos, como botões de comando, gráficos, grades, quadros
textos, etc. Pois um programa desenvolvido em VB também pode possuir vários objetos. Esses objetos são colocados
no programa sem que seja necessário digitar uma linha de código sequer. Basta selecioná-los na ToolBox.
Um controle pode ser adicionado ao projeto de duas formas: dando-se um duplo clique sobre ele na ToolBox,
ou clicando sobre ele uma só vez, e desenhando-o sobre o formulário, com o auxílio do mouse.
Para se visualizar a Caixa de Ferramentas, seleciona-se a opção de menu View - Toolbox.

3.4) Janela de projeto


A janela de projeto mostra a lista de todos os arquivos de Formulários e de Módulos do projeto em
andamento. Esses arquivos podem ser adicionados ou retirados do projeto, conforme a necessidade. Para que voce
tenha uma idéia, cada documento do Word é um formulário diferente, que deve ser adicionado ao programa.

1
Para adicionar um arquivo, usa-se a opção de menu Project - Add Form..., Project - Add Module... , etc, e
para se retirar um arquivo, a opção Project - Remove File.
Para se visualizar a janela de projeto, seleciona-se a opção View - Project Explorer.

fig 1.3 - Caixa de Ferramentas

fig 1.4 - Janela de Projeto

3.5) Janela de propriedades


A janela de propriedades contém uma lista com as propriedades do controle ou formulário selecionado. As
propriedades mostradas são as que podem ser alteradas durante o projeto. Quando mais de um controle é selecionado,
a janela de propriedades mostra as propriedades comuns.

fig 1.5 - Janela de Propriedades

Para se visualizar a janela de propriedades, seleciona-se a opção de menu Window - Properties, ou a tecla de
atalho F4.

2
4 - PROJETO

4.1) O que é um projeto


Toda vez qual o VB é iniciado, um novo projeto é aberto. Um projeto é a denominação que se dá ao conjunto
de formulários, controles e módulos que são utilizados na criação de um programa. Quando um projeto é salvo, são
salvos no diretório escolhido pelo programador, os seguintes arquivos: um arquivo de projeto (.VBP), e tantos arquivos
de formulários (.FRM) e de módulos (.BAS) quantos forem os formulários e os módulos existentes neste projeto em
particular. Os arquivos de controle (.OCX), devem estar disponíveis, normalmente no diretório
c:\windows\system. Esses arquivos possibilitam que um ou mais controles estejam disponíveis na caixa de
ferramentas.

4.2) Componentes de um projeto


São os seguintes, os componentes de um projeto:

* Formulários
* Controles
* Módulos

Os formulários são as janelas que estamos acostumados a ver no ambiente Windows. Toda vez que um
projeto é iniciado, um formulário é automaticamente adicionado ao projeto. Não pode haver um projeto sem pelo menos
um formulário ou um módulo.
Os controles são os objetos que povoam as janelas (formulários). Os controles são colocados nos
formulários, clicando-se sobre o ícone correspondente na caixa de ferramentas. São exemplos de controles: botões de
comando, botões de opção e quadro textos.
Os módulos são os locais onde são declaradas as funções, os procedimentos e as variáveis de alcance
global.
Associado a cada objeto (controles ou formulários) existem as propriedades, os eventos e os métodos.
As propriedades, em geral, dizem respeito à aparência de um objeto. Existem propriedades que tratam de
aspectos não relacionado à aparência, e serão apresentadas a medida que o curso se desenvolva. Como exemplo de
propriedades temos: a cor de um formulário, o tipo de letra de um quadro texto, a legenda de um botão de controle.
Existem propriedades que só podem ser alteradas durante o projeto (como o nome de um controle), outras que
só podem ser alteradas durante a execução (como a propriedade recordset de um controle de dados), e por fim, as que
podem ser alteradas tanto durante o projeto quanto durante a execução (como a legenda de um botão de comando).
Os eventos são as ações que ocorrem em relação a algum controle. Por exemplo, temos o evento click de um
botão (ocorre quando usamos o mouse e clicamos sobre o botão) e o evento change de um quadro texto (ocorre
quando o texto de um quadro texto é mudado).
Usamos os eventos para escrever algum código que será executado toda vez que o evento ocorra. Os
métodos são procedimentos ou funções previamente definidos, que operam sobre os objetos. Por exemplo, temos o
método circle, que desenha um círculo sobre um objeto especificado, e o método Move, que movimenta o objeto para
uma localização em particular.

4.3) Salvando um projeto


Utilizando a opção de menu File - Save Project, todos os arquivos do projeto são salvos no diretório
previamente especificado, ou a janela de diálogo Salvar Como aparece, caso seja a primeira vez que o projeto esteja
sendo salvo.

4.4) Gerando um executável


Um arquivo executável é gerado através da opção de menu File - Make EXE File.... Uma vez gerado esse
arquivo (.EXE), o programa pode ser executado sem que o VB esteja presente na máquina hospedeira.

5 - O PROGRAMA INAUGURAL
Neste primeiro programa serão apresentados os seguintes objetos: formulário, botões de comando
(Command Button), quadro texto (Text Box) e label (Label). Serão vistas também as propriedades Name, Caption,
BackColor, ForeColor, FontSize, FontName e FontItalic, além do evento Click.
Veremos também como alterar o valor de uma propriedade em tempo de projeto, em tempo de execução, e
como incluir linha de código em um evento.
O formulário com o programa em execução, é mostrado na figura 1.6.

Para se alterar uma propriedade de algum objeto, em tempo de projeto, deve-se escrever o novo valor dessa
propriedade na janela de propriedades, na linha referente à propriedade. Obviamente o objeto escolhido deve estar
selecionado, o que pode ser feito de duas formas: antes de visualizar a janela de ferramentas, clicar uma vez sobre o
objeto; ou após a janela estar acionada, escolher o objeto na lista de objetos que aparece na janela de propriedades.

3
Para se colocar um controle em um formulário, dar um clique sobre o botão correspondente (na caixa de
ferramentas), e desenhar o controle sobre o formulário (com o botão esquerdo do mouse pressionado). Pode-se
também, dar dois cliques sobre o botão correspondente (na caixa de ferramentas), o que fará com que o controle
apareça no meio do formulário.
Para acessar a janela que permite incluir código nos eventos, dar um duplo clique no objeto escolhido, usar a
opção de menu View - Code, ou usar a tecla de atalho F7.

fig 1.6 - O formulário do primeiro programa

Após iniciar uma sessão do VB, realizar as seguintes ações:


- Alterar a propriedade Name do formulário para FRMproj1- Este será o nome interno do formulário.
- Alterar a propriedade caption do formulário para Aula Inaugural.
- Salvar o projeto no diretório c:\aulavb\aula1\proj1 com o nome proj1.vbp.
- Salvar o formulário como proj1.frm - Este será o nome do arquivo de formulário, deste formulário.

5.1) Botões de Comando, Quadro Texto e Label


- Colocar três Botões de Comando no formulário.
Observe que os botões tem os nomes Command1, Command2 e Command3, e que a propriedade Caption
dos três controles é igual à propriedade Name de cada um deles. Toda vez que um controle é adicionado a um
formulário, o VB lhe dá um nome padrão (um valor para a propriedade Name). É importante que os nomes dos objetos
sejam significativos para o programador, por isso sempre alteraremos a propriedade Name de todos os controles.

- Alterar as propriedades Name e Caption para as seguintes:


name: BTNecoar, BTNlimpar, BTNsair
caption: &Ecoar, &Limpar, Sai&r , respectivamente.

OBS: Quando o símbolo & é colocado antes de alguma letra, no valor da propriedade Caption, a legenda do
controle apresentará a letra sublinhada. Isto significa que o evento Click deste controle pode ser acionado
digitando-se <Alt + a_tecla_sublinhada>.

- Colocar um quadro texto (Text Box) no formulário, e alterar as seguintes propriedades:


name: TXTentrada
text:

- Colocar um Label no formulário, e alterar as seguintes propriedades:


name: LBLeco
caption:

- Observe a figura 1.6 para dispor os controles adequadamente no formulário.

4
Label

Quadro
Texto
fig 1.7 - Botão de Comando, Quadro Texto e Label

5.2) Evento Click


- Adicionar no evento BTNsair_click:
End
O evento BTNsair_click ocorre sempre que o usuário der um clique com o mouse sobre o botão BTNsair.
Quando isso ocorre, o Windows captura esse evento, e o código que estiver associado ocorrerá. A palavra End, é uma
instrução do VB que finaliza um programa.

- Executar o programa.
Verificar que ao se clicar sobre os botões Limpar e Ecoar, nada acontece (não há código associado ao evento
Click desses botões), mas que ao clicar sobre o botão Sair, o programa é encerrado.

- Adicionar no evento BTNecoar_click:


LBLeco.Caption = TXTentrada.Text
Para referenciar uma propriedade de um controle durante a execução do programa, escreve-se o nome do
controle (propriedade Name), seguido de um ponto e do nome da propriedade que se quer acessar. A linha de código
inserida no evento BTNecoar_click copia o valor da propriedade Text do quadro de texto TXTentrada, para a
propriedade Caption do label LBLeco.

- Executar o programa.
Verificar o que ocorre ao se clicar no botão Ecoar.

- Adicionar no evento BTNlimpar_click:


TXTentrada.Text = ""
LBLeco.Caption = ""
Este código “limpa” os valores das propriedades Text e Caption, dos controles TXTentrada e LBLeco,
respectivamente.

- Executar o programa.
Verificar o que ocorre quando se clica nos botões.

- Salvar o projeto.

- Gerar o executável.
Usar a opção de menu File - Make EXE File.... Escolher o diretório C:\aulavb\aula1\proj1.

- Executar o programa a partir do gerenciador de arquivos.

- Executar o programa a partir do gerenciador de programas.

- Voltar ao projeto, e para todos os objetos, modificar as seguintes propriedades:


* BackColor
* ForeColor
* FontSize
* FontName
* FontItalic

5
Essas propriedades dizem respeito a aparência dos objetos, como a cor de fundo e das letras, e o nome, o
tamanho e se a fonte deve ou não ficar itálico. Verificar que nem todas as propriedades são comuns a todos os objetos,
e que se comportam de forma diferente, de acordo com o objeto.

6 - OUTRO PROGRAMA
Apresentação do controle barra de rolagem, com as suas principais propriedades, apresentação dos eventos
Form_Load e Change, além das propriedades Tab, Top, Left, Width e Height.

- Iniciar um novo projeto.

- Salvar o projeto no diretório c:\aulavb\aula1\proj2 com o nome proj2.

6.1) Propriedades Top, Left, Width, Height e ScaleMode


- Alterar as propriedades do formulário:

*Name = FRMproj2
*Caption = Velocidade
*Top = 1170
*Left = 1080
*Width = 4125
*Height = 4545

As propriedades Top e Left são as coordenadas de um objeto. O valor 1170 da propriedade Top significa que
o formulário dista 1170 unidades da parte superior da tela, enquanto que a propriedade Left determina a distância do
formulário em relação à borda esquerda da tela. A unidade utilizada é definida pela propriedade de formulário Scale
Mode, que por default é o Twip.
Para os controles, essas propriedades determinam as coordenadas em relação ao formulário que os contém.
As propriedades Width e Height definem as dimensões de um objeto (largura e altura), e também dependem
da propriedade Scale Mode. Todas essas propriedade podem ser alteradas tanto durante o projeto quanto durante a
execução. Observe que alterando a posição ou o tamanho de um objeto, via mouse, as propriedades são
automaticamente atualizadas.

fig 1.8 - O segundo programa

6.2) Propriedades Alignment e MultiLine


- Incluir um quadro texto, com as propriedades:
*Name = TXTvelocidade
*Text = “”
*BackColor = vermelho
*ForeColor = branco
*Alignment = centro
*MultiLine = True
*Top = 240
*Left = 1320
*Width = 1215
*Height = 495
A propriedade Alignment determina como o texto (propriedade Text) de um quadro texto será alinhado dentro
do controle. Essa propriedade só é reconhecida, se a propriedade MultiLine do mesmo controle tiver o valor True. Essa
propriedade habilita várias linhas em um quadro texto.

6
- Incluir um botão de comando
*Name = BTNsair
*Caption = Sai&r
*Top = 3000
*Left = 1440
*Width = 1215
*Height = 495

6.3) Barra de Rolagem Horizontal (HScrollBar)


- Incluir uma barra de rolagem horizontal (HScrollBar), com as seguintes propriedades:
*Name = HSBvelocidade
*Top = 1440
*Left = 600
*Width = 2775
*Height = 255

- No evento BTNsair_click
End

- Executar o programa.
Verificar que não ocorre nada ao se clicar na Barra de Rolagem.

6.4) Propriedades Min, Max, Value, SmallChange e LargChange


- Na barra de rolagem horizontal, alterar as seguintes propriedades:
*Min = 0
*Max = 100
*Value = 50
*SmallChange = 10
*LargChange = 50
Para uma barra de rolagem funcionar, essas propriedades devem ser configuradas. A propriedade Value indica
o valor atual da barra (a posição do marcador), e pode variar entre os valores das propriedades Min e Max. A
propriedade SmallChange define de quanto será a variação do valor de Value, quando umas das setas das
extremidades do controle for “clicada”, enquanto que LargChange define a mesma variação quando a parte interna da
barra de rolagem for “clicada”.

Barras de
Rolagem

fig 1.9 - Barra de Rolagem

6.5) Foco do Teclado - Propriedade TabIndex


- Executar o programa.
Verificar o que ocorre com a barra de rolagem.
Verificar que a medida que se pressiona a tecla <Tab>, o “foco” do teclado passa de um controle para o outro.
Quando um controle detém o foco, ele pode ser acessado também pelo teclado, e não apenas pelo mouse. Por
exemplo, quando um quadro texto tem o foco, é possível escrever nele; quando um botão tem o foco, é possível “clicá-
lo” teclando-se <Enter>. A propriedade que determina a ordem em que os controles receberão o foco, é a propriedade
TabIndex.

6.6) Evento Change


-Escrever na janela de código do evento HSBvelocidade_Change.
TXTvelocidade.Text = HSBvelocidade.Value
O evento Change ocorre sempre que o conteúdo de um controle é alterado ( o texto de um quadro texto, a
legenda de um label, o valor de uma barra de rolagem, etc).

7
Esta linha de código copia o conteúdo da propriedade Value do controle HSBvelocidade para a propriedade
Text do quadro texto TXTvelocidade. Este evento ocorre toda vez que as setas da extremidade da barra de rolagem
forem clicadas.

- Executar o programa.
Verificar o que ocorre quando se clica nas extremidades da barra de rolagem.

6.7) Evento Load


- Escrever no evento Form_load do formulário:
TXTvelocidade.Text = BRHvelocidade.Value + “ Km\h”
O evento Form_load ocorre sempre que um formulário é carregado na memória. Como só existe um
formulário neste projeto, quando iniciamos a execução, automaticamente o formulário é carregado, e o evento
Form_load ocorre. O comando copia para a propriedade Text do controle TXTvelocidade, o valor da propriedade
Value da barra de rolagem, concatenando-a com a string “ Km\h”.

- Executar o programa.
Verificar que agora o quadro texto já apresenta o valor da barra, ao iniciar o programa.

6.8) Propriedade Enabled


- No controle TXTvelocidade.
*Enabled = False
A propriedade Enabled habilita (True) ou desabilita (False) um controle - permitindo ou não que o controle
receba o foco do teclado. No caso de um quadro texto, Enabled = False impede que o usuário digite algo no quadro
texto.

6.9) Evento Scroll


- No evento HSBvelocidade_Scroll.
TXTvelocidade.Text = BRHvelocidade.Value + “ Km\h”
O evento Scroll de uma barra de rolagem ocorre quando se arrasta o marcador do controle.

- Executar o programa.

8
CAPÍTULO II

1 - TIPOS DE DADOS
Os tipos de dados suportados pelo VB são os seguintes:

TIPO DE DADO SUFIXO TAMANHO FAIXA

Integer % 2 bytes
Long(long integer) & 4 bytes

Single ! 4 bytes

Double # 8 bytes

Currency @ 8 bytes

String $ 1 byte por caracter

Variant Nenhum

Object Nenhum 4 bytes

2 - DECLARAÇÃO DE VARIÁVEIS

Ao se declarar uma variável, deve-se especificar qual é seu tipo. Quando o tipo não é especificado, ela é
considerada como sendo Variant.

2.1) Dim
A declaração de variáveis é feita usando-se a palavra chave Dim, seguida do nome da variável, com a
indicação do tipo vindo em seguida:

Dim i as Integer ou Dim i%


Dim x as Double ou Dim x#

2.2) Public
Uma variável declarada como Public, é visível em qualquer parte do projeto, e não apenas no módulo onde ela
for declarada. Essa declaração só pode ser feita em um módulo. Ex.:

Public Numerodeempregados As Integer

2.3) Private
Declara variáveis que são privativas do módulo em que foi feita a declaração. Essas variáveis não são visíveis
fora do módulo. Essa declaração só pode ser feita em um módulo .Por exemplo:

Private Numero As Integer

2.4) Static
As variáveis Static são declaradas em funções, e retém seu valor entre as chamadas. São variáveis locais, que
não são destruídas após a função ter sido encerrada, porém só são visíveis de dentro da função. Por exemplo:

Function Total(numero)
' Somente a variável acumulo retem seu valor entre as chamadas.
Static acumulo
acumulo = acumulo + numero
Total = acumulo
End Function

9
2.5) Matrizes
As variáveis matrizes são declaradas usando a seguinte sintaxe:

dim <nome_da_variável> (<limite_inferior> to <limite_superior>) as tipo

Onde nome_da_variável é um identificador definido pelo programador, e limite_inferior e limite_superior são os


valores inteiros que limitam a dimensão da matriz. Para criar uma matriz com mais de uma dimensão (no máximo 60
dimensões), basta acrescentar outros <limite_inferior> to <limite_superior> à declaração, conforme o exemplo:

Dim X(1 To 8) As Integer


Dim Y(1 To 8, 5 To 9) As Single

No primeiro caso temos a declaração da variável vetor X de elementos Integer, de uma dimensão e com
índices variando de 1 a 8, . No segundo caso é declarada a variável Y, um vetor de valores Single, com duas
dimensões, tendo a primeira índices variando de 1 a 8 e a segunda de 5 a 9.
O acesso a um elemento da matriz é feito escrevendo-se o nome da variável seguida de parênteses, que
contém a posição do elemento dentro das dimensões da matriz. Observe o exemplo:

X (2) = 6
Y (3,6) = 8.9

No primeiro caso, é colocado o valor 6 no segundo elemento da variável X, enquanto que no segundo caso, é
colocado o valor 8.9 no elemento de índice 3 na primeira dimensão e 6 na segunda. Se imaginarmos a variável Y como
uma tabela, teríamos o seguinte:

5 6 7 8 9
1
2
3 8.
9
4
5
6
7
8

2.6) Redim
A instrução ReDim é utilizada para dimensionar ou redimensionar uma matriz dinâmica que já tenha sido
declarada formalmente utilizando-se uma instrução Private, Public ou Dim com os parênteses vazios (sem subscritos de
dimensão).
É possível utilizar a instrução ReDim várias vezes para alterar o número de elementos e dimensões em uma
matriz. Observe o exemplo:

Dim vetor() As Integer 'declara a matriz com os parênteses vazios

ReDim vetor(10) 'redeclara a matriz com 10 elementos

3 - INSTRUÇÕES DE CONTROLE DE FLUXO DE PROGRAMAS

3.1) If <expressão> Then <comando> End If


O comando If condiciona a execução de um comando (ou bloco de comandos) à verificação de uma
expressão. O comando só é executado se a expressão for verdadeira.

If A = 1 Then
<cmdo ou bloco executado somente se A for igual a 1>
End If

Existe também a possibilidade da utilização do Else, como no exemplo abaixo

If A = 1 Then
<cmdo ou bloco executado somente se A for igual a 1>
Else
<cmdo ou bloco executado somente se A for diferente de 1>
End If

10
Também é possível o uso de If's aninhados, sendo executado o grupo de comandos associados à condição
verdadeira. Observe o exemplo:

If x > 4 then
<comandos>
ElseIf x = 4 then
<comandos>
Else
<comandos>
End If

3.2) A instrução Select Case


Essa instrução tem funcionamento parecido com a anterior, normalmente sendo utilizada quando há a
necessidade de uma escolha que envolva várias opções. É testado o valor de uma expressão numérica ou string, contra
vários valores, cada um associado a um case. Serão executados os comandos que estiverem relacionados ao case que
contiver a condição verdadeira.

Select Case x
Case 0
<comandos que serão executados caso x = 0>
Case 1
<comandos que serão executados caso x = 1>
Case 2
<comandos que serão executados caso x = 2>
End Select

Select Case x
Case 0
Beep
Case Is > 1 < 5
Text1.Text = x
Case 2
x=x*x
Text1.Text = x
Case Else
Text1.Text = 2*x
End Select

Voce também pode usar múltiplas expressões ou faixas em cada cláusula case. Por exemplo, a seguinte linha é
válida:

Case 1 To 4, 7 To 9, 11, 13, Is > X

3.3) A instrução Do While ... Loop


Esta instrução é utilizada para executar instruções enquanto uma determinada condição for verdadeira.

x=1
Do While X < 1000
x=x+1
Loop

O pedaço de código acima inicializa a variável x, e executa o comando x = x + 1 enquanto x for menor que
1000.

3.4) A instrução Do ... Loop While


No exemplo anterior, se x fosse inicializado com 1000, o loop nunca seria executado. Pode ser conveniente
que um determinado loop seja executado pelo menos uma vez, independente da variável de controle. Isto é possível
com Do ... Loop While.

x = <qualquer_valor>
Do
x =x+1
Loop While x < 1000

Neste fragmento de código, o comando x = x + 1 é executado pelo menos uma vez, sendo executado
novamente enquanto x for menor do que 1000.
11
OBS: É possível a substituição da palavra While pela palavra Until nas instruções vistas anteriormente. Neste
caso, o loop será executado até que a condição se torne verdadeira, e não enquanto ela for verdadeira.

3.5) A instrução For ... Next


É uma outra forma de se criar loops no VB. Sempre que for possível, deve ser utilizado no lugar das outras
instruções de repetição, por ser mais rápida.

For x = 1 to 100 Step 2


y=y+1
Next

Este comando realiza o loop contando x de 1 até 100, de 2 em 2. Step informa de quanto será o incremento da
variável de controle. Se for omitida, o valor do incremento será 1. Observe que o valor inicial da variável de controle (no
caso x), é definido no próprio comando, não importando qual valor a variável possuia antes.

3.6) A instrução Exit For


Esta instrução determina a saída do loop contido da instrução For ... Next mais interna, mesmo que a condição
de término do loop não tenha sido alcançada.

For x = 1 to 100 Step 2


y=y+1
if y = 30 then
Exit For
End If
Next

Se y tiver o valor 30 durante a execução do loop, o comando For é encerrado.

3.7) A instrução Exit Do


Esta instrução determina a saída do loop da instrução Do ... mais interna, mesmo que a condição de término
do loop não tenha sido alcançada. É semelhante à instrução Exit For.

x = <qualquer_valor>
Do
x =x+1
if x = 30 then
Exit Do
End If
Loop While x < 1000

4 - SELECIONANDO OPÇÕES
O próximo programa nos mostrará como permitir que o usuário selecione uma opção. Para isto serão vistos os
controles Option Button (botão de opção) e Check Box (caixa de verificação).

- Iniciar um projeto.

- Alterar as propriedades do formulário:


Name = FRMopcao
Caption = Programa Opção
formulário : opcao.frm

- Salvar o projeto no diretório c:\aulavb\aula02\proj1:

- Inserir um botão de comando:


Name = BTNsair
Caption = Sa&ir

- Inserir um label:
Name = LBLescolha
Caption = <vazio>

O formulário deve ficar conforme a figura 2.1.

12
4.1) Option Button e Check Box
Um Botão de opção (Option Button) e um Caixa de verificação (Check Box) permitem que o usuário faça
uma escolha. Quando ocorre um clique sobre o controle, em tempo de execução, a propriedade Value muda de True
para False, e vice e versa. Quando essa propriedade for True, o botão se apresentará marcado. O funcionamento dos
dois controles é similar, com a diferença de que em um formulário, vários Check Box podem estar selecionados, mas
somente um Option Button pode ter Value como True.
Outra diferença é que os valores possíveis de Value são True e False para um Option Button, e 0, 1 e 2 (não
marcado, marcado e não disponível) para um Check Box.

- Inserir 3 (três) botões de opção:


Name = OPTverde Name = OPTvermelho Name = OPTbranco
Caption = Ve&rde Caption = Ver&melho Caption = &Branco
Value = False Value = False Value = True

- Inserir 3 (três) botões de verificação:


Name = CHKcor Name = CHKsom Name = CHKmouse
Caption = &Cor Caption = &Som Caption = &Mouse
Value = 0 Value = 0 Value = 0

- Inserir o seguinte código nos eventos Click dos botões de opção:


atualiza_cor

fig 2.1

fig 2.2 - Option Button e Check Box

5 - ESCREVENDO E CHAMANDO FUNÇÕES E PROCEDIMENTOS

5.1) Procedimentos (Sub)


A linha de código acima significa que o procedimento atualiza_cor será executado toda vez que qualquer um
dos botões de opção for clicado. Obviamente devemos escrever o código deste procedimento. Na seção General do
formulário, escreva Sub atualiza_cor, e tecle <Enter>. Automaticamente o VB apresenta uma janela de código para o
procedimento em questão.
Uma outra maneira de criar um procedimento ou função é através do item de menu Tools – Add Procedure,
conforme figura 2.3. A janela de diálogo da figura 2.4 será exibida.
13
fig 2.3 – Criar procedimento

A diferença entre um procedimento e uma função é que a função retorna um valor. No procedimento
atualiza_cor, escrever então o seguinte código:

Sub atualiza_cor
If OPTvermelho Then
FRMopcao.BackColor = &HFF&
OPTvermelho.BackColor = &HFF&
OPTverde.BackColor = &HFF&
OPTbranco.BackColor = &HFF&
CHKcor.BackColor = &HFF&
CHKsom.BackColor = &HFF&
CHKmouse.BackColor = &HFF&
LBLescolha.BackColor = &HFF&
ElseIf OPTverde Then
FRMopcao.BackColor = &HFF00&
OPTvermelho.BackColor = &HFF00&
OPTverde.BackColor = &HFF00&
OPTbranco.BackColor = &HFF00&
CHKcor.BackColor = &HFF00&
CHKsom.BackColor = &HFF00&
CHKmouse.BackColor = &HFF00&
LBLescolha.BackColor = &HFF00&
ElseIf OPTbranco Then
FRMopcao.BackColor = &HFFFFFF
OPTvermelho.BackColor = &HFFFFFF
OPTverde.BackColor = &HFFFFFF
OPTbranco.BackColor = &HFFFFFF
CHKcor.BackColor = &HFFFFFF
CHKsom.BackColor = &HFFFFFF
CHKmouse.BackColor = &HFFFFFF
LBLescolha.BackColor = &HFFFFFF
End If
End Sub

Este procedimento troca o valor da propriedade BackColor de todos os controles do formulário (exceto do
botão), de acordo com o botão de opção escolhido.

fig 2.4 – janela de diálogo Add Procedure

- Inserir o seguinte código nos eventos Click das caixas de verificação:


atualiza_label
14
A linha de código acima significa que o procedimento atualiza_label será executado toda vez que qualquer um
dos botões de check for clicado. Obviamente devemos escrever o código deste procedimento.
Escrever o procedimento atualiza_label:

Sub atualiza_label

Dim pl, info As String

pl = Chr(10) + Chr(13)

If CHKcor Then
info = "Cor ON"
Else
info = "Cor OFF"
End If
If CHKsom Then
info = info + pl + "Som ON"
Else
info = info + pl + "Som OFF"
End If
If CHKmouse Then
info = info + pl + "Mouse ON"
Else
info = info + pl + "Mouse OFF"
End If
LBLescolha.Caption = info
end sub

As duas variáveis (pl e info) são do tipo string. A variável pl recebe o valor Chr(10) + Chr(13). A função chr()
devolve o símbolo cujo código Ascii é o número passado como parâmetro, sendo 10 o código de avanço de linha e 13 o
de retorno de carro. Na prática, o uso dessa função com esses parâmetros, faz com que uma linha seja avançada.
A variável info recebe o seu valor de acordo com as caixas de verificação que estiverem selecionadas.

5.2) Funções
Este outro programa mostrará como uma função deve ser codificada e chamada. O formulário deve Ter a
aparência mostrada na figura 2.5.

- Iniciar um novo projeto, com as seguintes propriedades do formulário:


Name = FRMcalcular
Caption = Calculadora Simples
BackColor = &H00C0C0C0& (cinza)

- Salvar o projeto no diretório c:\aulavb\aula02\proj2, com o nome calcular.mak, e o formulário como


calcular.frm.

- Colocar dois quadros textos:


Name = TXTop1 Name = TXTop2
BorderStyle = 1 BorderStyle = 1

15
fig 2.5 – Outro projeto

- Colocar dois labels, de forma que o label LBLoperacao fique entre os dois quadros textos, e o label
LBLigual fique depois do quadro texto TXTop2:
Name =LBLoperacao Name = LBLigual
BorderStyle = 0 BorderStyle = 0
Caption = =

- Colocar quatro botões de opção, um em cima do outro, do lado esquerdo do formulário, conforme a figura 2.5:
Name = OPTsoma Caption = &Soma
Name = OPTsubtracao Caption = Su&btracao
Name = OPTmultiplicacao Caption = &Multiplicacao
Name = OPTdivisao Caption = &Divisao

- Colocar dois botões de comando:


Name = BTNcalcular Caption = &Calcular
Name = BTNSair Caption = Sai&r

- Escrever no evento click do botão BTNsair:


End

- Escrever no evento click de cada botão de opção:


LBLoperacao.caption = “+” (OPTsoma_clicK)
LBLoperacao.caption = “-” (OPTsubtracao_click)
LBLoperacao.caption = “x” (OPTmultiplicacao_click)
LBLoperacao.caption = “/” (OPTdivisao_click)
Dessa forma, sempre que um botão de opção for selecionado (clicado), o controle LBLoperacao terá a
propriedade Caption configurada adequadamente.

- Configurar as propriedades FontSize para obter um melhor efeito, aumentando o tamanho da fonte usada.

- No evento form_load:
optsoma_click
optsoma.Value = 1
Isto faz com que o evento click do botão de opção seja executado, colocando “+” no caption do label
LBLresultado (1ª linha) e faz com que o OPTsoma fique selecionado (2ª linha), assim que o programa inicie.

- Executar o programa.

- No evento BTNcalcular_click:
LBLresultado.caption = calcular(Val(TXTop1.Text), Val(TXTop2.Text))

Como já dito anteriormente, a diferença entre uma função e um procedimento é que uma função retorna um
valor. Portanto, ao chamar uma função, o valor de retorno deve ser atribuído a alguma coisa (variável, propriedade de
algum controle,etc.).
A linha de código vista acima coloca o valor de retorno da função calcular na propriedade Caption do controle
LBLresultado.
16
Tanto uma função como um procedimento podem receber argumentos. Argumentos são como variáveis
locais, internas à função ou procedimento.
Para chamar uma função com argumentos, eles devem vir entre parênteses; no caso de uma sub
(procedimento) , não se usa parênteses. Obviamente a função ou procedimento deve especificar os seus parâmetros na
definição, indicando também de que tipo eles são.

- Na seção General do formulário, escrever Function calcular(op1, op2).

- Inserir o seguinte código na janela de edição da função calcular:

Function calcular (op1 As Single, op2 As Single)


Select Case LBLoperacao.Caption
Case "+"
calcular = op1 + op2
Case "_"
calcular = op1 - op2
Case "x"
calcular = op1 * op2
Case "/"
If op1 = 0 Then
MsgBox "Impossível dividir por zero!", , "Aviso"
Exit Function
End If
calcular = op1 / op2
End Select
End Function

- Executar o programa.

5.3) Função Val()


A função predefinida Val() recebe como argumento uma string que pode ser interpretada como um número,e
retorna este número como um double. Ela lê o argumento até que apareça um caracter que não represente um número.
Caso o primeiro caracter não seja numérico, a função retorna o valor zero.

5.4) Propriedade AutoSize


- Alterar a propriedade do controle LBLresultado:
LBLresultado.AutoSize = True
A propriedade AutoSize é aplicada a um Label e a uma Picture (um controle ainda não visto), e determina se
o controle se ajustará ao seu conteúdo (o valor da propriedade Caption no caso do Label).

17
CAPÍTULO III

1- CONTROLANDO O TEMPO

O próximo programa nos mostrará como permitir que o usuário controle a execução de ações em função do
tempo. Para isto será visto o controle Timer.

Controle

fig. 3.1 - Controle Timer

- Iniciar um projeto.
- Alterar as propriedades do formulário:
Name = FRMtimer
Caption = Timer
- Salvar o projeto no diretório c:\aulavb\aula03\proj1:
formulário : timer.frm
projeto : timer.mak
- Inserir um botão de comando:
Name = BTNhabilita
Caption = Desabilitar
- Inserir um quadro texto:
Name = TXT1
Caption = <vazio>
- Inserir uma barra de rolagem vertical:
Name = BRVintervalo
Max = 1000
Min = 1
LargeChange = 1
SmallChange = 50
Value = 500

O formulário do programa deve ficar com a aparência da figura 3.1.

1.1) Timer Control


Um Timer é um controle que permite a execução de um código, em intervalos de tempo regulares, através do seu
único evento Timer. Esse controle sempre fica invisível durante a execução do programa.

- Inserir 1 (um) controle Timer:


Name = Timer1
Interval = 500

1.2) Propriedade Interval e o evento Timer


A propriedade Interval define qual o intervalo de tempo (em milésimos de segundo) decorrerá entre duas
ocorrências do evento Timer. Como o valor inicial foi de 500 (definido na Caixa de Propriedades), a cada 500
milisegundos o código relacionado ao evento Timer será executado.

- Executar o programa. Note que nada acontece, pois o evento Timer não tem qualquer código associado.

18
fig. 3.2 - O formulário desse programa

- Inserir o seguinte código nos eventos Change e Scroll da barra de rolagem vertical:
timer1.Interval = BRVintervalo.Value
Isso fará com que o usuário possa controlar o intervalo de tempo que decorrerá entre uma chamada e outra ao
evento Timer.

- Inserir no evento Timer1.Timer a linha de código:


TXT1.Text = TXT1.Text + 1
Beep
Toda vez que o evento Timer ocorrer, o valor mostrado no quadro texto será incrementado em uma unidade, e
um sinal sonoro será emitido.

- Executar o programa.

- Incluir no evento BTNhabilita.Click o seguinte código:

Sub BTNhabilita_Click ()
If VRGhabilita = 1 Then
timer1.Enabled = True
VRGhabilita = 0
BTNhabilita.Caption = "Desabilitar"
Else
timer1.Enabled = False
VRGhabilita = 1
BTNhabilita.Caption = "Habilitar"
End If
End Sub

- Execute o programa e veja o que ocorre.

- Inclua um controle no programa, de forma que o intervalo seja informado ao usuário.

2 - USANDO O MOUSE
Neste outro programa começaremos a entender o funcionamento e a usar o mouse. Veremos inicialmente dois
eventos de mouse (MouseDown e MouseMove), e nos próximos projetos discutiremos os demais.
Veremos também novos controles e novos métodos: a caixa de figura (Picture Box), o quadro combo (Combo
Box), o Frame e a caixa de listagem (List Box); e os métodos Circle e Move.

- Iniciar um projeto.

- Alterar as propriedades do formulário:


Name = FRMmouse
Caption = Mouse

19
fig 3.3 - o formulário desse projeto

- Salvar o projeto no diretório c:\aulavb\aula03\proj2:


formulário : mouse.frm
projeto : mouse.mak
- Inserir um Frame:
Caption = Cursor
- Declarar uma variável de formulário, seguindo a sintaxe abaixo:
Dim VFcor As Integer

Picture Frame
Box

Comb
oBox

List
Box
fig 3.4 - Controles ComboBox, ListBox, Frame e PictureBox

2.1) List Box Control


Esse controle mostra uma lista de itens, a partir da qual o usuário pode selecionar um ou mais itens. Se o nº de
itens exceder o nº que pode ser mostrado, uma barra de rolagem automaticamente é adicionada ao controle.
As duas propriedades mais importantes são a ListIndex e a ListCount. ListIndex informa o índice do item
selecionado (o primeiro item tem índice 0, e assim por diante), e ListCount o nº de itens que estão no controle. A
propriedade Text informa o valor do item selecionado. Se nenhum item estiver selecionado, ListIndex tem o valor zero.

2.2) Métodos AddItem e RemoveItem


Para adicionar e remover itens de uma List Box, usamos os métodos AddItem e RemoveItem,
respectivamente. Esses métodos são usados por vários controles do VB, sendo que o funcionamento é semelhante.

- Inserir uma List Box:


- No evento Form Load inserir o seguinte código:

List1.AddItem "Preto"
List1.AddItem "Azul"
List1.AddItem "Verde"
List1.AddItem "Vermelho"
List1.AddItem "Amarelo"
List1.AddItem "Branco"
List1.ListIndex = 0

Este código fará com que, ao ser carregado o formulário, os itens especificados sejam adicionados ao controle,
ficando o primeiro item selecionado ("Preto"). Mais a frente veremos onde utilizar esses itens.
- No evento List1_Click, inserir o seguinte código:

20
Private Sub List1_Click()
Select Case List1.Text
Case "Preto"
VFcor = 0
Case "Azul"
VFcor = 9
Case "Verde"
VFcor = 10
Case "Vermelho"
VFcor = 12
Case "Amarelo"
VFcor = 14
Case "Branco"
VFcor = 15
End Select
End Sub

Este código ocorre toda vez que for selecionado um novo item no controle, através do evento click do Mouse
sobre o controle List1. Observe que de acordo com o valor do item selecionado, a variável de formulário VFcor recebe
um valor numérico. A utilização dessa variável será vista mais adiante, no evento Mouse Move.

2.3) Combo Box Control


Um Combo Box combina a utilização de um Text Box com uma List Box - o usuário pode digitar texto na
parte de texto do controle, ou selecionar um item da parte de lista do controle.
As propriedades ListCount e ListIndex, e os métodos AddItem e RemoveItem, têm o mesmo funcionamento
que no controle List Box.

- Inserir um quadro combo:


- No evento Form Load, adicionar as seguintes linhas de código, antes ou depois das linhas que adicionam
itens ao controle List Box:

Combo1.AddItem "Figura1"
Combo1.AddItem "Figura2"
Combo1.AddItem "Figura3"
Combo1.ListIndex = 0

Este código adicionará ao controle os itens relacionados, e mostrará como selecionado o primeiro item . Mais a
frente veremos onde utilizar esses itens.

2.4) Picture Box Control


Um controle Picture Box é uma caixa que pode mostrar uma figura a partir de um arquivo gráfico (bitmap,
icon, metafile), e a partir da versão 5.0 do VB, arquivos JPEG e GIF. A figura mostrada é definida pela propriedade
Picture.
- Inserir três caixas de figura, não alterando a propriedade Name, e definir a propriedade picture de cada uma delas,
escolhendo uma figura do diretório C:\windows.
(Essa escolha é feita clicando-se duas vezes sobre a propriedade Picture do controle. Uma janela se abrirá,
permitindo a escolha de um arquivo de figura.)

2.5) O Evento MouseDown


- No evento MouseDown do formulário, incluir o seguinte código:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
If Combo1.ListIndex = 0 Then
Picture1.Move X, Y
ElseIf Combo1.ListIndex = 1 Then
Picture2.Move X, Y
ElseIf Combo1.ListIndex = 2 Then
Picture3.Move X, Y
End If
End If
End Sub

O evento ocorre sempre que um botão do mouse for pressionado sobre a área de um controle. Note que esse
evento possui os seguintes argumentos: Button As Integer, Shift As Integer, X As Single, Y As Single. Eles
significam o seguinte:
21
Button especifica qual botão do mouse foi pressionado, se o esquerdo (valor 1), o direito (2), ou o do centro
(4);`
Shift define o estado das teclas Shift, Ctrl e Alt, tendo os valores abaixo conforme elas forem pressionadas:

VALOR ALT CTRL SHIFT

0 NÃO NÃO NÃO


1 NÃO NÃO SIM
2 NÃO SIM NÃO
3 NÃO SIM SIM
4 SIM NÃO NÃO
5 SIM NÃO SIM
6 SIM SIM NÃO
7 SIM SIM SIM

X e Y são as coordenadas do local onde o botão do mouse foi pressionado.


Observe que o argumento Button só pode representar um botão por vez pressionado do mouse.
O código acima faz o seguinte: se o botão do mouse pressionado é o da esquerda, é movido (pelo método
Move) um controle picture para as coordenadas X e Y. O controle movido depende de qual item do controle Combo
Box está selecionado. Se for pressionado qualquer outro botão do mouse, nada ocorrerá.

2.6) As Coordenadas do Formulário


As coordenadas do formulário são definidas em função das seguintes propriedades:
ScaleMode: Define qual a unidade que será usada como medida. Os valores possíveis são os seguintes:
0-User (É definido pelas propriedades ScaleHeight, ScaleWidth, ScaleLeft, e ScaleTop) ,
1-Twip (default - 1440 Twips por polegada; 567 Twips por centímetros) ,
2-Point (72 pontos por polegada),
3 - Pixel (depende da resolução do monitor),
4-Character (horizontal = 120 twips por unidade; vertical = 240 twips por unidade),
5-Inch (polegadas),
6-Millimeter (milímetros),
7-Centimeter (centímetros)

ScaleHeight/ScaleWidth: Determina o número de unidades (de acordo com ScaleMode) para a área interna
vertical e horizontal, respectivamente.
ScaleLeft/ScaleTop: Determina o valor da coordenada do ponto superior esquerdo do controle. O default é
zero para ambas.

2.7) O Método Move


Este método move um controle ou um formulário, e tem a seguinte sintaxe:

[objeto.]Move left[, top[, width[, height] ] ]

Com os parâmetros significando o seguinte (somente o argumento left é obrigatório):

objeto Formulário ou controle a ser movido. Pode ser qq controle, a exceção de Timer e
Menu.
left Valor Single que indica a coordenada horizontal para o lado esquerdo do objeto.
top Valor Single que indica a coordenada vertical para a parte superior do objeto.
width Valor Single que indica o novo valor da propriedade Width.
height Valor Single que indica o novo valor da propriedade Height.

2.8) O Evento MouseMove


- No evento MouseMove do formulário, incluir o seguinte código:

Label1.Caption = X
Label2.Caption = Y
If Button = 1 Then
If Combo1.ListIndex = 0 Then
Picture1.Move X, Y
ElseIf Combo1.ListIndex = 1 Then
Picture2.Move X, Y
ElseIf Combo1.ListIndex = 2 Then
Picture3.Move X, Y
End If
22
ElseIf Button = 2 Then
Circle (X, Y), 70, QBColor(VFcor)
End If

Esse evento ocorre sempre que o mouse for movimentado sobre a área do objeto, com algum de seus botões
pressionado. Observe que esse evento possui os mesmos argumentos do evento MouseDown, tendo praticamente os
mesmos significados. Uma das diferenças está nos argumentos X e Y, que são as coordenadas do local onde o mouse
está posicionado. Esses argumentos são continuamente verificados, enquanto o cursor do mouse percorrer a área do
formulário com um botão pressionado.
A outra diferença está no argumento Button. Enquanto que no evento MouseDown esse argumento só
poderia ter os valores 1, 2 ou 4 (significando botão esquerdo pressionado, botão direito, ou botão central), no evento
MouseMove este argumento pode ter os seguintes valores:

VALOR BOTÃO ESQUERDO BOTÃO DIREITO BOTÃO CENTRAL

0 NÃO NÃO NÃO


1 SIM NÃO NÃO
2 NÃO SIM NÃO
3 NÃO SIM SIM
4 NÃO NÃO SIM
5 SIM NÃO SIM
6 NÃO SIM SIM
7 SIM SIM SIM

É importante ressaltar que outros controles também possuem os eventos MouseMove e MouseDown, que
são disparados quando o mouse percorre a área sobre o controle respectivo.
O código acima faz o seguinte: se o botão pressionado quando o mouse for movimentado é o da esquerda, é
movido um controle picture para as coordenadas X eY. O controle movido depende de qual item do controle Combo
Box está selecionado. Se o botão pressionado for o da direita, é desenhado um círculo (método Circle) na posição X,
Y, com um raio de 70 unidades (definida pela propriedade ScaleMode).
OBS: Para verificar o funcionamento do evento MouseMove, e dos argumentos X e Y, insira dois labels no
formulário, e esta linha de código no início do evento MouseMove do formulário:
label1.caption = x
label2.caption = y

2.9) O Método Circle


Este método desenha um círculo, uma elipse ou um arco em um objeto. Possui a seguinte sintaxe:

[object.]Circle [Step](x, y), radius[,[color] [,[start] [,[end] [,aspect] ] ] ]

object Objeto no qual a figura será desenhada.


Step Especifica que o centro da figura é relativo às coordenadas correntes do objeto.
(x,y) Valores Single que indicam as coordenadas do centro da figura. A medida é
determinada pelas propriedades de escala (ScaleMode, ScaleLeft, ScaleTop,
ScaleHeight and ScaleWidth).
radius Valor Single que indicao raio da figura. A medida é determinada pelaspropriedades de
escala (ScaleMode, ScaleLeft, ScaleTop, ScaleHeight and ScaleWidth).
color Valor Long integer que indica a cor da linha da figura. Se for omitida, o valor da
propriedade ForeColor é usado.
start e
end Valores Single que indicam o iníco e o final de um arco de círculo ou elipse. A faixa vai
de -2 PI radianos até 2 PI radianos. O default para start é 0 radianos, e para end é 2 PI
radianos.
aspect Valor Single que indica o aspecto da figura. O default é 1.0, e indica que será
denhado um círculo.

No nosso projeto, esse método é chamado no evento Mouse Move, e como nenhum objeto é especificado, o
desenho é feito sobre o formulário. Ele desenha um círculo de 70 unidades de raio, como já foi dito, e com a cor
especificada pela função Qbcolor. Essa função será vista em outro capítulo, mas por hora basta informar que ela
retorna um valor Long integer que representa uma cor, segundo o argumento numérico que lhe for passado (no
caso, a variável VFcor).

3 - UTILIZANDO MENUS
Este programa permitirá que o usuário modifique a cor de fundo e o tamanho de um formulário, através da

23
utilização de menus. Também será visto uma nova função do VB, a função QBcolor(). Siga os passos descritos abaixo:

- Iniciar um projeto.
- Alterar as propriedades do formulário:
Name = FRMmenu
Caption = Programa Menu
- Salvar o projeto no diretório c:\aulavb\aula04\proj1:
formulário :menu.frm
projeto : menu.vbp

3.1) Menu
Para criarmos um menu em um formulário, utilizamos o Menu Editor do VB. Escolhemos a opção de menu
Tools - Menu Editor, ou clicamos as teclas <Ctr E>, e a janela que permite a criação do menu é aberta.

Um item de menu também é um controle, e portanto possui propriedades. Essas propriedades são definidas
na janela do Editor de Menu. A maioria já é conhecida, e têm a mesma função que em outros controles, como as
propriedades Caption, Name, Index, Visible, Checked e Enabled. A propriedade ShortCut permite especificarmos
uma tecla de atalho, a partir da lista de opções que é oferecida.
Para se criar os menus, escreve-se os valores das propriedades nos locais apropriados da janela Menu
Design, e seleciona-se ou não as propriedades que possuem valores do tipo lógico, através dos check box . Os botões
de setas da janela permitem a criação de submenus, e a navegação pelos itens.

FIG 3.5 - A janela Menu Editor

- Criar os seguintes itens de menu:

ITEM DE MENU NAME CAPTION


Cores MNPcores &Cores
Branco MNSbranco &Branco
Azul MNSazul A&zul
Vermelho MNSvermelho &Vermelho
----------- MNSsep -
Sair MNSsair Sai&r
Tamanho MNPtamanho &Tamanho
Minimizado MNSminimizado &Minimizado
Normal MNSnormal &Normal
Maximizado MNSmaximizado Ma&ximizado

Após a criação de todos os itens de menu, teclar o botão OK.

24
Observe que os itens com a propriedade name iniciando com as letras MNP, são os itens principais de menu,
enquanto que os outros são os submenus.

- Inserir o seguinte código no evento click do menu MNSvermelho:

Sub MNSvermelho_Click ()
FRMmenu.BackColor = QBColor(4)
MNSvermelho.Enabled = False
MNSazul.Enabled = True
MNSbranco.Enabled = True
End Sub

3.2) Função Qbcolor()


A função Qbcolor() é uma função do VB, que retorna um valor de cor (um inteiro longo, que é identificado pelo
windows como uma cor), de acordo com o argumento que lhe é passado, conforme a tabela abaixo (observe que o valor
do argumento pode ser qq inteiro entre 0 e 15):

Nº Cor Nº Cor
0 Preto 8 Cinza escuro
1 Azul 9 Azul claro
2 Verde 10 Verde claro
3 Cyan 11 Cyan claro
4 Vermelho 12 Vermelho claro
5 Magenta 13 Magenta claro
6 Amarelo 14 Amarelo claro
7 Cinza 15 Branco

O código acima faz com que o formulário fique vermelho, desabilitando o item de menu MNSvermelho, e
habilitando os itens MNSverde e MNSbranco. Os códigos dos eventos click dos demais itens de menu relacionados
com as cores devem produzir resultados semelhantes:

- Inserir o seguinte código no evento click do menu MNSazul:

Sub MNSazul_Click ()
FRMmenu.BackColor = QBColor(1)
MNSvermelho.Enabled = True
MNSazul.Enabled = False
MNSbranco.Enabled = True
End Sub

- Inserir o seguinte código no evento click do menu MNSbranco:

Sub MNSbranco_Click ()
FRMmenu.BackColor = QBColor(15)
MNSvermelho.Enabled = True
MNSazul.Enabled = True
MNSbranco.Enabled = False
End Sub

- Inserir o seguinte código no evento load do formulário

Sub Form_Load ()
MNSbranco.Enabled = False
FRMmenu.BackColor = QBColor(15)
MNSnormal.Enabled = False
FRMmenu.WindowState = 0
End Sub

Este código faz com que o programa sempre inicie com o formulário no tamanho normal, com a cor branca,
além de desabilitar os itens de menu MNSbranco e MNSnormal.

3.3) A propriedade WindowState do Formulário


A propriedade WindowState de um formulário informa qual o tamanho do formulário. Ela pode ser acessada
tanto em tempo de projeto quanto em tempo de execução, e os valores possíveis são os seguintes:
25
0 (Default) Normal
1 Minimizado
2 Maximizado (toda a tela)

- Inserir no evento click do item de menu MNSminimizado:

Sub MNSminimizado_Click ()
FRMmenu.WindowState = 1
MNSminimizado.Enabled = False
MNSmaximizado.Enabled = True
MNSnormal.Enabled = True
End Sub

Este código minimiza a janela do programa, além de desabilitar o item de menu MNSminimizado e habilitar os
itens MNSnormal e MNSmaximizado. Obviamente os eventos click do outros dois itens relacionados ao tamanho do
formulário deverão conter códigos semelhantes.

3.4) O evento Resize do Formulário


Com o programa do jeito que está, se o tamanho do formulário for alterado através do menu de controle ou dos
botões maximizar e minimizar do formulário, os itens de menu não terão suas propriedades Enabled modificadas de
acordo, pois nenhum evento click foi disparado. Para resolver esse inconveniente, temos que capturar o evento que
ocorre, e nele inserir o código apropriado.
Estamos falando do evento Resize. Ele ocorre sempre que o formulário tem o seu tamanho alterado. Portanto,
para que o problema deixe de existir, deve ser feito o seguinte:

- Inserir no evento Resize do formulário FRMmenu o seguinte código:

Sub Form_Resize ()
If FRMmenu.WindowState = 0 Then
MNSminimizado.Enabled = True
MNSmaximizado.Enabled = True
MNSnormal.Enabled = False
ElseIf FRMmenu.WindowState = 2 Then
MNSminimizado.Enabled = True
MNSmaximizado.Enabled = False
MNSnormal.Enabled = True
End If
End Sub

Desta forma, toda vez que o formulário tiver seu tamanho alterado, os itens de menu terão sua propriedades
Enabled alteradas de acordo.
Observe as três linhas inferiores do evento click dos menus relacionados ao tamanho do formulário. Elas se
encarregam de alterar as propriedades Enabled de cada item de menu apropriadamente. Como é exatamente isso que
faz o código do evento Resize, e como este evento ocorre sempre que um item desses é selecionado (devido a
instrução que altera a propriedade WindowState), elas não são mais necessárias nos eventos Click dos itens de menu.
Deixá-las no programa não causará nenhum problema, mas elas se tornaram redundantes.

3.5) Menus Instantâneos


Um menu instantâneo é um pequeno menu que surge em algum lugar do formulário, em resposta a um evento
do programa. Como exemplo, temos o menu que aparece no programa Word for Windows 7.0, toda vez que o usuário
aperta o botão direito do mouse sobre a área de texto. Um menu instantâneo aparecerá sempre na posição atual do
mouse, e depois que a seleção é feita, o menu desaparece da tela.
A criação de um menu instantâneo é feita da mesma forma que a de um menu comum. Na verdade, a
diferença está na chamada a esse menu, que é feita pelo método PopUpMenu, como veremos adiante.

3.6) Método PopUpMenu


Este método faz com que um menu apareça na posição em que o cursor do mouse se encontra. A sua sintaxe
é a seguinte:

object.PopupMenu menuname

Por exemplo, se inserirmos o código a seguir no nosso projeto, toda vez que o usuário apertar o botão direito
do mouse, sobre o formulário, o menu Cores irá surgir no posição do cursor.

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)


26
If Button = 2 Then
PopupMenu MNPcores
End If
End Sub
Observe que o menu Cores aparece também na barra de menu. Se quisermos que ele seja apenas um menu
instantâneo, basta selecionarmos a sua propriedade Visible como False.

4 - FORMULÁRIO MDI

4.1) MDI Form


Um formulário MDI (multiple-document interface) é uma janela que atua em background na aplicação e que
pode conter formulários que têm a propriedade MDIChild definida em True. Um exemplo de aplicativo que usa MDI é o
Word. Cada documento é um formulário diferente, e quando não há nenhum documento aberto, o formulário MDI
assume o foco.
É possível adicionar um formulário MDI em um projeto, através da opção de Menu Project - Add MDI Form.
Cada aplicação só pode conter um MDI, mas vários formulários filhos (MDIchild). A barra de menu dos
formulários filhos é automaticamente aplicada ao MDIForm, quando o formulário filho é ativado. Um MDIchild
minimizado aparece como um ícone dentro do MDIForm.
Um formulário MDI só pode conter Menu e PictureBox, ou controles que posuam a propriedade Align.

4.2) Propriedade Align


Essa propriedade determina como o controle será alinhado dentro do formulário que o contiver.

- Inicie um novo projeto, e inclua um formulário MDI.


- Inclua um menu com as seguintes propriedades, e de acordo com a figura 3.6:

NAME CAPTION
MNParquivo &Arquivo
MNSprimeiro &Primeiro
MNSnovo Form novo
sep -
MNSsair Sai&r
MNPjanela &Janela
MNShorizontal Lado a lado (horizontalmente)
MNSvertical Lado a lado (verticalmente)
MNScascata Em ascata
MNSicones Organizar ícones

- inserir as seguintes linhas de código:

Private Sub MNScascata_Click()


MDIForm1.Arrange 0
End Sub

Private Sub MNShorizontal_Click()


MDIForm1.Arrange 1
End Sub

Private Sub MNSvertical_Click()


MDIForm1.Arrange 2
End Sub

Private Sub MNSicones_Click()


MDIForm1.Arrange 3
End Sub

Private Sub MNSsair_Click()


End
End Sub

A instruções MDIForm1.Arrange 0, MDIForm1.Arrange 1 e MDIForm1.Arrange 2, mostram os formulários


filhos do MDI, e que estivem visíveis, em cascata, horizontalmente e verticalmente, respectivamente. A instrução
MDIForm1.Arrange 3 organiza os ícones dos formulários filhos que estiverem minimizados.

27
fig 3.6 - janela de menu

- Incluir um novo formulário no projeto e definir a propriedade MDIchild para True;


- inserir um CommandButton e um ListBox neste formulário, atribuindo os seguintes valores à propriedade
Name desses controles

CONTROLE NAME
Form Formulario
CommandButton BTN
ListBox List1

4.3) Vetor de Controles


Um vetor de controles é um conjunto de controles do mesmo tipo, todos com o mesmo valor para a
propriedade Name. Quando, em tempo de projeto, nomeamos dois controles com o mesmo nome, o VB nos pergunta
se desejamos criar um vetor com esses controles.
Para que o vetor possa existir, a propriedade Index dos controles envolvidos devem receber valores inteiros e
consecutivos. Também é possível criar vetores de controles dinamicamente. Nesse caso devemos atribuir à propriedade
Index de um controle o valor 0 (zero), e usar o método Load, como veremos adiante.
- Atribuir à propriedade Index do controle BTN o valor 0 (zero)

-Inserir as seguintes linhas de código no formulário MDI:

Option Explicit
Dim Form() As New Formulario

Private Sub MNSprimeiro_Click()


Load Formulario
End Sub

As duas primeiras linhas devem ser escritas na seção general do formulário MDI. A palavra chave New usada
com a declaração Dim cria uma matriz de objetos Form, com as características do controle formulario, deste projeto. A
instrução Load carrega o controle formulário.

- Inserir mais essas linhas de código no MDI:

Private Sub MNSnovo_Click()


Static i As Integer
i=i+1
ReDim Form(i)
Load Form(i)

28
Form(i).Caption = Str$(i) + "º Formulário"
Form(i).Show
End Sub

Esse código é executado quando o item de menu Novo é acionado. Observe que é declarada uma variável
Static, que será usada para redimensionar a matriz de formulários. A cada vez que esse evento ocorrer, a variável será
incrementada de 1, e conseqüentemente a matriz de formulários também, devido a ReDim Form(i). O último formulário
dessa matriz (índice i) é carregado, e sua propriedade Caption recebe o valor apropriado. Portanto, a cada vez que
esse item de menu for selecionado, um novo formulário será acrescido à aplicação. Da mesma forma que um novo
documento é adicionado ao Word.

- Inserir as seguintes linhas de código no controle formulario:

Private Sub BTN_Click(Index As Integer)


Static i As Integer
i=i+1
List1.AddItem (i)
Load BTN(i)
BTN(i).Top = 0
BTN(i).Left = (i - 1) * 1000
BTN(i).Visible = True
BTN(i).Caption = "botão " + Str(i)
End Sub

No evento Private Sub BTN_Click tambem é delarada uma variável Static, e cada vez que esse evento
ocorrer acontecerá o seguinte: será adicionado um elemento ao controle List1, mostrando o valor da variável i; um novo
controle BTN será carregado, com a propriedade Index uma unidade maior do que a do controle anteriormente
carregado, e com a propriedade Caption mostrando a string "botão " seguida do valor da variável i.
Observe que as propriedades Left e Top do novo controle BTN são configuradas de forma que o controle
fique no alto do formulário, ao lado do controle anteriormente carregado.
A aplicação em funcionamento tem a aparência da figura 3.7.

fig 3.7 - o programa sendo executado

29
CAPÍTULO IV
Neste capítulo veremos a criação de menus, que são utilizados para escolha de opções, e também a criação e
utilização de janelas de diálogos.

1- MANIPULANDO JANELAS E MENSAGENS


Veremos agora a criação de janelas de diálogo, que possibilitam a comunicação de um programa com o
usuário. As janelas podem ser de três tipos: as personalizadas, as predefinidas e as comuns.

fig 4.1 - Usando janelas de diálogos

Este programa mostrará os dois primeiros tipos de janelas, permitindo que o usuário faça escolhas, como
mudar a cor de fundo dos objetos, além de digitar números, datas e nomes. Será visto também a utilização de mais de
um formulário por programa. A última categoria de janelas de diálogos, as comuns, será vista no próximo capítulo.
O nosso programa terá a aparência da figura 4.1:

Seguir as instruções abaixo.

- Iniciar um projeto.

- Alterar as propriedades do formulário:


Name = FRMjanelas
Caption = Verificando Janelas de Diálogo

- Salvar o projeto no diretório c:\aulavb\aula04\proj2


formulário :janelas.frm
projeto : janelas.vbp

1.1) O Controle SSPanel


Este controle é um painel com aparência três dimensões, que serve basicamente para personalizar a aparência
de um aplicativo, permitindo a utilização de grupos de controles, como botões de opção.

O botão da caixa de ferramentas é o mostrado na fig 4.3:


- Inserir um Panel3D.

OBS: Para tornar disponível esse controle, é necessário inserir o componente Sheridan 3D Controls, através do
item de menu Project - Components. O arquivo que corresponde a esse controle é o IMGADMIN.OCX, como
pode ser visto na figura 4.3.

fig 4.2 - Ícone do Frame

30
fig 4.3 - A janela de componentes

- Alterar as propriedades:
Name = Panel3D1
Caption = Personalizadas

- Alterar as propriedades referentes à aparência do painel, verificando o que ocorre.


- Inserir dois botões de comando, dentro do painel, com as seguintes propriedades:
Name = BTNmensagemp Caption = Mensagem
Name = BTNsairp Caption = Sair

Foram usados nomes terminando em p, para distinguir esses botões como os que mostram as janelas
Personalizadas.

OBS: Para que os controles referentes ao Sheridan 3D Controls estejam disponíveis, é necessário que eles
tenhas sido instalados. Esses controles não são desenvolvidos pela Microsoft, mas são feitos para serem
utilizados por programas escritos em VB. Caso o seu computador não tenha esses controles, inclua um Frame
ao invés de um Panel.

1.2) Usando novos Formulários


Incluir dois novos formulários no programa. Isto é feito através da opção de menu Project - Add Form. Alterar
as propriedades dos formulários, conforme tabela abaixo:

NOME EXTERNO NAME CAPTION


Mensagem.frm FRMmensagem Exemplo de Janela Personalizada
Sair.frm FRMsair Sair

- Incluir no formulário FRMmensagem um label e um botão, conforme a figura 4.4 e a tabela seguinte:

31
fig 4.4 - Janela personalizada

CONTROLE NAME CAPTION


Label LBL1 Esta msg pode ser alterada por você!
Command Button BTNok Ok

Quando temos mais de um formulário em um projeto, podemos ter controles com o mesmo nome, desde que
em formulários diferentes. Por exemplo, podemos ter dois botões com Name BTNsair, um em cada formulário. Para
referenciar os controles, é necessário que se informe a qual formulário ele pertence:
Por ex.: FRMmsg.BTNsair ou FRMinicial.FRMsair

- Inserir o seguinte código no evento click do botão FRMjanelas.BTNmensagemp:

Sub BTNmensagem_per_Click ()
FRMmensagem.Show 1
End Sub

1.3) Os Métodos Load e Unload e os Eventos Load e Unload


Esses métodos são aplicados a formulários, e fazem com que o formulário seja carregado (Load) e
descarregado (Unload) da memória. Quando um formulário é carregado, o evento Load ocorre, e quando ele é
descarregado, o evento que ocorre é o Unload.

1.4) Os Métodos Show e Hide e os Eventos Activate e Deactivate


Esses métodos são aplicados a formulários, e fazem com que o formulário seja mostrado (show) e escondido
(Hide). Quando um formulário é mostrado, o evento Activate ocorre, e quando ele é escondido, o evento que ocorre é
o Deactivate.
Se um formulário não estiver carregado na memória, o método Show primeiro carrega (ocorre o evento Load)
e depois mostra o formulário (ocorre o evento Activate).
O método Show tem um parâmetro, que informa se o formulário é modal ou não. Um formulário é modal,
quando nenhum outro formulário da aplicação pode ter o foco se ele estiver ativado. Para mostrar um formulário como
modal, usa-se o método Show com o parâmetro 1. Um parâmetro 0 ou ausência de parâmetro, mostra o formulário
normalmente.
Portanto, o código do evento click acima mostra o FRMmensagem da forma modal.

- Inserir o seguinte código no evento click do botão FRMmensagem.BTNok:

Sub BTNok _Click ()


FRMmensagem.Hide
End Sub

Este código esconde o formulário.

1.5) Janelas Personalizadas


- Executar o programa, e verificar o que ocorre quando clicamos no botão Mensagem.
Temos um exemplo de janela personalizada. Para que o formulário se pareça com uma janela de mensagem,
alterar as seguintes propriedades:
PROPRIEDADE VALOR
BorderStyle 3
ControlBox False

Isto fará com que a borda do formulário fique fixa, e que não apareça o botão de controle no canto superior
esquerdo.

- Incluir no formulário FRMsair um label e dois botões de comando, conforme abaixo:


32
fig 4.5 - Outra janela

CONTROLE NAME CAPTION


Label LBL1 Deseja realmente sair?
Command Button BTNsim Sim
Command Button BTNnao Não

- Inserir o seguinte código no evento click do botão FRMjanelas.BTNsairp:

Sub BTNsairp _Click ()


FRMsair.Show 1
End Sub
Este código fará com que o formulário FRMsair seja mostrado na forma modal.

- Inserir o seguinte código no evento click do botão FRMsair.BTNsim:


Sub BTNsim _Click ()
End
End Sub
Este código encerra o programa.

- Inserir o seguinte código no evento click do botão FRMsair.BTNnao:

Sub BTNnao _Click ()


FRMsair.Hide
End Sub

Este código esconde o formulário FRMsair, e o programa continua a ser executado.


Temos um outro exemplo de janela personalizada. Mude as propriedades que se referem a aparência no
formulário FRMsair, para que seja alcançado um melhor efeito visual.

1.6) Janelas Padronizadas - MsgBox e InputBox


A função MsgBox mostra uma mensagem em uma caixa de diálogo (fig. 4.6), e espera que o usuário clique
em um botão desta caixa de diálogo. Tem os seguintes parâmetros: msg, buttons, title.

*msg : Define a mensagem que será mostrada. É uma string.


*buttons: Define os botões e a imagem que serão mostrados. É um valor integer.
*title: Define o título da caixa de diálogo. É uma string.

fig 4.6 - MsgBox

33
Ela pode ser usada como function ou como procedimento (statement). Se for usada como function, ela
retorna um valor e os parâmetros devem vir entre parênteses; se for usada como procedimento, não é retornado valor
e não se usa parênteses.
Os valores retornados, no caso de ser usada como function, dependem dos botões mostrados. Tanto os
valores de retorno (para o caso de function) quanto os valores para o argumento type podem ser consultados na ajuda
on line (help) do VB. Serão mostrados abaixo os valores mais usados para o argumento buttons, imediatamente
seguido dos valores de retorno.

buttons Descrição

0 Mostra botão OK, somente


1 Mostra botões OK e Cancelar
2 Mostra botões Abortar, Repetir e Ignorar.
3 Mostra botões Sim, Não e Cancelar.
4 Mostra botões Sim e Não
5 Mostra botões Repetir e Cancelar.
16 Mostra ícone de mensagem crítica.
32 Mostra ícone de interrogação.
48 Mostra ícone de exclamação.
64 Mostra ícone de informação.

OBS: Para obter uma associação de butões e ícones, os valores devem ser somados. Por exemplo: o valor 36
mostra o ícone de interrogação e os botões Sim e Não, pois 36=32 + 4.

Retorno Descrição
1 OK
2 Cancelar
3 Abortar
4 Repetir
5 Ignorar
6 Sim
7 Não

A função InputBox mostra um prompt em uma caixa de diálogo, e espera que o usuário digite algo e pressione
um botão (Ok e Cancel). Tem os seguintes parâmetros: prompt, title, default, xpos, ypos.

*prompt: Define a mensagem. É uma string.


*title: Define o título da caixa. É uma string.
*default: Define uma string que é mostrada no prompt, e que será usada como valor de retorno, caso o
usuário não digite algo. É uma string.
*xpos, ypos: Definem as distancias do alto e do lado esquerdo da tela, em twips. É uma expressão
numérica.

InputBox só pode ser usada como function. O pressionamento do botão Cancel faz com que o valor
retornado seja uma string nula. O pressionamento do botão Ok retorna o que foi digitado pelo usuário.

- Inserir outro Panel3D, conforme a fig 4.2, com as seguintes propriedades:


Name = Panel3D2
Caption = Predefinidas

fig 4.7 - InputBox

- Inserir dois frames, dentro do painel, com as seguintes propriedades:


Name =Frame1 Caption = MsgBox
Name =Frame2 Caption = InputBox

34
- Dentro do frame1, inserir os seguintes controles:

CONTROLE NAME CAPTION


Command Button BTNmensagem Mensagem
Command Button BTNsair Sair

- Inserir o seguinte código no evento click do botão BTNmensagem:

MsgBox "Esta mensagem é informativa.", 16, "Mensagem"


- Inserir o seguinte código no evento click do botão BTNsair:

Dim X
X = MsgBox("Deseja sair do programa?", 36, "Confirma saída")
If X = 6 Then
End
End If
No primeiro caso, MsgBox é usada como statement, e o valor 16 como argumento type, define que será
mostrado a figura Stop e um botão Ok. O código apenas mostra uma janela de mensagem, que é fechada quando o
usuário clicar sobre o botão.
No segundo caso, MsgBox é usada como function. O valor 36 como argumento type define que serão
mostrados dois botões (Sim e Não) e a figura 4.8:

fig 4.8 - Ícone de interrogação

No caso de botões Sim e Não, o valor de retorno pode ser 6 ou 7, respectivamente, conforme o botão clicado.
O código acima encerra o programa se o botão clicado for o Sim.

- Dentro do frame2, inserir os seguintes controles:

CONTROLE NAME CAPTION


Command Button BTNnome Nome
Command Button BTNnumero Número
Command Button BTNdata Data

- Inserir dois labels no formulário FRMjanelas, na parte superior, fora de qualquer SSPanel. Nomeá-los como
LBL1 e LBL2.

- Inserir o seguinte código no evento click do botão BTNnome:

Dim nome As String


LBL1.Caption = ""
LBL2.Caption = ""
nome = InputBox("Digite seu nome", "Demonstração")
If nome = "" Then
Exit Sub
End If
LBL1.Caption = "O seu nome é " + nome

Este código limpa o caption dos dois labels, mostra uma InputBox e coloca o valor de retorno como caption
do label LBL1.

- Inserir o seguinte código no evento click do botão BTNnumero:


Dim numero As String
LBL1.Caption = ""
LBL2.Caption = ""
numero = InputBox("Digite um número", "Demonstração")
If numero = "" Then
Exit Sub
End If
If IsNumeric(numero) Then
LBL1.Caption = "O número digitado foi " + numero
Else
35
MsgBox "Você não digitou um número!", , "Aviso!!"
End If

1.7) Função IsNumeric


Este código limpa o caption dos dois labels, mostra uma InputBox e verifica se o valor retornado é numérico,
através da função IsNumeric. Esta função verifica se um argumento String pode ser considerado um número,
retornando True ou False.
Se foi digitado um valor numérico, o valor de retorno é colocado como caption do label LBL1.

1.8) Função IsDate


- Inserir o seguinte código no evento click do botão BTNdata:

Dim dta, dia As String


LBL1.Caption = ""
LBL2.Caption = ""
dta = InputBox("Digite uma data", "Demonstração")
If dta = "" Then
Exit Sub
End If
If Not IsDate(dta) Then
MsgBox "Você não digitou uma data!", , "Aviso!!"
Exit Sub
End If
LBL1.Caption = "A data digitada foi " + dta
Select Case Weekday(dta)
Case 1
dia = "Domingo"
Case 2
dia = "Segunda"
Case 3
dia = "Terça"
Case 4
dia = "Quarta"
Case 5
dia = "Quinta"
Case 6
dia = "Sexta"
Case 7
dia = "Sábado"
End Select
LBL2.Caption = "e o dia da semana é : " + dia

Este código limpa o caption dos dois labels, mostra uma InputBox e verifica se o valor retornado pode ser
uma data, através da função IsDate. Esta função verifica se um argumento String pode ser considerado uma data,
retornando True ou False.

1.9) Função WeekDay


Se foi digitado um valor que pode ser considerado uma data, o valor de retorno é passado para a função
WeekDay. Esta função recebe uma data e retorna um inteiro entre 1 e 7, que informa qual o dia da semana referente
àquela data.
O código acima utiliza o valor retornado pela função WeekDay para informar qual o dia da semana através do
label LBL2.

2 - JANELAS DE DIÁLOGOS COMUNS


Dando continuidade ao assunto janelas de diálogos, veremos agora as janelas de diálogos comuns. Elas são
as janelas de diálogos padronizadas do Windows. Uma caixa de diálogo comum pode ser vista na figura 5.1.

36
fig 4.9 - A caixa de diálogo Salvar Como

O VB oferece um controle que permite exibir facilmente caixas de diálogos, que é o CommomDialog. Para
verificarmos isso, iniciaremos um outro projeto, que terá a aparência final da figura 4.10:

fig 4.10 - O formulário do programa

- Inserir dois CommandButton, com as seguintes propriedades:

CONTROLE NAME CAPTION


Command Button BTNcor Cor
Command Button BTNarquivo Arquivo

2.1) O Controle Common Dialog


Este controle proporciona a apresentação das caixas de diálogo comuns (File, Font, Color, Print) para
operações como abrir, imprimir ou salvar arquivos, ou selecionar cores ou fontes. Este controle não tem nenhum evento
associado, e fica sempre invisível durante a execução.
A propriedade Action deste controle determina qual será a caixa de diálogo mostrada. Por exemplo, a caixa de
diálogo comum de abrir arquivo é mostrada na fig 4.11:

37
fig 4.11 - Caixa de Diálogo Abrir

Action Diálogo Mostrado

0 nenhum
1 Abrir
2 Salvar como
3 Cor
4 Fonte
5 Impressão

De acordo com a caixa mostrada, outras propriedades devem ser selecionadas. Veremos neste capítulo, as
caixas de diálogo comuns Abrir e Cor.

- Inserir um Common Dialog Control no formulário. Não se preocupe com a localização dele, pois ele sempre
fica invisível. O ícone é o da figura 4.12:

fig 4.12 - Ícone do Common Dialog Control

OBS: Para que o Common Dialog Control fique disponível na ToolBox, é necessário incluir o arquivo de
controle respectivo, que é o Microsoft Common Dialog Control 5.0. Isto é feito através da opção de menu
Project - Components. O arquivo correspondente é o COMDLG32.OCX.

As propriedades principais desse controle são usadas de acordo com o valor da propriedade Action. A
propriedade Cancel indica que um erro ocorrerá, caso ela seja definida como True, e o usuário pressione, durante a
execução, a tecla Cancelar da janela de diálogo (isso será usado no nosso programa, e será melhor explicado). Já
FileName retorna o nome do Path e do arquivo selecionado (se Action = 1). Filter especifica o filtro que será mostrado
na ListBox Type da janela, em tempo de execução (para Action = 1), e representa o tipo de arquivo que será mostrado
na janela. Color retorna a cor selecionada (para Action = 3).

- Inserir no evento click do botão BTNcor:

Private Sub BTNcor_Click()


On Error GoTo 2

'seleciona a ação para que a caixa de diálogo permita escolha


'de cores
CMdialog1.Action = 3

'utiliza a cor escolhida na caixa de diálogo, como cor de


'fundo para os controles e o formulário
FRMdialogos.BackColor = CMdialog1.Color
38
Exit Sub
2:
If Err = 32755 Then
Exit Sub
Else
MsgBox "Algum erro ocorreu!", , "Aviso"
End If
Exit Sub

End Sub

Como podemos ver, Action foi definida em 3, o que significa que uma caixa de diálogo de cores irá aparecer. A
propriedade Color representa a cor escolhida pelo usuário, e é utilizada para mudar a cor de fundo de todos os
controles do formulário, inclusive o próprio.
Como a propriedade Cancel é True, se o usuário clicar no Botão Cancel da caixa de diálogo, ocorre um erro (
o código desse erro é 32755). A linha de código On Error GoTo 2 diz ao VB para que o controle do programa vá para o
label 2, caso algum erro ocorra. Se o usuário escolher o botão Cancel, ocorrerá o erro 32755, e o código após o label 2
é executado. Maiores informações sobre o controle de erros será visto adiante.

- Inserir no evento click do botão BTNarquivo:

Private Sub BTNarquivo_Click()


Dim X
Dim ext, nome_arquivo As String

On Error GoTo 1

'especifica os filtros que são mostrados na caixa de diálogo


CMdialog1.Filter = "Texto|*.txt|Desenho|*.bmp"

'especifica que a caixa de diálogo é para abrir arquivos


'se o botão cancelar é clicado, ocorre um erro
CMdialog1.Action = 1

'o nome do arquivo escolhido é colocado na variável nome_arquivo


nome_arquivo = CMdialog1.filename
lbl1.Caption = "O Arquivo escolhido foi: " + nome_arquivo

'se não foi clicado o botão <Cancelar>


ext = Mid$(nome_arquivo$, Len(nome_arquivo$) - 2, 3)
Select Case ext
Case "txt"
X = Shell("notepad " + nome_arquivo$, 1)
Case "bmp"
X = Shell("pbrush " + nome_arquivo$, 1)
Case Else
MsgBox "Deve ser escolhido um arquivo .txt ou .bmp!", , "Aviso"
End Select
Exit Sub
1:
If Err = 32755 Then
Exit Sub
Else
MsgBox "Algum erro ocorreu!", , "Aviso"
End If
Exit Sub

End Sub

Como podemos ver, Action foi definida em 1, o que significa que uma caixa de diálogo Abrir irá aparecer. A
propriedade Filter representa o filtro que será mostrado ao usuário, e é utilizada para selecionar o tipo de arquivo que
será visível na caixa. É formada pelo nome que informa o tipo do arquivo (Texto, Desenho), que é definido pelo
programador ; e pela extensão do arquivo (txt, bmp), que deve ser uma extensão válida (só serão mostrados os
arquivos que tiverem a mesma extensão). Observe que deve haver um traço vertical "|" entre cada um dos argumentos
da propriedade, como escrito no código transcrito a seguir: CMdialog1.Filter = "Texto|*.txt|Desenho|*.bmp".

39
2.2) Métodos ShowColor, ShowFont, ShowOpen, ShowSave e ShowPrinter
A propriedade Action se manteve no VB5 por questões de compatibilidade com as versões anteriores. Nos
códigos vistos acima, pode-se usar os novos métodos ShowColor, ShowFont, ShowOpen, ShowSave e
ShowPrinter, no lugar dessa propriedade. Esta seria, inclusive, a forma mais adequada de se escrever o código.

Após o usuário escolher o arquivo, a propriedade FileName informa qual o nome (incluindo o Path) do arquivo
escolhido. O que foi dito em relação à captura de erros do código do evento Click do botão BTNcor ocorre novamente.
A linha de código ext = Mid$(nome_arquivo, Len(nome_arquivo) - 2, 3) coloca na variável ext, a extensão do
arquivo (as últimas três letras do nome do arquivo). Isto é feito com a utilização de duas funções relacionadas a strings.

2.3) A Função Len


Essa função retorna o número de letras de um argumento String. Sua sintaxe é definida abaixo:

Len(strintg)

2.4) A Função Mid


Essa função retorna, de um argumento String (primeiro argumento), a partir de uma determinada posição
(definida pelo 2º argumento), um determinado número de letras (definida pelo 3º argumento). No nosso caso, o primeiro
argumento é a extensão e o nome do arquivo selecionado; o segundo argumento informa a posição (o tamanho da
string menos 2); e o terceiro argumento define que os três caracteres seguintes a essa posição, inclusive, serão
retornados.

2.5) O Comando Shell


Este comando inicia a execução de um outro aplicativo a partir do programa em VB. Ele tem dois argumentos:
o nome do programa (que deve ser uma String), e um número (que identifica como a janela deste aplicativo será
apresentada no monitor). Os valores possíveis são descritos a seguir:

0 Janela escondida com foco.


1 Janela com foco e tamanho e posição original.
2 Janela como ícone com foco.
3 Janela maximizada com foco.
4 Janela restaurada para o tamanho e posição anterior, sem o foco.
6 Janela como ícone sem foco.

Um aplicativo iniciado a partir do comando Shell do VB, será executado, e quando for terminado, devolve o
controle ao programa chamador.
Portanto, a parte do código referente ao Select, usa a extensão do arquivo para iniciar o aplicativo adequado
(Pbrush para um arquivo .bmp, e Notepad para um arquivo .txt)

OBS: A cada nova função vista, é interessante que verificar, através do help do VB, quais as funções que tratam
de assuntos correlatos. Isto é feito clicando-se na opção See Also do Help. Como exercício, verifique as
funções relacionadas com a função M id().

fig 4.13 - Help do VB

40
CAPITULO V

Neste capítulo serão vistos as ferramentas gráficas do VB. Veremos os controles gráficos, os métodos gráficos
e os controles de imagens.

1 - OS CONTROLES GRÁFICOS

Nesta primeira parte do programa serão vistos os controles que representam figuras geométricas. Estes
controles são o Shape Control e Line Control.

1.1) Shape Control


Shape é um controle gráfico que mostra um retângulo, um quadrado, um círculo, uma elipse, um retângulo
arredondado ou um quadrado arredondado.

Shape
Contro
fig 5.1 - o ícone do Shape Control

O que determina qual figura será desenhada é a propriedade Shape, conforme quadro abaixo:

(Default) Retângulo
1 Quadrado
2 Elipse
3 Círculo
4 Retângulo arredondado
5 Quadrado arredondado

A propriedade BorderWidth determina a espessura da linha de contorno da figura.

- Iniciar um projeto.

- Alterar as propriedades do formulário:


Name = FRMgrafic1
Caption = Controles Gráficos

- Salvar o projeto no diretório c:\aulavb\aula09\proj1:


formulário :grafic1.frm
projeto :grafic.vbp

- Inserir os controles conforme a figura 5.2 (os botões, a barra de rolagem horizontal, a caixa de checagem, e
os controles Shape e Line), alterando a propriedade Name de cada controle de acordo com o Caption.
Em relação a Barra de Rolagem, alterar as propriedades Max, Mim, SmallChange e LargeChange para 50, 1,
1 e 25, respectivamente.

1.2) Line Control


Line é um controle gráfico que mostra uma linha vertical, horizontal ou diagonal. O botão da caixa de
ferramentas é mostrado na figura 5.3.
Da mesma forma que no controle Shape, a propriedade BorderWidth determina a espessura da linha.

O objetivo deste programa é desenhar uma linha ou uma figura geométrica, conforme o botão pressionado. A
borda da figura será determinada pela barra de rolagem.
Não esqueça de nomear os botões adequadamente, conforme a padronização seguida no curso.

41
fig 5.2 - o primeiro formulário desse projeto

Line

fig 5.3 - o ícone do Line Control

- Inserir os seguintes códigos nos eventos apropriados dos controles:

Sub BTNlinha_Click ()
shape1.Visible = False
line1.Visible = True
End Sub

Sub BTNretangulo_Click ()
If CHKarredondado.Value Then
shape1.Shape = 4
Else
shape1.Shape = 0
End If
shape1.Visible = True
line1.Visible = False
End Sub
Sub BTNquadrado_Click ()
If CHKarredondado.Value Then
shape1.Shape = 5
Else
shape1.Shape = 1
End If
shape1.Visible = True
line1.Visible = False
End Sub

Sub BTNelipse_Click ()
shape1.Shape = 2
shape1.Visible = True
line1.Visible = False
End Sub

Sub BTNcirculo_Click ()
shape1.Shape = 3
shape1.Visible = True
line1.Visible = False
42
End Sub

Observe que os códigos acima alternam os controles Shape e Line, mantendo apenas um visível. Quando o
controle Shape estiver visível, a figura a ser mostrada depende do valor da propriedade Shape. Observe também que
os códigos dos eventos Sub BTNretangulo_Click () e Sub BTNquadrado_Click() verificam a propriedade Value do
CHKarredondado, mostrando uma figura arredondada ou não (retângulo ou quadrado).

Sub HSClargura_Change ()
line1.BorderWidth = HSClargura.Value
shape1.BorderWidth = HSClargura.Value
End Sub

Este código altera a espessura da figura, de acordo com o valor da propriedade Value da Barra de Rolagem.

1.3) O Controle SpinButton


Este contrloe incrementa e decrementa números. Clicar em um SpinButton altera somente o valor do próprio
SpinButton. Você pode escrever o código que utiliza o SpinButton para atualizar o valor exibido de outro controle. Por
exemplo, você pode utilizar um SpinButton para alterar o mês, dia ou ano mostrados em uma data. Pode também usá-
lo para se movimentar por um intervalo de valores ou lista de itens ou para alterar o valor exibido em uma caixa de
texto.
Para exibir um valor atualizado por um SpinButton, você deve atribuir o valor do SpinButton à parte exibida
de um controle, como a propriedade Caption de um Label ou a propriedade Text de um TextBox. Para criar um
SpinButton horizontal ou vertical, escolha o valor apropriado da propriedade Orientation.
A propriedade padrão de um SpinButton é a propriedade Value, e o evento padrão de um SpinButton é o
evento Change. No nosso projeto usaremos os eventos SpinDown e SpinUp, que ocorrem quando o usuário clica com
o mouse na seta inferior ou superior, respectivamente, de um controle Spin.

- Inserir quatro controles SpinButton no formulário, conforme a figura 5.2, e nomeá-los como spin1, spin2,
spin3 e spin4, do controle mais ao alto para baixo.

- Inserir oito labels, conforme a figura 5.2, e nomeá-los como LBLx1, LBLx2, LBLy1 e LBLy2, para os quatro
labels próximos aos controles Spin; e LBL1,LBL2, LBL3 e LBL4 para os outros. Nestes últimos, definir a propriedade
Caption com os valores X1, X2, Y1, e Y2, conforme a figura.

Spin
Button

fig 5.4 - o ícone do controle SpinButton

- Inserir as seguintes linhas de código:

Private Sub Spin1_SpinDown()


LBLx1.Caption = LBLx1.Caption - 10
Line1.x1 = LBLx1.Caption
End Sub

Private Sub Spin1_SpinUp()


LBLx1.Caption = LBLx1.Caption + 10
Line1.x1 = LBLx1.Caption
End Sub

Private Sub Spin2_SpinDown()


LBLx2.Caption = LBLx2.Caption - 10
Line1.x2 = LBLx2.Caption
End Sub

Private Sub Spin2_SpinUp()


LBLx2.Caption = LBLx2.Caption + 10
Line1.x2 = LBLx2.Caption
End Sub

Private Sub Spin3_SpinDown()


43
LBLy1.Caption = LBLy1.Caption - 10
Line1.y1 = LBLy1.Caption
End Sub

Private Sub Spin3_SpinUp()


LBLy1.Caption = LBLy1.Caption + 10
Line1.y1 = LBLy1.Caption
End Sub

Private Sub Spin4_SpinDown()


LBLy2.Caption = LBLy2.Caption - 10
Line1.y2 = LBLy2.Caption
End Sub
Private Sub Spin4_SpinUp()
LBLy2.Caption = LBLy2.Caption + 10
Line1.y2 = LBLy2.Caption
End Sub

Essas linhas de código definem as propriedades X1, X2, Y1 e Y2 do controle Line com o valor da propriedade
Value dos controles Spin respectivos.

2 - OS MÉTODOS GRÁFICOS

São semelhantes aos controles gráficos, porém são mais fáceis de usar em algumas situações. Enquanto os
controles gráficos podem ser manipulados em tempo de projeto (alterando suas propriedades na Janela de
Propriedades), os métodos gráficos só podem ser utilizados em tempo de execução.
Veremos os métodos Pset, Line e Circle, que desenham respectivamente pontos, linhas e círculos (ou arcos e
elipses).
O nosso programa ganhará um novo formulário, que mostrará o funcionamento dos métodos gráficos.
- Inserir um novo formulário no nosso projeto, através da opção de menu Project - Add Form. Nomear o novo
formulário como FRMgrafic2, e salvá-lo como Grafic2.frm, no diretório desse projeto.
O objetivo é desenhar aleatoriamente pontos, linhas e círculos no formulário, conforme o botão selecionado.
Será utilizado um Timer, que conterá o “coração” do código.
O funcionamento é o seguinte:
Serão declaradas variáveis a nível de formulário, conforme abaixo:

Option Explicit
Dim VRpontos, VRlinhas, VRcirculos As Integer

Essas variáveis terão seus valores mudados entre zero e um, conforme o botão pressionado. O código do
evento Timer1.timer verifica quais variáveis têm o valor 1, e desenha as figuras respectivas.
Inserir 6 botões de comando, um controle Timer e três Frames, posicionando-os e alterando as propriedades
Caption (quando for o caso) conforme a figura 5.5. Não esqueça de alterar a propriedade Interval do controle Timer
para 1.

44
fig 5.5 - o segundo formulário desse projeto

O botão com o Caption “Outro Formulário” servirá para alternar o formulário ativo, devendo ser colocado um
botão idêntico no formulário FRMgrafic1, que terá a mesma função.

- Inserir o seguinte código no evento Click deste botão:

Sub BTNoutro_click()
FRMgrafic1.Show
FRMgrafic2.Hide
End Sub

No evento Click() do botão semelhante do formulário FRMgrafic1, o código deve mostrar o segundo formulário
e esconder o primeiro.
- Inserir os seguintes códigos nos botões:

Sub BTNpontos_Click ()
If BTNpontos.Caption = "Para" Then
BTNpontos.Caption = "Desenha"
VRpontos = 0
Else
BTNpontos.Caption = "Para"
VRpontos = 1
End If
End Sub

Sub BTNlinhas_Click ()
If BTNlinhas.Caption = "Para" Then
BTNlinhas.Caption = "Desenha"
VRlinhas = 0
Else
BTNlinhas.Caption = "Para"
VRlinhas = 1
End If
End Sub

Sub BTNcirculos_Click ()
If BTNcirculos.Caption = "Para" Then
BTNcirculos.Caption = "Desenha"
VRcirculos = 0
Else
BTNcirculos.Caption = "Para"
VRcirculos = 1
End If
End Sub

Esses três eventos têm funcionamento semelhante, alterando o valor da propriedade Caption do botão
respectivo, de “Desenha “ para “Para” e vice e versa, e alterando o valor da variável respectiva entre 1 e 0.
Como já foi dito, e conforme veremos no evento Timer do controle Timer1, serão desenhadas as figuras cujas
variáveis respectivas tiverem o valor 1.

Sub BTNlimpa_pontos_Click ()
VRpontos = 0
VRlinhas = 0
VRcirculos = 0
FRMgrafic2.Cls
BTNpontos.Caption = "Desenha"
BTNlinhas.Caption = "Desenha"
BTNcirculos.Caption = "Desenha"
End Sub
Este evento atribui 0 às variáveis, desabilitando o desenho de todas, e altera o Caption dos botões, além de
limpar o formulário com o método Cls.

2.1) O Método Cls


Limpa texto e gráficos gerados em tempo de execução, de um Formulário ou de uma Picture Box.
Vamos agora verificar qual o código responsável pelo desenho, que está no evento Timer :

45
Sub Timer1_Timer ()
Dim vermelho, verde, azul
Dim X, Y, x1, x2, y1, y2
Dim contador As Integer

‘desenha os pontos
If VRpontos = 1 Then
vermelho = Rnd * 255
verde = Rnd * 255
azul = Rnd * 255

X = Rnd * FRMgrafic2.ScaleWidth
Y = Rnd * FRMgrafic2.ScaleHeight

FRMgrafic2.PSet (X, Y), RGB(vermelho, verde, azul)


End If

‘desenha as linhas
If VRlinhas = 1 Then
vermelho = Rnd * 255
verde = Rnd * 255
azul = Rnd * 255

x1 = Rnd * FRMgrafic2.ScaleWidth
y1 = Rnd * FRMgrafic2.ScaleHeight
x2 = Rnd * FRMgrafic2.ScaleWidth
y2 = Rnd * FRMgrafic2.ScaleHeight

FRMgrafic2.Line (x1, y1)-(x2, y2), RGB(vermelho, verde, azul)', BF


End If

‘desenha os círculos
If VRcirculos = 1 Then
vermelho = Rnd * 255
verde = Rnd * 255
azul = Rnd * 255

x1 = Rnd * FRMgrafic2.ScaleWidth
y1 = Rnd * FRMgrafic2.ScaleHeight

FRMgrafic2.Circle (x1, y1), 150, RGB(vermelho, verde, azul)', 0, 3


End If
End Sub

Este código é dividido em 4 partes: a declaração de variáveis locais, a parte que desenha os pontos, a parte
que desenha as linhas e a parte que desenha os círculos.
Observe que cada bloco de If verifica se a variável global adequada (VRpontos, VRlinhas ou VRcirculos) tem o
valor 1. Se tiver, as instruções do bloco são executadas, e as figuras são desenhadas; caso contrário, o bloco não é
executado.

2.2) A Função Rnd


Essa função retorna um valor Single aleatório, variando entre zero e um.

Dentro de cada bloco IF existe um conjunto de instruções comuns:


vermelho = Rnd * 255
verde = Rnd * 255
azul = Rnd * 255

Essas instruções atribuem a cada variável (vermelha, verde e azul) um valor que varia entre 0 e 255, pois
multiplica 255 pelo valor retornado pela função Rnd. Essas variáveis serão usadas, no código, como argumentos da
função RGB(), que será vista adiante.

2.3) A Função RGB


Retorna um inteiro Longo (Long) que representa uma cor no padrão RGB, que é o padrão usado no Windows.
Ela é composta de três parâmetros: Red, Green e Blue. Esses parâmetros representam os componentes de vermelho,
verde e azul, respectivamente, da cor retornada, e seus valores são inteiros.
46
Observe que após as instruções comuns, cada bloco de If inicializa as variáveis X e Y , ou X1, Y1, X2, Y2,
conforme o caso. A elas são atribuídos valores que variam de 0 até ao valor da largura do formulário (no caso de
variáveis X) ou de zero até o valor da altura do formulário (no caso dos Y). Isso é conseguido multiplicando-se o valor
retornado pela função Rnd (que varia entre 0 e 1) pelo valor da propriedade ScaleWidth (largura útil do formulário) ou
pelo valor da propriedade ScaleHeight (altura útil do formulário).
Tendo compreendido tudo o que foi visto até agora, veremos a parte do código que realmente desenha no
formulário.

2.4) O Método Pset


Desenha um ponto em um objeto, com uma cor específica. A sintaxe é a seguinte:

[object.]PSet [Step](x, y)[,color]

E suas partes são:

object Objeto no qual o ponto será desenhado.


Step Palavra chave que especifica que as coordenadas são relativas à posição corrente dada pelas
propriedades CurrentX e CurrentY.
x, y Valores Single que indicam as coordenadas horizontal e vertical do ponto
color Cor RGB especificada para o ponto.

A linha de código que desenha o ponto é a seguinte:

FRMgrafic2.PSet (X, Y), RGB(vermelho, verde, azul)

2.5) O Método Line


Desenha linhas ou retângulos em um objeto. A sintaxe é a seguinte:

[object.]Line [[Step](x1, y1)] - [Step](x2, y2) [,[color][,B[F]]]

E suas partes são:


object Objeto no qual a linha será desenhada.
Step Palavra chave que especifica que as coordenadas são relativas à posição corrente dada pelas
propriedades CurrentX e CurrentY.
x1, y1 Valores Single que indicam as coordenadas horizontal e vertical do ponto de início da linha (ou vértice
superior esquerdo do retângulo)..
Step Palavra chave que especifica que as coordenadas são relativas ao ponto inicial da linha.
x2, y2 Valores Single que indicam as coordenadas horizontal e vertical do ponto de final da linha (ou vértice
inferior direito do retângulo).
color Cor RGB especificada para a linha.
B Opção que determina o desenho de um retângulo.
F Se a opção B é usada, essa opção determina que o retângulo será preenchido pela mesma cor da
borda.

A instrução que desenha a linha é a seguinte:

FRMgrafic2.Line (x1, y1)-(x2, y2), RGB(vermelho, verde, azul)', BF

Observe que as opções B e F estão comentadas. Retire o comentário, e verifique o que ocorre ao executar o
programa.

2.6) O Método Circle


Desenha círculos, arcos ou elipses em um objeto. A sintaxe é a seguinte:

[object.]Circle [Step](x, y), radius[,[color] [,[start] [,[end] [,aspect] ] ] ]

E suas partes são:


object Objeto no qual o círculo será desenhado.
Step Palavra chave que especifica que as coordenadas são relativas à posição corrente dada pelas
propriedades CurrentX e CurrentY.
x, y Valores Single que indicam as coordenadas horizontal e vertical do centro do círculo (ou do arco ou
da elipse).
radius Valor Single que indica o raio da figura.
color Cor RGB especificada para a figura.
Start
47
End Valores Single que indicam o início e o final do arco. A faixa de valores vai de 0 Pi radianos até 2 Pi
radianos.
aspect Valor Single que indica se a figura será um círculo (valor 1.0) ou uma elipse (valor diferente).

A instrução que desenha o círculo é a seguinte:

FRMgrafic2.Circle (x1, y1), 150, RGB(vermelho, verde, azul)', 0, 3


Retire o comentário que antecede os números 0 e 3, e verifique o que ocorre ao executar o programa.

OBS: A propriedade DrawWidth do formulário determina qual espessura dos pontos, das linhas e dos círculos
desenhados pelos métodos Pset, Line e Circle, respectivamente. Experimente alterar o valor dessa
propriedade, em tempo de projeto, e veja como os pontos, linhas e círculos serão desenhados.

3 - OS CONTROLES DE IMAGEM

Veremos agora os controles que permitem que arquivos de imagens sejam armazenados. Else são A Picture
Box Control e a Image Control. Na terceira aula foi apresentado o controle Picture Box, e agora veremos mais
alguma coisa referente a esse controle, além do controle Image.

3.1) Picture Box Control


Como já visto, permite que uma imagem seja mostrada, bastando que o arquivo gráfico (.bmp, .wmf, .emf, .ico,
ou .dib) que contenha informações sobre a imagem seja atribuído à propriedade Picture.
Possui ainda a propriedade AutoSize, que determina que o controle se ajuste ao tamanho da figura por ele
mostrada.

3.2) Image Control


Controle que também permite que uma imagem seja mostrada. A propriedade Picture deve ser configurada da
mesma forma que no controle anterior.
Possui a propriedade Stretch, que dimensiona a figura de acordo com o tamanho do controle (o contrário da
propriedade AutoSize do controle Picture).

- Incluir um novo formulário no projeto:


Name = FRMgrafic3
Caption = Imagens

- Salvá-lo no diretório corrente, como grafic3.frm.

- Incluir 7 botões, 2 chek box, dois labels, um controle Picture e outro Image, e distribuí-los conforme a figura
5.6. Por enquanto não se preocupar com a imagem da lua. Os controles referentes a essa imagem serão incluídos mais
tarde.

- Nomear os controles de acordo com a convenção utilizada, não alterando os nomes da Picture e da Image.

- Incluir um CMdialog Control, configurando a propriedade Filter para BMP|*.bmp| ICO|*.ico.

- Escrever os seguintes códigos nos respectivos botões:

Sub BTNcarrega_picture_Click ()
CMdialog1.ShowOpen
picture1.Picture = LoadPicture(CMdialog1.Filename)
End Sub

Sub BTNcarrega_image_Click ()
CMdialog1.ShowOpen
image1.Picture = LoadPicture(CMdialog1.Filename)
End Sub

Os códigos acima acionam o controle CMdialog1, fazendo-o mostrar uma janela de diálogo para abrir arquivo
(método ShowOpen, já visto). O arquivo escolhido (CMdialog1.Filename) é atribuído à propriedade Picture, através da
função LoadPicture, já vista anteriormente.

- Inserir os códigos abaixo nos eventos click dos botões apropriados:

Sub BTNlimpa_picture_Click ()
48
picture1.Picture = LoadPicture("")
picture1.Height = 1575
picture1.Width = 1815
End Sub

Sub BTNlimpa_image_Click ()
image1.Picture = LoadPicture("")
image1.Height = 1575
image1.Width = 1815
End Sub

fig 5.6 - o terceiro formulário do projeto

Os códigos anteriores removem a figura do controle (1ª linha do código), a ajustam o tamanho do controle, para
o tamanho inicial (2ª e 3ª linhas).

- Inserir os códigos abaixo nos eventos click dos controles CheckBox:

Sub Check2_Click ()
picture1.AutoSize = check2.Value
End Sub

Sub Check1_Click ()
image1.Stretch = check1.Value
End Sub

Esses dois últimos códigos ajustam as propriedades AutoSize e Stretch, dos controles respectivos, tornando-
as True ou False, conforme a propriedade Check do controle CheckBox.

- Inserir no evento click do controle BTNoutro:


Sub BTNoutro_Click ()
FRMgrafic1.Show
FRMgrafic2.Hide
FRMgrafic3.Hide
End Sub

Ajuste os códigos dos eventos Click dos botões BTNoutro dos dois primeiros formulários, de forma similar ao
código descrito acima, permitindo que todos os formulários possam ser acionados em tempo de execução.

3.3) Vetor de Controles


Um vetor de controles é um conjunto de controles do mesmo tipo, todos com o mesmo valor para a
propriedade Name. Quando, em tempo de projeto, nomeamos dois controles com o mesmo nome, o VB nos pergunta
se desejamos criar um vetor com esses controles.
Para que o vetor possa existir, a propriedade Index dos controles envolvidos devem receber valores inteiros e
consecutivos.
49
- Inserir um novo controle Image no formulário, na posição em que aparece a lua na figura. Não altera a
propriedade Name ( Image2).

Com esse controle selecionado, copie para a área de transferência (Ctrl - C). Clique sobre o formulário, e cole
(Ctrl - V) o conteúdo da área de transferência. O VB perguntará se você deseja criar um vetor de controles com o
objeto Image2. Responda sim e vá colando novos controles Image2, até fazer um total de 9 elementos. Posicione-os,
de forma que os elementos fiquem um ao lado do outro, em ordem de valor da propriedade Index, à exceção do
primeiro (Index = 0), que deve ficar na posição em que aparece a lua na figura. Observe que a única diferença entre os
controles é o valor da propriedade Index.
A exceção do primeiro, altere a propriedade Visible para False de todos os controles. Atribua à propriedade
Picture do controle com Index = 1 o arquivo“c:\vb\icons\elements\moon01.ico”. Atribua os arquivos subsequentes para
os controles que se seguem, em ordem. Caso não encontre esses arquivos ou o diretório, use o pbrush para desenhar
as figuras.
A posição dos controles no formulário realmente não importa, já que eles ficarão invisíveis durante a execução.
Mas para um melhor efeito visual durante o projeto, aconselho colocá-los um ao lado do outro. Eles podem ser
colocados inclusive em uma parte do formulário que não é mostrada quando o programa for executado.

fig 5.7 - posicionamento dos controles Image2

- Inserir um controle Timer no formulário, atribuindo 100 para Interval.

- Escrever o seguinte código:

Option Explicit
Dim i As Integer

Sub Timer1_Timer ()
i=i+1
If i = 9 Then
i=1
End If
image2(0).Picture = image2(i).Picture
End Sub

Sub BTNlua_Click ()
If timer1.Enabled Then
timer1.Enabled = False
Else
timer1.Enabled = True
End If
End Sub

Ao pressionar o botão BTNlua, se o Timer1 estiver habilitado, ele é desabilitado, e vice-versa. Enquanto o
Timer1 estiver habilitado, o evento Timer1_Timer() ocorre de 100 em 100 milisegundos (conforme valor da propriedade
Interval).
A cada vez que o evento ocorrer, o valor da variável i é incrementado e depois verificado, de maneira que ele
nunca seja superior a 8. Desta forma, a propriedade Picture do controle Image2(0) recebe o valor da propriedade
Picture de cada um dos controles do vetor, em ordem, dando a impressão de movimento.

50
CAPÍTULO VI

1 - MANIPULANDO ARQUIVOS
Veremos agora como manipular arquivos, como utilizar a Área de Transferência do Windows e como tratar
os erros. Isto será feito ao desenvolvermos um programa semelhante ao Bloco de Notas do Windows.
Para isso, devemos abrir um novo projeto, nomear o formulário como FRMbloco, e salvá-lo como
c:\aulavb\aula07\proj1\bloco.frm. Salvar o projeto como c:\aulavb\aula05\proj2\bloco.vbp.
O programa terá a aparência da figura 5.6..
- Inserir um quadro texto, nomeando-o como TXTbloco.

1.1) O Evento de Formulário Resize


Este evento ocorre sempre que o formulário for redimensionado.
- Escrever o seguinte código no evento Resize e no evento Load do formulário:

TXTedicao.Height = FRMbloco.ScaleHeight
TXTedicao.Width = FRMbloco.ScaleWidth

Isto fará com que o controle de texto sempre tenha o tamanho da área útil do formulário.

fig 5.6 - Bloco de Notas

- Inserir um Menu com os seguintes itens de Menu:

Name Caption

MNParquivo &Arquivo
MNSnovo &Novo
MNSabrir &Salvar
MNSsep1 -
MNSsalvar &Salvar
MNSsalvarcomo Salvar &Como
MNSsep2 -
MNSsair Sai&r

- Inserir um Cmdialog, configurando as propriedades conforme abaixo:

Filter = Arquivo texto|*.txt


CancelError = True

- Escrever os seguintes códigos:

Option Explicit
Dim numero_arquivo, nome_arquivo

Sub MNSnovo_Click ()
TXTedicao.Text = ""
FRMbloco.Caption = "Bloco de Notas"
nome_arquivo = ""
TXTedicao.SetFocus
End Sub

51
Foram declaradas as variáveis, a nível de formulário, numero_arquivo e nome_arquivo. Essas variáveis são
utilizadas para abrir e referenciar um arquivo.
O código do evento MNSnovo_click limpa o conteúdo do TXTedição e da variável nome_arquivo.

Sub MNSabrir_Click ()
On Error GoTo cancelar1
CMdialog1.Action = 1
nome_arquivo = CMdialog1.Filename
numero_arquivo = FreeFile
Open nome_arquivo For Input As numero_arquivo
FRMbloco.Caption = "Bloco de Notas - " & nome_arquivo
TXTedicao.Text = Input(LOF(numero_arquivo), numero_arquivo)
Close numero_arquivo
TXTedicao.SetFocus
Exit Sub
cancelar1:
trata_erro
TXTedicao.Text = ""
Exit Sub
End Sub

O código do evento MNSabrir_click usa o Cmdialog1 para mostrar a janela de diálogo que permite selecionar
um arquivo para abertura (Action = 1).

1.2) A Função FreeFile


A Função FreeFile retorna um número válido para referenciar um arquivo. O VB pode tratar de vários arquivos
abertos simultaneamente, e cada arquivo é referenciado por um número. Essa função retorna o próximo nº livre para um
arquivo. Observe que no código acima, o valor retornado pela função é atribuído à variável número_arquivo, que é
usada no comando Open, como o último argumento.

1.3) O Comando Open


Esse comando abre um arquivo, habilitando leitura e escrita. Um arquivo pode ser aberto nos seguintes modos:
Append, Binary, Input, Output e Random. Os modos Append, Input e Output se referem a arquivos abertos no
modo sequencial, e definem se o arquivo será aberto para acréscimo, entrada ou saída, respectivamente. Binary abre
um arquivo em modo binário, e Random abre um arquivo para acesso aleatório.
A sintaxe básica desse comando é a seguinte:

Open <nome_arquivo> For <modo> As [#]<número_arquivo>

1.4) A Função Input


Essa função retorna caracteres lidos de um arquivo sequencial. Tem dois parâmetros: o nº de caracteres que
devem ser lidos, e o nº que referencia o arquivo. Obviamente o arquivo deve ser aberto antecipadamente pela função
Open.

1.5) A Função LOF


Essa função retorna o nº de bytes de um arquivo aberto. Possuí um parâmetro, que especifica o nº do arquivo
previamente aberto.

1.6) O método Close


Essa função fecha um arquivo previamente aberto pela função Open.

É possível agora entender o código do evento MNSabrir_Click (). O código usa a função Open para abrir o
arquivo escolhido pelo usuário, através do controle Cmdialog1 (variável nome_arquivo), no modo Input, com o
número retornado pela função FreeFile (variável numero_arquivo). Neste modo (Input), o arquivo é aberto para leitura.
Após abrir o arquivo, o conteúdo dele é copiado para a propriedade Text do controle TXTedição, sendo o
arquivo fechado logo em seguida, pela função Close.

- Incluir os seguintes códigos nos eventos click dos botões MNSsalvar e MNSsalvar_como:
Sub MNSsalvar_Click ()
On Error GoTo cancelar2
If nome_arquivo = "" Then
CMDialog1.Action = 1
nome_arquivo = CMDialog1.filename
numero_arquivo = FreeFile
End If

52
Open nome_arquivo For Output As numero_arquivo
FRMbloco.Caption = "Bloco de Notas - " & nome_arquivo
Print #numero_arquivo, TXTedicao.Text
Close numero_arquivo
TXTedicao.SetFocus
Exit Sub
cancelar2:
trata_erro
Exit Sub
End Sub

Sub MNSsalvarcomo_Click ()
On Error GoTo cancelar3
CMdialog1.Action = 2
nome_arquivo = CMdialog1.Filename
numero_arquivo = FreeFile
Open CMdialog1.Filename For Output As numero_arquivo
FRMbloco.Caption = "Bloco de Notas - " & nome_arquivo
Print #numero_arquivo, TXTedicao.Text
Close numero_arquivo
TXTedicao.SetFocus
Exit Sub
cancelar3:
Exit Sub
End Sub

1.7) O Método Print


Esse método copia o conteúdo de uma variável em um arquivo sequencial previamente aberto.
Tanto o código do evento MNSsalvar_click quanto o do evento MNSsalvarcomo_Click, abrem um arquivo
para gravação, usando Open no modo Output. A diferença é no evento MNSsalvarcomo_Click a variável
nome_arquivo tem seu valor alterado, através da chamada ao controle Cmdialog1, com Action = 2, enquanto que no
evento MNSsalvar_click o conteúdo dessa variável não foi alterado.
Ambos os eventos copiam o conteúdo do TXTedicao para o arquivo especificado, usando o método Print,
fechando o arquivo logo em seguida.
Pode ser notado que o nosso programa sempre trabalha com o arquivo fechado. Ele é aberto somente durante
a ocorrência dos eventos click de menu (que têm uma duração de milisegundos), e o seu conteúdo é copiado ou lido,
conforme o caso.

2 - ÁREA DE TRANSFERÊNCIA

2.1) O Objeto ClipBoard


Esse objeto é utilizado para manipular textos e gráficos na área de transferência. Permite a implementação das
ações Copiar, Colar e Recortar nos seus programas.

- Adicionar ao menu existente, os seguintes itens de menu:

Name Captions

MNPeditar Editar
MNScolar Colar
MNScopiar Copiar
MNSrecortar Recortar

- Inserir os seguintes códigos:

Sub MNScopiar_Click ()
clipboard.Clear
clipboard.SetText TXTedicao.SelText
TXTedicao.SetFocus
End Sub

Sub MNScolar_Click ()
On Error GoTo cancelar4
TXTedicao.SelText = clipboard.GetText()
53
TXTedicao.SetFocus
Exit Sub
cancelar4:
trata_erro
Exit Sub
End Sub

Sub MNSrecortar_Click ()
clipboard.Clear
clipboard.SetText TXTedicao.SelText
TXTedicao.SelText = ""
TXTedicao.SetFocus
End Sub

2.2) O Método Clear


Esse método limpa o conteúdo da área de transferência, quando chamado junto com a palavra chave
Clipboard.

2.3) O Método SetText


Coloca o conteúdo de uma variável String, que lhe é passada como argumento, na área de transferência.

2.4) O Método SetData


Coloca uma picture, que lhe é passada como argumento, na área de transferência, usando o formato grafico
específico. Possui outro argumento, que indica o formato da picture. Pode ter um dos seguintes valores:

Valor Descrição
2 Bitmap (.bmp files)
3 Metafile (.wmf files)
8 Device-independent bitmap (DIB)
9 Color palette

2.5) O Método GetText


Retorna o conteúdo da área de transferência, no formato texto.

2.6) O Método GetData


Retorna o conteúdo da área de transferência, em um formato gráfico. Opcionalmente pode especificar o
formato, usando os mesmos valores vistos no método SetData.

OSB: A utilização dos métodos SetData e GetData será vista oportunamente.

2.7) A Propriedade SelText


Essa propriedade identifica a string que está selecionada em um quadro texto.

Verificando os códigos dos eventos relacionados aos menus recém inseridos, será possível identificar a sintaxe
dos diversos métodos relacionados ao manuseio da Área de Transferência.

3 - MANIPULANDO ERROS
Observe que no eventos Colar, e em outros eventos anteriormente vistos, existe a chamada a um
procedimento não visto até agora, o procedimento trata_erro. O código desse procedimento é mostrado a seguir.

Sub trata_erro ()
Select Case Err
Case 52
MsgBox "Nome de arquivo inválido", , "Impossível salvar"
Case 32755
Exit Sub
Case 7
MsgBox "Erro de memória", , "Operação cancelada"
Case Else
MsgBox "Ocorreu algum erro!", , "Operação cancelada"
End Select
End Sub

54
3.1) On Error
Quando um erro de execução ocorre, o programa é encerrado, e uma mensagem do VB é enviada para a tela.
Para evitar que isso ocorra, e tratar o erro sem que o programa seja encerrado, deve ser usado a construção On Error.
Ela deve ser usada em conjunto com Goto, que especifica para qual linha o controle do programa deve ir, caso
seja detectado um erro de execução. Esse tratamento é restrito a um evento ou função. Portanto, cada procedimento
deve ter o seu On Error.
A linha a que se refere o Goto é especificada por um Label, e o programa continuará a ser executado
normalmente após essa linha.

3.2) A função Err


A cada erro em tempo de execução, está relacionado um número. A função Err retorna o número do último
erro ocorrido. Normalmente ela é utilizada em uma rotina de tratamento de erros, conforme a que foi vista acima.

OBS: Existe um número muito grande de erros em tempo de execução. Para verificar quais os erros possíveis, e
seus respectivos números, consulte o help, veja a função Err, e escoha os assuntos correlatos. Uma lista com
todos os códigos de erros pode ser visualizada.CAPÍTULO VI

Neste capítulo veremos como manipular arquivos de acesso randômico (registros). Criaremos uma aplicação
que permitirá a gravação, recuperação e alteração de diversos registros em um arquivo. Este capítulo complementa o
assunto iniciado no capítulo anterior, quando foi visto a manipulação de arquivos seqüenciais.

4 - MANIPULANDO ARQUIVOS DE REGISTROS


-Abrir um novo projeto, nomear o formulário como FRMagenda, e salvá-lo como agenda.frm. Salvar o projeto
como agenda.vbp.
A aparência final do programa, quando em execução, é a da figura 6.1:

LBLagend
a
fig 6.1 - manipulando registros

Esse programa cria e manipula arquivos, através de registros. O usuário pode escolher qual arquivo de agenda
será aberto para edição.

- Inserir quatro labels, nomeando-os da seguinte forma: LBLnome, LBLtelefone, LBLcomentarios e


LBLagenda. A propriedade Caption de cada label deve ser a que aparece na figura, a exceção do LBLagenda, que
deve ter essa propriedade vazia. Esse último label será usado para informar qual registro está sendo acessado (parte
inferior esquerda da figura).
Os Labels devem ser colocados conforme aparecem na figura.

- Inserir oito botões de comando, nomeando-os e configurando a propriedade Caption de cada um deles,
conforme a figura. Por exemplo: BTNnovo (Caption = &Novo).

- Inserir três quadro textos, dispondo-os conforme a figura, e nomeando-os de acordo com o label mais
próximo. Por exemplo: TXTnome próximo ao LBLnome.

55
4.1) A Declaração Type
Esta declaração permite a definição de um tipo de dado definido pelo usuário, composto de um ou mais
elementos.
O VB oferece os tipos de dados padrões (integer, string, boolean, etc), mas o programador pode definir
novos tipos, usando os tipos pré-definidos, ou outros também definidos.
A sintaxe da definição de tipos está mostrada abaixo:

- Inserir um módulo no projeto, salvando-o como agenda.bas, no diretório do projeto atual.


Um módulo é um objeto que contém código (funções e procedimentos) e declarações de tipos e variáveis, não
sendo possível a colocação de controles. Para inserir um módulo no projeto, deve-se selecionar a opção de menu
Project - Add Module.

- Escrever o seguinte código na seção de declarações do módulo:

Option Explicit
Type informação
nome As String * 40
fone As String * 20
comentários As String * 100
End Type

Esta declaração cria o tipo informação, que é composto pelos elementos nome, fone e comentários. A partir
de agora, é possível a declaração de uma variável como sendo do tipo informação, da mesma forma que se declara
uma variável do tipo integer. Por exemplo:

Dim x as informação

cria uma variável chamada x que é do tipo informação. Para se acessar os elementos dessa variável (nome, fone, e
comentários) usa-se um ponto (.) separando o nome da variável do identificador do elemento, por exemplo:

x.nome = "Alfredo"
x.fone = TXTfone.text

Esta declaração deve ser feita em um módulo.

- Escrever o seguinte código na seção de declarações do formulário:

Option Explicit
Dim pessoa As informação
Dim numero_arquivo As Integer
Dim tamanho_registro, corrente_registro, ultimo_registro As Long
Dim clicou_novo, clicou_cancelar, clicou_change, clicou_excluir As Integer
Dim nome_procurado As String

Observe que na segunda linha foi declarada uma variável (pessoa), como sendo do tipo informação.
As variáveis clicou_<alguma_coisa> serão usadas para controlar o funcionamento do programa, no que diz
respeito a habilitação dos botões de comando, como será visto mais adiante.

- Inserir o código a seguir, no evento Form_load():

Private Sub form_load()


FRMagenda.Show
nome_arquivo = InputBox("Digite o caminho e o nome do arquivo", "Selecione Arquivo de Agenda",
"c:/agenda.dat", 2300, 2500)
If nome_arquivo = "" Then
End
End If
tamanho_registro = Len(pessoa)
numero_arquivo = FreeFile
Open nome_arquivo For Random As numero_arquivo Len = tamanho_registro _
ultimo_registro = FileLen(nome_arquivo) / tamanho_registro
If ultimo_registro = 0 Then
BTNgravar.Enabled = False
BTNcancelar.Enabled = False
BTNexcluir.Enabled = False
BTNnovo.Enabled = True
BTNprocurar.Enabled = False
56
TXTnome.Enabled = False
TXTfone.Enabled = False
TXTendereco.Enabled = False
Else
BTNgravar.Enabled = False
BTNcancelar.Enabled = False
BTNexcluir.Enabled = True
BTNnovo.Enabled = True
BTNprocurar.Enabled = True
TXTnome.Enabled = True
TXTfone.Enabled = True
TXTendereco.Enabled = True
corrente_registro = 1
mostra_registro
End If
LBLagenda.Caption = "Registro " + Str(corrente_registro) + "/" + Str(ultimo_registro)
End Sub

Este código abre (ou cria) o arquivo digitado pelo usuário, na caixa inpubox mostrada ao iniciar o programa. O
que for digitado pelo usuário é retornado pela função inpubox para a variável nome_arquivo.

fig 6.2 - InputBox("Digite o caminho e o nome do arquivo",...

Observe que o comando Open abre o arquivo no modo Randon. O tamanho dos registros desse arquivo é
definido pelo último argumento (Len = tamano_registro). Verifique que o valor da variável tamanho_registro é o nº de
bytes da variável pessoa.
A variável ultimo_registro calcula quantos registros existem no arquivo recém aberto, dividindo o tamanho do
arquivo pelo tamanho de cada registro (4ª linha). Observe que conforme o valor apresentado por essa variável (se igual
ou diferente de zero), os botões e os quadros textos são habilitados e desabilitados. Por exemplo: não faz sentido deixar
os textos habilitados, ou os botões (a exceção do botão Novo), caso não haja registros no arquivo.
Observe que se houver pelo menos um registro no arquivo (caso ultimo_registro <>0), a variável
corrente_registro recebe o valor 1 (o arquivo sempre é aberto com o apontador no início). Logo em seguida é
chamado o procedimento de usuário mostra_registro, que deve ser escrito conforme abaixo, na seção general do
formulário (poderia ser escrito no módulo, usando a palavra public).

Sub mostra_registro ()
If ultimo_registro = 0 Then
Exit Sub
End If
Get #numero_arquivo, corrente_registro, pessoa
TXTnome.Text = pessoa.nome
TXTfone.Text = pessoa.fone
TXTcomentarios.Text = pessoa.comentarios
LBLagenda.Caption = "Registro " + Str(corrente_registro) + "/" + Str(ultimo_registro)
End Sub

4.2) O Procedimento Get


O procedimento get lê dados de um arquivo de acesso randômico, colocando o conteúdo de um registro em
uma variável. Ele recebe três parâmetros, a saber: o número do arquivo (definido no comando open); o número do
57
registro a ser lido (o primeiro registro é o número 1, o segundo o nº 2, e assim por diante); e a variável que receberá o
conteúdo do registro especificado. Essa variável deve ter o mesmo tamanho que o registro do arquivo.
O procedimento mostra_registro verifica se existe algum registro no arquivo, verificando a variável
ultimo_registro. Caso exista, o arquivo é lido (função Get()) na posição determinada pela variável corrente_registro, e
o valor é colocado na variável pessoa. Observe como as variáveis numero_arquivo, corrente_registro e pessoa são
passadas para o procedimento get.
Por fim, na última linha, o label LBLagenda informa qual o nº registro (variável corrente_registro) que está
sendo acessado, e quantos registros (variável ultimo_registro) existem no arquivo.

-Inserir no evento click do BTNnovo o seguinte código:

Sub BTNnovo_Click ()
LBLagenda.Caption = "Registro Novo"
ultimo_registro = ultimo_registro + 1
corrente_registro = ultimo_registro
BTNgravar.Enabled = True
BTNcancelar.Enabled = True
BTNexcluir.Enabled = False
BTNnovo.Enabled = False
BTNprocurar.Enabled = False
BTNproximo.Enabled = False
BTNanterior.Enabled = False
TXTnome.Text = ""
TXTfone.Text = ""
TXTcomentarios.Text = ""
TXTnome.Enabled = True
TXTfone.Enabled = True
TXTcomentarios.Enabled = True
TXTnome.ForeColor = &H0&
TXTnome.SetFocus
clicou_novo = True
End Sub

Neste evento, que ocorre quando o usuário quer inserir um registro novo, as variáveis ultimo_registro e
corrente_registro são incrementadas, e os botões e quadro textos são habilitados e desabilitados conforme a
necessidade. Observe que a variável clicou_novo recebe o valor True. Isto é feito porque, como veremos adiante, os
eventos change dos quadro textos contém um código que também atualiza os botões, e nós não queremos que esse
código seja executado quando a mudança nos textos tenha ocorrido devido o pressionamento do botão novo.
Observe também que a cor dos textos (propriedade ForeColor) muda de vermelho para preto (&H0&), o que
significa que os dados que aparecem nos textos não foram gravados ainda.

- Inserir no evento click do controle BTNgravar o seguinte código:

Sub BTNgravar_Click ()
If TXTnome.Text = "" Then
MsgBox "É necessário preencher o nome!", , "Impossível Gravar"
Exit Sub
End If
BTNgravar.Enabled = False
BTNcancelar.Enabled = False
BTNexcluir.Enabled = True
BTNnovo.Enabled = True
BTNprocurar.Enabled = True
BTNproximo.Enabled = True
BTNanterior.Enabled = True
pessoa.nome = TXTnome.Text
pessoa.fone = TXTfone.Text
pessoa.comentarios = TXTcomentarios.Text
TXTnome.ForeColor = &HFF&
TXTfone.ForeColor = &HFF&
TXTcomentarios.ForeColor = &HFF&
Put #numero_arquivo, corrente_registro, pessoa
TXTnome.SetFocus
LBLagenda.Caption = "Registro " + Str(corrente_registro) + "/" + Str(ultimo_registro)
clicou_novo = False
End Sub

58
4.3) O Procedimento Put
Esse procedimento grava para um arquivo em disco o conteúdo de uma variável. Ele é o oposto do comando
Get, visto anteriormente. Também recebe três argumentos, na mesma ordem que no comando anterior (nº do arquivo,
nº do registro, variável). A sintaxe deve ser estudada nas linhas abaixo, que explicam o código do evento Sub
BTNgravar_Click ().

Este evento ocorre quando o usuário deseja gravar um registro novo, ou uma alteração em algum registro
existente. Caso o nome não tenha sido preenchido, a gravação não é feita (as primeiras quatro linhas).
Verifique que ele também habilita e desabilita os botões, torna os textos dos quadros textos vermelhos
(propriedade ForeColor = &HFF&), e usa o comando put para gravar no arquivo (referenciado pela variável
numero_arquivo), na posição determinada pela variável corrente_registro, o conteúdo da variável pessoa. Note que
antes da chamada a esse comando (put), a variável pessoa teve os seus diversos elementos atualizados pelos valores
dos quadros textos (linhas 12, 13 e 14).
Observe que a variável clicou_novo recebe o valor False ao final do evento, só tornando a ficar True caso o
botão Novo seja novamente pressionado. Isto ocorre porque durante esse evento, serão chamados os eventos change
dos quadros textos, e os códigos nesses eventos verificam o valor dessa variável para tomar decisões.

- inserir nos eventos change dos quadros textos os seguintes códigos:

Private Sub TXTnome_Change()


If clicou_excluir Or clicou_cancelar Then
Exit Sub
End If
If TXTnome.Text <> pessoa.nome Then
clicou_change = True
TXTnome.ForeColor = &H0&
TXTendereco.ForeColor = &H0&
TXTfone.ForeColor = &H0&
BTNgravar.Enabled = True
BTNcancelar.Enabled = True
BTNexcluir.Enabled = False
BTNnovo.Enabled = False
BTNprocurar.Enabled = False
BTNproximo.Enabled = False
BTNanterior.Enabled = False
End If
End Sub

Private Sub TXTfone_Change()


If clicou_excluir Or clicou_cancelar Then
Exit Sub
End If
If TXTfone.Text <> pessoa.fone Then
clicou_change = True
TXTnome.ForeColor = &H0&
TXTendereco.ForeColor = &H0&
TXTfone.ForeColor = &H0&
BTNgravar.Enabled = True
BTNcancelar.Enabled = True
BTNexcluir.Enabled = False
BTNnovo.Enabled = False
BTNprocurar.Enabled = False
BTNproximo.Enabled = False
BTNanterior.Enabled = False
End If
End Sub

Private Sub TXTendereco_Change()


If clicou_excluir Or clicou_cancelar Then
Exit Sub
End If
If TXTendereco.Text <> pessoa.comentarios Then
clicou_change = True
TXTnome.ForeColor = &H0&
TXTendereco.ForeColor = &H0&
TXTfone.ForeColor = &H0&
BTNgravar.Enabled = True
59
BTNcancelar.Enabled = True
BTNexcluir.Enabled = False
BTNnovo.Enabled = False
BTNprocurar.Enabled = False
BTNproximo.Enabled = False
BTNanterior.Enabled = False
End If
End Sub

Veja que a única diferença entre esses códigos está na 5ª linha. Em todos eles, é feita uma comparação entre
o conteúdo do quadro texto em questão com o conteúdo do elemento respectivo da variável pessoa. Se esses
conteúdos forem diferentes, a cor dos textos muda para preto, e os botões são habilitados/desabilitados de forma que
fique claro que houve uma alteração no registro, e que essa alteração pode ser gravada ou cancelada (os botões gravar
e cancelar ficam habilitados, e os demais não).
Esse evento ocorre nas seguintes ocasiões:

1) sempre que o usuário digitar algo nos quadros;


2) quando clicar o botão Novo, pois nesse evento os quadros têm seus textos alterados para "", o que invoca o
evento change;
3) quando clicar o botão Excluir, pois nesse evento os quadros também têm seus textos alterados, como
veremos adiante;
4) quando clicar o botão Cancelar, pois nesse evento os quadros também têm seus textos alterados, como
veremos adiante.

Deve ficar claro que, nos casos de exclusão e cancelamento, não estamos alterando o conteúdo de um registro
em particular, como nos outros casos. Por isso o if inicial que verifica se as variáveis clicou-excluir ou clicou_cancelar
estão com valor true.

A variável clicou_change recebe o valor True no final do evento, pois é verificada no código do evento click
do botão BTNcancelar.

- Inserir no evento click do controle BTNcancelar:

Private Sub BTNcancelar_Click()


clicou_cancelar = True
TXTnome.ForeColor = &HFF&
TXTfone.ForeColor = &HFF&
TXTendereco.ForeColor = &HFF&
If clicou_novo Then
ultimo_registro = ultimo_registro - 1
corrente_registro = ultimo_registro
End If
If clicou_novo And ultimo_registro = 0 Then
BTNgravar.Enabled = False
BTNcancelar.Enabled = False
BTNexcluir.Enabled = False
BTNnovo.Enabled = True
BTNprocurar.Enabled = True
BTNproximo.Enabled = True
BTNanterior.Enabled = True
TXTnome.Text = ""
TXTfone.Text = ""
TXTendereco.Text = ""
TXTnome.Enabled = False
TXTfone.Enabled = False
TXTendereco.Enabled = False
LBLagenda.Caption = "Registro " + Str(corrente_registro) + "/" + Str(ultimo_registro)
ElseIf clicou_change And ultimo_registro <> 0 Then
BTNgravar.Enabled = False
BTNcancelar.Enabled = False
BTNexcluir.Enabled = True
BTNnovo.Enabled = True
BTNprocurar.Enabled = True
BTNproximo.Enabled = True
BTNanterior.Enabled = True
TXTnome.Enabled = True
TXTfone.Enabled = True

60
TXTendereco.Enabled = True
mostra_registro
TXTnome.SetFocus
End If
clicou_novo = False
clicou_change = False
clicou_cancelar = False
End Sub

Este evento ocorre quando o usuário deseja cancelar a inclusão de um registro novo ou a alteração do registro
corrente. Aparece a variável clicou_change, que é True caso o usuário tenha digitado texto do registro corrente
(conforme foi visto nos eventos change dos quadro textos). Observe que os If’s do código verificam as variáveis
clicou_... , para habilitar/desabilitar os botões, mostrar ou não um registro, e apresentar o número do registro corrente e
o número de registros.
Não deixe de entender porque as variáveis clicou_... recebem False ao final do evento.

- Inserir o seguinte código no evento click do controle BTNexcluir:

Private Sub BTNexcluir_Click()


Dim tmp_numero_arquivo
Dim tmp_corrente_registro, recnum As Long
Dim tmp_pessoa As informação

clicou_excluir = True
tmp_numero_arquivo = FreeFile
Open "c:\agenda.tmp" For Random As tmp_numero_arquivo Len = tamanho_registro
tmp_corrente_registro = 1
recnum = 1
Do While recnum < ultimo_registro + 1
If recnum <> corrente_registro Then
Get #numero_arquivo, recnum, tmp_pessoa
Put #tmp_numero_arquivo, tmp_corrente_registro, tmp_pessoa
tmp_corrente_registro = tmp_corrente_registro + 1
End If
recnum = recnum + 1
Loop
Close numero_arquivo
Kill nome_arquivo
Close tmp_numero_arquivo
Name "c:\agenda.tmp" As nome_arquivo
Open nome_arquivo For Random As numero_arquivo Len = tamanho_registro

ultimo_registro = FileLen(nome_arquivo) / tamanho_registro


If ultimo_registro = 0 Then
BTNgravar.Enabled = False
BTNcancelar.Enabled = False
BTNexcluir.Enabled = False
BTNnovo.Enabled = True
BTNprocurar.Enabled = False
TXTnome.Text = ""
TXTfone.Text = ""
TXTendereco.Text = ""
TXTnome.Enabled = False
TXTfone.Enabled = False
TXTendereco.Enabled = False
corrente_registro = 0
Else
BTNgravar.Enabled = False
BTNcancelar.Enabled = False
BTNexcluir.Enabled = True
BTNnovo.Enabled = True
BTNprocurar.Enabled = True
TXTnome.Enabled = True
TXTfone.Enabled = True
TXTendereco.Enabled = True
corrente_registro = 1
mostra_registro

61
End If
LBLagenda.Caption = "Registro " + Str(corrente_registro) + "/" + Str(ultimo_registro)
clicou_excluir = False
End Sub

Este evento ocorre quando o usuário que deletar algum registro. Observe as variáveis locais que são criadas
no início do evento; elas servirão para a gravação de um arquivo, que receberá todos os registros do arquivo em uso,
menos o registro corrente (o que se quer deletar).
O arquivo com a extensão tmp é criado para acesso randômico, com o tamanho do registro igual ao do arquivo
em uso. Após sua criação, o loop while faz com que os registros do arquivo original sejam lidos, um a um, para a
variável tmp_pessoa, que por sua vez tem seu conteúdo gravado no arquivo .tmp, a exceção do registro corrente.
Temos então dois arquivos, sendo que o .tmp é uma réplica do original, menos o registro corrrente.
Em seguida, o arquivo original é fechado, sendo deletado pelo procedimento Kill.

4.4) O Procedimento Kill


Este procedimento apaga um arquivo em disco. O arquivo deve estar fechado para que posa ser deletado. A
sintaxe é a seguinte:
Kill <nome_do_arquivo>

4.5) O Procedimento Name ... as ...


Este procedimento renomeia um arquivo em disco. O arquivo deve estar fechado para que posa ser
renomeado. A sintaxe é a seguinte:
Name <nome_do_arquivo> as <nome_novo>

O arquivo .tmp é então fechado, e renomeado para o nome do arquivo original. Note portanto, que a exclusão
de um registro significa na verdade acessar um outro arquivo com o mesmo nome, com todos os registros do arquivo
original, mas sem o registro que foi excluído.
- Inserir o código a seguir no evento click do controle BTNprocurar:

Private Sub BTNprocurar_Click()


Dim achou As Integer
Dim aux_corrente_registro As Long
Dim aux_pessoa As informação
nome_procurado = InputBox("Digite o nome: ", "Procurar" ) 'figura 6.3
If nome_procurado = "" Then
Exit Sub
End If
achou = False
For aux_corrente_registro = 1 To ultimo_registro
Get #numero_arquivo, aux_corrente_registro, aux_pessoa
If UCase(nome_procurado) = UCase(Trim(aux_pessoa.nome)) Then
achou = True
Exit For
End If
Next
If achou Then
corrente_registro = aux_corrente_registro
mostra_registro
Else
MsgBox "Nome não encontrado!", , "Aviso!"
End If
End Sub

Este código proporciona ao usuário procurar por um registro, fornecendo o nome cadastrado. Uma InputBox
retorna o nome procurado pelo usuário.

62
fig 6.3 - procurando um registro

Dentro do loop for, o arquivo é lido (até o fim) para a variável aux_pessoa, que tem seu conteúdo comparado
com o nome digitado pelo usuário na InputBox. Se o conteúdo for igual, o loop é interrompido, caso contrário ele segue.
Ao final, de acordo com o resultado da busca, o registro procurado é mostrado, ou é enviada uma MsgBox informando
que o nome não foi encontrado.
Ele usa duas novas funções, que serão explicadas adiante.

4.6) As Funções UCase e LCase


A função UCase recebe um argumento string e retorna uma cópia dessa string, porém com todos os
caracteres alfabéticos em maiúsculos. Ela é usada no evento para garantir que um nome seja encontrado, independente
de como o usuário o digite (maiúsculo ou minúsculo).
A função Lcase funciona de forma semelhante, porém retorna os caracteres em minúsculo.

4.7) As Funções Trim, LTrim e RTrim


A função Trim também recebe um argumento string e retorna uma cópia dessa string, só que com os
espaços em branco do início e do final, que porventura existam, removidos. É usada com finalidade semelhante a da
função anterior.
As funções LTrim e RTrim removem os espaços em branco do início e do final de uma string,
respectivamente.

- Inserir nos eventos click dos botões Próximo e Anterior, os seguintes códigos:

Sub BTNproximo_Click ()
If corrente_registro < ultimo_registro Then
corrente_registro = corrente_registro + 1
mostra_registro
Else
MsgBox "Este é o último registro", , "Aviso!"
End If
End Sub

Sub BTNanterior_Click ()
If corrente_registro > 1 Then
corrente_registro = corrente_registro - 1
mostra_registro
Else
MsgBox "Este é o primeiro registro", , "Aviso!"
End If
End Sub

- Estes eventos mostram o próximo registro ou o registro anterior, conforme o caso. Os códigos são muito
parecidos, e fazem uso da rotina mostra_registro, tendo antes incrementado ou decrementado a variável
corrente_registro.
Para finalizar o nosso projeto, vamos incluir um menu com os seguintes ítens:

Name Caption

MNParquivo &Arquivo
MNSabrir &Abrir

63
sep -
MNSsair Sai&r
MNPajuda &?
MNSsobre &Sobre

No evento click do item Abrir, colocar uma chamada ao evento Form_load, da seguinte maneira:

Private Sub MNSabrir_Click()


form_load
End Sub

Isso permitirá que o usuário possa escolher um outro arquivo de agenda, mesmo com o programa em
execução. No evento click do item Sair, obviamente colocar o comando End.
No evento click do item Sobre, inserir a seguinte linha de código:

FRMsobre.Show 1

Este formulário ainda não existe. Portanto, devemos adicionar um novo formulário ao projeto (item de menu
Project - Add Form), atribuir para a propriedade Name o valor FRMsobre, e salvá-lo no diretório do projeto, com o
nome de sobre.frm.
É possível agora criarmos uma janela de informações sobre o programa, que será mostrada ao usuário sempre
que ele escolha essa opção de menu. Para obter idéias de como essa janela deve ser, selecione os itens de menu
Sobre dos diversos programas for Windows existentes.
Não esqueça de colocar um botão de comando OK nesse formulário, com uma instrução para que ele seja
descarregado, senão o usuário não tem como voltar ao programa, já que o formulário está sendo mostrado na forma
modal ( argumento 1 para o método Show).

64
CAPÍTULO VII
Neste capítulo veremos como manipular banco de dados utilizando um controle do VB, O Data Control. O
programa criado no capítulo anterior será revisto, e o arquivo de registro criado será no formato .mdb, que é o tipo de
arquivo manipulado pelo Access.

1 - Definições Gerais de Banco de Dados

1.1) Definições Gerais de Banco de Dados


Um banco de dados é formado por um conjunto de tabelas, que por sua vez são formadas por um conjunto de
registros, estes últimos contendo campos.
Uma tabela representa um conjunto de objetos do mundo real. É utilizada para armazenar informações sobrte
vários elementos de um mesmo conjunto. Como exemplo de objetos podemos ter os funcionários de uma empresa, os
livros de uma biblioteca, os fornecedores de uma loja, etc. Teríamos, portanto, a tabela funcionários, a tabela livros e a
tabela fornecedores, para representar cada um dos objetos citados anteriormente.
Cada elemento desses conjuntos (um funcionário, um livro ou um fornecedor) será um registro da tabela
respectiva. Na tabela funcionários, por exeplo, seria possível termos um registro referente ao funcionário João.
Obviamente, cada elemento possui atributos que o diferenciam dos demais elementos do mesmo conjunto de
objetos. Esses atributos são os campos das tabelas. Por exemplo, os funcionários de uma empresa têm os seguintes
atributos: nome, endereço, telefone, identidade, etc. Quando for criada a tabela que representar esse conjunto, ela
deverá ser organizada com os campos nome, endereço, telefone, identidade, e assim por diante.
Podemos imaginar uma tabela como sendo composta de linhas e colunas, as linhas representando os
registros, e as colunas os campos, como no exemplo abaixo.

TABELA FUNCIONÁRIOS
IDENTIDADE NOME ENDEREÇO TELEFONE
002233 João
023132 Maria

Observe que o campo identidade foi colocado à esquerda. Isto foi proposital, pois ele é chamado de campo
chave. Um campo chave é um campo que identifica univocamente um registro. No caso em questão, podemos ter
vários registros com o valor João no campo nome, e mais de um registro com o mesmo valor no campo endereço, por
exemplo, mas só pode existir um registro com o valor 002233 no campo identidade. Em outras palavras, um campo
chave sempre terá valores diferentes para registros diferentes.

1.2) Banco de Dados MDB


Um Banco de Dados no formato MDB (Microsoft Data Base) é um arquivo .mdb que pode conter várias
tabelas de dados, e que é reconhecido pelo programa Access, da Microsoft.
Na verdade, quando se quer criar uma ou mais tabelas de dados, é necessário a utilização de um programa
como o Access. Existem vários programas que permitem a criação e manipulação de tabelas de dados, cada um
gerando um arquivo em um determinado formato.

2 - O Data Control
O Data Control é um controle do VB que proporciona acesso aos dados armazenados em um arquivo de
banco de dados. O ícone na Caixa de Ferramentas é o seguinte:

Ele permite a movimentação pelos registros e que cada registro seja mostrado em um bound control.
Daremos início ao projeto, executando as ações discriminadas abaixo.

fig 7.1 - ícone do Data Control

-Abrir um novo projeto, nomear o formulário como FRMagenda, e salvá-lo como


c:\aulavb\aula07\proj1\agenda.frm. Salvar o projeto como \aulavb\aula07\proj1\agenda.vbp.

- Inserir um Data Control no formulário, conforme a figura 7.2.

65
fig 7.2 - Agenda telefônica usando o Data Control

- Inserir quatro labels, nomeando-os da seguinte forma: LBLnome, LBLtelefone, LBLcomentarios e


LBLfoto. A propriedade Caption de cada label deve ser a que aparece na figura.
Os Labels devem ser colocados conforme aparecem na figura.

- Inserir oito botões de comando, nomeando-os e configurando a propriedade Caption de cada um deles,
conforme a figura. Por exemplo: BTNnovo (Caption = &Novo).

- Inserir três quadro textos, dispondo-os conforme a figura, e nomeando-os de acordo com o label mais
próximo. Por exemplo: TXTnome próximo ao LBLnome.

- Inserir uma caixa de diálogos. Este controle será usado para permitir a escolha de um arquivo de figura, que
será mostrada no controle de imagem.

- Inserir um controle de Imagem, conforme mostra a figura. Este controle será usado para mostrar uma figura,
que será armazenada no nosso arquivo de banco de dados.

2.1) A propriedade Connect


Como foi dito anteriormente, existem vários formatos de banco de dados, sendo que o Data Control se
conecta com os seguintes: access, dbase, excel, lotus, texto, paradox e foxpro. A definição de qual formato será
utilizado é feita configurando-se a propriedade Connect do controle de dados.

2.2) A propriedade DataBase


Essa propriedade seleciona o nome e a localização da origem dos dados para o Data Control. Em outras
palavras, nesta propriedade deve ser especificado o path e o nome do arquivo que será conectado ao controle.

2.3) A propriedade RecordSource


Como foi dito anteriormente, um arquivo de banco de dados pode conter várias tabelas. Enquanto que a propriedade
DataBase especifica o arquivo, RecordSource define a origem dos registros. A origem pode ser uma tabela ou uma
instrução em SQL. Se o valor dessa propriedade for mudado em tempo de execução, deve ser usado o método Refresh
sobre o data control, para habilitar a mudança.

66
fig 7.3 - definindo a propriedade conect do Data Control

Para o nosso projeto utilizaremos um arquivo chamado agenda.mdb, que será composto de uma tabela chamada
agenda, composta dos seguintes campos: nome (text - 20), telefone (text - 15), comentários (memo) e foto (binary). O
campo foto é do tipo Binary, porque esse tipo permite o armazenamento de imagens.
A criação desse arquivo foge ao escopo deste trabalho, mas pode ser feita no Access ou no Visula Data
Manager.
O Visual Data Manager é um utilitário que vem com o pacote do VB, e que permite a criação e a manipulação
de banco de dados. Para iniciar esse programa, usa-se o item de menu Add-Ins - Visual Data Manager.

fig 7.4 - Executando o Visual Data Manager

Para associarmos o controle Data Control à tabela Agenda do banco de dados Agenda.mdb, após ele ter sido
criado, devemos configurar as propriedades DatabaseName e RecordSource como segue:

- DatabaseName = C:\aulavb\aula07\proj1\agenda.mdb
- RecordSource = Agenda

2.4) A propriedade Recordset


Quando a origem dos registros é definida pelas propriedades DataBase e RecordSource, o Data Control, ao
ser carregado juntamente com o formulário que o contém, cria um conjunto de dados (objeto) chamado Recordsert,
que pode ser acessado, em tempo de execução, pela propriedade Recordset. É essa propriedade que permite que o
conjunto de dados seja acessado. Portanto, como veremos adiante, qualquer movimentação pelos registros, adição,
deleção, deve ser feita com referência a essa propriedade.

2.5) A propriedade RecordsetType


A propriedade RecordsetType define qual o tipo do Recordset criado, que pode ser Dynaset, Table ou
Snapshot. Neste projeto, usaremos a propriedade com o valor Dynaset, e no próximo capítulo explicaremos a
diferença entre esses tipos.
A partir de agora, temos que acessar cada campo dessa tabela, para que possamos acessar os seus registros.

3 - Bound control
Um bound control é um controle comum do VB, que pode ser conectado a um controle Data Control, desde
que esse controle esteja no mesmo formulário. Sem um Data Control, não é possível fazer com que um controle
funcione como um bound control em um formulário.
Veremos mais adiante, quais são os controles que podem funcionar como um bound control, e como fazer
para conectá-los ao data control.

3.1) As propriedades DataSource e DataField


Todos os controles que podem funcionar como bound controls possuem essas duas propriedades. Elas
providenciam a ligação ao controle Data e ao campo específico, respectivamente.
67
Nos controles textos e imagem do nosso formulário, alterar a propriedade DataSource da seguinte forma:

DataSource = Data1 (é o valor da propriedade Name do Data Control do nosso formulário)

fig 7.5 - as propriedades DataSource e DataField

Para cada controle texto e para o controle imagem, colocar na propriedade DataField os nomes dos campos,
em tempo de projeto, da seguinte forma:

TXTnome.DataField = Nome
TXTtelefone.DataField = fone
TXTcomentarios.DataField = comentarios
TXTfoto.DataField = foto

- Utilizando o Data Manager, inserir dois registros no nosso banco de dados.

- Inserir o seguinte código no nosso projeto:

Sub Form_Load ()
BTNcancelar.Enabled = False
BTNgravar.Enabled = False
frmagenda.Show
End Sub

Sub Form_Activate ()
If Data1.Recordset.RecordCount = 0 Then
TXTnome.Enabled = False
txtfone.Enabled = False
txtcomentarios.Enabled = False
BTNgravar.Enabled = False
End If
LBLagenda.Caption = Data1.Recordset.RecordCount
End Sub

4 - Objeto Recordset
Como foi dito anteriormente, esse objeto é gerado quando o formulário que contem um controle de dados é
carregado. Serão vistas adiante, algumas das características mais importantes desse objeto.

4.1) A propriedade RecordCount


Retorna o número de registros acessados em um objeto Recordset ou o número total de registros em um
objeto Recordset tipo table. Ela não indica quantos registros estão contidos em um objeto Recordset tipo dynaset,
snapshot ou forward only, até que todos os registros tenham sido acessados.
O código descrito acima habilita os textos do formulário, assim que ele é carregado, somente se houver algum
registro.

- Executar o programa. Podemos observar que apesar de não termos escrito praticamente nenhuma linha de
código, já é possível visualizar e alterar os registros da nosso tabela, bastando escrever nos controles de texto e clicar
nas setas do controle Data1.

- Inserir os seguintes códigos:

68
Sub BTNnovo_Click ()
If Data1.Recordset.RecordCount <> 0 Then
corrente_registro = Data1.Recordset.Bookmark
End If
Data1.Recordset.AddNew
TXTnome.Enabled = True
txtfone.Enabled = True
txtcomentarios.Enabled = True

Data1.Enabled = False

BTNnovo.Enabled = False
BTNgravar.Enabled = True
BTNcancelar.Enabled = True
BTNexcluir.Enabled = False

TXTnome.SetFocus
End Sub

4.2) O Método AddNew


Limpa o buffer do arquivo para a criação de um novo registro em um Recordset.
Observe que o código do evento click do botão BTNnovo usa o método AddNew e habilita os textos e a
imagem, para que possam ser preenchidos pelo usuário. Também habilitam e desabilitam os botões, conforme o caso.

Sub BTNgravar_Click ()
If TXTnome.Text = "" Then
MsgBox "É necessário preencher o nome!", , "Impossível gravar"
TXTnome.SetFocus
Exit Sub
End If
Data1.Enabled = True
Data1.Recordset.Update
BTNnovo.Enabled = True
BTNgravar.Enabled = False
BTNcancelar.Enabled = False
BTNexcluir.Enabled = True
Data1.Recordset.Bookmark = Data1.Recordset.LastModified
LBLagenda.Caption = Data1.Recordset.RecordCount
End Sub

4.3) O Método Edit


Abre o registro corrente do Recordset especificado para edição, copiando o conteúdo para o buffer de arquivo.

recordset.Edit

Após a sua utilização, deve ser empregado o método Update, para que o conteúdo do buffer seja salvo no
registo.

4.4) O Método Update


Esse método é usado para salvar qualquer mudança em um registro, após a utilização dos métodos AddNew
ou Edit. Ele grava o conteúdo do buffer do arquivo, no registro corrente.

4.5) A Propriedade Bookmark


Determina qual o registro do Recordset é o registro corrente. Só é avaliado em tempo de execução.

recordset.Bookmark [ = variavel ]

Quando um Recordset é criado ou aberto, cada registro tem um único e inequívoco Bookmark. É possível
salvar o Bookmark do registro corrente atribuindo esse valor a uma variável do tipo variant. Para retornar rapidamente
a esse registro, após ter havido movimentação pelos registros, basta atribuir à propriedade Bookmark do Recordset o
valor dessa variável.

69
4.6) A Propriedade LastModify
Essa propriedade contem o Bookmark do registro mais recentemente modificado. Só é avaliada em tempo de
execução.

Recordset.Bookmark = Recordset.LastModified

Pode ser usada para fazer com que o registro mais recentemente modificado passe a ser o registro corrente.

4.7) O Método Delete


Este método exclui o registro atual em um objeto Recordset atualizável. Após esse método ser executado, é
necessário mover o apontador de arquivo para um registro válido, pois o registro excluído deixa de existir. No projeto
atual, é usado o método MoveFirst, que move o apontador para o primeiro registro do Recordset. Esse e os outros
métodos associados à movimentação e à procura de registros serão vistos no capítulo seguinte.
Insira os códigos abaixo e verifique o que ocorre, tendo em vista as explicações dos métodos e propriedades
deste capítulo.

Sub BTNcancelar_Click ()
clicou_cancelar = True
If corrente_registro <> "" Then
Data1.Recordset.Bookmark = corrente_registro
End If
clicou_cancelar = False

Data1.Enabled = True

BTNnovo.Enabled = True
BTNgravar.Enabled = False
BTNcancelar.Enabled = False
BTNexcluir.Enabled = True
End Sub

Sub BTNexcluir_Click ()
If Data1.Recordset.RecordCount <> 0 Then
Data1.Recordset.Delete
Data1.Recordset.MoveFirst
LBLagenda.Caption = Data1.Recordset.RecordCount
Else
MsgBox "Não há registro!", , "Impossível excluir"
TXTnome.Enabled = False
txtfone.Enabled = False
txtcomentarios.Enabled = False
End If
End Sub

- Inserir o seguinte código:

Sub Image1_DblClick ()
On Error GoTo 1
CMdialog1.Action = 1
Image1.Picture = LoadPicture(CMdialog1.Filename)
Exit Sub
1:
Exit Sub
End Sub

Observe que ao dar dois clikes sobre a imagem, o controle de caixa de diálogos é ativado, permitindo a
escolha de um arquivo de figura. Esse arquivo é então atribuído à propriedade Picture do controle imagem.

Sub Image1_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single)


If Button = 2 Then
If MsgBox("Deseja realmente excluir a foto?", 36, "Exclusão de Foto") = 6 Then
Image1.Picture = LoadPicture("")
End If
End If
End Sub

70
Esse evento limpa o conteúdo da propriedade picture do controle imagem, caso o usuário assim deseje. Ele
ocorre quando o usuário aperta o botão direito do mouse (devido a instrução If Button = 2 Then ).
Vamos voltar a falar sobre o Data Control. Existem dois eventos principais associados a esse controle:
Validate e Reposition.

5 - Os Eventos do Data Control

5.1) O Evento Reposition


Quando o Data Control é carregado, o primeiro registro do Recordset é transformado no registro corrente, e o
evento Reposition ocorre. Toda vez que o usuário clicar em qualquer botão do Data Control, movendo-se de registro
em registro, ou usar os métodos Move ou Find (que serão vistos no próximo capítulo) o evento Reposition ocorre.
Portanto, esse evento ocorre sempre depois que o registro corrente passar a ser outro registro.

5.2 - O Evento Validate


O evento Validate ocorre antes de um registro diferente passar a ser o registro corrente, antes do método
Update, e antes das operações Delete, Unload e Close.
Possue dois parâmetros (como pode ser visto no código abaixo), que têm o seguinte significado:
O argumento Action indica a operação que causou a ocorrência do evento. Os valores possíveis desse
argumento são:

Valor Descrição

0 Cancela a operação que causou o evento.


1 MoveFirst método.
2 MovePrevious método.
3 MoveNext método.
4 MoveLast método.
5 AddNew método.
6 Update operation.
7 Delete método.
8 Find método.
9 A propriedade Bookmark foi alterada.
10 Close método.
11 O formulário começa a ser descarregado da memória.

O argumento Save indica se houve mudança no dado que está no buffer. Se ele for True, os métodos Edit e
UpdateRecord são invocados. Portanto, se algum texto tiver seu conteúdo modificado, e um botão do Data1 for clicado,
automaticamente essa mudança será salva.
Insira o seguinte código no evento Data1_Validate:

Sub Data1_Validate (Action As Integer, save As Integer)


If clicou_cancelar = True Then
save = False
End If
End Sub

Quando o botão cancelar é clicado, o registro que era o corrente volta a sê-lo (verifique o evento
BTNcancelar_click). Houve, portanto, alteração da propriedade BookMark (action=9), e o evento validate ocorre. A
variável clicou_cancelar neste momento é true, fazendo o argumento save = False, impedindo que os métodos Edit e
UpdateRecord ocorram, não salvando qualquer mudança.
Para uma maior comodidade, é repetido abaixo o evento Sub BTNcancelar_Click ():

Sub BTNcancelar_Click ()
clicou_cancelar = True
If corrente_registro <> "" Then
Data1.Recordset.Bookmark = corrente_registro 'nesta linha o evento validate é
'acionado
End If
clicou_cancelar = False

Data1.Enabled = True
BTNnovo.Enabled = True
BTNgravar.Enabled = False
BTNcancelar.Enabled = False
BTNexcluir.Enabled = True
End Sub
71
Para encerrar esse projeto, inserir um menu com os itens mostrados abaixo:

fig 7.6 - o menu do programa

Nomeá-los como MNPOrdenar, MNSnome e MNSregistro. Eles serão usados para ordenar o Recordset por
nome ou por ordem de entrada. Observe que isto é feito configurando-se a propriedade Data1.RecordSource com uma
instrução SQL, contendo ou não um comando order by. Se essa cláusula estiver presente, isto gera um Recordset
ordenado, caso contrário, é gerado o Recordset com os registros em ordem de digitação. Não esqueça que o
Recordset só é gerado após o método Refresh ser executado,.
Para maiores detalhes sobre a instrução SQL, consultar o apêndice que trata do assunto.

Private Sub MNSnome_Click()


Data1.RecordSource = "select * from agenda order by nome"
Data1.Refresh
MNSregistro.Checked = False
MNSnome.Checked = True
End Sub

Private Sub MNSregistro_Click()


Data1.RecordSource = "select * from agenda"
Data1.Refresh
MNSregistro.Checked = True
MNSnome.Checked = False
End Sub

72
CAPÍTULO VIII

I - Objetos de Dados
A utilização do controle de dados Data Control para realizar o acesso a um arquivo de dados MDB, foi vista no
capítulo anterior. Neste capítulo veremos que esse acesso também é possível sem o uso do controle, mas com o uso
dos objetos de dados disponíveis no VB.
Um objeto de dados pode ser visto como uma variável que tem uma função específica no tratamento de banco
de dados. Os principais objetos de dados do VB são os seguintes: DataBase e Recordset.
Enquanto que o Data Control oferece facilidade no manuseio de um Banco de Dados, os Objetos de Dados
permitem uma maior flexibilidade, porém com o ônus de uma maior codificação.

1.1) Objeto DataBase


Um objeto database é usado para referenciar um arquivo de Banco de Dados (mdb, por exemplo). Sua função
pode ser comparada à propriedade DataBaseName do Data Control. A declaração de um objeto database é feita da
seguinte forma:

Public <nome_objeto> as DataBase

1.2) Objeto Recordset


Um objeto Recordset permite o acesso a uma tabela ou grupo de registros de uma ou mais tabelas de um
banco de dados previamente aberto com o método Open DataBase. É equivalente à propriedade RecordSource do
Data Control. A declaração é a seguinte:

Public <nome_objeto> as Recordset

Um Recordset pode ser de três tipos: Table, Dynaset ou Snapshot. A definição de qual o tipo do Recordset
criado é feita por ocasião da inicialização do objeto, que será vista adiante. Essa definição corresponde à propriedade
RecordsetType do Data Control.

1.2.1 - Table

Uma table é uma representação física da estrutura do banco de dados. Um recordset do tipo table só pode ser
ligado às tabelas existentes no arquivo de dados. É a ligação mais direta, e os dados são acessados e modificados em
uma tabela um registro por vez.
Como vantagens temos a possibilidade de criar e usar índices; utilizar o método Seek, que permite pesquisas
rápidas em busca de um registro e visualizar as mudanças feitas por outros usuários em tempo real.
As principais desvantagens são a impossibilidade de se definir filtros para limitar o escopo dos registros
acessados e a não utilização dos métodos Find, que podem encontrar mais de uma ocorrência de um mesmo valor
para uma determinada chave. O método Seek só encontra a primeira ocorrência.
Para se abrir uma tabela, é necessário a inicialização de um objeto Recordset, através do método
OpenRecordset.

1.2.2 - Dynaset

Uma Dynaset é um agrupamento de dados provenientes de uma ou mais tabelas do banco de dados. Um
recordset do tipo Dynaset é composto de campos selecionados, geralmente de um grupo de registros filtrados, de uma
ou mais tabelas. Ele permite que seja feito acesso a várias tabelas de um banco de dados, usando-se uma instrução
SQL.
Na verdade, um Dynaset é um ponteiro de registros para o que havia nas tabelas no momento em que ele foi
criado. Qualquer alteração no Dynaset se reflete nas tabelas originais, mas uma alteração em qualquer tabela, não se
reflete no Dynaset, devendo ele ser atualizado. Isso diminui a sua utilização em programas multiusuário.
Como vantagens temos a possibilidade de manipular informações provenientes de várias tabelas; utilizar os
método Find; filtrar campos e registros.
As principais desvantagens são a impossibilidade de se utilizar índices e o fato de que ele não reflete as
alterações que outros programas ou usuários possam fazer nas tabelas.
Para se abrir uma Dynaset, é necessário a inicialização de um objeto Recordset, através do método
OpenRecordset.

1.2.3 - Sanpshot

Uma Sanpshot é uma cópia dos dados provenientes de uma ou mais tabelas do banco de dados. Um
recordset do tipo Sanpshot é quase idêntico ao dynaset. A diferença é que um Sanpshot não pode ser atualizado,
sendo apenas de leitura. A sua utilização normalmente se faz em relatórios ou telas de visualização de dados.
Existe um tipo de Sanpshot chamado Forward-Only, que só pode ser percorrido no sentido ascendente dos
registros, não sendo possível o emprego dos métodos Move.
73
Como vantagens temos a possibilidade de manipular informações provenientes de várias tabelas; utilizar os
método Find; filtrar campos e registros.
As principais desvantagens são a impossibilidade de se utilizar índices e o fato de que ele não reflete as
alterações que outros programas ou usuários possam fazer nas tabelas, e o fato de que ele não é atualizável.
Para se abrir uma Sanpshot, é necessário a inicialização de um objeto Recordset, através do método
OpenRecordset.

1.3) Método OpenDataBase


Proporciona a abertura de um arquivo de banco de dados, e o associa a um objeto database. É a inicialização
do objeto. Por exemplo:

Public Dbagenda as DataBase {declaração}


Set DBagenda = OpenDatabase("C:\agenda\agenda.mdb") {inicialização}

1.4) Método OpenRecordset


Este método associa uma ou mais tabelas de um banco de dados, a um objeto Recordset. Quando o
objeto é uma table, somente uma tabela pode ser associada; quando o objeto é um dynaset ou um snapshot, pode ser
usada uma instrução SQL que filtre os dados de várias tabelas. A sintaxe é a seguinte:

Set objeto = objeto_database.OpenRecordset (origem,tipo,opções)

Uma table só pode ser criada a partir de um objeto DataBase, mas um dynaset e um snapshot também
podem ser criados a partir de outro dynaset ou snapshot. Neste último caso, o argumento origem não é usado.
Veremos a seguir vários exemplos de declarações que criam table, dynaset e snapshot.

Set DBagenda = OpenDatabase("C:\AGENDA.MDB")


Set DYNagenda = DBagenda.OpenRecordset("Select * from agenda order by nome", DbOpenDynaset) 'cria
um dynaset
Set TABagenda = DBagenda.OpenRecordset("agenda", DbOpenTable) 'cria uma table
Set DYNagenda = DBagenda.OpenRecordset("Select * from agenda order by nome", DbOpenSnapshot) 'cria
um snapshot

Com os objetos de banco de dados vistos, é possível a utilização dos seguintes métodos: métodos Move,
métodos Find, método Delete, método Close. Com o objeto Table é possível também a utilização do método Seek,
desde que haja um índice especificado para a tabela, mas não é possível a utilização dos métodos Find.
Será visto a seguir, como utilizar esses métodos.

1.5) Os Métodos Find


São quatro: FindPrevious, FindNext, FindLast e FindFirst. Servem para procurar o registro anterior, o
próximo registro, o último registro e o primeiro registro (respectivamente) que se enquadre no critério de procura.
A sintaxe é a seguinte:

recordset.FindFirst criterio
recordset.FindLast criterio
recordset.FindNext criterio
recordset.FindPrevious criterio

onde recordset é um objeto do tipo dynaset ou snapshot. O critério é uma string que contém uma instrução SQL, sem
a palavra Where. Por exemplo:

DYNagenda.FindFirst “nome = ‘Jose’” {posiciona no primeiro registro cujo conteúdo do campo nome seja igual
a Jose}

1.6) Os Métodos Move


São quatro: MovePrevious, MoveNext, MoveLast e MoveFirst. Servem para movimentar o ponteiro de
registros para o registro anterior, para o próximo registro, para o último registro e para o primeiro registro,
respectivamente.
A sintaxe é a seguinte:

recordset.MoveFirst
recordset.MoveLast
recordset.MoveNext
recordset.MovePrevious

onde recordset é um objeto do tipo table, dynaset ou snapshot. Por exemplo:

74
DYNagenda.MoveLast {posiciona no último registro do dynaset}

Não esqueça que a propriedade recordset de um Data Control cria um dynaset, um snapshot ou uma table,
de acordo com a propriedade RecordsetType, o que significa que esses métodos podem ser usados com um Data
Control, através da propriedade recordset. Por exemplo:

Data1.recordset.MoveLast {posiciona no último registro}

1.7) O Método Seek


Localiza um registro em um objeto Table indexado, seguindo o critério especificado para o índice corrente. A
sintaxe é a seguinte:

<nome_table>.Seek comparação, chave1, chave2...

onde comparação é uma das seguintes strings: <, <=, =, >=, >, ou <>. Devem vir entre aspas duplas. Chaves é
um valor para cada campo do índice corrente da table.

1.8) A propriedade Index


Define ou retorna um valor que indica o nome do objeto Index atual em um objeto Recordset tipo table. Para
utilizar o método Seek, a propriedade Index do recordset deve ser definida antes. O objeto Index especificado deve já
estar definido. Se você definir a propriedade Index como um objeto Index que não existe ou se a propriedade Index
não for definida quando você usar o método Seek, ocorrerá um erro interceptável.
O índice pode ser criado através do Visual Data Manager, ou usando a declaração CreateIndex.
A forma de se definir o objeto index utilizado é a seguinte:

<nome_table>.Index = nome_do_indice

Essa instrução determina qual o índice existente será usado como o índice corrente para indexar os registros
de um objeto criado a partir de uma tabela.

table.Index [ = indexname ]

Indexname é o nome do índice, podendo ser definido através do Visual Data Manager. Sempre que se quiser
usar o método seek, deve-se antes se determinar o índice, configurando-se a propriedade index. Por exemplo:

TABagenda.index = "indcpf" {já existe um índice com esse nome}


TABagenda.seek "=", 22314456 {procura pelo registro que tenha esse cpf}

OBS: As propriedades e os métodos vistos para os objetos de acesso a dados podem ser empregados a um
controle Data Control, através da propriedade Recordset, observando o tipo de recordset definido pela
propriedade RecordsetType.

2 - Praticando com Objetos de Dados


Vamos agora por em prática os conhecimentos obtidos, e criar um programa com funções semelhantes ao
criado no capítulo anterior, mas usando objetos de dados no lugar do Data Control.
A listagem do programa, que tem a aparência da figura 8.1, servirá como exemplo dos conceitos vistos neste
capítulo:

Option Explicit
Public DBagenda As Database
Public DYNagenda As Recordset
Public TABagenda As Recordset
Public corrente_registro
Dim inicio, clicou_procurar, clicou_ordenar As Integer
Dim clicou_excluir, clicou_novo, clicou_cancelar As Integer
Dim clicou_proximo, clicou_anterior As Integer

75
fig 8.1 - Usando objetos de acesso a dados

Sub grava_registro()
DYNagenda("nome") = FRMagenda.TXTnome
DYNagenda("telefone") = FRMagenda.TXTfone
DYNagenda("comentarios") = FRMagenda.TXTcomentarios
DYNagenda("foto") = FRMagenda.CMDialog1.filename
End Sub

Sub le_registro()
FRMagenda.TXTnome = DYNagenda("nome")
If IsNull(DYNagenda("telefone")) Then
FRMagenda.TXTfone = ""
Else
FRMagenda.TXTfone = DYNagenda("telefone")
End If
If IsNull(DYNagenda("comentarios")) Then
FRMagenda.TXTcomentarios = ""
Else
FRMagenda.TXTcomentarios = DYNagenda("comentarios")
End If
If IsNull(DYNagenda("foto")) Then
FRMagenda.Image1.Picture = LoadPicture("")
Else
FRMagenda.Image1.Picture = LoadPicture(DYNagenda("foto"))
End If
End Sub

Private Sub BTNanterior_Click()


If DYNagenda.RecordCount = 0 Then
MsgBox "Não há registro!", , "Atenção"
Exit Sub
End If
clicou_anterior = True
DYNagenda.MovePrevious
If Not (DYNagenda.BOF) Then
le_registro
corrente_registro = DYNagenda.Bookmark
Else
DYNagenda.MoveNext
End If
clicou_anterior = False

76
End Sub

Private Sub BTNcancelar_Click()


clicou_cancelar = True
If Not IsEmpty(corrente_registro) Then
DYNagenda.Bookmark = corrente_registro
le_registro
Else
FRMagenda.TXTnome = ""
FRMagenda.TXTfone = ""
FRMagenda.TXTcomentarios = ""
FRMagenda.Image1 = LoadPicture("")
End If
clicou_cancelar = False
clicou_novo = False

BTNnovo.Enabled = True
BTNgravar.Enabled = False
BTNcancelar.Enabled = False
BTNexcluir.Enabled = True
BTNproximo.Enabled = True
BTNanterior.Enabled = True

End Sub

Private Sub BTNexcluir_Click()


clicou_excluir = True
If DYNagenda.RecordCount <> 0 Then
DYNagenda.Delete
Set DYNagenda = DBagenda.OpenRecordset("agenda", dbOpenDynaset)
'Set CMPnome = DYNagenda("nome")
'Set CMPtelefone = DYNagenda("telefone")
'Set CMPcomentarios = DYNagenda("comentarios")
'Set CMPfoto = DYNagenda("foto")
If DYNagenda.RecordCount <> 0 Then
DYNagenda.MoveFirst
le_registro
corrente_registro = DYNagenda.Bookmark
Else
TXTnome.Text = ""
TXTfone.Text = ""
TXTcomentarios.Text = ""
Image1.Picture = LoadPicture("")
TXTnome.Enabled = False
TXTfone.Enabled = False
TXTcomentarios.Enabled = False
Image1.Enabled = False
corrente_registro = Empty
End If
If DYNagenda.RecordCount <> 0 Then
DYNagenda.MoveLast
DYNagenda.MoveFirst
If DYNagenda.RecordCount <= 1 Then
LBLagenda.Caption = Str(DYNagenda.RecordCount) + " registro"
Else
LBLagenda.Caption = Str(DYNagenda.RecordCount) + " registros"
End If
Else
LBLagenda.Caption = "Não há registro"
End If
Else
MsgBox "Não há registro!", , "Impossível excluir"
TXTnome.Enabled = False
TXTfone.Enabled = False
TXTcomentarios.Enabled = False
Image1.Enabled = False
End If

77
clicou_excluir = False
End Sub

Private Sub BTNgravar_Click()


If TXTnome.Text = "" Then
MsgBox "É necessário preencher o nome!", , "Impossível gravar"
TXTnome.SetFocus
Exit Sub
End If
grava_registro
DYNagenda.Update
DYNagenda.Bookmark = DYNagenda.LastModified

corrente_registro = DYNagenda.Bookmark
BTNnovo.Enabled = True
BTNgravar.Enabled = False
BTNcancelar.Enabled = False
BTNexcluir.Enabled = True
BTNproximo.Enabled = True
BTNanterior.Enabled = True
DYNagenda.Bookmark = DYNagenda.LastModified
If DYNagenda.RecordCount <= 1 Then
LBLagenda.Caption = Str(DYNagenda.RecordCount) + " registro"
Else
LBLagenda.Caption = Str(DYNagenda.RecordCount) + " registros"
End If
clicou_novo = False
End Sub

Private Sub BTNimprimir_Click()


Dim x
x = MsgBox("Somente esse registro?", 35, "Imprimir")
If x = 6 Then
Report1.SelectionFormula = "{agenda.nome} = '" + TXTnome.Text + "'"
Report1.Action = 1
ElseIf x = 7 Then
Report1.SelectionFormula = "" '+ TXTnome.Text
Report1.Action = 1
End If
End Sub

Private Sub BTNnovo_Click()


clicou_novo = True
If DYNagenda.RecordCount <> 0 Then
corrente_registro = DYNagenda.Bookmark
End If
DYNagenda.AddNew
TXTnome.Enabled = True
TXTfone.Enabled = True
TXTcomentarios.Enabled = True
Image1.Enabled = True
TXTnome.Text = ""
TXTfone.Text = ""
TXTcomentarios.Text = ""
Image1.Picture = LoadPicture("")

BTNnovo.Enabled = False
BTNgravar.Enabled = True
BTNcancelar.Enabled = True
BTNexcluir.Enabled = False
BTNproximo.Enabled = False
BTNanterior.Enabled = False

TXTnome.SetFocus
End Sub

Private Sub BTNproximo_Click()

78
If DYNagenda.RecordCount = 0 Then
MsgBox "Não há registro!", , "Atenção"
Exit Sub
End If
clicou_proximo = True
DYNagenda.MoveNext
If Not (DYNagenda.EOF) Then
le_registro
corrente_registro = DYNagenda.Bookmark
Else
DYNagenda.MovePrevious
End If
clicou_proximo = False

End Sub

Private Sub BTNsair_Click()


End
End Sub

Private Sub Form_Load()

'abre o arquivo agenda.mdb, e o associa à variável DBagenda


Set DBagenda = OpenDatabase("C:\CURSOVB\AULA08\AGENDA.MDB")

'associa o dynaset DYNagenda à tabela agenda


Set DYNagenda = DBagenda.OpenRecordset("agenda", dbOpenDynaset)

'associa cada variável field ao campo respectivo da tabela agenda


'Set CMPnome = DYNagenda("nome")
'Set CMPtelefone = DYNagenda("telefone")
'Set CMPcomentarios = DYNagenda("comentarios")
'Set CMPfoto = DYNagenda("foto")

'executa o corpo do if somente se houver algum registro


'na tabela
If DYNagenda.RecordCount <> 0 Then
inicio = True
le_registro
inicio = False
corrente_registro = DYNagenda.Bookmark
Else
'se não houver registro
TXTnome.Enabled = False
TXTfone.Enabled = False
TXTcomentarios.Enabled = False
Image1.Enabled = False
BTNgravar.Enabled = False
End If

BTNcancelar.Enabled = False
BTNgravar.Enabled = False

'informa o nº de registros
If DYNagenda.RecordCount <> 0 Then
DYNagenda.MoveLast
DYNagenda.MoveFirst
If DYNagenda.RecordCount <= 1 Then
LBLagenda.Caption = Str(DYNagenda.RecordCount) + " registro"
Else
LBLagenda.Caption = Str(DYNagenda.RecordCount) + " registros"
End If
Else
LBLagenda.Caption = "Não há registro"
End If
FRMagenda.Show
End Sub

79
Private Sub Image1_DblClick()
On Error GoTo 1
CMDialog1.Action = 1
Image1.Picture = LoadPicture(CMDialog1.filename)
If BTNnovo.Enabled = True Then
DYNagenda.Edit
End If
BTNnovo.Enabled = False
BTNgravar.Enabled = True
BTNcancelar.Enabled = True
BTNexcluir.Enabled = False
BTNproximo.Enabled = False
BTNanterior.Enabled = False
Exit Sub
1:
Exit Sub
End Sub

Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, x As Single, Y As Single)


On Error GoTo 1
If Button = 2 Then
If MsgBox("Deseja realmente excluir a foto?", 36, "Exclusão de foto") = 6 Then
Image1.Picture = LoadPicture("")
Else
Exit Sub
End If
If BTNnovo.Enabled = True Then
DYNagenda.Edit
End If
BTNnovo.Enabled = False
BTNgravar.Enabled = True
BTNcancelar.Enabled = True
BTNexcluir.Enabled = False
BTNproximo.Enabled = False
BTNanterior.Enabled = False

End If
Exit Sub

1:
Exit Sub
End Sub

Private Sub MNSnome_Click()


clicou_ordenar = True
Set DYNagenda = DBagenda.OpenRecordset("select * from agenda order by nome")
le_registro
corrente_registro = DYNagenda.Bookmark
MNSregistro.Checked = False
MNSnome.Checked = True
clicou_ordenar = False

End Sub

Private Sub MNSnome2_Click()


clicou_procurar = True
FRMprocurar.Show 1
clicou_procurar = False
End Sub

Private Sub MNSproximo_Click()


clicou_procurar = True
DYNagenda.FindNext "nome = '" + TXTnome.Text + "'"
If DYNagenda.NoMatch Then
MsgBox "Não existem mais registros com esse nome!", 0, "Aviso"
DYNagenda.Bookmark = corrente_registro

80
Else
le_registro
corrente_registro = DYNagenda.Bookmark
End If
clicou_procurar = False

End Sub

Private Sub MNSregistro_Click()


clicou_ordenar = True
Set DYNagenda = DBagenda.OpenRecordset("select * from agendA")
le_registro
corrente_registro = DYNagenda.Bookmark
MNSregistro.Checked = True
MNSnome.Checked = False
clicou_ordenar = False
End Sub

Private Sub TXTcomentarios_Change()


If clicou_procurar Or clicou_ordenar Or clicou_anterior Or clicou_proximo Or clicou_novo Or
clicou_excluir Or inicio Then
Exit Sub
End If
DYNagenda.Edit

BTNnovo.Enabled = False
BTNgravar.Enabled = True
BTNcancelar.Enabled = True
BTNexcluir.Enabled = False

End Sub

Private Sub TXTfone_Change()


If clicou_procurar Or clicou_ordenar Or clicou_anterior Or clicou_proximo Or clicou_novo Or
clicou_excluir Or inicio Then
Exit Sub
End If
DYNagenda.Edit

BTNnovo.Enabled = False
BTNgravar.Enabled = True
BTNcancelar.Enabled = True
BTNexcluir.Enabled = False

End Sub

Private Sub TXTnome_Change()


If clicou_procurar Or clicou_ordenar Or clicou_anterior _
Or clicou_proximo Or clicou_novo Or clicou_excluir _
Or inicio Then
Exit Sub
End If
DYNagenda.Edit

BTNnovo.Enabled = False
BTNgravar.Enabled = True
BTNcancelar.Enabled = True
BTNexcluir.Enabled = False
End Sub

81
ÍNDICE ANALÍTICO

CAPÍTULO I............................................................................................................................................................................... 1
1 - CRIAÇÃO DE UM PROGRAMA ........................................................................................................................................ 1
2 - AS PARTES DE UM PROGRAMA..................................................................................................................................... 1
3 - AMBIENTE DE PROGRAMAÇÃO VB ............................................................................................................................... 1
3.1) Barra de menu ............................................................................................................................................................ 1
3.2) Barra de ferramentas (atalho para as opções de menu)............................................................................................. 1
3.3) Caixa de ferramentas (ToolBox) ................................................................................................................................. 1
3.4) Janela de projeto......................................................................................................................................................... 1
3.5) Janela de propriedades............................................................................................................................................... 2
4 - PROJETO ......................................................................................................................................................................... 3
4.1) O que é um projeto .................................................................................................................................................... 3
4.2) Componentes de um projeto ....................................................................................................................................... 3
4.3) Salvando um projeto ................................................................................................................................................... 3
4.4) Gerando um executável .............................................................................................................................................. 3
5 - O PROGRAMA INAUGURAL ............................................................................................................................................ 3
5.1) Botões de Comando, Quadro Texto e Label ............................................................................................................... 4
5.2) Evento Click ................................................................................................................................................................ 5
6 - OUTRO PROGRAMA........................................................................................................................................................ 6
6.1) Propriedades Top, Left, Width, Height e ScaleMode .................................................................................................. 6
6.2) Propriedades Alignment e MultiLine............................................................................................................................ 6
6.3) Barra de Rolagem Horizontal (HScrollBar) ................................................................................................................. 7
6.4) Propriedades Min, Max, Value, SmallChange e LargChange ..................................................................................... 7
6.5) Foco do Teclado - Propriedade TabIndex................................................................................................................... 7
6.6) Evento Change ........................................................................................................................................................... 7
6.7) Evento Load ................................................................................................................................................................ 8
6.8) Propriedade Enabled .................................................................................................................................................. 8
6.9) Evento Scroll ............................................................................................................................................................... 8
CAPÍTULO II.............................................................................................................................................................................. 9
1 - TIPOS DE DADOS ............................................................................................................................................................ 9
2 - DECLARAÇÃO DE VARIÁVEIS ........................................................................................................................................ 9
2.1) Dim.............................................................................................................................................................................. 9
2.2) Public .......................................................................................................................................................................... 9
2.3) Private......................................................................................................................................................................... 9
2.4) Static ........................................................................................................................................................................... 9
2.5) Matrizes .................................................................................................................................................................... 10
2.6) Redim........................................................................................................................................................................ 10
3 - INSTRUÇÕES DE CONTROLE DE FLUXO DE PROGRAMAS ...................................................................................... 10
3.1) If <expressão> Then <comando> End If ................................................................................................................... 10
3.2) A instrução Select Case............................................................................................................................................ 11
3.3) A instrução Do While ... Loop.................................................................................................................................... 11
3.4) A instrução Do ... Loop While.................................................................................................................................... 11
3.5) A instrução For ... Next ............................................................................................................................................. 12
3.6) A instrução Exit For................................................................................................................................................... 12
3.7) A instrução Exit Do.................................................................................................................................................... 12
4 - SELECIONANDO OPÇÕES............................................................................................................................................ 12
4.1) Option Button e Check Box ....................................................................................................................................... 13
5 - ESCREVENDO E CHAMANDO FUNÇÕES E PROCEDIMENTOS................................................................................. 13
5.1) Procedimentos (Sub) ................................................................................................................................................ 13
5.2) Funções .................................................................................................................................................................... 15
5.3) Função Val() ............................................................................................................................................................. 17
5.4) Propriedade AutoSize ............................................................................................................................................... 17
CAPÍTULO III........................................................................................................................................................................... 18
1- CONTROLANDO O TEMPO ............................................................................................................................................ 18
1.1) Timer Control ............................................................................................................................................................ 18
1.2) Propriedade Interval e o evento Timer ...................................................................................................................... 18
2 - USANDO O MOUSE........................................................................................................................................................ 19
2.1) List Box Control......................................................................................................................................................... 20
2.2) Métodos AddItem e RemoveItem.............................................................................................................................. 20
2.3) Combo Box Control................................................................................................................................................... 21
2.4) Picture Box Control ................................................................................................................................................... 21
2.5) O Evento MouseDown .............................................................................................................................................. 21

82
2.6) As Coordenadas do Formulário ................................................................................................................................ 22
2.7) O Método Move......................................................................................................................................................... 22
2.8) O Evento MouseMove............................................................................................................................................... 22
2.9) O Método Circle ........................................................................................................................................................ 23
3 - UTILIZANDO MENUS ..................................................................................................................................................... 23
3.1) Menu ......................................................................................................................................................................... 24
3.2) Função Qbcolor() ...................................................................................................................................................... 25
3.3) A propriedade WindowState do Formulário .............................................................................................................. 25
3.4) O evento Resize do Formulário................................................................................................................................. 26
3.5) Menus Instantâneos.................................................................................................................................................. 26
3.6) Método PopUpMenu ................................................................................................................................................. 26
4 - FORMULÁRIO MDI ......................................................................................................................................................... 27
4.1) MDI Form .................................................................................................................................................................. 27
4.2) Propriedade Align...................................................................................................................................................... 27
4.3) Vetor de Controles .................................................................................................................................................... 28
CAPÍTULO IV .......................................................................................................................................................................... 30
1- MANIPULANDO JANELAS E MENSAGENS ................................................................................................................... 30
1.1) O Controle SSPanel.................................................................................................................................................. 30
1.2) Usando novos Formulários ....................................................................................................................................... 31
1.3) Os Métodos Load e Unload e os Eventos Load e Unload......................................................................................... 32
1.4) Os Métodos Show e Hide e os Eventos Activate e Deactivate ................................................................................. 32
1.5) Janelas Personalizadas ............................................................................................................................................ 32
1.6) Janelas Padronizadas - MsgBox e InputBox............................................................................................................ 33
1.7) Função IsNumeric ..................................................................................................................................................... 36
1.8) Função IsDate........................................................................................................................................................... 36
1.9) Função WeekDay...................................................................................................................................................... 36
2 - JANELAS DE DIÁLOGOS COMUNS............................................................................................................................... 36
2.1) O Controle Common Dialog ...................................................................................................................................... 37
2.2) Métodos ShowColor, ShowFont, ShowOpen, ShowSave e ShowPrinter................................................................. 40
2.3) A Função Len............................................................................................................................................................ 40
2.4) A Função Mid ............................................................................................................................................................ 40
2.5) O Comando Shell...................................................................................................................................................... 40
CAPITULO V ........................................................................................................................................................................... 41
1 - OS CONTROLES GRÁFICOS......................................................................................................................................... 41
1.1) Shape Control ........................................................................................................................................................... 41
1.2) Line Control............................................................................................................................................................... 41
1.3) O Controle SpinButton .............................................................................................................................................. 43
2 - OS MÉTODOS GRÁFICOS ............................................................................................................................................. 44
2.1) O Método Cls ............................................................................................................................................................ 45
2.2) A Função Rnd ........................................................................................................................................................... 46
2.3) A Função RGB .......................................................................................................................................................... 46
2.4) O Método Pset .......................................................................................................................................................... 47
2.5) O Método Line........................................................................................................................................................... 47
2.6) O Método Circle ........................................................................................................................................................ 47
3 - OS CONTROLES DE IMAGEM ....................................................................................................................................... 48
3.1) Picture Box Control ................................................................................................................................................... 48
3.2) Image Control............................................................................................................................................................ 48
3.3) Vetor de Controles .................................................................................................................................................... 49
CAPÍTULO VI .......................................................................................................................................................................... 51
1 - MANIPULANDO ARQUIVOS .......................................................................................................................................... 51
1.1) O Evento de Formulário Resize ................................................................................................................................ 51
1.2) A Função FreeFile..................................................................................................................................................... 52
1.3) O Comando Open ..................................................................................................................................................... 52
1.4) A Função Input.......................................................................................................................................................... 52
1.5) A Função LOF........................................................................................................................................................... 52
1.6) O método Close ........................................................................................................................................................ 52
1.7) O Método Print .......................................................................................................................................................... 53
2 - ÁREA DE TRANSFERÊNCIA .......................................................................................................................................... 53
2.1) O Objeto ClipBoard ................................................................................................................................................... 53
2.2) O Método Clear......................................................................................................................................................... 54
2.3) O Método SetText ..................................................................................................................................................... 54
2.4) O Método SetData .................................................................................................................................................... 54
2.5) O Método GetText..................................................................................................................................................... 54
2.6) O Método GetData .................................................................................................................................................... 54
83
2.7) A Propriedade SelText .............................................................................................................................................. 54
3 - MANIPULANDO ERROS................................................................................................................................................. 54
3.1) On Error .................................................................................................................................................................... 55
3.2) A função Err .............................................................................................................................................................. 55
4 - MANIPULANDO ARQUIVOS DE REGISTROS ............................................................................................................... 55
4.1) A Declaração Type.................................................................................................................................................... 56
4.2) O Procedimento Get ................................................................................................................................................. 57
4.3) O Procedimento Put.................................................................................................................................................. 59
4.4) O Procedimento Kill .................................................................................................................................................. 62
4.5) O Procedimento Name ... as ... ................................................................................................................................. 62
4.6) As Funções UCase e LCase ..................................................................................................................................... 63
4.7) As Funções Trim, LTrim e RTrim .............................................................................................................................. 63
CAPÍTULO VII ......................................................................................................................................................................... 65
1 - DEFINIÇÕES GERAIS DE BANCO DE DADOS ........................................................................................................................... 65
1.1) Definições Gerais de Banco de Dados ..................................................................................................................... 65
1.2) Banco de Dados MDB............................................................................................................................................... 65
2 - O DATA CONTROL .............................................................................................................................................................. 65
2.1) A propriedade Connect ............................................................................................................................................. 66
2.2) A propriedade DataBase........................................................................................................................................... 66
2.3) A propriedade RecordSource.................................................................................................................................... 66
2.4) A propriedade Recordset .......................................................................................................................................... 67
2.5) A propriedade RecordsetType .................................................................................................................................. 67
3 - BOUND CONTROL ............................................................................................................................................................... 67
3.1) As propriedades DataSource e DataField................................................................................................................. 67
4 - OBJETO RECORDSET .......................................................................................................................................................... 68
4.1) A propriedade RecordCount ..................................................................................................................................... 68
4.2) O Método AddNew.................................................................................................................................................... 69
4.3) O Método Edit ........................................................................................................................................................... 69
4.4) O Método Update...................................................................................................................................................... 69
4.5) A Propriedade Bookmark .......................................................................................................................................... 69
4.6) A Propriedade LastModify......................................................................................................................................... 70
4.7) O Método Delete ....................................................................................................................................................... 70
5 - OS EVENTOS DO DATA CONTROL ........................................................................................................................................ 71
5.1) O Evento Reposition ................................................................................................................................................. 71
5.2 - O Evento Validate .................................................................................................................................................... 71
CAPÍTULO VIII ........................................................................................................................................................................ 73
I - OBJETOS DE DADOS ............................................................................................................................................................ 73
1.1) Objeto DataBase....................................................................................................................................................... 73
1.2) Objeto Recordset ...................................................................................................................................................... 73
1.3) Método OpenDataBase............................................................................................................................................. 74
1.4) Método OpenRecordset ............................................................................................................................................ 74
1.5) Os Métodos Find....................................................................................................................................................... 74
1.6) Os Métodos Move ..................................................................................................................................................... 74
1.7) O Método Seek ......................................................................................................................................................... 75
1.8) A propriedade Index.................................................................................................................................................. 75
2 - PRATICANDO COM OBJETOS DE DADOS ................................................................................................................................ 75

84

Вам также может понравиться