Escolar Documentos
Profissional Documentos
Cultura Documentos
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
1
2
4 - 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.
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 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..
- 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 Label
Label no
no formulário, e alterar as seguintes propriedades:
name: LBLeco
caption:
4
Label
Quadro
Texto
fig 1.7 - Botão de Comando, Quadro Texto e Label
- 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.
- Executar o programa.
Verificar o que ocorre ao se clicar no botão Ecoar .
- 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..
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..
- Salvar o projeto
projeto no
no diretório c:\aulavb\aula1\proj2 com o nome proj2.
*Name = FRMproj2
*Caption = Velocidade
*Top = 1170
*Left = 1080
*Width = 4125
*Height = 4545
6
- No evento BTNsair_click
End
- Executar o programa.
Verificar que não ocorre nada ao se clicar na Barra de Rolagem.
Barras de
Rolagem
7
- Executar o programa.
Verificar o que ocorre quando se clica nas extremidades da barra de rolagem.
- Executar o programa.
Verificar que agora o quadro texto já apresenta o valor da barra, ao iniciar o programa.
- 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:
Integer % 2 bytes
Long(long integer) & 4 bytes
Single ! 4 bytes
Double # 8 bytes
Currency @ 8 bytes
Variant Nenhum
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:
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.:
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:
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:
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:
If A = 1 Then
<cmdo ou bloco executado somente se A for igual a 1>
End If
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
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:
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.
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.
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.
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.
- Inserir um label:
Name = LBLescolha
Caption = <vazio>
12
fig 2.1
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
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.
Sub atualiza_label
atualiza_label
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
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.
15
fig 2.5 – Outro projeto
- 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
- 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.).
- Na seção General
General do
do formulário, escrever Function calcular(op1, op2).
op2).
- Executar o programa.
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 .
- 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
18
fig. 3.2 - O formulário desse programa
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.
19
fig 3.3 - o formulário desse projeto
Picture Frame
Comb
List
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.
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.
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
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á.
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..
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
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:
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
- 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.
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.
Sub MNSvermelho_Click ()
FRMmenu.BackColor = QBColor(4)
MNSvermelho.Enabled = False
MNSazul.Enabled = True
MNSbranco.Enabled = True
End Sub
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:
Sub MNSazul_Click ()
FRMmenu.BackColor = QBColor(1)
MNSvermelho.Enabled = True
MNSazul.Enabled = False
MNSbranco.Enabled = True
End Sub
Sub MNSbranco_Click ()
FRMmenu.BackColor = QBColor(15)
MNSvermelho.Enabled
MNSazul.Enabled = True= True
MNSbranco.Enabled = False
End Sub
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.
0 (Default) Normal
1 Minimizado
2 Maximizado (toda a tela)
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.
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.
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.
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
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
27
fig 3.6 - janela de menu
Option Explicit
Dim Form() As New Formulario
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..
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..
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.
- Iniciar um projeto.
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.
30
- Alterar as propriedades:
Name = Panel3D1
Caption = Personalizadas
Foram usados nomes terminando em p, para distinguir esses botões como os que mostram as janelas
Personalizadas.
31
fig 4.4 - Janela personalizada
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
Sub BTNmensagem_per_Click ()
FRMmensagem.Show 1
End Sub
- Incluir no formulário
formulário FRMsair um label
label e
e dois botões de comando,
comando, conforme abaixo:
32
33
buttons Descriçã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.
34
- Dentro do frame1
frame1,, inserir os seguintes controles:
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:
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:
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..
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:
37
fig 4.11 - Caixa de Diálogo Abrir
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.
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).
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.
On Error GoTo 1
End Sub
39
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().
40
CAPITULO V
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.
Shape
(Default) Retângulo
1 Quadrado
2 Elipse
3 Círculo
4 Retângulo arredondado
5 Quadrado arredondado
- Iniciar um projeto.
- 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.
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
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
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.
- 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
LBLy1.Caption = LBLy1.Caption - 10
Line1.y1 = LBLy1.Caption
End Sub
2 - OS MÉTODOS GRÁFICOS
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
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..
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
‘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
‘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
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.
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.
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.
Observe que as opções B e F estão comentadas. Retire o comentário, e verifique o que ocorre ao executar o
programa.
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).
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..
- 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.
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
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
Sub Check2_Click ()
picture1.AutoSize = check2.Value
End Sub
Sub Check1_Click ()
image1.Stretch = check1.Value
End Sub
- 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.
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..
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.
- 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:
Option Explicit
Dim numero_arquivo, nome_arquivo
Sub MNSnovo_Click ()
TXTedicao.Text = ""
FRMbloco.Caption = "Bloco de Notas"
nome_arquivo = ""
TXTedicao.SetFocus
End Sub
51
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
É 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
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
2 - ÁREA DE TRANSFERÊNCIA
MNPeditar Editar
MNScolar Colar
MNScopiar Copiar
MNSrecortar Recortar
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
Valor Descrição
2 Bitmap (.bmp files)
3 Metafile (.wmf files)
8 Device-independent bitmap (DIB)
9 Color palette
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.
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.
LBLagend
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 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
- 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.
Option Explicit
Type informação
nome As String * 40
fone As String * 20
comentários As String * 100
End Type
Dim x as informação
x.nome = "Alfredo"
x.fone = TXTfone.text
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.
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
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
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.
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.
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
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.
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:
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 :
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.
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
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
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 :
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.
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
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..
TABELA FUNCIONÁRIOS
IDENTIDADE NOME ENDEREÇO TELEFONE
002233 João
023132 Maria
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.
-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..
65
fig 7.2 - Agenda telefônica usando o Data Control
- 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.
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.
66
fig 7.3 - definindo a propriedade conect do Data
do Data Control
- DatabaseName = C:\aulavb\aula07\proj1\agenda.mdb
C :\aulavb\aula07\proj1\agenda.mdb
- RecordSource = Agenda
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.
Nos controles textos e imagem do nosso formulário, alterar a propriedade DataSource da seguinte forma:
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
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.
- 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.
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
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
recordset.Edit
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
Recordset.Bookmark = Recordset.LastModified
Pode ser usada para fazer com que o registro mais recentemente modificado passe a ser o registro corrente.
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.
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..
Valor Descrição
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::
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:
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
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
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.
recordset.FindFirst criterio
recordset.FindLast criterio
recordset.FindNext criterio
recordset.FindPrevious criterio
recordset.MoveFirst
recordset.MoveLast
recordset.MoveNext
recordset.MovePrevious
<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..
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 ]
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.
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
End Sub
BTNnovo.Enabled = True
BTNgravar.Enabled = False
BTNcancelar.Enabled = False
BTNexcluir.Enabled = True
BTNproximo.Enabled = True
BTNanterior.Enabled = True
End Sub
77
clicou_excluir = False
End Sub
BTNnovo.Enabled = False
BTNgravar.Enabled = True
BTNcancelar.Enabled = True
BTNexcluir.Enabled = False
BTNproximo.Enabled = False
BTNanterior.Enabled = False
TXTnome.SetFocus
End Sub
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
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
End If
Exit Sub
1:
Exit Sub
End Sub
End Sub
80
Else
le_registro
corrente_registro = DYNagenda.Bookmark
End If
clicou_procurar = False
End Sub
BTNnovo.Enabled = False
BTNgravar.Enabled = True
BTNcancelar.Enabled = True
BTNexcluir.Enabled = False
End Sub
BTNnovo.Enabled = False
BTNgravar.Enabled = True
BTNcancelar.Enabled = True
BTNexcluir.Enabled = False
End Sub
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.4) O Método
2.5) O Método SetData ...................................................
.......................................................................................................
.................................................................................................
.............................................
GetText.....................................................................................................................................
GetText............................................................... ...................................................................................... 54
................ 54
2.6) O Método GetData ...................................................
.......................................................................................................
.................................................................................................
............................................. 54
83
84