Você está na página 1de 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.
programação.
Como exemplo de linguagens temos Pascal
Pascal,, Cobol
Cobol,, C.
 Após o advento do Windows
Windows,, o computador passou a apresentar um ambiente gráfico, enquanto que na época
do DOS
DOS tínhamos
 tínhamos um ambiente texto.
No Windows
Windows as
 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 
Basic  foi desenvolvida para criar programas para o Windows
Windows,,
dizemos que ela é orientada
VB. a eventos.
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, 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 
VB  é
composto dos seguintes elementos:

3.1) Barra de menu


Como todos os aplicativos for Windows
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
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
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
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
ToolBox..
Um controle pode ser adicionado ao projeto de duas formas: dando-se um duplo clique sobre ele na ToolBox
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.
Toolbox.

3.4) Janela de projeto


 A janela de projeto mostra a lista de todos os arquivos de Formulários
Formulários   e de Módulos
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...,


Form..., Project - Add Module... , etc, e
para se retirar um arquivo, a opção Project - Remove File.
File.
Para se visualizar a janela de projeto, seleciona-se a opção View - Project 
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,


Properties, ou a tecla de
atalho F4
F4..

2
 

4 - PROJETO

4.1) O que é um projeto


Toda vez qual o VB é
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
( .VBP),
salvos no diretório escolhido pelo programador, os seguintes arquivos: um arquivo de projeto (.VBP ), e tantos arquivos
(.FRM)) e de módulos (.BAS
de formulários (.FRM ( .BAS)) quantos forem os formulários e os módulos existentes neste projeto em
particular. Os arquivos de controle (.OCX .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
c:\windows\system
ferramentas.

4.2) Componentes de um projeto


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

* Formulários
* Controles
* Módulos

Os formulários
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
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
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
objeto (controles
 (controles ou formulários) existem as propriedades
propriedades,, os eventos
eventos e
 e os métodos
métodos..
 As propriedades
propriedades,,  em 
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
eventos são
 são as ações que ocorrem em relação a algum controle. Por exemplo, temos o evento click
click de
 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
métodos  são procedimentos ou funções previamente definidos, que operam sobre os objetos. Por exemplo, temos o
método circle
circle,, que desenha um círculo sobre um objeto especificado, e o método Move
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,
Project, todos os arquivos do projeto são salvos no diretório
previamente especificado, ou a janela de diálogo Salvar Como aparece,
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....
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),
Button), quadro
quadro   texto
texto ( Text Box)
 (Text Box) e label (Label
Label).). Serão vistas também as propriedades Name
Name,, Caption
Caption,,
BackColor, ForeColor, FontSize, FontName e FontItalic
FontItalic,, além do evento Click
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


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,
Code, ou usar a tecla de atalho F7
F7..

fig 1.6 - O formulário do primeiro programa

 Após iniciar uma sessão do VB,


VB, realizar as seguintes ações:
- Alterar a propriedade Name
Name do
 do formulário
formulário para
 para FRMproj1
FRMproj1-- Este será o nome interno do formulário. 
formulário.  
- Alterar a propriedade caption do formulário
formulário para
 para Aula Inaugural.
projeto no
projeto nocomo
- Salvar o formulário diretório c:\aulavb\aula1\proj1 com
c:\aulavb\aula1\proj1
proj1.frm  comdo
- Este será o nome arquivoproj1.vbp
o nome proj1.vbp.
.
de formulário, 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, Command3, e que a propriedade Caption
Command1, Command2 e Command3, 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
Name).). É importante que os nomes dos objetos
sejam significativos para o programador, por isso sempre alteraremos a propriedade Name
Name de
 de todos os controles.

- Alterar as propriedades
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 (


texto (Text
Text Box)
Box) no formulário, e alterar as seguintes propriedades:
name: TXTentrada
text:

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

- Executar o programa.
Verificar que ao se clicar sobre os botões Limpar   e
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


BTNecoar_click::
LBLeco.Caption = TXTentrada.Text
Para   referenciar uma propriedade de um controle durante a execução do programa, escreve-se o nome do
Para
controle (propriedade Name
Name),), seguido de um ponto e do nome da propriedade que se quer acessar. A linha de código
inserida no evento BTNecoar_click
BTNecoar_click   copia o valor da propriedade Text
Text   do quadro de texto TXTentrada
TXTentrada,, para a
propriedade Caption
Caption do
 do label LBLeco
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
Text   e Caption
Caption,, dos controles TXTentrada
TXTentrada   e LBLeco
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....
File.... Escolher o diretório C:\aulavb\aula1\proj1
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,
rolagem, com as suas principais propriedades, apresentação dos eventos
Form_Load e Change
Change,, além das propriedades Tab, Top, Left, Width e Height
Height.. 

- Iniciar um novo projeto.

- Salvar o projeto
projeto no
 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
formulário::

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

 As propriedades Top e Left


Left são
 são as coordenadas de um objeto. O valor 1170 da propriedade Top
Top significa
 significa que
unidades  da parte superior da tela, enquanto que a propriedade Left
o formulário dista 1170 unidades  Left determina
 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
Mode Twip..
Para os controles, essas propriedades determinam as coordenadas em relação ao formulário que os contém.
 As propriedades Width e Height
Height definem
 definem as dimensões de um objeto (largura e altura), e também dependem
da propriedade Scale Mode.
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,
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
Text)) de um quadro texto será alinhado dentro
do controle. Essa propriedade só é reconhecida, se a propriedade MultiLine
MultiLine do
 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)
HScrollBar),, com as seguintes propriedades: 
propriedades: 
*Name = HSBvelocidade
*Top
*Left = 1440
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


Lar gChange
- Na barra de rolagem horizontal,
horizontal, alterar as seguintes propriedades: 
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
Value indica
 indica
o valor atual da barra (a posição do marcador), e pode variar entre os valores das propriedades Min e Max Max.. A
propriedade SmallChange define de quanto será a variação do valor de Value Value,, quando umas das setas das
extremidades do controle for “clicada”, enquanto que LargChange
LargChange define
 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
HSBvelocidade_Change..
TXTvelocidade.Text = HSBvelocidade.Value
O evento Change
Change ocorre
 ocorre sempre que o conteúdo de um controle é alterado ( o texto de um quadro texto, a
etc).  
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


Value do
 do controle HSBvelocidade para a propriedade
Text do
Text do quadro texto TXTvelocidade
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: 
formulário: 
TXTvelocidade.Text = BRHvelocidade.Value + “ Km\h”
evento  Form_load ocorre sempre que um formulário é carregado na memória. Como só existe um
O evento 
formulário neste
Form_load projeto,
ocorre. quandocopia
O comando iniciamos
para aapropriedade
execução, automaticamente o formulário é , carregado,
Text do controle TXTvelocidade
TXTvelocidade, o valor da epropriedade
o evento
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
TXTvelocidade.. 
*Enabled = False 
False 
 A propriedade Enabled
Enabled   habilita (True
(True)) ou desabilita (False
(False)) um controle - permitindo ou não que o controle
texto,  Enabled = False impede que o usuário digite algo no quadro
receba o foco do teclado. No caso de um quadro texto, Enabled
texto.

6.9) Evento Scroll


- No evento HSBvelocidade_Scroll.
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
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
Variant..

2.1) Dim
 A declaração de variáveis é feita usando-se a palavra chave Dim
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#
ou Dim

2.2) Public
Uma variável declarada como Public
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
Static são
 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
s ido 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 
Function 

9
 

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

dim <nome_da_variável > (<limite_inferior > to <


dim < 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 <
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
variável Y, um vetor de valores Single
índices variando de 1 a 8, . No segundo caso é declarada a variável 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.

4 9
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


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
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> 
0> 
Case 1
<comandos que serão executados caso x = 1> 
1> 
Case 2
<comandos que serão executados caso x = 2> 
2> 
End Select 
Select 

Select Case x
Case 0
Beep
Case Is >Text1.Text
1<5 =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
enquanto uma
 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.
While.

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

Neste fragmento de código, o comando x = x + 1 é executado pelo menos uma vez, sendo executado
novamente enquanto
enquanto x
 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.
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
Next mais interna, mesmo que a condição
de término do loop não tenha sido alcançada.
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
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


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)
Button) e um Caixa de verificação (
verificação (Check
Check Box)
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 Value muda
 muda de True
True  
para False
False,, e vice e versa. Quando essa propriedade for True
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
Box podem estar selecionados, mas
somente um Option Button pode
Button pode ter Value como True
True..
Outra diferença é que os valores possíveis de Value são True e False
False para
 para um Option Button,
Button, e 0, 1 e 2 (não
marcado, marcado e não disponível) para um Check Box.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 
True 

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


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

- Inserir o seguinte código nos eventos Click


Click dos opção: 
 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á
  será executado toda vez que qualquer um
dos botões de opção for clicado. Obviamente devemos escrever o código deste procedimento
procedimento.. Na seção General
General do
 do
formulário, escreva Sub atualiza_cor , e tecle <Enter>
<Enter>.. Automaticamente o VB apresenta
VB apresenta uma janela de código para o
procedimento em questão.

conformeUma outra
figura 2.3. maneira
A janela de
de criar umda
diálogo procedimento função é através do item de menu Tools – Add Procedure,
ou exibida.
figura 2.4 será Procedure,
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
LBLescolha.BackColor==&HFF00&
&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 


Procedure 

- Inserir o seguinte código nos eventos Click


Click das
 das caixas de verificação:
verificação: 
  atualiza_label
14
 

  A linha de código acima significa que o procedimento atualiza_label


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

Sub atualiza_label 
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


string.. A variável pl recebe
pl recebe o valor Chr(10) + Chr(13). A
Chr(13). A função chr()
chr()  
devolve o símbolo cujo código Ascii
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


LBLoperacao fique
 fique entre os dois quadros textos, e o label
LBLigual fique
LBLigual fique depois do quadro texto TXTop2
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 =
Name = OPTsubtracao
OPTsoma Caption Caption = &Soma
= 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


click do
 do botão BTNsair :
End

- Escrever no evento click


click de
 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
LBLoperacao   terá a
propriedade Caption
Caption configurada
 configurada adequadamente.
- Configurar as propriedades FontSize
FontSize para
 para obter um melhor efeito, aumentando o tamanho da fonte usada.

- No evento form_load
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.).

. de código vista acima coloca o valor de retorno da função calcular  na


 A linha
LBLresultado
LBLresultado.  na propriedade Caption do controle
16
 

  Tanto uma função como um procedimento podem receber argumentos


argumentos.. 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
General do
 do formulário, escrever Function calcular(op1, op2).
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()
Val() recebe
 recebe como argumento uma string
string que
 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 
True 
 A propriedade AutoSize
AutoSize é
 é aplicada a um Label
Label e
 e a uma Picture
Picture (um
 (um controle ainda não visto), e determina se
o controle se ajustará ao seu conteúdo (o valor da propriedade Caption
Caption no
 no caso do Label
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 .

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
c:\aulavb\aula03\proj1::
formulário : timer.frm
projeto : timer.mak
- Inserir um botão
Name de comando:
= 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
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),
Propriedades), a cada 500
milisegundos o código relacionado ao evento Timer  será
 será executado.

- Executar o programa. Note que nada acontece, pois o evento Timer  não


 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


Scroll da
 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,
 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


BTNhabilita.Click o
 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

ocorre.  
- 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 mouse.. Veremos inicialmente dois
eventos de mouse (MouseDown e MouseMove
MouseMove), ), e nos próximos projetos discutiremos os demais.
(Picture Box),
Veremos também novos controles e novos métodos: a caixa de figura (Picture Box), o quadro combo (Combo
( Combo
Box),
Box ), o Frame
Frame e (List Box);
 e a caixa de listagem (List Box); e os métodos Circle e Move
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


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

Picture Frame

Comb

List

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
rolagem automaticamente é adicionada ao controle.
 As duas propriedades mais importantes são a ListIndex e a ListCount
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
Text informa seleci onado. Se nenhum item estiver selecionado, ListIndex
 informa o valor do item selecionado. ListIndex tem
 tem o valor zero
zero..

2.2) Métodos AddItem e RemoveItem


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

- Inserir uma List Box:


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

2.3) Combo Box Control


Um Combo Box combina
Box combina a utilização de um Text Box com uma List Box - 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
ListIndex,, e os métodos AddItem e RemoveItem
RemoveItem,, têm o mesmo funcionamento
que no controle List Box.
Box. 

- Inserir um quadro combo:


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

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 é
Box é uma caixa que pode mostrar uma figura a partir de um arquivo gráfico ( bitmap
bitmap,,
icon,, metafile
icon metafile),
), e a partir da versão 5.0 do VB,
VB , arquivos JPEG e GIF.
GIF . A figura mostrada é definida pela propriedade
Picture..
Picture
- Inserir três caixas de figura, não alterando a propriedade Name
Name,, e definir a propriedade picture de cada uma delas,
escolhendo uma figura do diretório C:\windows
C:\windows..
(Essa escolha é feita clicando-se duas vezes sobre a propriedade Picture
Picture do
 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
significam os seguintes argumentos: Button As Integer, Shift As Integer, X As Single, Y As Single.
o seguinte: Single. Eles
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:
Shift define

VALOR ALT
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
 e Y são
 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
Move picture para
 para as coordenadas X e Y. O controle movido depende de qual item do controle Combo
Box está
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:
ScaleMode
0-User (É definido pelas propriedades ScaleHeight, ScaleWidth, ScaleLeft, e ScaleTop) ,
1-Twip (default - 1440 Twips 
Twips por polegada; 567 Twips 
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)
 (centímetros)

ScaleHeight/ScaleWidth:: Determina o número de unidades (de acordo com ScaleMode


ScaleHeight/ScaleWidth ScaleMode)) para a área interna
vertical e horizontal, respectivamente.
ScaleLeft//ScaleTop
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


left é
 é obrigatório):

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

2.8) O Evento MouseMove


- No evento MouseMove
MouseMove do
 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
End If X, Y
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
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
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


MouseMove   e MouseDown
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
picture para
 para as coordenadas X eY. O controle movido depende de qual item do controle Combo
Box
Box está
 está
Y, com umselecionado. Se o botão
raio de 70 unidades pressionado
(definida for o da direita,
pela propriedade é desenhado
ScaleMode).
ScaleMode ). um círculo (método Circle) na posição X,
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 escala (ScaleMode,
Valor Single que indicaoScaleTop,
ScaleLeft, raio da figura. A medida
ScaleHeight andéScaleWidth).
determinada pelaspropriedades de
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,


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,


VB, a função QBcolor()
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
c:\aulavb\aula04\proj1::
formulário :menu.frm
projeto : menu.vbp

3.1) Menu

Para criarmos
Tools - Menu Editor , ouum menu em
clicamos um formulário,
as teclas E>, eutilizamos
<Ctr E>, o Menu
a janela que Editor
permite do VB.
a criaçãoVB
do. menu
Escolhemos a opção de 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
Caption,, Name
Name,, Index
Index,, Visible
Visible,, Checked
Checked   e Enabled
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 .
Design box . Os botões
de setas da janela permitem a criação de d e 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


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


click do
 do menu MNSvermelho
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()
Qbcolor() é
 é uma função do VB,
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
MNSvermelho,, e
habilitando os itens MNSverde e MNSbranco.
MNSbranco . Os códigos dos eventos click dos
click  dos demais itens de menu relacionados
com as cores devem produzir resultados semelhantes:

- Inserir o seguinte código no evento click


click do
 do menu MNSazul
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


click do
 do menu MNSbranco
MNSbranco::

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

- Inserir o seguinte código no evento load


load do
 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
WindowState de
 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


click do
 do item de menu MNSminimizado
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
MNSminimizado e  e habilitar os
itens MNSnormal
MNSnormal   e MNSmaximizado
MNSmaximizado.. Obviamente os eventos click
click do
 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 Enabled modificadas
 modificadas de
acordo, pois nenhum evento click foi
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
Resize.. Ele
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


Resize do
 do formulário FRMmenu
FRMmenu o
 o seguinte código:

Sub Form_Resize ()
If FRMmenu.WindowState
MNSminimizado.Enabled= =0 True
Then
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
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
Enabled de
 de cada item de menu apropriadamente. Como é exatamente isso que
faz o código do evento Resize,
Resize , e como este evento ocorre sempre que um item desses é selecionado (devido a
instrução que altera a propriedade WindowState
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, 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
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 
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
Cores irá
 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
Cores aparece
 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
False..

4 - FORMULÁRIO MDI

4.1) MDI Form


Um formulário MDI
MDI ( multiple-document interface)
 (multiple-document interface) é uma janela que atua em background na aplicação e que
pode conter formulários que têm a propriedade MDIChild
MDIChild definida
 definida em True
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
Word 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.
Form.
Cada aplicação só pode conter um MDI MDI,, mas vários formulários filhos (MDIchild)
(MDIchild). A barra de menu dos
formulários filhos é automaticamente aplicada ao MDIForm
MDIForm,, quando o formulário filho é ativado. Um MDIchild
minimizado aparece como um ícone dentro do MDIForm
MDIForm..
Um formulário MDI só pode conter Menu
Menu e
 e PictureBox
PictureBox,, ou controles que posuam a propriedade Align
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
MNSnovo &Primeiro
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, 0, MDIForm1.Arrange 1 e 1 e MDIForm1.Arrange 2,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
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


MDIchild para
 para True
True;;
- inserir um CommandButton e um ListBox neste formulário, atribuindo os seguintes valores à propriedade
Name desses
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
Name.. Quando, em tempo de projeto, nomeamos dois controles com o mesmo nome, o VB nos VB nos pergunta
se desejamos criar um vetor com esses controles.
Para que o vetor possa existir, a propriedade Index
Index dos
 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
Index  de um controle o valor 0 (zero), e usar o método Load
Load,, como veremos adiante.
- Atribuir à propriedade Index
Index do
 do controle BTN
BTN o
 o valor 0 (zero)

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


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
MDI.. A palavra chave New
New usada
 usada
com a declaração Dim
Dim cria
 cria uma matriz de objetos Form
Form,, com as características do controle formulario
formulario,, deste projeto. A
instrução Load
Load carrega
 carrega o controle formulário
formulário..

- Inserir mais essas linhas de código no MDI


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 NovoNovo é  é 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á
Static,
incrementada de 1, e conseqüentemente a matriz de formulários também, devido a ReDim Form(i).
Form(i). O último formulário
dessa matriz (índice i) é carregado, e sua propriedade Caption
Caption recebe
 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
Word..

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


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 


BTN_Click  tambem é delarada uma variável StaticStatic,, e cada vez que esse evento
ocorrer acontecerá o seguinte: será adicionado um elemento ao controle List1
List1,, mostrando o valor da variável i; um novo
controle BTN será carregado, com a propriedade Index Index   uma unidade maior do que a do controle anteriormente
carregado, e com a propriedade Caption
Caption mostrando
 mostrando a string "botão " seguida do valor da variável i.
Observe que as propriedades Left e Top Top do
 do novo controle BTN
BTN   são configuradas de forma que o controle
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
formulário por
 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


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
d e 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
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


controles referentes ao Sheridan 3D Controls estejam
estejam disponíveis, é necessário qu
quee 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.
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


FRMmensagem um
 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 Name   BTNsair, um em cada formulário. Para
referenciar os controles, é necessário que se informe
i nforme a qual formulário ele pertence:
Por ex.: FRMmsg.BTNsair  ou  ou FRMinicial.FRMsair  

- Inserir o seguinte código no evento click


click do
 do botão FRMjanelas.BTNmensagemp
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
métodos   são aplicados a formulários, e fazem com que o formulário seja carregado (Load
( Load)) e
(Unload)) da memória. Quando um formulário é carregado, o evento
descarregado (Unload evento   Load
Load   ocorre, e quando ele é
descarregado, o evento
evento que
 que ocorre é o Unload
Unload..

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


E ventos Activate e Deactivate
(show)) e escondido
Esses métodos são aplicados a formulários, e fazem com que o formulário seja mostrado (show
(Hide
Hide).
). Quando um formulário é mostrado, o evento
evento   Activate
Activate ocorre,
 ocorre, e quando ele é escondido, o evento
evento que
 que ocorre é
o Deactivate
Deactivate..
Se um formulário não estiver carregado na memória, o método ShowShow primeiro
 primeiro carrega (ocorre o evento Load)
Load)
e depois mostra o formulário (ocorre o evento Activate).
Activate).
O método Show
Show   tem um parâmetro, que informa se o formulário é modal
modal   ou não. Um formulário é modal
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 ShowShow   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
click acima
 acima mostra o FRMmensagem
FRMmensagem da  da forma modal.

- Inserir o seguinte código no evento click


click do
 do botão FRMmensagem.BTNok
FRMmensagem.BTNok::

Sub BTNok _Click ()


FRMmensagem.Hide
End Sub

Este código esconde o formulário.

1.5) Janelas Personalizadas


clica mos no botão Mensagem
- Executar o programa, e verificar o que ocorre quando clicamos 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


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

- Incluir no formulário
formulário  FRMsair um label
label e
 e dois botões de comando,
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


click do
 do botão FRMjanelas.BTNsairp
FRMjanelas.BTNsairp::

Sub BTNsairp _Click ()


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

- Inserir o seguinte código no evento click


click do
 do botão FRMsair.BTNsim
FRMsair.BTNsim::
Sub BTNsim _Click ()
End
End Sub
Este código encerra o programa.

- Inserir o seguinte código no evento click


click do
 do botão FRMsair.BTNnao
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
MsgBox mostra
 mostra uma mensagem em uma caixa de diálogo (fig. 4.6), e espera que o usuário clique
d iálogo. Tem os seguintes parâmetros: msg
em um botão desta caixa de diálogo. msg,, buttons
buttons,, title
title..

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


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

fig 4.6 - MsgBox

33
 

Ela pode ser usada como function


function   ou como procedimento (statement
statement).
). Se for usada como function
function,, ela
retorna um valor e os parâmetros devem vir entre parênteses; se for usada como procedimento
procedimento,, não é retornado valor
e não se usa parênteses.
Os valores retornados, no caso de ser usada como function
function,, dependem dos botões mostrados. Tanto os
valores de retorno (para o caso de function
function)) quanto os valores para o argumento type
type podem
 podem ser consultados na ajuda
on line 
line  (help
help))  do VB.
VB. Serão mostrados abaixo os valores mais usados para o argumento buttons
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
56 Ignorar
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
(Ok e
um botão (Ok  e Cancel
Cancel).
). Tem os seguintes parâmetros: prompt
prompt,, title
title,, default
default,, xpos
xpos,, ypos
ypos..

*prompt:
*prompt: Define a mensagem. É uma string
string..
*title::
*title Define o título da caixa. É uma string
string..
*default::
*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
string..
*xpos,, ypos
*xpos ypos:: Definem as distancias do alto e do lado esquerdo da tela, em twips
twips.. É uma expressão
numérica.

InputBox só pode ser usada como function


function.. O pressionamento do botão CancelCancel   faz com que o valor
retornado seja uma string nula. O pressionamento do botão Ok
Ok retorna
 retorna o que foi digitado pelo usuário.

- Inserir outro Panel3D


Panel3D,, conforme a fig 4.2, com as seguintes propriedades:
Name = Panel3D2
Caption = Predefinidas

fig 4.7 - InputBox

- Inserir dois frames


frames,, dentro do painel, com as seguintes propriedades:
Name =Frame1 Caption = MsgBox
Name =Frame2 Caption = InputBox

34
 

 
- Dentro do frame1
frame1,, inserir os seguintes controles:

CONTROLE NAME CAPTION


Command Button BTNmensagem Mensagem
Command Button BTNsair Sair

- Inserir o seguinte código no evento click


click do
 do botão BTNmensagem
BTNmensagem::

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


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

Dim X
X = MsgBox("Deseja sair do programa?", 36, "Confirma
" Confirma saída")
If X = 6 Then
End
End If
No primeiro caso, MsgBox
MsgBox   é usada como statement
statement,, e o valor 16 como argumento type
type,, define que será
mostrado a figura Stop
Stop e
 e um botão Ok
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
MsgBox   é usada como function
function.. O valor 36 como argumento type define que serão
(Sim e Não
mostrados dois botões (Sim Não)) e a figura 4.8:

fig 4.8 - Ícone de interrogação

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

- Dentro do frame2
frame2,, inserir os seguintes controles:

CONTROLE NAME CAPTION


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

- Inserir dois labels


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

- Inserir o seguinte código no evento click


click do
 do botão BTNnome
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


caption dos
 dos dois labels, mostra uma InputBox
InputBox e
 e coloca o valor de retorno como caption
do label LBL1
LBL1..

- Inserir o seguinte código no evento click


click do
 do botão BTNnumero
BTNnumero::
Dim numero As String
LBL1.Caption = ""
LBL2.Caption = ""
numero = InputBox("Digite um número", "Demonstração")
" 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
caption dos
 dos dois labels, mostra uma InputBox
InputBox e
 e verifica se o valor retornado é numérico,
através da função IsNumeric
IsNumeric.. Esta função verifica se um argumento String
String   pode ser considerado um número,
retornando True
True ou
 ou False
False..
Se foi digitado um valor numérico, o valor de retorno é colocado como caption do label LBL1
LBL1..

1.8) Função IsDate


- Inserir o seguinte código no evento click
click do
 do botão BTNdata
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 
dia 

Este código limpa o caption


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

1.9)foi
Se Função WeekDay
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
WeekDay
à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
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
Windows.. Uma caixa de diálogo comum pode ser vista
vi sta na figura 5.1.

36
 

 
fig 4.9 - A caixa de diálogo Salvar Como

O VB 
VB  oferece um controle que permite exibir facilmente caixas de diálogos, que é o CommomDialog
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


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 ( File,,  Font,
Font,  Color ,  Print)
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
Action deste
 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  
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


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 


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 Action.. A
propriedade Cancel
Cancel indica
 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
FileName  retorna o nome do Path e do arquivo selecionado (se Action = 1).
1). Filter   especifica o filtro que será mostrado
mostrado
na ListBox Type da
Type da janela, em tempo de execução (para Action = 1),
1), e representa o tipo de arquivo que será mostrado
na janela. Color retorna a cor selecionada (para Action = 3).
3).

- Inserir no evento click


click do
 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 CMdialog1.Color
FRMdialogos.BackColor o formulário

38
 

  Exit Sub
2:
If Err = 32755 Then
Exit Sub
Else
MsgBox "Algum erro ocorreu!", , "Aviso"
End If
Exit Sub

End Sub

propriedadeComo podemos
Color ver, Action
representa Action foi
a cor foiescolhida
definida em
pelo3,usuário,
o que significa que uma
e é utilizada caixa
para de diálogo
mudar a cor de
decores
fundoiráde
aparecer.
todos osA
controles do formulário, inclusive o próprio.
Como a propriedade Cancel
Cancel é
 é True, se o usuário clicar no Botão Cancel da
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 paraVB para que o controle do programa vá para o
 2,, caso algum erro ocorra. Se o usuário escolher o botão Cancel
label 2
label Cancel,, ocorrerá o erro 32755, e o código após o label 2
label 2  
é executado. Maiores informações sobre o controle de erros será visto adiante.

- Inserir no evento click


click do
 do botão BTNarquivo
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


ar quivos
'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


Action foi
 foi definida em 1, o que significa que uma caixa de diálogo Abrir  irá
  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 a arquivo
rquivo (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".
"Texto|*.txt|Desenho|*.bmp".

39
 

2.2) Métodos ShowColor, ShowFont,


ShowFont, ShowOpen, ShowSave e ShowPrinter
 A propriedade Action se manteve no VB5 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 ShowFont,, ShowOpen
ShowOpen,, ShowSave
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


FileName informa
 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 ClickClick do
 do botão BTNcor  ocorre
 ocorre novamente.
 A linha de código ext = Mid$(nome_arquivo, Len(nome_arquivo) - 2, 3) coloca na variável ext ext,, a extensão do
arquivo (as últimas três letras do nome do arquivo). Isto é feito com a utili zação de duas funções relacionadas a strings
utilização strings.. 

2.3) A Função Len


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

2.4) A Função Mid


Essa função retorna, de um argumento String
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.
VB. Ele tem dois argumentos:
o nome do programa (que deve ser uma String
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


Shell   do VB,
VB, será executado, e quando for terminado, devolve o
controle ao programa chamador.
Portanto, a parte do código referente ao Select
Select,, usa a extensão do arquivo para iniciar o aplicativo adequado
(Pbrush
Pbrush para
 para um arquivo .bmp
.bmp,, e Notepad
Notepad para
 para um arquivo .txt
.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.


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.
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
Shape
arredondado ou um quadrado arredondado.

Shape

fig 5.1 - o ícone do Shape Control

O que determina qual figura será desenhada é a propriedade Shape


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. 


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


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
Line),
), alterando a propriedade Name de cada controle de acordo com o Caption
Caption..
Em relação a Barra de Rolagem, alterar as propriedades MaxMax,, Mim
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
Line
ferramentas é mostrado na figura 5.3.
Da mesma forma que no controle Shape
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
segui da 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


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

1.3) O Controle SpinButton


Este contrloe incrementa e decrementa números. Clicar em um SpinButton
SpinButton altera
 altera somente o valor do próprio
SpinButton.. Você pode escrever o código que utiliza o SpinButton
SpinButton SpinButton para
 para atualizar o valor exibido de outro controle. Por
exemplo, você pode utilizar um SpinButton
SpinButton para
 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
SpinButton,, você deve atribuir o valor do SpinButton
SpinButton à à parte exibida
de um controle, como a propriedade Caption
Caption   de um Label
Label   ou a propriedade Text
Text   de um TextBox. Para criar um
SpinButton horizontal
SpinButton  horizontal ou vertical, escolha o valor apropriado da propriedade
propriedade  Orientation
Orientation..
 A propriedade padrão de um SpinButton
SpinButton é  é a propriedade Value
Value,, e o evento padrão de um SpinButton
SpinButton   é o
evento Change
Change.. No nosso projeto usaremos os eventos SpinDown e SpinUp SpinUp,, que ocorrem quando o usuário clica com
o mouse na seta inferior ou superior, respectivamente, de um controle SpinSpin..

- Inserir quatro controles SpinButton


SpinButton   no formulário, conforme a figura 5.2, e nomeá-los como spin1
spin1,, spin2
spin2,,
spin3 e
spin3  e spin4,
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 Spin;; e LBL1,LBL2, LBL3 e LBL4 para os outros. Nestes últimos, definir a propriedade
Caption com
Caption  com os valores X1, X2, Y1, e Y2, conforme a figura.

Spin

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
End Sub = LBLy2.Caption
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,


X2, Y1 e Y2 do controle Line
Line com
 com o valor da propriedade
Value dos
Value dos controles Spin
Spin respectivos.
 respectivos.

2 - OS MÉTODOS GRÁFICOS

São semelhantes aos controles gráficos,


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),
Propriedades ), os métodos
métodos  gráficos só podem ser utilizados em tempo de execução.
Veremos os métodos Pset
Pset,, Line
Line e
 e Circle
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.
Form. Nomear o novo
formulário como FRMgrafic2
FRMgrafic2,, e salvá-lo como Grafic2.frm
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
 verifica quais variáveis têm o valor 1, e desenha as figuras respectivas.
Inserir 6 botões de comando, um controle Timer  e   e três Frames
Frames,, posicionando-os e alterando as propriedades
Caption (quando for o caso) 
caso)  conforme a figura 5.5. Não esqueça de alterar a propriedade Interval do controle Timer
para  1.
para

44
 

fig 5.5 - o segundo formulário desse projeto

O botão com o Caption


Caption “Outro
 “Outro Formulário” servirá para alternar o formulário ativo, devendo ser colocado um
botão idêntico no formulário FRMgrafic1
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
Click()
() do botão semelhante do formulário FRMgrafic1
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 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
 do controle Timer1
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
Caption dos
 dos botões, além de
limpar o formulário com o método Cls
Cls..

2.1) O Método Cls


e xecução, de um Formulário
Limpa texto e gráficos gerados em tempo de execução, Formulário ou
 ou de uma Picture Box.
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

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

‘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
valor 1. Se queinstruções
tiver, as cada bloco If  verifica
dodebloco
 verifica se a variávele global
são executadas, adequada
as figuras (VRpontos, VRlinhas
são desenhadas; ou VRcirculos)
caso contrário, teméo
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


IF existe comuns: 
 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
Rnd.. Essas variáveis
variáveis serão usadas, no código, como argumentos da
função RGB()
RGB(),, que será vista adiante.

2.3) A Função RGB


  Retorna um inteiro Longo (Long
Long)) que representa uma cor no padrão RGB RGB,, que é o padrão usado no Windows
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
se us valores são inteiros.
46
 

 
Observe que após as instruções comuns, cada bloco de If  inicializa
  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) 1)  pelo valor da propriedade ScaleWidth
ScaleWidth (largura
 (largura útil do formulário) ou
pelo valor da propriedade ScaleHeight
ScaleHeight (altura
 (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


object qual o ponto será desenhado.
Step  Palavra chave que especifica
Step  especifica que as coordenadas
coordenadas são relativas à posição corrente dada pelas
propriedades CurrentX
CurrentX e
 e CurrentY
CurrentY..
x, y 
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.
object
Step   Palavra chave que especifica
Step especifica que as coordenadas
coordenadas são relativas à posição corrente dada pelas
propriedades CurrentX
CurrentX e e CurrentY
CurrentY..
x1, y1 
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.
Step
x2, y2 
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
object qual o círculo será desenhado.
Step   Palavra chave que especifica
Step especifica que as coordenadas
coordenadas são relativas à posição corrente dada pelas
propriedades CurrentX
CurrentX e
 e CurrentY
CurrentY..
x, y 
y  Valores Single que indicam as coordenadas horizontal e vertical do centro do círculo (ou do arco ou
da elipse).
radius Valor  Single
 Single que indica o raio da figura.
color  
Start Cor RGB especificada para a figura.

47
 

  End 
End  Valores Single
Single que
 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
aspect Single que
 que indica se a figura será um círculo (valor 1.0) ou uma elipse
eli pse (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 em
 propriedade, pelos métodos
tempo Pset,
de projeto,
projeto Linecomo
, e veja e Circle, respectivamente.
respectivam
os pontos, linhas eente.
círculosExperimente alterar o valor dessa
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
Box  Control   e a Image Control.
Control. Na terceira aula foi apresentado o controle Picture Box,
Box, e agora veremos mais
alguma coisa referente a esse controle, além do controle Image
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,
i magem seja atribuído à propriedade Picture
ou .dib) que contenha informações sobre a imagem Picture..
Possui ainda a propriedade AutoSize
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
Picture deve
 deve ser configurada da
mesma forma que no controle anterior.
Possui a propriedade Stretch
Stretch,, que dimensiona a figura de acordo com o tamanho do controle (o contrário da
propriedade AutoSize
AutoSize do
 do controle Picture
Picture).
).

- Incluir um novo formulário no projeto:


Name = FRMgrafic3
Caption = Imagens

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


grafic3.frm..

- Incluir 7 botões
botões,, 2 chek box,
box, dois labels
labels,, um controle Picture
Picture e
 e outro Image
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.

utili zada, não alterando os nomes da Picture


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

- Incluir um CMdialog Control,


Control, configurando a propriedade Filter  para
 para BMP|*.bmp| ICO|*.ico.
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


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

- Inserir os códigos abaixo nos eventos click


click dos
 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


c ontrole (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


click dos
 dos controles CheckBox
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


AutoSize e
 e Stretch
Stretch,, dos controles respectivos, tornando-
as True ou False
False,, conforme a propriedade Check
Check do
 do controle CheckBox
CheckBox..

- Inserir no evento click


click do
 do controle BTNoutro
BTNoutro::
Sub BTNoutro_Click ()
FRMgrafic1.Show
FRMgrafic2.Hide
FRMgrafic3.Hide
End Sub

 Ajuste os códigos dos eventos Click


Click dos
 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
Name.. Quando, em tempo de projeto, nomeamos dois controles com o mesmo nome, o VB nos VB nos pergunta
se desejamos criar um vetor com esses controles.
Para que o vetor possa existir, a propriedade Index
Index dos
 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
Image2).
).

(Ctrl - C).
Com esse controle selecionado, copie para a área de transferência (Ctrl C). Clique sobre o formulário, e cole
(Ctrl - V)
V) o conteúdo da área de transferência. O VB perguntará se você deseja criar um vetor de controles com o
objeto Image2
Image2.. Responda sim e vá colando novos controles Image2
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 Index,, à exceção do
(Index =
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
Index..
 A exceção do primeiro, altere a propriedade Visible para  False de
para False  de todos os controles. Atribua à propriedade
Picture do
Picture
os  do controle
controles com Index
que se seguem, em= ordem.
1 o arquivo“c:\vb\icons\elements\moon01.ico”.
Caso não encontre esses arquivos ou oAtribua osuse
diretório, arquivos subsequentes
o pbrush
pbrush para para
 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
q ue não é mostrada quando o programa for executado.

fig 5.7 - posicionamento dos controles Image2

- Inserir um controle Timer  no


 no formulário, atribuindo 100 para Interval
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
Timer1 estiver
Timer1 estiver o botão
habilitado, BTNlua,
BTNlua
o evento , se o Timer1
Timer1 
Timer1_Timer()   estiver
ocorre habilitado,
de 100 ele é desabilitado,
em 100 milisegundos e vice-versa.
(conforme Enquanto o
valor da propriedade
Interval).
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
Picture   do controle Image2(0)
Image2(0)   recebe o valor da propriedade
Picture de
Picture movimento. 
 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
Área   de
de   Transferência
Transferência   do Windows
Windows e
 e como tratar
os erros. Isto será feito ao desenvolvermos um programa semelhante ao Bloco de Notas do
Notas do Windows
Windows..
Para isso, devemos abrir um novo projeto, nomear o formulário como FRMbloco FRMbloco,, e salvá-lo como
c:\aulavb\aula07\proj1\bloco.frm.. Salvar o projeto como c:\aulavb\aula05\proj2\bloco.vbp
c:\aulavb\aula07\proj1\bloco.frm c:\aulavb\aula05\proj2\bloco.vbp..
O programa terá a aparência da figura 5.6..
- Inserir um quadro texto, nomeando-o como TXTbloco
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
Resize e
 e no evento Load
Load do
 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
Menu com
 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
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


nome_arquivo.. Essas variáveis são
utilizadas para abrir e referenciar um arquivo.
O código do evento MNSnovo_click
MNSnovo_click limpa
 limpa o conteúdo do TXTedição
TXTedição e
 e da variável nome_arquivo
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


MNSabrir_click usa
 usa o Cmdialog1
Cmdialog1 para
 para mostrar a janela de diálogo que permite selecionar
(Action =
um arquivo para abertura (Action 1). 
 = 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
r eferenciado 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
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
Append Binary,, Input
Input,, Output
Output   e Random
Random.. Os modos Append
Append,, Input
Input   e Output
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
Binary abre
 abre
um arquivo em modo binário, e Random
Random abre
 abre um arquivo para acesso aleatório.
al eató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..
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
Open..

É possível agora entender o código do evento MNSabrir_Click (). (). O código usa a função Open
Open para
 para abrir o
arquivo escolhido pelo usuário, através do controle Cmdialog1
Cmdialog1   (variável nome_arquivo
nome_arquivo), ), no modo Input
Input,, com o
número retornado pela função FreeFile
FreeFile (variável (Input),, o arquivo é aberto para leitura.
 (variável numero_arquivo). Neste modo (Input)
 Após abrir o arquivo, o conteúdo dele é copiado para a propriedade TextText   do controle TXTedição
TXTedição,, sendo o
arquivo fechado logo em seguida, pela função Close
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.
evento  MNSsalvar_click 
Tanto o código do evento  MNSsalvar_click  quanto o do evento MNSsalvarcomo_Click
MNSsalvarcomo_Click,, abrem um arquivo
para gravação, usando Open
Open   no modo Output
Output.. A diferença é no evento MNSsalvarcomo_Click a variável
nome_arquivo tem
nome_arquivo  tem seu valor alterado, através da chamada ao controle Cmdialog1
Cmdialog1,, com Action
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
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


i tens 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 
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..
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
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
e m 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
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 é 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 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 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
  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
FRMagenda,, e salvá-lo como agenda.frm
agenda.frm.. Salvar o projeto
como agenda.vbp
agenda.vbp..
 A aparência final do programa, quando em execução, é a da figura 6.1:

LBLagend

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


LBLnome,, LBLtelefone
LBLtelefone,, LBLcomentarios
LBLcomentarios   e
LBLagenda. A propriedade Caption de cada label deve ser a que aparece na figura, a exceção do LBLagenda
LBLagenda. LBLagenda,, que
deve ter essa propriedade vazia. Esse último label será usado para informar qual registro está sendo acessado (parte
(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


Caption   de cada um deles,
conforme a figura. Por exemplo: BTNnovo
BTNnovo ( Caption =
 (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
TXTnome próximo
 próximo ao LBLnome
LBLnome..

55
 

4.1) A Declaração Type


Esta declaração permite a definição de um tipo de dado definido pelo usuário, usuário, composto de um ou mais
elementos.
O VB oferece os tipos de dados padrões (integer 
(integer , string
string,, boolean
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
módulo no
 no projeto, salvando-o como agenda.bas
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.
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


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

Dim x as informação

cria uma variável chamada x que é do tipo informação


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

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

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

na  seção de declarações do formulário:


- Escrever o seguinte código na seção 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

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

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


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
corrente_registro = 1 = True
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
inpubox mostrada
 mostrada ao iniciar o programa. O
que for digitado pelo usuário é retornado pela função inpubox
inpubox para variável nome_arquivo..
 para a variável nome_arquivo

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

Observe que o comando OpenOpen   abre o arquivo no modo Randon


Randon.. O tamanho dos registros desse arquivo é
(Len = tamano_registro).
definido pelo último argumento (Len tamano_registro). Verifique que o valor da variável tamanho_registro
tamanho_registro é é o nº de
bytes da variável pessoa
pessoa..
 A variável ultimo_registro
ultimo_registro calcula
 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 des
desabilitados.
abilitados. 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 é
corrente_registro
chamado o procedimento de usuário mostra_registro
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
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
get lê
 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
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
mostra_registro   verifica se existe algum registro no arquivo, verificando a variável
ultimo_registro.. Caso exista, o arquivo é lido (função Get()
ultimo_registro Get())) na posição determinada pela variável corrente_registro
corrente_registro,, e
o valor é colocado na variável pessoa
pessoa.. Observe como as variáveis numero_arquivo
numero_arquivo,, corrente_registro
corrente_registro e
 e pessoa
pessoa são
 são
passadas para o procedimento get get..
Por fim, na última linha, o label LBLagenda
LBLagenda informa
 informa qual o nº registro (variável corrente_registro
corrente_registro)) que está
sendo acessado, e quantos registros (variável ultimo_registro
ultimo_registro)) existem no arquivo.

-Inserir no evento click


click do
 do BTNnovo
BTNnovo o
 o seguinte código:

Sub BTNnovo_Click () = "Registro Novo"


LBLagenda.Caption
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
ultimo_registro   e
corrente_registro  são incrementadas, e os botões e quadro textos são habilitados e desabilitados conforme a
corrente_registro 
necessidade. Observe que a variável clicou_novo
clicou_novo recebe
 recebe o valor True
True.. Isto é feito porque, como veremos adiante, os
eventos change
change dos
 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&( &H0&),
), o que
significa que os dados que aparecem nos textos não foram gravados ainda.

- Inserir no evento click


click do
 do controle BTNgravar  o código: 
 o seguinte código: 

Sub BTNgravar_Click ()
If TXTnome.Text = "" Then
MsgBox "É necessário preencher o nome!", , "Impossível
" 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,
Get
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 lilinhas).
nhas).
Verifique que ele também habilita e desabilita os botões, torna os textos dos quadros textos vermelhos
(propriedade ForeColor   = &HFF&
&HFF&),), e usa o comando put put   para gravar no arquivo (referenciado pela variável
numero_arquivo),
numero_arquivo ), na posição determinada pela variável corrente_registro
corrente_registro,, o conteúdo da variável pessoa
pessoa.. Note que
antes da chamada a esse comando (put)(put),, a variável pessoa
pessoa teve
 teve os seus diversos elementos atualizados pelos valores
dos quadros textos (linhas 12, 13 e 14).
Observe que a variável clicou_novo
clicou_novo recebe
 recebe o valor False
False ao
 ao final do evento, só tornando a ficar True caso o
botão Novo
Novo seja
 seja novamente pressionado. Isto ocorre porque durante esse evento, serão chamados os eventos change change  
decisões.  
dos quadros textos, e os códigos nesses eventos verificam o valor dessa variável para tomar decisões.

- inserir nos eventos change


change dos
 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 pessoa.. Se esses
conteúdos
fique forem
claro que diferentes,
houve a cor dos
uma alteração notextos muda
registro, para
e que preto,
essa e os botões
alteração sãogravada
pode ser habilitados/desabilitados de forma
ou cancelada (os botões que
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
change;;
3) quando clicar o botão Excluir , pois nesse evento os quadros também têm seus textos alterados, como
veremos adiante;
quando clicar o botão Cancelar , pois nesse evento os quadros também têm seus textos alterados, como
4) quando
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
 ou clicou_cancelar  
estão com valor true
true..

 A variável clicou_change
clicou_change recebe
 recebe o valor True
True no
 no final do evento, pois é verificada no código do evento click
do botão BTNcancelar .
- Inserir no evento click
click do
 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
TXTfone.Enabled ==True
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
clicou_change,, que é True
True   caso o usuário tenha digitado texto do re registro
gistro corrente
(conforme  , foi
clicou_... ,
clicou_... paravisto nos eventos change
change 
habilitar/desabilitar   dos mostrar
os botões, quadro outextos).
não umObserve
registro,que os   If’s 
os  If’s  doo código
e apresentar númeroverificam ascorrente
do registro variáveis
e
o número de registros.
Não deixe de entender porque as variáveis clicou_...
clicou_... recebem
 recebem False
False ao
 ao final do evento.

- Inserir o seguinte código no evento click


click do
 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
Get #numero_arquivo, Then
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
BTNprocurar.Enabled= True
= 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
mostra_registro = 1

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
q uer deletar).
O arquivo com a extensão tmp
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
tmp_pessoa,, que por sua vez tem seu conteúdo gravado no arquivo .tmp .tmp,, a exceção do registro corrente.
Temos então dois arquivos,
Em seguida, sendo
o arquivo que oé .tmp
original .tmp é
 é uma
fechado, réplica
sendo do original,
del etado
deletado menos o registro
pelo procedimento Kill..corrrente.
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> 
<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> 
<nome_novo> 

O arquivo .tmp
.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.
e xcluído.
- Inserir o código a seguir no evento click
click do
 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
mostra_registro = aux_corrente_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
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
aux_pessoa,, que tem seu conteúdo comparado
com o nome digitado pelo usuário na InputBox
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 MsgBoxMsgBox informando
 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
UCase   recebe um argumento string
string   e retorna uma cópia dessa string
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
Lcase funciona
 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
Trim   também recebe um argumento string
string   e retorna uma cópia dessa string
string,, só 
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
LTrim   e RTrim removem os espaços em branco do início e do final de uma string,
respectivamente.

- Inserir nos eventos click


click dos
 dos botões Próximo
Próximo e
 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!"
" 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
mostra_registro,, tendo antes incrementado ou decrementado a variável
corrente_registro..
corrente_registro
Para finalizar o nosso projeto, vamos incluir um menu com os seguintes ítens:

Name Caption

MNParquivo
MNSabrir &Arquivo&Abrir

63
 

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

No evento click do item Abrir , colocar uma chamada ao evento Form_load


Form_load,, da seguinte maneira: 
maneira: 

Private Sub MNSabrir_Click()


form_load
End Sub

Isso
execução. No permitirá quedooitem
evento click usuário
Sair , possa escolher
obviamente um ooutro
colocar arquivo
comando End.de
End . agenda, mesmo com o programa em
No evento click do item Sobre
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),
Form), atribuir para a propriedade Name
Name   o valor FRMsobre
FRMsobre,, e salvá-lo no diretório do projeto, com o
nome de sobre.frm
sobre.frm..
É possível agora criarmos uma janela de informações sobre o programa, que sserá
erá 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
Sobre programas for Windows existentes.
 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
Show).).

64
 

CAPÍTULO VII
Neste capítulo veremos como manipular banco de dados utilizando um controle do VB, VB, O Data Control.
Control. O
programa criado no capítulo anterior será revisto, e o arquivo de registro criado será no formato .mdb
.mdb,, que é o tipo de
arquivo manipulado pelo Access
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
tabelas,, que por sua vez são formadas por um conjunto de
registros,, estes últimos contendo campos
registros campos..
Uma tabela
tabela representa
 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
ci tados anteriormente.
Cada elemento desses conjuntos (um funcionário, um livro ou um fornecedor) será um registro 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
campos das 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 tabelatabela   que representar esse conjunto, ela
deverá ser organizada com os campos
campos nome,
 nome, endereço, telefone, identidade, e assim por diante.
Podemos imaginar uma tabela
tabela   como sendo composta de linhaslinhas   e colunas
colunas,, as linhas
linhas   representando os
registros,, e as colunas
registros colunas os os campos
campos,, como no exemplo abaixo.

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

Observe que o campo


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

1.2) Banco de Dados MDB


Um Banco de Dados no formato MDB (Microsoft Data Base) Base) é um arquivo .mdb
.mdb   que pode conter várias
tabelas de dados, e que é reconhecido pelo programa Access
Access,, da Microsoft
Microsoft..
Na verdade, quando se quer criar uma ou mais tabelas de dados, é necessário a utilização de um programa
como o Access
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 
controle  do
do   VB que proporciona acesso aos dados armazenados em um arquivo de
banco de dados. O ícone na Caixa de Ferramentas é
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 FRMagenda,, e salvá-lo como
c:\aulavb\aula07\proj1\agenda.frm. Salvar o projeto como \aulavb\aula07\proj1\agenda.vbp
c:\aulavb\aula07\proj1\agenda.frm. como  \aulavb\aula07\proj1\agenda.vbp..

- Inserir um Data Control no


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


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

- Inserir oito botões de comando, nomeando-os e configurando a propriedade Caption


Caption   de cada um deles,
conforme a figura. Por exemplo: BTNnovo
BTNnovo ( Caption =
 (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
TXTnome próximo
 próximo ao LBLnome
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  Control  se
conecta com os seguintes: access
access,, dbase
dbase,, excel
excel,, lotus, texto, 
texto,  paradox
paradox   e foxpro
foxpro.. A definição de qual formato será
utilizado é feita configurando-se a propriedade Connect do controle de dados.

2.2) A propriedade DataBase

palavras,Essa
nestapropriedade
propriedadeseleciona o nome e a olocalização
deve ser especificado da origem
path e o nome dos que
do arquivo dados
serápara o Dataao
conectado Control
Control.. Em outras
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
DataBase  especifica o arquivo, RecordSource
RecordSource define
 define a origem dos registros. A origem pode ser uma tabela ou uma
instrução em SQL
SQL.. Se o valor dessa propriedade for mudado em tempo de execução, deve ser usado o método Refresh
Refresh  
sobre o data control, para habilitar a mudança.

66
 

 
fig 7.3 - definindo a propriedade conect do Data
do Data Control

Para o nosso projeto utilizaremos um arquivo chamado agenda.mdb


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
agenda
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
Access   ou no Visula Data
Manager .
O Visual Data Manager   é um utilitário que vem com o pacote
pacote do VB,
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 à


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

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

2.4) A propriedade Recordset


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

2.5) A propriedade RecordsetType


 A propriedade RecordsetType define qual o tipo do Recordset criado, que pode ser Dynaset
Dynaset,, Table
Table   ou
Snapshot.. Neste projeto, usaremos a propriedade com o valor Dynaset
Snapshot 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,VB, que pode ser conectado a um controle Data Control,
Control, desde
que esse controle esteja no mesmo formulário. Sem um Data Control,
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,
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


Name do
 do Data
Data  Control
Control do
 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
Recordset   ou o número total de registros em um
objeto Recordset
Recordset   tipo table
table.. Ela não indica quantos registros estão contidos em um objeto Recordset tipo dynaset
dynaset,,
snapshot ou
snapshot  ou forward only,
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
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
Recordset..
Observe que o código do evento click
click   do botão BTNnovo
BTNnovo   usa o método AddNew
AddNew   e habilita os textos e a
imagem, para que possam ser preenchidos pelo usuário. Também habilitam
habi litam e desabilitam os botões, conforme o cas
caso.
o.

Sub BTNgravar_Click ()
If TXTnome.Text = "" Then
MsgBox "É necessário preencher o nome!", , "Impossível gravar"
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
Recordset especificado
 especificado para edição, copiando o conteúdo para o buffer de arquivo.

recordset.Edit

registo.  Após a sua utilização, deve ser empregado o método Update


Update,, para que o conteúdo do buffer seja salvo no

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
AddNew  
ou Edit
Edit.. Ele grava o conteúdo do buffer do arquivo, no registro corrente.

4.5) A Propriedade Bookmark


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

recordset.Bookmark [ = variavel ]

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

69
 

4.6) A Propriedade LastModify


Essa propriedade contem o Bookmark
Bookmark do
 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
Recordset atualizável.
 atualizável. Após esse método ser executado, é
necessário mover
atual, é usado o apontador
o método de arquivo
MoveFirst,
MoveFirst para um
, que move registro válido,
o apontador para opois o registro
primeiro excluído
registro deixa de. existir.
do Recordset
Recordset. Esse eNo os projeto
outros
métodos associados à movimentação e à procura de d e 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
End Sub = True

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

código: 
- Inserir o seguinte código: 

SubError
On Image1_DblClick
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 ).
Then  ).
Vamos voltar a falar sobre o Data Control. Existem dois eventos principais associados a esse controle:
Validate e
Validate e Reposition
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
Reposition ocorre.
 ocorre. Toda vez que o usuário clicar em qualquer botão do Data Control,
Control, movendo-se de registro
em registro, ou usar
Portanto, os métodos
esse Move ou
Move
evento ocorre  ou Find
Find (que
sempre  (que serão
 que ovistos
depois que
depois no próximo
registro corrente capítulo)
passar a oser outroReposition
evento
s er registro. ocorre.

5.2 - O Evento Validate


O evento Validate ocorre antes
antes   de um registro diferente passar a ser o registro corrente, antes do método
Update,, e antes das operações Delete
Update Delete,, Unload
Unload e
 e Close
Close..
Possue dois parâmetros (como pode ser visto no código abaixo), que têm o seguinte significado:
O argumento Action
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
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,
UpdateRecord são
automaticamente essa mudança será salva.
Insira o seguinte código no evento Data1_Validate
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
BTNcancelar_click). (action=9),
=9), e o evento validate ocorre. A
variável clicou_cancelar neste momento é true, fazendo o argumento save = False
False,, impedindo que os métodos Edit e
UpdateRecord ocorram,
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  
'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


MNSnome e  e MNSregistro
MNSregistro.. Eles serão usados para ordenar o Recordset
Recordset por
 por
nome ou por ordem de entrada. Observe que isto é feito configurando-se a propriedade Data1.RecordSource
Data1.RecordSource com
 com uma
instrução SQL
SQL,, contendo ou não um comando order by. by. Se essa cláusula estiver presente, isto gera um Recordset
Recordset  
ordenado, caso contrário, é gerado o Recordset
Recordset   com os registros em ordem de digitação. Não esqueça que o
Recordset só
Recordset  só é gerado após o método Refresh
Refresh ser
 ser executado,.
Para maiores detalhes sobre a instrução SQL
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
Control para realizar o acesso a um arquivo de dados MDB
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
dados disponíveis no VB.
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
VB são os seguintes: DataBase
DataBase e
 e Recordset
Recordset..
Enquanto que o Data Control oferece
Control oferece facilidade no manuseio de um Banco de Dados, os Objetos de Dados 
Dados 
permitem uma maior flexibilidade, porém com o ônus de uma maior codificação.
1.1) Objeto DataBase
( mdb,, por exemplo). Sua função
Um objeto database é usado para referenciar um arquivo de Banco de Dados (mdb
pode ser comparada à propriedade DataBaseName
DataBaseName   do Data Control.
Control. A declaração de um objeto database é feita da
seguinte forma:

Public <nome_objeto>
Public <nome_objeto> as DataBase

1.2) Objeto Recordset


Um objeto Recordset
Recordset permite
 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.
DataBase. É equivalente à propriedade RecordSource do
Data Control.
Control. A declaração é a seguinte:

Public <nome_objeto> as Recordset 
Public <nome_objeto> Recordset 

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

1.2.1 - Table

Uma table
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
 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 FindFind,, que podem encontrar mais de uma ocorrência de um mesmo valor
para uma determinada chave. O método SeekSeek só
 só encontra a primeira ocorrência.
Para se abrir uma tabela, é necessário a inicialização de um objeto RecordsetRecordset,, através do método
OpenRecordset..
OpenRecordset

1.2.2 - Dynaset

recordset Uma
recordset do Dynaset 
Dynaset
 do tipo   é um
Dynaset é
Dynaset agrupamento
 é composto de dados
de campos provenientes
selecionados, de uma ou
geralmente maisgrupo
de um tabelas do bancofiltrados,
de registros de dados. Um
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
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
 Find;; filtrar campos e registros.
método Find
método
 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 Dynaset,, é necessário a inicialização de um objeto Recordset
Recordset,, através do método
OpenRecordset..
OpenRecordset

1.2.3 - Sanpshot

Uma Sanpshot
Sanpshot   é uma cópia dos dados provenientes de uma ou mais tabelas do banco de dados. Um
recordset do tipo Sanpshot
recordset do Sanpshot é
 é quase idêntico ao dynaset
dynaset.. A diferença é que um Sanpshot
Sanpshot não
 não pode ser atualizado,
sendo
  apenas
Existede
umleitura.
tipo deA Sanpshot
sua utilização
Sanpshot  normalmente
  chamado se faz em
Forward-Only,
Forward-Only relatórios
, que só podeou ser
telaspercorrido
d
dee visualização de dados.
no sentido ascendente dos
registros, não sendo possível o emprego dos métodos Move
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.
método Find
 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
Sanpshot,, é necessário a inicialização de um objeto Recordset
Recordset,, através do método
OpenRecordset..
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


DataBase   {declaração} 
{declaração} 
Set DBagenda
Set DBagenda = OpenDatabase
OpenDatabase("C:\agenda\agenda.mdb")
("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
Recordset.. Quando o
objeto é uma table
table,, somente uma tabela pode ser associada; quando o objeto é um dynaset
dynaset ou
 ou um snapshot
snapshot,, pode ser
usada uma instrução SQL
SQL que
 que filtre os dados de várias tabelas. seguinte:  
tabel as. A sintaxe é a seguinte:

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

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

Set DBagenda
Set DBagenda = OpenDatabase
OpenDatabase("C:\AGENDA.MDB")
("C:\AGENDA.MDB")
Set DYNagenda = DBagenda.OpenRecordset
Set DYNagenda DBagenda.OpenRecordset("Select nome",  DbOpenDynaset)) 'cria
("Select * from agenda order by nome", DbOpenDynaset
um dynaset
Set TABagenda
Set
Set
Set DYNagenda
 DYNagenda DBagenda.OpenRecordset("agenda",
 TABagenda == DBagenda.OpenRecordset
DBagenda. ("agenda",
OpenRecordset("Select
DBagenda.OpenRecordset DbOpenTable)
DbOpenTable
("Select * from ) 'cria
agenda order byuma tableDbOpenSnapshot
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 Move,,
métodos Find
Find,, método Delete
Delete,, método Close
Close.. Com o objeto Table
Table é
 é possível também a utilização do método Seek
Seek,,
desde que haja um índice especificado para a tabela, mas não é possível a utilização dos métodos Find
Find..
Será visto a seguir, como utilizar esses métodos.

1.5) Os Métodos Find


São quatro: FindPrevious
FindPrevious,, FindNext
FindNext,, FindLast
FindLast   e FindFirst
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


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

DYNagenda.FindFirst   “nome = ‘Jose’” {posiciona no primeiro registro cujo con


DYNagenda.FindFirst conteúdo
teúdo do campo nome seja igual
a Jose}

1.6) Os Métodos Move


São quatro: MovePrevious
MovePrevious,, MoveNext
MoveNext,, MoveLast
MoveLast   e MoveFirst
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


table,, dynaset
dynaset ou
 ou snapshot
snapshot.. Por exemplo:
 
74
 

  MoveLast   {posiciona no último registro do dynaset}


DYNagenda.MoveLast
DYNagenda.

Não esqueça que a propriedade recordset


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

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


Data1.recordset.MoveLast

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,
<nome_table>.Seek comparação, chave1, chave2...

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

1.8) A propriedade Index


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

Index = nome_do_indice
<nome_table>.Index
<nome_table>.

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


Visual   Data Manager . Sempre que se quiser
usar o método seek
seek,, deve-se antes se determinar o índice, configurando-se a propriedade index
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.
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.
Control.

capítulo: A listagem do programa, que tem a aparência da figura 8.1, servirá como exemplo dos conceitos vistos neste

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
End If = False

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


D Bagenda
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"
" 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
 AS PARTES DE UM PROGRAMA.....................................................................................................................................1
3 - AMBIENTE
 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)
3.5) Janela
Janela de
de projeto.............................................
projeto.................................................................................................
............................................................................................................
........................................................ 1
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.... Label...............................................................
...........................................................................................................
................................................ 4
5.2) Evento Click .....................................................
.............................................................................................................
...........................................................................................................
................................................... 5
6 - OUTRO PROGRAMA........................................................................................................................................................6
6.1) Propriedades Top, Left, Width, Height e ScaleMode ..................................................................................................6
6.2) Propriedades
Propriedades Alig
Alignment
nment e MultiLine.............................................
MultiLine....................................................................................................................
...............................................................................
........ 6
6.3) Barra de Rolagem
Rolagem Horizontal ((HScrollBar)
HScrollBar) .........................................................................................................
.................................................................................................................
........ 7
6.4) Propriedades Min, Max, Value, Sm SmallChange
allChange e LargC LargChangehange .................................................
.....................................................................................
.................................... 7
6.5) Foco do Teclado - Propriedade TabIndex TabIndex.......................................................
...................................................................................................................
............................................................ 7
6.6) Evento Change ...........................................................................................................................................................7
6.7) Evento Load................................................................................................................................................................8
6.8) Propriedade
6.9) Enabled .....................................................................................................
................................................. .................................................................................................
............................................. 8
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.......................................................................................................
Redim............................................... .........................................................................................................................
................................................................. 10
3 - INSTRUÇÕES  DE CONTROLE DE FLUXO DE PROGRAMAS .........................................................
......................................................................................
............................. 10
3.1) If <expressão> Then <com
<comando>
ando> End If ...................................................................................................................
............................................................ ....................................................... 10
3.2) A ins
instrução
trução Select Case.........
Case.............................................................
.............................................................................................................................
...............................................................................
...... 11
3.3) A instrução Do While ... Loop....................................................................................................................................11
3.4) A instrução DDo
o ... Loop While.......................................................
While.................................................................................................................................
.............................................................................
... 11
3.5) A instrução
instrução For ... Next ....................................................
.............................................................................................................................
.........................................................................................
................ 12
3.6) A ins
instrução
trução Exit For......
For...........................................................
.............................................................................................................................
........................................................................................
................ 12
3.7) A instrução Exit Do....................................................................................................................................................
Do........................................................................................... ......................................................... 12
4 - SELECIONANDO  OPÇÕES............................................................................................................................................12
4.1) Option
Option Button e Chec
Check
k Box..........................................
Box.............................................................................................................
.............................................................................................
.......................... 13
5 - ESCREVENDO  E CHAMANDO  FUNÇÕES E PROCEDIMENTOS.................................................................................13
5.1) Procedimentos
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.....................
Control............................................................................
...............................................................................................................................
.............................................................................
..... 20
2.2) Métodos
Métodos AddItem e RemoveItem................................................
RemoveItem..........................................................................................................................
..............................................................................
.... 20
2.3) Combo Box Control...............
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.........................................................................................................................................
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 Resiz
Resize e do Formulário......................................................................................
Formulário.................................................................................................................................
........................................... 26
3.5) Menus Instantâneos.................
Instantâneos.....................................................................
...........................................................................................................................
.............................................................................
...... 26
3.6) Método PopUpMenu .................................................
......................................................................................................
................................................................................................
........................................... 26
4 - FORMULÁRIO MDI ..................................................................................................
.............................................. ...........................................................................................................
....................................................... 27
4.1) MDI Form ................................................
.......................................................................................................
..................................................................................................................
........................................................... 27
4.2) Propriedade Align.....................................
Align.........................................................................................
.................................................................................................................
............................................................. 27
4.3) Vetor de Controles ....................................................
.........................................................................................................................
................................................................................................
........................... 28
CAPÍTULO IV .......................................................
...............................................................................................................
...................................................................................................................
........................................................... 30
1- MANIPULANDO JANELAS E MENSAGENS ......................................................
..............................................................................................................
.............................................................
..... 30
1.1) O Controle SSPanel..............
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
Métodos Show e Hide e os Ev Eventos
entos Activate e Deactivate ........................................................
.................................................................................
......................... 32
1.5) Janelas Personalizadas ....................................................
............................................................................................................................
........................................................................................
................ 32
1.6) Janelas Padronizadas - M MsgBox
sgBox e InputBox................................................................................
InputBox............................................................................................................
............................ 33
1.7) Função IsNumeric
IsNumeric....................................................
........................................................................................................
.................................................................................................
............................................. 36
1.8) Função IsDate..................................
IsDate......................................................................................
.........................................................................................................................
..................................................................... 36
1.9) Função WeekDay...........................................................
WeekDay......................................................................................................................................
...........................................................................................
................ 36
2 - JANELAS DE DIÁLOGOS COMUNS...............................................................................................................................36
2.1) O Controle Common Dialog .....................................................
..................................................................................................................................
.................................................................................
.... 37
2.2) Métodos ShowC
ShowColor,
olor, ShowFont, ShowOpen, S ShowSave
howSave e ShowPrinter................................................................. 40
2.3) A Função Len............
Len....................................................................
................................................................................................................................
........................................................................................
................ 40
2.4) A Função Mid .........................................................................................................
.................................................... ........................................................................................................
................................................... 40
2.5) O Comando Shell...........
Shell...............................................................
...........................................................................................................................
.......................................................................................
................ 40
CAPITULO V .......................................................................................................
............................................... ............................................................................................................................
.................................................................... 41
1 - OS CONTROLES GRÁFICOS.........................................................................................................................................41
1.1) Shape Control .................................................................................................................................
....................................................... ....................................................................................................
.......................... 41
1.2) Line Control......................
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
RGB..................................................
.......................................................................................................
........................................................................................................
................................................... 46
2.4) O Método Pset ..........................................................................................................
.................................................. ........................................................................................................
................................................ 47
2.5) O Método Line.............................................
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................................................
Control........................................................................................................
............................................................................................................
.................................................... 48
3.3) Vetor de Controles ....................................................
.........................................................................................................................
................................................................................................
........................... 49
CAPÍTULO VI ......................................................
.............................................................................................................
....................................................................................................................
............................................................. 51
1 - MANIPULANDO ARQUIVOS
 ARQUIVOS ........................................................................................................
................................................. .........................................................................................
.................................. 51
1.1) O Evento de F
Formulário
ormulário Resize ..................................................
............................................................................................................................
..............................................................................
.... 51
1.2) A Função FreeFile............................................
FreeFile...................................................................................................
.........................................................................................................
.................................................. 52
1.3) O Comando Open ..........................................................................................................................
.................................................... .................................................................................................
........................... 52
1.4) A Função Input................
Input....................................................................
..........................................................................................................................
......................................................................................
................ 52
1.5) A Função LOF.........................
LOF.............................................................................
.............................................................................................................................
..............................................................................
..... 52
1.6) O método Close ...............................................
....................................................................................................
.........................................................................................................
.................................................... 52
1.7) O Método Print .......................................................................................................
.................................................. ........................................................................................................
................................................... 53
2 - ÁREA
  ÁREA DE TRANSFERÊNCIA..........................................................................................................................................53
2.1) O Objeto ClipBoard ..................................................
........................................................................................................................
.................................................................................................
........................... 53
2.2) O Método Clear.........
Clear.................................................................
................................................................................................................................
........................................................................................
................ 54
2.3) O Método SetText ..........................................................................................................................
...................................................... ...............................................................................................
........................... 54

2.4) O Método
2.5) O Método SetData ...................................................
.......................................................................................................
.................................................................................................
.............................................
GetText.....................................................................................................................................
GetText............................................................... ...................................................................................... 54
................ 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
 ARQUIVOS DE REGISTROS...............................................................................................................55
4.1) A Declaração Type.....................................................
Type.........................................................................................................................
...............................................................................................
........................... 56
4.2) O Procedimento Get ....................................................................................................
................................................ .................................................................................................
............................................. 57
4.3) O Procedimento Put....
Put............................................................
..............................................................................................................................
......................................................................................
................ 59
4.4) O Procedimento Kill ..................................................
......................................................................................................
................................................................................................
............................................ 62
4.5) O Procedimento Name ... as .........................
....................................................................................
...........................................................................................................
................................................ 62
4.6) As Funções UCase e LCase..............................
LCase..................................................................................
.......................................................................................................
................................................... 63
4.7) As Funções Tr
Trim,
im, LTrim e RTrim ..........................................................................................................................
.................................................. ............................................................................
.... 63
CAPÍTULO VII ............................................................................................................
.................................................... .....................................................................................................................
............................................................. 65
1 - DEFINIÇÕES GERAIS DE B ANCO DE D ADOS ...........................................................................................................................65
1.1) Definições Gerais de Banco de Dados .....................................................................................................................65
1.2) Banco de Dados MDB...............................................................................................................................................65
2 - O D ATA CONTROL ..............................................................................................................................................................65
2.1) A propriedade Connect ....................................................
.............................................................................................................................
.........................................................................................
................ 66
2.2) A propriedade DataBase...........................................................................................................................................66
2.3) A propriedade RecordSource.......................................................
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 R
RecordCount
ecordCount .................................................................................................................................
.......................................................... ...........................................................................
.... 68
4.2) O Método AddNew..........................
AddNew..................................................................................
..........................................................................................................................
.................................................................. 69
4.3) O Método Edit ............................................................................................................
.................................................... .......................................................................................................
............................................... 69
4.4) O Método Update.....................
Update.........................................................................
...........................................................................................................................
.............................................................................
...... 69
4.5) A Propriedade Bookmark
Bookmark............................................
................................................................................................
..............................................................................................
.......................................... 69
4.6) A Propriedade LastModify.........................................................................................................................................70
4.7) O Método Delete ...............................................
...................................................................................................
........................................................................................................
.................................................... 70
5 - OS EVENTOS DO D ATA CONTROL ........................................................................................................................................71
5.1) O Evento Reposition ..................................................
......................................................................................................
...............................................................................................
........................................... 71
5.2 - O Evento Validate .........................................................................................................................
................................................... .................................................................................................
........................... 71
CAPÍTULO VIII ...........................................................................................................
................................................... .....................................................................................................................
............................................................. 73
I - OBJETOS DE D ADOS ............................................................................................................................................................73
1.1) Objeto DataBase...........................
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.........
Find................................................................
..............................................................................................................................
.......................................................................................
................ 74
1.6) Os Métodos Move ..........................................................................................................................
..................................................... ................................................................................................
........................... 74
1.7) O Método Seek ..............................................................................................................................
........................................................ .................................................................................................
........................... 75
1.8) A propriedade Index.......
Index...........................................................
...........................................................................................................................
.......................................................................................
................ 75
2 - PRATICANDO COM OBJETOS DE D ADOS ................................................................................................................................75

  84

Você também pode gostar