Manual Visual Basic5
Manual Visual Basic5
12+1 B
CURSO: Aplicações Informáticas de Gestão
UNIÃO EUROPEIA
Unidade 3
Visual Basic
Fevereiro, 2004
ESCOLA SECUNDÁRIA DE ALBERTO SAMPAIO
12+1 B
CURSO: Aplicações Informáticas de Gestão
UNIÃO EUROPEIA
Unidade 3
Visual Basic
Extraído de
Paiva L. F.: Visual Basic 5.0 Passo a
Passo.
Fevereiro, 2004
Sumário
4
1 APRESENTAÇÃO DO VISUAL BASIC 5
6
Controles Básicos
7
Controles Básicos
Usamos as opções do menu do Visual Basic para configurar nosso ambiente de trabalho, janelas,
cores, inserir novos formulários, módulos, salvar o projeto, sair do Visual, etc. Não usamos os
menus para construir nenhuma aplicação, suas opções são de assistência. Vamos no decorrer deste
livro comentar as opções principais e mais usadas.
Como o acesso aos menus geralmente é um processo mais lento do que o acesso a botões, o Visual
Basic dá a possibilidade de podermos “cortar caminho” através da barra de botões. As principais
opções do Menu foram duplicadas em forma de botões.
8
Controles Básicos
9
Controles Básicos
Vamos por ora ressalvar duas propriedades que a maioria absoluta dos objetos possuem: Caption e
Name.
A propriedade Caption é responsável pela legenda (título) que o objeto terá quando aparecer em
nosso formulário. Por exemplo, num objeto CommandButton (Botão de Comando), o Caption é
quem coloca o título que irá aparecer dentro do botão.
A propriedade Name nomeia um objeto, e sempre que formos nos referenciar a este objeto em
qualquer etapa de nosso projeto, usamos o nome dado na propriedade Name dele. Se um botão
“Cancelar” tiver o nome de cmdCancelar, é este o nome que vamos usar na codificação deste objeto.
Este nome fica atribuído ao objeto.
Para se dar nomes a alguns objetos algumas regras tem que serem seguidas, como por exemplo,
não pode conter espaços em branco, não se pode usar sinais como “ #$&+-^ ”. Como padrão
acostuma-se a usar as três primeiras letras do nome para abreviar o tipo do Objeto, para durante a
codificação do programa facilitar na identificação de qual objecto estamos a usar. Por exemplo: Um
botão de comando é do tipo CommandButton, e abreviamos como “cmd”, um formulário é do tipo
Form, e abreviamos como “frm”, uma máscara de edição é do tipo MaskEdBox, e abreviamos como
“msk”. Essas abreviações ficam a critério do programador.
Mas para compor a propriedade Name, não colocamos
somente abreviações do tipo de objeto que ele representa,
10
Controles Básicos
mas também o que se trata o Objeto. Por exemplo: temos duas caixas de opções (OptionButton),
onde temos a opção para o usuário escolher: Masculino e Feminino. Abreviamos este tipo de objeto
como “opt”, e o nome destes OptionButton ficaria assim: optMasculino, e o outro optFeminino.
Para se conhecer o tipo de cada Objeto existente na caixa de ferramentas é só ficar com o rato em
cima de qualquer objeto, e o tipo aparecerá dentro de uma caixinha amarela.
Botão Maximizar
Botão Minimizar
Área de titulo.
Caption do
formulário.
Menu de Controle.
Para se inserir um Objeto da caixa de ferramentas para o formulário existem dois procedimentos:
Escolha o objeto que se quer usar, e de dois clicks com o rato em cima dele, e logo o objeto irá
11
Controles Básicos
aparecer no centro do formulário. Esse método não é muito aconselhado pois o Controle escolhido
não vai para onde você precisa dele, e sim sempre para o centro do formulário, obrigando-o a ir com
o rato até o objeto e arrastá-lo para onde realmente necessitamos dele.
O modo mais aconselhado para inserção de objetos no formulário, é dando um click com o rato no
objeto, e depois leve o ponteiro do rato para o formulário (dentro do formulário o ponteiro do rato irá
se transformar numa cruz), e então clicando no botão esquerdo do rato faça um quadrado. O objeto
irá aparecer dentro de seu quadrado. Isto é útil pois podemos inserir o objeto exatamente onde
precisamos.
escolha o
objeto do
tipo
CommandButt
Criando o objeto, com Soltando o botão do om e
botão do rato apertado. mouse, o objeto é criado coloque-o
na posição e dimensão
dentro do
escolhida.
formulário.
12
Controles Básicos
Cada objeto colocado no formulário possui eventos, e baseados nestes eventos vamos criar nosso
programa. Por exemplo: Se queremos que ao apertar o botão “Fechar”, o programa feche a janela,
então precisamos, dentro da janela de codificação criar um evento para o objeto Botão chamado
Click. Dentro deste evento colocamos tudo que queremos que aconteça ao darmos um click neste
botão criado.
Para acessar a janela de codificação podemos dar dois clickes em qualquer objeto ou apertar o
botão “View Code” na Caixa de Projetos. O mais prático é sempre dar dois clickes no objetos que
queremos codificar, pois assim a janela de codificação será aberta já pronta para codificar o objeto
selecionado.
13
Controles Básicos
É bom lembrarmos que cada objeto possui vários eventos diferentes, e nossa tarefa básica é
codificar cada evento que nosso programa necessitar. Somente ocorre eventos durante a execução
do programa. Por exemplo, existe um evento chamado Click, que é para quando damos um click
com o rato no objeto. Evento MouseMove para quando o rato se movimentar dentro do objeto.
Evento KeyPress para quando um tecla for pressionada dentro do objeto. Estudaremos mais em
detalhe esses eventos. Por ora é importante entender a utilidade deles, e qual a finalidade deles em
nossa codificação.
End Sub
O Cursor ficará piscando acima do comando “End Sub”, esperando você
digitar algo ali.
14
Controles Básicos
Para se entender melhor em que momento do programa esses eventos são chamados, é só imaginar
o seguinte: quando executamos uma aplicação Windows qualquer, o usuário pode fazer várias
tarefas (ou eventos) como apertar uma tecla, o botão do rato, movimentar o rato, dimensionar o
tamanho de uma janela, etc. Pois bem, quando qualquer um desses possíveis eventos são
executados o Windows verifica se existe alguma codificação para aquele evento, se existir ele
executa todas as linhas até encontrar a expressão “End Sub”
Quando precisarmos criar uma codificação dentro de nosso formulário mas que tenha seu alcance
estendido para todos os procedimentos e eventos do formulário, e não para algum determinado,
escolhemos o Object “General”, que significa Geral (na caixa de eventos aparecerá o nome
“declaration”). Se declararmos ali uma variável ela terá validade para todo o formulário. Veremos isto
melhor no Capítulo sobre variáveis.
15
Controles Básicos
Escolhemos aqui o
diretório (pasta)
onde armazenaremos
o arquivo de
Formulário.
Aqui colocamos o
nome do arquivo. Por
“Default” irá
aparecer o nome
dado ao formulário
na propriedade Name
acrescido da
extensão .frm
Nome do arquivo do
Projeto. Por
“Default” aparece o
nome Project1, mas
sempre é bom
modificar para um
nome que sinalize
melhor o nome que
nosso projeto
(programa) terá.
Sempre coloque cada projeto dentro de uma pasta diferente para não ter problema de localização.
16
Controles Básicos
EXERCÍCIOS PROPOSTOS
1 - Descreva 5 botões da barra de botões que você acha mais importante:
Nome Descrição
2 - Qual opção do menu nos dá a possibilidade de incluir mais Objetos dentro da Caixa de
Ferramentas?
Objetos:
Propriedades:
Formulário:
Janela de Projetos:
Codificação:
17
Controles Básicos
Dê dois clickes no botão “OK” e na janela de codificação escreva Print “Oba! Deu Certo!”, como esta
na janela acima. Feche a janela, e voltando ao formulário dê agora dois clickes no botão “Fechar”. A
janela de codificação volta a aparecer e nos digitaremos Unload frmCadastroPaciente.
Execute o programa e veja que fizemos com que o botão “OK” mostre na janela a frase “Oba! Deu
Certo!” e o botão “Fechar” termina o programa.
O Comando Print tem a finalidade de mostrar na janela aberta a expressão que esta na sua
frente entre aspas. Na verdade numa programação profissional ele não é usado, pois não definimos
sua localização na tela. Ele sempre imprime a expressão no canto superior esquerda. Estamos
usando ele aqui somente para fins didáticos. Vamos substitui-lo depois pelo Objeto Label.
5 - Qual a diferença dos arquivos com extensão .vbp dos com extensão .frm
18
2 OS CONTROLES BÁSICOS
(A interface)
Form
CommandButton
Label
TextBox
CheckBox
OptionButton
Frame
Controles Básicos
propriedade.
20
Controles Básicos
21
Controles Básicos
MousePointer: Nesta propriedade especificamos o tipo de ponteiro que o rato terá quando se mover
sobre o formulário. Veja os tipos existentes:
3 Seleção de escrita
4 Ícone
5 Seleção de Mover Objetos
6 Redimensionamento na diagonal
7 Redimensionamento na vertical
8 Redimensionamento na diagonal
9 Redimensionamento na horizontal
10 Seleção alternada
11 Sinal de ocupado.
22
Controles Básicos
O arquivo
correspondente
esta na pasta
Icons/Traffic e
chama
[Link]
23
Controles Básicos
24
Controles Básicos
25
Controles Básicos
Esse objeto é um texto, não editável, que usamos geralmente para rotular outros Objetos. A
Finalidade básica dele é de colocar um texto na forma.
26
Controles Básicos
Exibe uma caixa de texto onde o usuário irá digitar dados diversos. Quando inserimos esse
Objeto, ele automaticamente coloca a expressão “Text1” dentro da área de digitação. Logicamente,
sempre teremos que remover essa expressão, pois não faz sentido deixar uma caixa de texto com
“Text1” em seu interior. O usuário de seu programa ficará sem entender a finalidade.
27
Controles Básicos
Name: Nomeia o objeto TextBox. Geralmente com a inicial txt. Exemplo: Se formos usar essa caixa
de texto para que o usuário digite o nome do paciente, poderíamos abreviar assim: txtNomePaciente.
PasswordChar: Se durante a digitação de qualquer dado na caixa de texto, quisermos que o Visual
Basic mostre outro caractere no lugar do caractere digitado, é só especificarmos aqui qual queremos
que seja mostrado. Muito usado para digitação de senhas.
ScrollBars: Estando a propriedade MultiLine habilitada, é interessante colocarmos um ScrollBars na
caixa de texto, pois ele acrescentará uma barra de rolagem que poderá ser:
1 - Horizontal
2 - Vertical
3 - Both: Horizontal
e Vertical juntos.
Text: A propriedade Text é a mais importante deste Objeto. Todo o texto digitado pelo usuário
dentro da caixa de texto é incorporado nesta propriedade.
28
Controles Básicos
29
Controles Básicos
DlbClick: Se o usuário apertar duas vezes o botão esquerdo do rato sobre a caixa de texto
KeyDown: Ocorre quando o usuário aperta uma tecla no teclado.
KeyUp: Ocorre quando o usuário solta a tecla apertada.
KeyPress: Ocorre quando uma tecla é pressionada e solta. Como argumento possui uma variável
cujo conteúdo é a tecla pressionada (código correspondente na tabela ASCII).
30
Controles Básicos
Conhecendo os eventos e sabendo para que eles servem vamos começar a usá-
los. No formulário frmLançamentoExames que já criamos posicione o cursor
sobre a caixa de texto “txtNome” e dê dois clickes com o mouse. Irá
aparecer uma janela assim:
31
Controles Básicos
Note que quando executarmos o programa o label “Sexo” estará na cor cinza
e a caixa de texto abaixo não aceitará digitação.
Então vamos agora colocar uma codificação que verifique se na caixa de
texto txtNome existe algo digitado. Se existir, libera a digitação do Sexo,
se não existir continua sem liberação.
32
Controles Básicos
Como foi explicado acima, esse evento é acionado sempre que o usuário
altera um valor digitado na caixa de texto. Mas isto não significa que na
caixa de texto obrigatoriamente tem que existir um valor para ser alterado.
Na verdade quando está vazia e digitamos algo ali estamos alterando seu
conteúdo.
Com isto, concluímos que sempre que digitarmos algo ali (letra, número,
barra de espaço, delete, Backspace, etc.) o evento “Change” será acionado.
Digite o seguinte código na janela de codificação aberta:
33
Controles Básicos
Aumente o tamanho da caixa de texto na vertical, para darmos espaços para as novas linha
que serão inseridas. Mude as propriedades:
Propriedade Text1 Descrição
MultiLine True Habilita múltiplas linhas
Text “Vazio” Tira o texto “Text1”
ScrollBars 2 - Vertical Coloca barra de rolagem
vertical
Exibe uma caixa de checagem (ou verificação) onde o usuário poderá ligar ou desligar uma
determinada opção.
Usamos o CheckBox para mostrar várias opções ao usuário para ele escolher uma, algumas, todas
ou nenhuma.
No nosso exemplo de “Lançamento de Exames” esse objeto poderia substituir com vantagens a
caixa de texto onde digitaremos o Exame que o paciente fará. Sabendo de antemão que o
laboratório possui somente exames de Raio X, Sangue, gravidez e espermograma podemos criar 4
caixas de checagem, sendo cada uma para um exame diferente. Com isto, poderíamos selecionar ou
não o exame em vez de digitá-lo.
Alignment: Especifica se o texto ficara do lado esquerdo da caixa.
34
Controles Básicos
Pronto! Agora ficou mais fácil escolher o exame que o paciente quer
fazer. Na codificação do programa, sempre que quisermos saber se algum
desses exames foi escolhido é só verificarmos se a propriedade “Value” de
cada um deles esta “Checked”, ou seja, selecionado.
Note que podemos marcar um exame, alguns, todos ou nenhum. Fica a
critério do usuário. Mas no nosso exemplo vai ser difícil um paciente
entrar em nosso laboratório e não fazer NENHUM exame. Se o nome dele esta
sendo processado no computador é porque pelo menos um exame ele vai fazer.
Depois vamos fazer uma rotina que verifica isto.
35
Controles Básicos
Algumas outras alterações teremos que fazer também, como por exemplo não
deixar o programa aceitar que um paciente do sexo masculino faça exame de
Gravidez, ou do sexo feminino fazer Espermograma. Mas antes de trabalharmos
nisto é necessário conhecermos mais um objeto importante.
Este botão de opção é usado para o usuário poder escolher entre uma opção ou outra. Quando
ele escolhe uma a outra é desmarcada. Diferentemente da Caixa de Checagem onde poderíamos ter
várias marcadas ou nenhuma, o Objeto OptionButton exibe que somente uma opção seja marcada.
Por exemplo, precisamos criar um objeto em que o usuário coloque se uma determinada pessoa é
Casada, Solteira, Divorciada ou Viúva.
Seja lá qual estado civil seja, quando mudar a outra deixa de existir. Uma pessoa não pode ser
Casado e Solteiro ao mesmo tempo. Então neste caso o usual é o Botão de Opção, pois se
colocássemos a Caixa de Checagem, o Objeto aceitaria que escolhêssemos dois ou mais estado
civil.
Alignment: Determina se o texto ficará do lado direito ou esquerdo do botão de opção.
Caption: O texto que será anexado ao Objeto.
Enabled: Habilita ou não o objeto. Estando desabilitado o usuário não poderá selecionar a opção, e
a cor do texto será acinzentado.
Name: O nomeia o Objeto. A inicial abreviada que se usa é “opt”.
Value: True para quando a opção esta selecionada e False para quando a opção não esta
selecionada.
36
Controles Básicos
Rode o programa e teste para verificar se esta tudo correndo bem. Todos
os objetos de escolha estão desabilitados até que um nome seja digitado.
Neste momento a escolha do Sexo do paciente é liberado.
Vamos agora fazer o mesmo com os Objetos “OptionButton”. Vamos criar um
evento Click para eles, de maneira que quando o usuário escolher um
determinado sexo para o paciente seja liberado os exames correspondentes.
Dê dois clickes com o rato no objeto “optMasculino”. A janela de
codificação será aberta e o evento Click já terá sido criado.
Vamos então habilitar os exames para esse Objeto:
37
Controles Básicos
Esse objeto é muito útil para nos ajudar na criação de uma interface mais limpa para o usuário.
Podemos criar molduras que agruparão outros objetos. Essas molduras possuem formato 3D
embelezando ainda mais nossa janela.
Caption: Coloca um texto no topo da moldura. Não é obrigatório.
38
Controles Básicos
39
Controles Básicos
EXERCÍCIOS PROPOSTOS
1 - Explique a finalidade dos Objetos:
Form:
CommandButton:
Label:
TextBox:
CheckBox:
OptionButton
Frame:
2 - Explique:
40
Controles Básicos
8 - O que é um Evento?
41
Controles Básicos
10 - Em que situação podemos usar uma Caixa de Checagem e um Botão de Opção? Exemplifique.
42
Controles Básicos
43
Controles Básicos
3 SELECIONANDO ITENS
ListBox
ComboBox
44
Selecionando Itens
Caixa de Lista é um objeto onde pode-se adicionar ou remover vários itens, e o usuário pode
selecionar um ou vários destes itens.
Caixa de Lista
Vazia, sem
nenhum texto
digitado em seu
interior.
Este tipo de objeto é muito útil para mostrarmos uma relação de nomes ou códigos para se um (ou
vários) seja selecionado, e sempre que a quantidade desses itens superar o tamanho do ListBox um
ScroolBar Vertical automaticamente irá aparecer.
É bom ressalvar que este objeto, internamente, cria um índice começando com 0 (zero) até na
quantidade existente de itens. Exemplo: se temos 4 nomes dentro do ListBox, “Maria, José,
Cornélios, Pedro e Peter”, então o índice criado será 0 para Maria, 1 para José, e assim
sucessivamente. Este índice será usado sempre que for referenciar aos nomes contido dentro do
ListBox.
Enabled: Habilita ou não o ListBox para o usuário selecionar algum item no objeto.
IntegralHeight: Determina a possibilidade dos itens dentro da caixa de lista ser exibido de forma
parcial.
IntegralHeight
com TRUE
IntegralHeight
com FALSE
45
Selecionando Itens
MultiSelect: Quando esta propriedade está habilitada significa que a caixa de lista aceitará múltiplas
seleções, ou seja, poderá ser selecionado mais de um ítem. As opções são 0 - None para seleção
somente de 1 ítem. 1 - Simple para seleção de vários itens usando apenas o clicar do rato ou barra
de espaço. 2 - Extended é o padrão do Windows para multiplas seleções. Para selecionar mais de 1
item usa-se a combinação de tecla CTRL + Click do rato ou barra de espaço.
Name: Nome que o Objeto ListBox terá. A abreviação padrão é “lst”.
Sorted: Classifica os itens existentes dentro do ListBox em ordem alfabética ou numérica
ascendente. Esta propriedade em tempo de execução tem a finalidade de informar o estado que se
encontra o Sorted.
Style: O Estilo Standard é o padrão, e o Visual Basic 5 acrescentou o Estilo CheckBox, onde os
itens existentes no ListBox são acompanhados de um quadradinho do lado esquerdo para se fazer a
seleção dos itens. Para multiplas seleções esse tipo de ListBox é mais intuitivo para o usuário.
46
Selecionando Itens
No exemplo que criamos acima, um ListBox com nomes inseridos nele, vamos
fazer algumas mudanças. Acrescente mais 3 botões no formulário.
Propriedadades Botão1 Botão2 Botão3
Caption Quantidade Índice Text
Name cmdQuantidade CmdÍndice cmdText
47
Selecionando Itens
48
Selecionando Itens
As propriedades
do formulário
será “Relação de
Nomes” para o
Caption e
frmRelaçãoDeNomes
para o Name.
Veja ao lado como
ficará a janela.
O Objeto txtNome
tem sua propriedade
Text adicionada ao
lstNomes, e em
seguida é igualada a
um conteúdo vazio.
49
Selecionando Itens
Veja que na
codificação verificamos
se o txtNome esta
vazio. Se tiver
desabilita o botão
Adicionar, e não tiver
vazio habilita o botão.
50
Selecionando Itens
Este objeto é na verdade uma combinação da caixa de texto e da caixa de lista. Uma diferença
que este Objeto possui em relação a caixa de lista é que ele não aceita multiseleção. Somente é
acessado um item de cada vez.
Uma das grandes vantagens da Caixa de Combinação é a economia de espaços na tela. Podemos
colocar uma relação enorme de itens dentro de uma caixa de combinação que ela será apresentada
somente com uma caixa de texto, e a relação aparece somente se o usuário necessitar, digitando
assim na seta para baixo do Objeto.
51
Selecionando Itens
3.2.2 Os Métodos
Usamos para o ComboBox os mesmos métodos usados para o ListBox: AddItem,
RemoveItem e Clear. O modo de manipulá-los na janela de codificação também é o mesmo.
52
Selecionando Itens
53
Selecionando Itens
EXERCÍCIOS PROPOSTOS
1 - Descreva as seguintes propriedades do ListBox:
List:
Sorted:
MultiSelect:
Selected:
ListCount
ListIndex:
4 - Explique os métodos:
AddItem:
RemoveItem:
Clear:
54
Selecionando Itens
55
Selecionando Itens
4 O FOCO
TabIndex
GotFocus e LostFocus
SetFocus
Mnemônico
56
Selecionando Itens
4.1 O FOCO
Foco é o termo usado para descrever o objeto que esta em destaque no momento. O objeto que esta
sendo usado pelo usuário. Um objeto pode perder ou ganhar o foco. Quando estamos manipulando-
o ele ganha o foco, se apertamos a tecla TAB ou clicarmos com o rato em outro objeto o foco é
transferido para outro objeto, ou seja, um ganha o foco e outro perde o foco.
A seqüência que a tecla TAB usa para dar foco aos objetos no formulário é a ordem que eles
foram inseridos no formulário. Se você insere um botão de comando e depois insere uma caixa de
texto, então quando executarmos o programa o primeiro a receber o foco será o botão de comando.
Quando apertar a tecla TAB o foco será então transferido para a caixa de texto. Podemos também
passar o foco para um determinado objeto usando o rato.
Neste exemplo, quando o programa é executado e apertamos a tecla TAB o foco é passado do botão
de comando para a caixa de texto e depois para a caixa de checagem. Mas se quisermos alterar
esta ordem é só mudar o número existente na propriedade TabIndex.
Vamos passar a ordem de tabulação destes objetos para: Botão de comando, caixa de checagem e
depois caixa de texto.
Para fazer isto basta alterar a propriedade da caixa de texto para 1.
57
Selecionando Itens
A propriedade TabStop possui a finalidade de fazer a tecla Tab ignorar o controle na tabulação. Ou
seja, o objeto que tiver TabStop = False, não receberá o foco via teclado, somente se o usuário
clicar com o rato no objeto.
Quando o objeto esta com a propriedade Enabled = False ou Visible = False, o foco não passa por
eles, nem via teclado nem via mouse.
O Objeto Label não possui foco, pois ele não interage com o usuário.
58
Selecionando Itens
59
Selecionando Itens
Use o método SetFocus quando você quiser que um determinado campo ou controle tenha o foco,
para que toda a entrada do usuário seja direcionada para esse objeto. De modo a ler algumas das
propriedades de um controle, você precisa assegurar que o controle tenha o foco. Algumas
propriedades só podem ser definidas quando o controle não tem o foco. Por exemplo, você não pode
definir as propriedades Visible ou Locked de um controle como False quando esse controle tem o
foco.
Você não pode mover o foco para um controle se sua propriedade Enabled estiver definida como
False. Você precisa definir a propriedade Enabled de um controle como True antes de poder mover
o foco para esse controle. Você pode, porém, mover o foco para um controle se sua propriedade
Locked estiver definida como True.
Esses eventos ocorrem quando o foco é movido em resposta a uma ação do usuário, como o
pressionamento da tecla TAB ou o clicar no objeto, ou quando você usa o método SetFocus no
Visual Basic.
60
Selecionando Itens
Um controle só pode receber o foco se suas propriedades Visible e enabled estiverem definidas
como True. Um formulário só pode receber o foco se não tiver controles ou se todos os controles
visíveis estiverem desativados.
Você pode especificar o que acontece quando um formulário ou controle recebe o foco executando
um procedimento de evento quando o evento GotFocus ocorrer. Por exemplo, anexando um
procedimento de evento GotFocus a cada controle de um formulário, você pode guiar o usuário
através de seu aplicativo exibindo breves instruções ou mensagens em uma caixa de texto. Você
também pode oferecer indicações visuais ativando, desativando ou exibindo controles que
dependam do controle que tem o foco.
Também Pode-se usar um procedimento de evento LostFocus para validar dados inseridos conforme
o usuário move o foco de um controle. Você também pode reverter ou alterar as condições que você
define no procedimento de evento GotFocus do objeto. Outros usos para os procedimentos de
evento LostFocus e GotFocus são ativar, desativar, ocultar e exibir outros objetos.
61
Selecionando Itens
62
Selecionando Itens
Formulário:
Caption:Recursos Humanos
Name:frmRecursosHumanos
Caixa de Texto 1:
Text: <deixar vazio>
Name:txtNomeFuncionário
Caixa de Texto 2:
Text: <deixar vazio>
Name:txtCargo
Caixa de Texto 3:
Text: <deixar vazio>
Name:txtNomeConjuge
Enabled = False
Label 1:
Caption:Nome do Funcionário
Label 2:
Caption:Cargo
Label 3:
Caption: Nome do Cônjuge
Enabled: False
Name: lblNomeConjuge
Frame 1:
Caption:Estado Civil
Frame 2:
Caption: Setor
63
Selecionando Itens
64
Selecionando Itens
“Ca&ncelar”. Assim aparecerá no vídeo como: “Cancelar”, e se o usuário usar a combinação de tecla
ALT+N passará o foco para este objeto e o acessará.
Este recurso vale para todos os objetos que possuem a propriedade Caption, mas é bom lembrar
que alguns objetos não faz sentido colocar o Mnemônico, como por exemplo para um formulário.
Sempre que possível use as mesmas teclas de acesso em todo seu programa. Se numa janela você
tem o botão “Cancelar” com o mnemônico na letra “n”, então sempre que este botão aparecer em
outras janelas tente repetir a tecla de acesso usada.
Outra dica: Não use tecla de acesso para opções perigosas, como por exemplo um botão “Apaga
Tudo”. Se colocarmos uma tecla de acesso ALT+P nele corremos o risco de do usuário apertar esta
combinação por engano e limpar tudo. Estas opções delicadas sempre é bom obrigar o usuário a
usar o rato ou a tecla TAB para ele ter certeza do que esta fazendo.
Perceba que agora é só apertar a tecla ALT e a letra sublinhada para que
o objeto seja acessado. Entretanto para que o programa combine o objeto
label no objeto mais próximo, que no nosso exemplo são as caixas de texto,
é necessário que a ordem do TabIndex esteja rigorosamente crescente.
65
5 CONTROLES ESPECIAIS
MaskEdBox
CommonDialog
Selecionando Itens
Alguns controles do Visual Basic necessitam de uma explicação mais profunda devida a sua grande
utilidade dentro da linguagem de programação. Habitualmente estes controles são pouco tratados
em literaturas sobre o Visual Basic, e devido a isto vamos aprofundar mais sobre eles aqui.
5.1 MASKEDITBOX
Este objeto é semelhante a uma caixa de texto, entretanto ele possui alguns recursos
adicionais, como a possibilidade de colocar uma máscara para o texto que irá ser digitado e validar a
digitação automaticamente.
Vejamos as principais propriedades:
AllowPrompt: Determina se o caractere informado como prompt é válido durante a digitação.
AutoTab: Determina se quando o usuário terminar de preencher a mascara do objeto o foco é
automaticamente passado para o objeto seguinte, sem necessidade do usuário apertar TAB ou o
rato.
ClipMode: Determina se, diante de um evento de copiar ou recortar dados do objeto Maskedit para a
área de transferência, devem ser enviados os dados digitados com os caracteres que compõem a
máscara ou não.
ClipText: Retorna o texto digitado no objeto sem os caracteres que compõem a máscara.
Format: Determina o formato que os dados serão exibidos. Seque os mesmos padrões
estabelecidos para a função Format (veja no capítulo Funções Auxiliares)
Use a propriedade Format para exibir dados em um formato consistente, ou seja, os dados serão
exibidos neste formato, mesmo que o usuário digite os dados diferentemente do formato. Por
exemplo, se você definir a propriedade Format para “dd/mmm/yyyy”, todas as datas digitadas serão
exibidas no formato 18/Set/1995. Se o usuário digitar a data como 18/09/95 (ou qualquer outro
formato de data válido), o Visual Basic converterá a exibição para o formato estabelecido, que é dia /
mês-por-extenso-abreviado / ano-com-4-digitos.
A propriedade Format afeta apenas a maneira como um valor é exibido e não como ele é
armazenado. Da mesma forma, um formato de exibição não é aplicado até que o usuário termine a
digitação e o controle perca o foco.
Nada é exibido no campo para sugerir ou controlar o formato no qual os dados são inseridos.
67
Selecionando Itens
Se você precisar controlar a maneira como os dados são digitados, use uma máscara de entrada
além de ou ao invés de um formato de exibição de dados. Se você quiser que os dados sejam
exibidos exatamente como foram inseridos, não defina a propriedade Format.
FormattedText : Retorna o texto digitado, incluindo os caracteres que compõem a máscara.
Mask : Máscara que moldará o controle.
O Visual Basic fornece duas propriedades que produzem resultados parecidos: a propriedade
Format e o Mask.
Use a propriedade Mask para exibir caracteres de exibição literais no campo com espaços em
branco a serem preenchidos. Por exemplo, se todos os números de telefones que inserir em um
campo tiverem o mesmo formato, você poderá criar uma máscara de entrada:
(###) ###-#### (___) ___ -____ (062) 621-3862
Uma máscara de entrada garante que os dados se ajustem ao formato definido e você poderá
especificar os tipos de valores que poderão ser inseridos em cada espaço em branco. Por exemplo,
a máscara de entrada anterior solicita que todas as entradas contenham exatamente os dígitos
necessários para completar um código de área e número de telefone, e que somente dígitos possam
ser inseridos em cada espaço em branco.
Você pode definir uma máscara de entrada usando os seguintes caracteres.
Quando você define uma máscara de entrada e a propriedade Format para o mesmo objeto, a
propriedade Format tem precedência quando os dados são exibidos. Isso significa que mesmo você
tendo salvo uma máscara de entrada, ela é ignorada quando os dados são formatados. O dado
original como foi digitado não é alterado; a propriedade Format só afeta a maneira como os dados
são exibidos.
MaxLength : Determina a quantidade máxima de caracteres que o MaskEdBox pode ter.
Name: Nomeia o objeto. Geralmente inicia o nome com “msk”
68
Selecionando Itens
PromptChar: Escolhe o caractere padrão que será exibido simbolizando o estado vazio. Por default
possui o caractere “_”, e aconselho a substituir pelo caractere de espaço. Esta propriedade não
aceita vazio.
PromptInclude: Determina se o caractere inserido na propriedade PromptChar será incluído na
propriedade Text.
Text: Contém o texto digitado pelo usuário no objeto.
Evento ValidationError: Este evento ocorre sempre que o usuário digita alguma entrada que não
corresponde a máscara estabelecida.
69
Selecionando Itens
5.2 COMMONDIALOG
O Visual Basic traz algumas caixas de diálogos prontas para Abrir arquivo, Salvar, Imprimir,
escolher Cor, ou escolher fontes de letra. Sua utilização é simples e basta inserirmos o objeto
CommonDialog no formulário para ativarmos os diálogos. Na codificação do programa usamos a
propriedade Action para o Visual Basic abrir o diálogo pretendido:
Action: Determina o tipo de diálogo que será exibido:
0 Nenhum diálogo.
1 Mostra caixa de diálogo Abrir Arquivo
70
Selecionando Itens
As principais propriedades deste objeto podem ser acessadas selecionando (Custom) ou clicando no
botão direito do rato e selecionando “Propriedades” no menu:
Open/SaveAs: Aqui definimos as características do arquivo que será aberto ou salvo.
71
Selecionando Itens
Filter: Especifica os tipos de arquivos que poderão ser selecionados. Veja a regra de uso desta
propriedade:
Descrição | Tipo de arquivo |
Primeiro usamos um texto descritivo para o arquivo que será selecionado. Depois uma barra
vertical (|), e a extensão que este arquivo usa e finaliza com outra barra.
Textos (*.txt) | *.txt | Documentos (*.Doc) | Figuras (*.bmp,*.pcx) | *.bmp;*.ico |
Color: Especifica a cor selecionada no diálogo. Essa propriedade serve não só para capturar a cor
escolhida como para levar para a janela Color a cor em uso.
72
Selecionando Itens
FontName: Nome da fonte corrente, usado no momento em que a janela de escolha de fonte foi
chamada. Também informa qual o nome da nova fonte escolhida.
FontSize: Determina o tamanho da fonte corrente e o novo tamanho escolhido.
Min e Max: Tamanho mínimo e máximo que um usuário pode escolher para uma determinada fonte
de letra.
Flags: Determina algumas opções para a caixa de díálogo. Coloque 1.
Style: Determina como será o tipo da fonte de letra.
73
Selecionando Itens
Métodos Aplicáveis ao Controle: Podemos usar métodos para exibir as caixas de diálogo.
[Link] Exibe janela para escolha de cores.
[Link] Exibe janela para escolha de fonte de letra.
[Link] Exibe janela com opções de abrir arquivo.
[Link] Exibe janela com opções para salvar arquivo.
[Link] Exibe janela com opções de impressão.
74
Selecionando Itens
Nomeie os objetos:
Tipo de Objeto Name
Label LblTeste
Command1 CmdCorLetra
Command2 cmdFonte
CommonDialog Dialogo
Com isto o usuário poderá escolher a cor da letra que para o label assim
como mudar a fonte de letra e o tamanho. Repare que usamos o "Flags = &H1"
para forçar o Visual Basic a ler somente as fontes de tela. Consulte o Help
para ver os outros Flags possíveis.
75
Selecionando Itens
6 MENUS
Criando Menus
Menus Instantâneos
76
Selecionando Itens
6.1 MENUS
A maioria das aplicações possui menus para facilitar o usuário na
localização de todas as janelas que compõem um programa.
Para criar menus, usamos o menu TOOLS opção Menu Editor.
Sempre que criarmos menu temos que seguir algumas regras como
colocar acesso Mnemônico em todos os itens e seguir um padrão,
como, pôr exemplo, o menu Arquivo colocar o sublinhado na letra
“A”, colocar “...” quando este menu abre uma janela de diálogo,
estabelecer uma Tecla de Atalho para as principais opções do menu e colocar um traço de
separação para separar seções dentro de um mesmo menu, como pôr exemplo, no menu ao lado,
usou este recurso para separar algumas opções.
77
Selecionando Itens
retirada. Usamos esta propriedade quando queremos mostrar para o usuário o estado Ligado ou
Desligado de algum item do menu.
Enabled: Habilita ou não um item do menu. Quando esta desabilitada o Visual Basic coloca o texto
do Caption acinzentado.
Visible: Quando necessitamos que um determinado item do menu exista mas que fique invisível
para o usuário até que determinada condição seja estabelecida, usamos esta propriedade.
Usamos os botões de setas para Baixo de para Cima para movermos um item de lugar depois de
criado. O botão seta para Direita transforma o item selecionado em submenu item imediatamente
acima. O botão seta para esquerda volta o item um nível.
O botão Next é o default, ou seja, ele é acionado sempre que digitamos ENTER. Ele passa para o
próximo item de menu a ser digitado ou na seqüência.
Insert é usado para inserir um item de menu entre outros já criados e Delete apaga o item
selecionado.
78
Selecionando Itens
apertamos ENTER para o próximo ele não insere um novo item. Temos que
repetir a operação “Insert” e “Seta para Direita”.
79
Selecionando Itens
Execute o programa e veja que clicando nas opções com o rato ou apertando
as teclas de atalho correspondentes o MsgBox é acionado.
Vamos agora voltar ao Editor de Menu e na opção “Cadastro” inclua no
final o item “Sair”. Vamos colocar um item “Separador” para esteticamente
ficar mais apresentável. Este item é colocando inserindo o caractere “-“ no
caption.
80
Selecionando Itens
MouseUp (Button as Integer, Shift As Integer, X as Single, Y as Single): Sempre que o usuário
aperta um botão do rato este evento é chamado. Usamos os argumentos que o evento oferece para
sabermos qual dos botões foram apertados, se foi em conjunto com alguma tecla e qual coordenada
estava o ponteiro do rato no momento que o evento foi chamado.
Button: retorna um número inteiro que informa qual dos botões foram apertados:
1 Botão esquerdo pressionado. vbLeftButton
2 Botão direito pressionado. vbRightButton
4 Botão do centro pressionado. vbMiddleButton
Shift: retorna um número inteiro que informa qual tecla estava pressionada no momento em que
algum botão do rato também foi pressionado.
1 SHIFT pressionado. VbShiftMask
2 CTRL pressionado. VbCtrlMask
4 ALT pressionado vbAltMask
X: Coordenada para linha
Y: Coordenada para Coluna
81
Selecionando Itens
82
Selecionando Itens
7 VARIÁVEIS E MATRIZES
Numérica
Texto
Data
Byte
Boolean
Object
Variant
Matrizes
83
Variáveis e Matrizes
84
Variáveis e Matrizes
Este exemplo bem simples é somente para mostrar que usamos duas variávels chamadas x e y e
não as declaramos. Precisamos delas e usamos. Caso fosse usar o comando Dim, esta mesma
função ficaria assim:
Function CalculaFormula()
Dim x As Integer
Dim y As Integer
x = 10
y = 13
CalculaFormula = x*y+30
End Function
A expressão Integer significa tipo de variável numérica que poderá aceitar somente números
inteiros. Veremos melhor esses tipos adiante.
Este método é extremamente útil, pois imagine um programa onde existe uma imensa quantidade de
variáveis. Se todas foram previamente declaradas saberemos de antemão os nomes dela e para
que servem.
Podemos forçar o Visual Basic a aceitar em nosso programa somente variáveis que foram
declaradas. Para tanto temos que acessar o TOOLS no menu principal, opção OPTIONS:
Usando isto, o Visual Basic irá exigir a declaração das variáveis, e não corremos o risco de, quando
digitarmos o nome de alguma variável errada, ele aceitar. Exemplo: Criamos uma variável de nome:
ClienteCadastrado. E em algum canto de nossa codificação digitamos: ClienteCadastado. Faltou a
letra “r”. Se a opção “Require Variable Declaration” estiver habilitada o Visual Basic nos avisará que
este nome não existe como variável. Caso contrário, o Visual Basic irá imaginá-la como uma nova
variável e aceitará o erro. Não corra risco!
85
Variáveis e Matrizes
86
Variáveis e Matrizes
Entretanto, apesar de podermos usar o operador “+” para fazer concatenação, vamos usar em seu
lugar sempre o operador “&”. Esse operador, em detrimento ao outro, força a concatenação mesmo
quando os dados são incompatíveis. Exemplo: “12” + 13 resultará em 25. Observe que uma
expressão era String e a outra numérica, e o operador “+” forçou a soma. Se usássemos neste
exemplo “12” & 13 resultaria em “1213” apesar da expressão 13 ser numérica.
Quando criamos uma variável do tipo String podemos delimitar previamente o tamanho que ela terá.
Veja a sintaxe:
Dim NomeEscola as String * 30
Criamos uma variável de nome “NomeEscola” do tipo String (texto) e que terá no máximo 30
caracteres. Se colocarmos mais que isto em seu conteúdo o excedente será ignorado. Se
colocarmos menos que isto será preenchido com espaços em branco.
87
Variáveis e Matrizes
7.1.9 Null
Quando o conteúdo da variável é um dado inválido ela retorna a palavra-chave Null.
Repare, a variável NomeTeste foi criada dentro da rotina Private Sub Command1 e na outra rotina
Private Sub Command2 fazemos referência a ela. Como ela foi criada dentro da Private Sub
Command1 ela tem validade somente lá. Este exemplo retornará um erro, pois NomeTeste não
existe para Private Sub Command2.
88
Variáveis e Matrizes
Entretanto, se queremos que uma variável tenha uma abrangência em todas as rotinas criadas
dentro do formulário, então na janela de código do formulário na parte superior mude o Object para
“General” e o Proc para “declarations). As variáveis que forem criadas ali valerão para todas as
rotinas criadas para o formulário e seus objetos anexados a ele.
Exemplo:
Option Explicit
Dim teste As String
Veja que a variável teste foi criada fora da rotina Private Sub, mas possui abrangência dentro dela.
Se criarmos um outro formulário e pedirmos para imprimir a variável teste irá ocasionar um erro, pois
a validade desta variável é somente dentro do formulário em que ela foi criada.
Caso precisamos de uma variável de caráter publico, que tenha validade Global, em todos os
formulários e rotinas de nossa aplicação, será necessário inserir um módulo (Menu Insert opção
Module) e dentro dele criar a variável com o comando PUBLIC no lugar de DIM. Veja exemplo:
Menu Project
Janela de
codificação do
módulo criado
89
Variáveis e Matrizes
90
Variáveis e Matrizes
Nesta codificação
do segundo botão
apenas mandamos
inserir o conteúdo
da variável Teste
para o Label
lblTreino.
Colocando o
comando Dim
no object
“General”
todas as
variáveis
criadas ali tem
abrangência em
toda a janela de
codificação do
formulário
(todas as rotinas
existentes).
91
Variáveis e Matrizes
Mas não existe nenhum conteúdo para a variável Teste até o momento em que
o botão “cmdTesteVariável” seja pressionado. A variável Teste terá um
conteúdo somente quando o botão “cmdTesteVariável” for pressionado. Até
então, a variável existe mas seu conteúdo é vazio.
Para entender melhor, mude a codificação do botão “cmdSegundoTeste” para:
92
Variáveis e Matrizes
7.3 MATRIZES
Nas matrizes podemos armazenar vários dados (seja texto, números ou datas) em uma única
variável. O que diferencia essencialmente uma matriz de uma variável é que a primeira possui níveis
dentro de si, e em cada nível podemos armazenar dados. Veja o exemplo de uma declaração e
inicialização de uma matriz:
Dim NomeCliente(3) as String
NomeCliente(0) = “Fernando Henrique”
NomeCliente(1) = “Fernando Collor”
NomeCliente(2) = “José Sarney”
Criamos uma matriz de nome NomeCliente e definimos como sendo uma String. Entretanto,
definimos também que essa matriz terá 3 níveis somente. Em cada nível podemos colocar um
elemento (um conteúdo) dentro dele.
Todos os elementos da matriz precisam ser do mesmo tipo estabelecido no comando Dim. Porém,
se declararmos um matriz do tipo Variant, cada elemento poderá ser de um tipo de dado diferente.
Para acessarmos um determinado conteúdo temos que especificar o número que acompanha o
nome da matriz. Chamamos esses números de índice, e são estes índices que localiza os elementos
dentro da matriz. Exemplo: Se desejamos imprimir a matriz que contém o nome “José Sarney” temos
que digitar:
Print NomeCliente(2)
Se digitar somente NomeCliente o Visual Basic não irá retornar um erro em tempo de execução:
Este erro acontece porque uma vez definido NomeCliente como matriz, ela poderá somente ser
chamada como uma matriz (com seu índice).
A abrangência e tempo de vida de uma matriz segue as mesmas regras estabelecida para as
variáveis.
As regras de nomeação de uma matriz também são as mesmas aplicadas as variáveis.
O primeiro elemento será referenciado com o índice 0, ou seja, Contador(0); o segundo elemento
como Contador(1), e assim por diante. O índice do último elemento será sempre um a menos que a
quantidade especificada entre os
parênteses na declaração. Isto
acontece porque como padrão o Visual
Basic inicia sua contagem para índices
em 0. No exemplo, o índice varia de 0 a
93
Variáveis e Matrizes
9. Mas isto não quer dizer que não podemos mudar esse padrão. Para isto usamos o comando
Option Base, adicionado à seção Declarations. Option Base 0 faz com que o índice das matrizes
inicie em 0, por outro lado, como Option Base 1, o valor inicial para para 1.
Significa que temos um matriz de nome Contador, possui 3 elementos e cada elemento possui 2
elementos. Ou seja, no total, essa matriz terá 6 elementos. Veja como ficaria:
Contador(1,1) = “Janeiro”
Contador(2,1) = “Fevereiro”
Contador(3,1) = “Março”
Contador(1,2) = “Venda Ruim”
Contador(2,2) = “Venda Regular”
Contador(3,2) = “Venda Boa”
Veja como ficaria a representação gráfica dessa matriz
Coluna 1 Coluna 2
Linha 1 Janeiro (1,1) Venda Ruim (1,2)
Linha 2 Fevereiro (2,1) Venda Regular (2,2)
Linha 3 Março (3,1) Venda Boa (3,2)
Perceba que esses tipos de matriz são multidimensional porque criam subdivisões dentro de cada
elemento. Poderíamos ter matrizes do tipo:
Dim Contador(3,5,8) as Integer
Esse monstro que criamos significa essa matriz possui 3 elementos. Cada Elemento se subdivide em
outros 5 elementos. Cada elemento desses cinco elementos se subdivide em outros 8 elementos,
formando no total 120 elementos (3X5X8). Confesso que a primeira impressão é horrível. Mas a
possibilidade existe e o bicho não é tão feio. Podemos usar matrizes multidimensional como uma
planilha eletrônica de cálculo.
94
Variáveis e Matrizes
Neste exemplo quando redimensionamos pela segunda vez tivemos que colocar um conteúdo
novamente para o NomeCliente(1) pois o comando ReDim sempre apaga os dados armazenados
anteriormente.
Quando não queremos que isto aconteça usamos a cláusula Preserve Juntamento com o ReDim.
Assim os conteúdos anteriores são preservados. Veja:
ReDim NomeCliente(1)
NomeCliente(1) = “João Figueiredo”
Objetos como o ComboBox e o ListBox usam matrizes para fazer referencia ao seu conteúdo
através da propriedade List. Veja este exemplo:
Note que na propriedade List existe um índice que usamos para referenciar aos dados contido no
Objeto ListBox. Este índice sempre inicia com 0 e vai até o ultimo existente dentro da Caixa de Lista.
A propriedade NewIndex do objeto retorna o índice do ultimo item que entrou no ListBox, e a
95
Variáveis e Matrizes
Se optarmos pelo sim ele criará uma matriz e renomeará o objeto para lblTestaMatriz(0) e
lblTestaMatriz(1). A propriedade index de cada um possuirá os números 0 e 1 respectivamente.
Usando uma matriz o nosso objeto agora terá que ser referenciada com o seu índice para podermos
saber qual objeto estamos querendo usar:
Se formos fazer alguma codificação para este objeto, teríamos que sempre colocar o índice
correspondente ao objeto que estamos trabalhando.
96
Variáveis e Matrizes
Note que o evento click que criamos para o Label possui um argumento “Index As Integer”. A
variável index terá em seu conteúdo o número do índice correspondente ao Objeto clicado. Ou seja,
se chamarmos o evento click através do Label1 o número do índice será 0. Se usarmos o Label2 o
índice será 1.
Para conseguirmos o mesmo efeito sem usar matriz teríamos que criar um
evento click para cada opção do CheckBox.
97
Variáveis e Matrizes
EXERCÍCIOS PROPOSTOS
1 - Cite três regra que temos que respeitar na criação de uma variável:
98
Variáveis e Matrizes
99
8 OPERADORES
Matemático
Relacional
Lógico
String
Operadores
8.1 OPERADORES
A finalidade básica dos operadores são para comparar, calcular, igualar, concatenar... enfim, fazer
operações envolvendo variáveis ou campos de Banco de Dados.
101
Operadores
And: Usamos quando precisamos comparar duas relações e ambas tem que ser verdadeira.
20 > 10 and 5 = 5
O Resultado será verdadeiro ( True ). 20 é maior que 10 e 5 é igual a 5.
20 > 10 and 5 = 4
O Resultado será falso (False). 20 é maior que 10 mas 5 não é igual a 4. Somente 1 das
duas expressões deram certo.
Or: Usamos quando precisamos comparar dois relacionamentos e pelo menos um deve ser
verdadeiro ( ou um ou outro ).
20 < 10 Or 5 > 4
O resultado será verdadeiro. 20 não é menor que 10, mas 5 é maior que 4.
20 < 10 Or 4 > 5
O resultado será falso. 20 não é menor que 10 e nem 4 é maior que 5.
Not: É um operador que inverte o resultado, passando algo que seria verdadeiro para falso e vice-
versa.
Not(10 > 5)
O resultado será falso. 10 é maior que 5. Seria Verdadeira a comparação, mas como possui
o Not, e ele inverte o resultado, o retorno é falso.
Xor: Este operador exige precisão. Não admite confusão na comparação dos relacionamentos. Ou é
uma coisa ou outra. Nunca as duas.
8 > 10 Xor 8 > 6
Retorna verdadeiro, pois o resultado das duas comparações foram diferentes. A primeira é
falsa e a segunda é verdadeira.
8 > 10 Xor 6 > 8
Retorna falso, pois o resultado das duas comparações foram semelhantes. A primeira é falsa
e a segunda também.
102
Operadores
Eqv: Abreviatura de Equivalente. Faz uma equivalência lógica entre duas expressões.
10 > 8 Eqv 8 > 6
Retorna verdadeiro, pois ambas comparações são iguais.
8 > 10 Eqv 8 > 6
Retorna falso, pois as comparações retornam valores diferentes.
Imp: Abreviatura de Implicação (uma coisa implica em outra). O resultado será False somente se a
primeira comparação for True e a segunda for False. Nos outros casos o resultado será sempre
True. Este operador é o único onde a ordem dos operandos fazem diferença.
10 > 8 Imp 6 > 8
Retorna Falso, pois a primeira comparação é Verdadeira e a segunda é falsa.
10 > 8 Imp 8 > 6
Retorna Verdadeiro.
8 > 10 Imp 6 > 8
Retorna Verdadeiro.
103
Operadores
Isto fará com que o programa calcule o valor informado e concatene este
valor com o nome do usuário.
104
Operadores
105
Operadores
EXERCÍCIOS PROPOSTOS
1 - Qual a diferença entre o operador / e o operador \ ?
106
9 COMANDOS CONDICIONAIS E DE LAÇO
Condicionais
Laço
Comandos Condicionais e de Laço
O programa verifica: Se contador for menor que 20 então imprima no formulário “Contador é menor
que 20”. Quando terminar imprima “Fim do Programa.
Quando uma determinada condição que colocamos no comando IF é verdadeira ele começa a
executar todas as linhas que existem entre IF e END IF. Se a condição não for verdadeira então o
programa passa a execução para a linha após o END IF e ignora tudo que houver dentro da
estrutura IF... END IF.
Dim Contador as Integer
Contador = 20
IF Contador > 20 Then
Print “Contador é maior que 20”
End If
Print “Fim do Programa”
Agora o programa irá verificar se Contador é maior que 20. Ele não é maior que 20. Esta condição é
falsa. Então, sendo assim, ele não executará as linhas existentes dentro da estrutura IF...END IF, e
só irá imprimir no formulário a frase “Fim do Programa”.
IF <<Condição>> THEN... ELSE... END IF
Traduzindo: IF = Se, THEN = Então, ELSE = Senão, END IF = Fim do Comando Se.
Acrescentamos na estrutura o comando ELSE, que é sempre executado quando a condição não é
verdadeira.
Dim Contador as Integer
Contador = 20
IF Contador < 20 Then
Print “Contador é menor que 20”
ELSE
Print “Contador é maior ou igual a 20”
End If
Print “Fim do Programa”
O programa verifica: Se o Contador for menor que 20 imprima a frase: “Contador é menor que 20”,
senão, imprima “Contador é maior ou igual a 20”.
108
Comandos Condicionais e de Laço
Perceba que agora o programa irá executar um comando da estrutura, seja um ou outro, mas pelo
menor um será executado. Se a condição for verdadeira o comando executado é sempre o que esta
após o comando IF, se for falsa ele ignora as instruções que existem após o comando IF e passa a
execução para a linha após o ELSE e vai até o final.
Lembre-se: Sempre que usar o comando IF é necessário usar o comando THEN após a condição, e
depois encerrar a estrutura condicional IF com END IF.
IF <<Condição>> THEN... ELSEIF... ENDIF
Traduzindo: IF = Se, THEN = Então, ELSEIF = Senão se, END IF = Fim do Comando Se.
Modificamos comando ELSE para ELSE IF, que é sempre executado quando a condição não é
verdadeira, mas ainda dependendo de uma outra condição.
Dim Contador as Integer
Contador = 20
IF Contador < 20 Then
Print “Contador é menor que 20”
ELSEIF Contador = 20
Print “Contador é igual a 20”
ELSE
Print “Contador é maior que 20”
End If
Print “Fim do Programa”
O programa verifica se o contador é menor que 20. Se não for verifica se é então igual a 20, senão
irá imprimir que contador é maior que 20.
Veja outro exemplo:
109
Comandos Condicionais e de Laço
SELECT CASE
Significa “Seleção de Casos”. Ou seja, colocamos várias possibilidades (varios casos) para o Visual
Basic e ele escolhe um.
Veja a estrutura do comando:
Opção = 3
Select Case Opção
Case 1
Print “Opção 1 acionada”
Case 2
Print “Opção 2 acionada”
Case 3
Print “Opção 3 acionada”
End Select
Veja que este comando verifica se a Opção é 1, depois verifica se é 2 e depois se é 3. Se a variável
Opção for 3 ele executará as instruções contidas na próxima linha. Caso a variável Opção não seja
1,2 ou 3 então o comando SELECT CASE é encerrado.
Opção = 3
Select Case Opção
Case 1
Print “Opção 1 acionada”
Case 2
Print “Opção 2 acionada”
Case 3
Print “Opção 3 acionada”
Case Else
Print “Opção não é 1,2 ou 3”
End Select
Acrescentando na estrutura cláusula CASE ELSE (caso contrário), o Visual Basic irá verificar se a
variável é 1,2 ou 3, não sendo então será CASE ELSE, e a linha seguinte a esta cláusula será
executada.
No comando Case podemos usar também intervalos, como por exemplo:
Case 2 to 4
110
Comandos Condicionais e de Laço
]
Em um novo formulário crie uma caixa de texto para digitarmos uma data e
um botão como esta abaixo:
111
Comandos Condicionais e de Laço
Inicializamos uma variável de nome Contador com Zero, e pedimos para o programa: “Repita as
instruções abaixo enquanto Contador for menor que 10”. O comando LOOP faz com que o programa
volte para a linha do DO WHILE e teste a condição de novo. Somente quando a condição for
verdadeira, ou seja, quando Contador for maior ou igual a 10, que o programa executará a li nha
após o LOOP.
Perceba que dependendo do resultado da condição os comandos existentes dentro da estrutura
podem não serem executados, passando direto para a linha após o comando LOOP.
Inicializamos uma variável de nome Contador com Zero, e pedimos para o programa: “Repita as
instruções abaixo até que Contador seja maior ou igual que 10”. O comando LOOP faz com que o
programa volte para a linha do DO UNTIL e teste a condição de novo. Somente quando a condição
112
Comandos Condicionais e de Laço
for verdadeira, ou seja, quando Contador for realmente maior ou igual a 10, que o programa
executará a linha após o LOOP.
Semelhante ao DO WHILE, dependendo do resultado da condição os comandos existentes
dentro da estrutura podem não serem executados, passando direto para a linha após o comando
LOOP.
FOR <<Intervalo>> ... NEXT (Conte de número inicial até numero final)
O comando FOR faz uma contagem de um determinado intervalo de números. Sempre que essa
contagem encontra com o comando NEXT (próximo) a execução do programa retorna ao comando
FOR até que o número final seja alcançado. Exemplo:
Contador = 0 Conte de um até 10
For Contador = 1 to 10
Print “A variável Contador agora vale “ &Contador
Next
Print “Fim da execução”
Neste programa o Visual Basic inicializa a variável Contador em zero, e o comando FOR avisa
“vamos contar até 10, começando pelo 1”. As instruções contidas na linha abaixo são executadas, e
quando o comando NEXT é encontrado a execução volta para o FOR, e a variável Contador é
incrementada em mais um e assim por diante. Quando Contador for igual a 10 a estrutura
FOR/NEXT é desfeita.
STEP
Usamos o STEP em conjunto com o FOR para fazer com que a contagem seja incrementada.
Exemplo: Se queremos que o comando conte de 2 em 2 colocamos FOR Variável = 1 TO 10 STEP 2
EXIT <<Comando>>
Exit Sub: Força a saída da Sub rotina. Quando a execução do programa encontra este
comando, o Visual Basic transfere o controle do programa para a linha seguinte a aquela que
chamou a rotina.
Exit Function: Força a saída da função. Quando a execução do programa encontra este
comando, o Visual Basic transfere o controle do programa para a linha seguinte a aquela que
chamou a rotina.
Exit Do: Força a saída de um LOOP, seja WHILE ou UNTIL, mesmo que a condição
estabelecida não seja verdadeira:
Contador = 0
Do While Contador < 10
Contador = Contador + 1
113
Comandos Condicionais e de Laço
Print Contador
if Contador = 5 then
Exit Do
end if
Loop
Print “Fim da execução”
Exit For: Força a saída de um FOR..NEXT, mesmo que o número final não tenha sido
alcançado.
Contador = 0
For Contador = 1 to 10
Print “A variável Contador agora vale “ &Contador
If Contador = 6
Exit For
end if
Next
Print “Fim da execução”
114
Comandos Condicionais e de Laço
EXERCÍCIOS PROPOSTOS
1 - Cite duas diferenças entre um laço DO WHILE e um laço DO - LOOP WHILE?
2 - Qual intrução que verifica sua condição antes da execução das rotinas que fazem parte do laço?
3 -Se necessitassemos executar um vários comandos e funções repetidamente até que uma
determinada condição fosse verdadeira, qual loop usuariamos?
115
10 FUNÇÕES DE AUXILIO
Data e Hora
Conversão
String
Matemática
Entrada de Dados
Identificação
Manipulação de Matriz
Comandos Condicionais e de Laço
10.1 FUNÇÕES
Funções nada mais é que rotinas prontas para executar determinadas ações.
Existem no Visual Basic diversos tipos de funções que nos auxiliam na programação em todos os
aspectos. São funções que fazem cálculos, funções que exibem resultados, funções para todos os
gostos. Vamos começar a ver algumas dessas funções e com isto descobriremos o poder que elas
exercem dentro da linguagem e sua utilidade.
Existem funções que precisam de um argumento para executar uma tarefa, outras somente retorna
algum valor sem necessidade do argumento, como visto nos exemplos abaixo:
FIX: Retorna a parte inteira de um número, ignorando as casas decimais, se houver. Não faz
arredondamento
VariávelNumérica = Fix(<expressãoNumérica>)
Print Fix(145.87)
Valor Impresso: 145
Print Fix(-145.87)
Valor Impresso: -145
INT: Retorna a parte inteira de um número, ignorando as casas decimais, se houver. Não faz
arredondamento. Se o argumento for um número negativo será incrementado em um.
VariávelNumérica = INT(<expressãoNumérica>)
Print Int(145.87)
Valor Impresso: 145
Print Int(-145.87)
Valor Impresso: -146
117
Comandos Condicionais e de Laço
118
Comandos Condicionais e de Laço
CBOOL: Converte uma expressão para um valor lógico (True ou false). Se o argumento for um zero,
retornará False, caso contrário será True.
VariávelLógica = CBool(<expressão>)
Print Cbool(43)
Valor Impresso: True
Print Cbool(0)
Valor Impresso: False
Print Cbool(4 = 6)
Valor Impresso: False. O resultado da comparação não é verdadeira.
CDATE: Converte uma expressão para um tipo Data. Entretanto, esta conversão se concretizará
desde que a expressão usada como argumento seja mesmo no formato de uma data, ou seja,
dia/mês/Ano. Se pedirmos para fazer conversão da palavra “teste” para data será retornado um erro.
VariávelData = Cdate(<expressão>)
Print Cdate(“12/04/95”)
Valor Impresso: 12/04/95
Print Cdate(“120495”)
Erro. O conteúdo informado como argumento não esta formatado como data.
Print Cdate(“30/02/95”)
Erro. O argumento não é uma data real
É importante salientar que essa conversão é necessário principalmente quando o usuário
digita uma data e esta data vai ser objeto de cálculo. Então a conversão é necessária.
CDBL: Converte uma expressão numérica em um número de ponto flutuante de precisão dupla.
VariávelNumérica = Cdbl(<expressão numérica>)
119
Comandos Condicionais e de Laço
CSNG: Converte uma expressão numérica em um número de ponto flutuante de precisão simples.
VariávelNumérica = CSng(<expressão >)
CSTR: Converte uma expressão numérica, data ou outra em uma string (texto).
VariávelString = CStr(<expressão>)
Print Cstr(452)
Valor Impresso: 452
STR: Converte um valor numérico para o tipo String (texto). Valido somente para argumentos
numéricos.
VariávelString = Str(<expressãoNumérica>)
Print Str(452)
Valor Impresso: 452
STRCONV: Retorna uma string convertida de acordo com o tipo de conversão especificado.
VariávelString = Strconv(<ExpressãoString>, <TipoDeConversão>)
Tipos de conversão que podemos usar:
vbUpperCase Converte toda a expressão em letras maiúsculas.
vbLowerCase Converte toda a expressão em letras minúsculas.
vbProperCase Converte somente a primeira letra em maiúscula e o restante em minúsculo.
Print StrConv(“Lionardo”, vbUpperCase)
Valor Impresso: LIONARDO
Print StrConv(“LIONARDO”, vbProperCase)
Valor Impresso: Lionardo
120
Comandos Condicionais e de Laço
VAL: Converte uma String com caracteres numéricos em uma variável númerica.
VariávelNumérica = Val(<stringNumérica>)
Print Var(“003”)
Valor Impresso: 3
Print Var(“123”)
Valor Impresso: 123
<Intervalo> Expressão de seqüência de caracteres que é o intervalo de tempo que você quer
adicionar. Tipos de caracteres usados:
yyyy Ano
q Trimestre
m Mês
y Dia do ano
d Dia
w Dia da semana
ww Semana
h Hora
n Minuto
s Segundo
<Incremento> Expressão numérica que é o número de intervalos que você quer adicionar.
Pode ser positivo (para obter datas no futuro) ou negativo (para obter datas no passado).
<ExpressãoData> Data que está sendo adicionada.
Print DateAdd("d",2,"31/07/96")
Valor Impresso: 02/08/96
A função DateAdd pode ser usada para adicionar a uma data ou subtrair dela um intervalo
de tempo especificado. Por exemplo, você poderia usar DateAdd para calcular uma data 30 dias a
partir de hoje ou uma hora que é 45 minutos a partir de agora.
Se quiser adicionar dias a data, você pode usar Dia do Ano ("y"), Dia ("d") ou Dia da
Semana ("w").
121
Comandos Condicionais e de Laço
A função DateAdd não retornará uma data inválida. O exemplo abaixo adiciona um mês a 31
de janeiro:
DateAdd("m", 1, "31-Jan-95")
Neste caso, DateAdd retorna 28-Fev-95 e não 31-Fev-95. Se date for 31-Jan-96, ele
retornará 29-Fev-96 pois 1996 é um ano bissexto.
<Intervalo> Expressão de seqüência de caracteres, que é o intervalo de tempo que você usa
para calcular a diferença entre uma data e outra.
O argumento intervalo tem estas configurações:
yyyy Ano
q Trimestre
m Mês
y Dia do ano
d Dia
w Dia da semana
ww Semana
h Hora
n Minuto
s Segundo
A função DateDiff pode ser usada para determinar quantos intervalos de tempo especificados
existem entre duas datas. Por exemplo, você poderia usar DateDiff para calcular o número de dias
entre duas datas ou o número de semanas entre o dia de hoje e o final do ano.
Se quiser saber o número de dias entre date1 e date2, você pode usar tanto o Dia do Ano ("y") como
o Dia ("d").
Quando interval é Dia da Semana ("w"), DateDiff retorna o número de semanas entre as duas datas.
Se date1 cair numa segunda-feira, DateDiff contará o número de segundas-feiras até a date2. Ele
conta date2, mas não date1. Se, contudo, interval for Semana ("ww"), a função DateDiff retornará o
número de semanas do calendário entre as duas datas. Ele conta o número de domingos entre
date1 e date2. DateDiff contará date2 se ela cair num domingo; mas não contará a date1, mesmo
que caia num domingo.
Se date1 se referir a um ponto no tempo posterior à date2, a função DateDiff retornará um número
negativo.
Se data for um literal de data (uma data entre sinais numéricos (#)), o ano, se especificado, se
tornará uma parte permanente dessa data. Contudo, se data estiver entre aspas ("") e você omitir o
122
Comandos Condicionais e de Laço
ano, o ano atual será inserido no código sempre que a expressão data for avaliada. Isto torna
possível escrever um código que pode ser usado em anos diferentes.
DATEPART: extrai de uma determinada data uma parte dela relativo a dia, mês, semana, quinzena,
etc.
ParteDaData = DatePart(<intervalo>, <expressãoData>)
Intervalo pode ser:
yyyy Ano
q Trimestre
m Mês
y Dia do ano
d Dia
w Dia da semana
ww Semana
h Hora
n Minuto
s Segundo
DATESERIAL: Retorna uma data para um dia, mês e ano especificados, ou seja, informe cada item
separado que a função monta a data.
VariavelData = DateSerial(<ano>, <mês>, <dia>)
Print DateSerial("96","08","02")
Valor Impresso: 02/08/96
DATEVALUE: Retorna a data especificada numa string, ou seja, converte uma variável String para o
tipo Data.
VariávelData = DateValue(<VariávelStringDeData>)
Print DateValue("02/08/96")
Valor Impresso: 02/08/96
123
Comandos Condicionais e de Laço
TIMEVALUE: Retorna a hora especificada numa string, ou seja, converte uma String cujo conteúdo
esta no formato de hora para uma variável tipo Data e Hora.
VariávelData = TimeValue(<ExpressãoStringDeHora>)
WEEKDAY: Retorna o dia da semana de uma data, ou seja, seu numero correspondente: 1 para
Domingo até 7 para Sábado.
VariávelNumérica = WeekDay(<ExpressãoData>)
124
Comandos Condicionais e de Laço
125
Comandos Condicionais e de Laço
INSTR: Retorna a posição da primeira ocorrência de uma seqüência de caracteres dentro de outra
Variável = InStr ({<posiçãoInicial>,] <string>,
<SubStringAPesquisar>[, <MétodoDeComparação])
Posição Inicial: Expressão numérica que define a posição inicial de cada pesquisa. Se omitido, a
pesquisa começa na posição do primeiro caractere.. Este argumento é necessário se o Método de
Comparação for especificado.
String : Expressão de seqüência de caracteres que está sendo pesquisada.
SubStringAPesquisar : Expressão de seqüência de caracteres procurada.
MétodoDeComparação : Especifica o tipo comparação de seqüências de caracteres. Este
argumento pode ser omitido, pode ser 0 ou 1. Especifique 0 (padrão) para realizar uma comparação
binária. Especifique 1 para realizar uma comparação textual que desconsidere
maiúsculas/minúsculas. Se este argumento for omitido, a configuração de Option Compare
determinará o tipo de comparação.
LEFT: Retorna uma quantidade de caracteres que se encontra da esquerda para a direita.
VariávelString = Left(<string>, <QuantidadeDeCaracteres>)
Print Left("Lionardo",4)
Valor Impresso: Lion
LEN: Retorna o número de caracteres de uma expressão String ou número de bytes requerido para
armazenar uma variável.
VariávelNumérica = Len (ExpressãoCaractere>)
Print Len(“Lionardo”)
Valor Impresso: 8
126
Comandos Condicionais e de Laço
MID: Retorna uma Substring de uma String, ou seja, retorna um número especificado de caracteres
de uma seqüência de caracteres.
SubString=Mid(<string>,<posiçãoInicial>[, <quantidadeDeCaracteres>])
RIGHT: Retorna uma substring com os caracteres que se encontram da direita para a esquerda
dentro de uma expressão String.
VariávelNumérica=Right([<ExpressãoString>, <QuantidadeDeCaracteres>)
Print Right(“Lionardo Fonseca”,7)
Valor Impresso: Fonseca
SPACE: Retorna uma String com uma determinada quantidade de espaços vázios.
VariávelString = Space(<quantidadeDeCaracteres>)
127
Comandos Condicionais e de Laço
NúmeroDeElemento: consiste de uma lista delimitada por vírgula de um número arbitrário de valores
que são atribuídos aos elementos da matriz contidos em Variant. Se nenhum argumento for
especificado, será criada uma matriz de comprimento zero.
Embora uma Variant que contém uma matriz seja conceitualmente diferente de uma matriz cujos
elementos são do tipo Variant, o modo como são acessados os elementos da matriz é o mesmo. A
notação usada para se referir a um elemento de uma matriz consiste no nome da variável seguido
por parênteses que contêm um número do índice que indica o elemento desejado.
O limite inferior de uma matriz criada com a função Array é determinado pelo limite inferior
especificado com a instrução Option Base.
Dim VariavelMatriz As Variant
VariavelMatriz = Array("Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb")
Print VariavelMatriz(2)
Print VariavelMatriz(4)
Valor Impresso: Ter
Valor Impresso: Qui
128
Comandos Condicionais e de Laço
IIF: Analisa uma expressão lógica, e retorna valores para quando for falso ou verdadeiro.
ExpressãoDeRetorno = IIF (<ExpressãoLógica>,
<ExpressãoParaVerdadeiro>, <ExpressãoParaFalso>)
Print iif(10 > 2,”10 é maior que 2”, “2 é maior que 10”)
Valor Impresso: 10 é maior que 2
SWITCH: Avalia uma lista de expressões e retorna o valor associado àquela primeiro avaliada como
verdadeira.
A=2
B=2
C=2
Print Switch(A<2,"Letra A < 2", B=2,"Letra B = 2", C<3, "Letra C < 3")
Valor Impresso: Letra B = 2
A segunda expressão na lista foi impresso, pois foi a primeira a ter uma condição verdadeira. Note
que o ultimo valor (C<3) também é verdadeiro, mas como a função Switch encerra sua execução
quando encontra a primeira ocorrência verdadeira, ele foi ignorado.
A=2
B=3
C=2
Print Switch(A<2,"Letra A < 2", B=2,"Letra B = 2", C<3, "Letra C < 3")
Valor Impresso: Letra C < 3
129
Comandos Condicionais e de Laço
Print FileDataTime("C:\WINDOWS\[Link]")
Valor Impresso: 03/08/96 [Link]
Print FileLen("C:\WINDOWS\[Link]")
Valor Impresso: 3481
130
Comandos Condicionais e de Laço
Print GetAttr("C:\WINDOWS\[Link]")
Valor Impresso: 32
ISDATE: Testa se o argumento pode ser convertido para uma data. Esta data deve estar dentro dos
padrões de data.
VariávelBoolean = IsDate(<expressão>)
ISMISSING: Testa se um argumento opcional foi passado como parâmetro para uma procedure ou
função.
VariávelBoolean = IsMissing(<NomedoArgumento>)
Print IsNumeric(“AB”)
Valor Impresso: False
Print IsNumeric(“03”)
Valor Impresso: True
131
Comandos Condicionais e de Laço
7 Data (Date).
8 Seqüência de caracteres textos (String).
9 objeto de Automação OLE (Object).
10 Erro (Error).
11 Booleano Boolean).
12 Variant (usada somente com matrizes de Variantes).
13 Um objeto que não seja de Automação OLE (DataObject).
17 Byte
8192 Matriz (Array).
Índice : Expressão numérica ou campo que resulta num valor entre 1 e o número de opções
disponíveis.
Escolha : Expressão Variant que contém uma das possíveis opções.
Choose retorna um valor da lista de opções com base no valor de índice. Se índice for 1, Choose
retorna a primeira opção da lista; se índice for 2, retorna a segunda opção e assim por diante.
Choose pode ser usado para pesquisar um valor numa lista de possibilidades. Por exemplo, se
índice avalia para 3 e a opção-1 = "um", opção-2 = "dois" e opção-3 = "três", Choose retorna "três".
Esta capacidade é particularmente útil se índice representar o valor num grupo de opções.
Se índice não for um número inteiro, ele será arredondado para o número inteiro mais próximo antes
de ser avaliado.
132
Comandos Condicionais e de Laço
INPUTBOX: Exibe um aviso numa caixa de diálogo, aguarda até que o usuário insira texto ou
escolha um botão e retorna o conteúdo da caixa de texto.
Variável=Inputbox(<expressão>,<barraDeTítulo>,<escolhaDefault>)
MSGBOX: Exibe uma caixa de diálogo para exibir informações e obter respostas simples através de
botões de comando.
VariávelNumérica = MsgBox (<ExpressãoPrompt>,<BotõesDisponíveis>, <BarraDeTítulo>)
133
Comandos Condicionais e de Laço
BotõesDisponível : Expressão numérica que é a soma de valores que especificam o número e tipo
de botões a serem exibidos, o estilo de ícone a ser usado, a identidade do botão padrão e a
modalidade da caixa de mensagem. Se omitido, o valor padrão será 0. Veja abaixo os tipos de
botões disponíveis:
Constante Valor Descrição
vbOKOnly 0 Exibe apenas o botão "OK".
VbOKCancel 1 Exibe os botões "OK" e "Cancelar".
VbAbortRetryIgnore 2 Exibe os botões "Anular", "Repetir" e "Ignorar".
VbYesNoCancel 3 Exibe os botões "Sim", "Não" e "Cancelar".
VbYesNo 4 Exibe os botões "Sim" e "Não".
VbRetryCancel 5 Exibe os botões "Repetir" e "Cancelar".
VbCritical 16 Exibe o ícone "Mensagem crítica".
VbQuestion 32 Exibe o ícone "Consulta de advertência".
VbExclamation 48 Exibe o ícone "Mensagem de advertência".
VbInformation 64 Exibe o ícone "Mensagem de informação".
VbDefaultButton1 0 O botão "Primeiro" é o padrão.
VbDefaultButton2 256 O botão "Segundo" é o padrão.
VbDefaultButton3 512 O botão "Terceiro" é o padrão.
VbApplicationModal 0 Janela restrita do aplicativo; o usuário deve
responder à caixa de mensagem antes de continuar
seu trabalho no aplicativo atual.
VbSystemModal 4096 Janela restrita do sistema; todos os aplicativos são
suspensos até que o usuário responda à caixa de
mensagem.
O primeiro grupo de valores (05) descreve o número e tipo de botões exibidos na caixa de diálogo; o
segundo grupo (16, 32, 48, 64) descreve o estilo de ícone; o terceiro grupo (0, 256, 512) determina
qual botão é o padrão; e o quarto grupo (0, 4096) determina modalidade da caixa de mensagem.
Quando adicionar números para criar um valor final para o argumento buttons, use somente um
número de cada grupo.
Observação: Estas constantes são especificadas pelo Visual Basic para aplicativos. Assim, os
nomes podem ser usados em qualquer lugar do código em lugar dos valores reais.
BarraDeTítulo: Expressão de seqüência exibida na barra de títulos da caixa de diálogo. Se você
omitir BarraDeTítulo, o nome do aplicativo será incluído na barra de títulos.
Estes são os valores que esta função retorna, para informar qual foi a ação do usuário:
Constante Valor de Retorno Botão escolhido
vbOK 1 "OK"
vbCancel 2 "Cancelar"
vbAbort 3 "Anular"
vbRetry 4 "Repetir"
vbIgnore 5 "Ignorar"
vbYes 6 "Sim"
vbNo 7 "Não"
Se a caixa de diálogo exibir um botão "Cancelar", pressionar a tecla ESC terá o mesmo efeito que
escolher "Cancelar".
134
Comandos Condicionais e de Laço
Se quiser especificar mais do que o primeiro argumento nomeado, você deverá usar MsgBox em
uma expressão. Se quiser omitir alguns argumentos de posição, você deverá incluir o delimitador de
vírgula correspondente.
Vamos fazer uma codificação para o botão 1 e o botão 2 como esta abaixo.
Perceba que usamos o MSGBOX não só para enviar uma mensagem para o
usuário, como para executar uma determinada ação dependendo do que o
usuário escolher.
135
Comandos Condicionais e de Laço
136
Comandos Condicionais e de Laço
Print Format(12345.3,”##,###.##”)
Valor Impresso: 12.345,3
Usamos o simbolo “#” para representar a disposição dos números. Não há necessidade de colocar a
mesma quantidade de números e “#”. Se tivessesmos colocado Print
Format(12345.3,”#,###,###.##”), ainda assim seria impresso somente “12.345,3”. Entretanto, se
colocarmos:
Print Format(12345.3, "###.##")
Valor Impresso: 12345,3
Perceba que não podemos colocar uma formatação menor que os números que serão impressos,
pois senão a formatação não irá alcançar toda a extensão dos números.
O símbolo “#” é substituído por números quando existir número para ser substituído. Note que o
número decimal é “.3” e apesar de termos usado uma formatação para casas decimais com dois
símbolos “##”, não apareceu as duas casas decimais. Se quisermos forçar o aparecimento de zeros
quando não tiver número para ser impresso, usados “0” no lugar de “#”. Veja:
Print Format(12345.3,”##,###.00”)
Valor Impresso: 12.345,30
Print Format(12345,”##,###.00”)
Valor Impresso: 12.345,00
Isto vale também para formatação de números sem casas decimais:
Print Format(45,”0000”)
Valor Impresso: 0045
Se quisermos uma formatação diferente para números negativos, basta colocar essa formatação
após o ponto-e-virgula.
Print Format(12345,”##,###.00; (-)##,###.00”)
Valor Impresso: 12.345,00
Print Format(-12345,”##,###.00; (-)##,###.00”)
Valor Impresso: (-)12.345,00
Veja abaixo os caracteres que podem ser usados na formatação de valores numéricos:
# Exibe um dígito ou nada. Se a expressão tiver um dígito na posição em que o símbolo # aparece
na seqüência de caracteres de formato, ele será exibido; caso contrário, nada será exibido nessa
posição.
Este símbolo funciona como o espaço reservado para o dígito 0, mas os zeros à esquerda e à direita
não são exibidos se o número tiver a mesma quantidade ou menos dígitos do que existem #
caracteres em qualquer um dos lados do separador decimal na expressão de formato.
137
Comandos Condicionais e de Laço
, Separador de milhar
Para algumas localidades, é utilizado um ponto como o separador de milhar. O separador de milhar
separa milhar de centena dentro de um número que tenha quatro ou mais casas à esquerda do
separador decimal. O uso padrão do separador de milhar é especificado no formato que contém um
separador de milhar delimitado por espaços reservados de dígito (0 ou #). Dois separadores de
milhar adjacentes ou um separador de milhar imediatamente à esquerda do separador decimal
(sendo ou não especificado um decimal) significa "aplique uma escala ao número dividindo-o por
1000 e arredonde-o conforme necessário." Use essa técnica para aplicar escalas a números
extensos. Por exemplo, a seqüência de caracteres de formato "##0,," pode ser usada para
representar 100 milhões como 100. Números inferiores a 1 milhão são exibidos como 0. Dois
separadores de milhar adjacentes em qualquer posição que não seja a imediatamente à esquerda do
separador decimal serão considerados apenas como especificação do uso de um separador de
milhar. O caractere real utilizado como o separador de milhar na saída formatada depende do
Formato Numérico reconhecido pelo sistema.
E- E+ e- e+ Formato científico
Se a expressão de formato contiver pelo menos um espaço reservado para dígito (0 ou #) à direita
de E-, E+, e- ou e+, o número é exibido em formato científico, sendo E ou e inserido entre o número
e seu expoente. O número de espaços reservados para dígito à direita determina o número de
dígitos do expoente. Use E- ou e- para incluir um sinal de subtração (-) ao lado de expoentes
negativos. Use E+ ou e+ para incluir um sinal de subtração ao lado de expoentes negativos e um
sinal de adição (+) ao lado de expoentes positivos.
138
Comandos Condicionais e de Laço
General Number : Exibe o número na forma em que se encontra, sem separadores de milhar.
Print Format(123456.7, "General Number")
Valor Impresso: 123456,7
Currency : Exibe o número com o separador de milhar, se apropriado; exibe dois dígitos à direita do
separador de casa decimal. Note que a saída é baseada nas configurações do Painel de Controle.
Print Format(123456.7, "Currency")
Valor Impresso: R$123.456,70
Fixed : Exibe pelo menos um dígito à esquerda e dois dígitos à direita do separador de casa
decimal.
Print Format(123456.7, "Fixed")
Valor Impresso: 123456,70
Print Format(1, "Fixed")
Valor Impresso: 1,00
Standard : Exibe o número com o separador de milhar, pelo menos um dígito à esquerda e dois
dígitos à direita do separador de casa decimal.
Print Format(123456.7, "Standard")
Valor Impresso: 123.456,70
Percent : Exibe o número multiplicado por 100 com um sinal de porcentagem (%) anexado à direita;
sempre mostra dois dígitos à direita do separador de casa decimal.
Print Format(123456.7, "Percent")
Valor Impresso: 12345670,00%
Print Format(1, "Percent")
Valor Impresso: 100,00%
139
Comandos Condicionais e de Laço
: Separador de hora. Em algumas localidades podem ser usados outros caracteres para representar
o separador de hora. O separador de hora separa horas, minutos e segundos quando os valores de
hora são formatados. O caractere real usado como o separador de hora na saída formatada é
determinado pelas configurações de seu sistema.
/ Separador de data. Em algumas localidades podem ser usados outros caracteres para representar
o separador de data. O separador de data separa o dia, mês e ano quando os valores de data são
140
Comandos Condicionais e de Laço
formatados. O caractere real usado como o separador de data na saída formatada é determinado
pelas configurações de seu sistema.
c Exibe a data como ddddd e a hora como ttttt, nessa ordem. Exibe apenas informações de data se
não houver parte fracionária para o número de série de data; exibe apenas informações de hora se
não houver parte inteira.
Print Format("01/08/96","c")
Valor Impresso: 01/08/96
Print Format(now,"c")
Valor Impresso: 01/08/96 [Link]
w Exibe o dia da semana como um número (1 para domingo até 7 para sábado).
m Exibe o mês como um número sem zeros à esquerda. Se m vier imediatamente depois de h ou
hh, é exibido o minuto em lugar do mês.
Print Format("01/08/96","m")
Valor Impresso: 8
mm Exibe o mês como um número com zeros à esquerda. Se m vier imediatamente depois de h ou
hh, é exibido o minuto em lugar do mês.
Print Format("01/08/96","mm")
Valor Impresso: 08
141
Comandos Condicionais e de Laço
Usando estes caracteres especiais podemos formatar uma data de várias maneiras,
como por exemplo:
Print Format(“01/08/96”,”dd/mmmm/yyyy”)
Valor Impresso: 01/Agosto/1996
Print Format(“01/08/96”,”dd/mmm/yy”)
Valor Impresso: 01/Ago/96
Veja abaixo a relação das palavras-chaves aceita pela função Format para expressões
de data e hora:
142
Comandos Condicionais e de Laço
General Date: Exibe a data e a hora nos formatos estabelecidos nas configurações do Windows.
Caso a expressão seja somente uma data, será exibido
Print Format(now,"general date")
Valor Impresso: 01/08/96 [Link]
Print Format("01/08/96","general date")
Valor Impresso: 01/08/96
Print Format("[Link]","general date")
Valor Impresso: [Link]
Long Date: Exibe uma data de acordo com o formato por extenso de data de seu sistema.
Print Format("01/08/96","Long Date")
Valor Impresso: Quinta-feira, 1 de Agosto de 1996
Medium Date: Exibe uma data usando o formato médio de data apropriado para a versão de idioma
do aplicativo host.
Print Format("01/08/96","Medium Date")
Valor Impresso: 01-Ago-96
Short Date: Exibe uma data usando o formato abreviado de data de seu sistema.
Print Format("01/08/96","Short Date")
Valor Impresso: 01/08/96
Long Time: Exibe uma hora usando o formato por extenso de hora de seu sistema: inclui horas,
minutos, segundos.
Print Format("[Link]","Long Time")
Valor Impresso: [Link]
Medium Time: Exibe uma hora no formato 12 horas usando horas e minutos e a designação AM/PM.
Print Format("[Link]","Medium Time")
Valor Impresso: 09:24 AM
143
Comandos Condicionais e de Laço
& Exibe um caractere ou nada. Se a seqüência de caracteres tem um caractere na posição em que &
aparece, ele será exibido; caso contrário, nada será exibido. Os espaços reservados são
preenchidos da direita para a esquerda a menos que exista um caractere ! na seqüência de
caracteres de formato. Veja abaixo.
! Força preenchimento da esquerda para a direita dos espaços reservados. O preenchimento padrão
é feito da direita para a esquerda.
144
Comandos Condicionais e de Laço
145
Comandos Condicionais e de Laço
EXERCÍCIOS PROPOSTOS
1 - Mostre a diferença entre as funções matemáticas FIX e INT:
2 - Para converter uma variável para o tipo Data usamos qual função?
3 - Para conversão de uma variável numérica para o formato String (texto) usamos qual função?
146
Comandos Condicionais e de Laço
10 - Mostre como ficaria a codificação de um programa que criasse uma matriz chamada MESES
cujo conteúdo fosse os meses de Janeiro a Dezembro:
11 - Considerando que:
A = “Editora”
B = “Gráfica”
C = “Editora”
D = IIF(A=B, “Igual”, “Diferente”)
E = IIF(A=C, “Igual”, “Diferente”)
F = IIF(C=B, “Igual”, “Diferente”)
QuaL o conteúdo das variáveis D, E e F?
13 - Desenvolva um programa que tenha no formulário uma caixa de texto para o usuário digitar um
numero de 0 a 5 e crie um evento Change cuja codificação é a seguinte:
Print Choose([Link], “Zero”,”Um”, “Dois”,”Três”,”Quatro”,”Cinco”)
Descreva o que o programa fará:
MSGBOX:
Data e Hora:
147
Comandos Condicionais e de Laço
String:
Caracteristicas
Visual Data Manager
Índices
148
Comandos Condicionais e de Laço
Sempre que trabalhamos com qualquer tipo de dado devemos gravá-los em arquivos para não
perdê-los quando desligamos o computador. Chamamos esses arquivos que recebem vários dados
de Banco de Dados. Neste livro vamos abordar o padrão MDB (Microsoft Database) que representa
a grande maioria de arquivos de Banco de Dados para Windows existente hoje. Esse padrão é
usado pelo Access e o Visual Basic também o aceita.
11.1.1 Características
Um arquivo que contém dados irá possuir a extensão MDB. Exemplo: Se temos um banco de dados
de um controle de estoque possivelmente ele terá o nome de “[Link]”.
Dentro de um arquivo deste podemos ter várias tabelas. No exemplo de um controle de estoque,
podemos ter uma tabela para Mercadoria, Fornecedor, Cliente, etc. Todas essas tabelas ficam
armazenadas dentro do arquivo MDB.
Cada tabela possui Campos onde serão armazenado os dados. Por exemplo, na tabela Mercadoria
temos o campo de Descrição da Mercadoria, Quantidade no Estoque, Valor de Venda, etc. Tudo isto
representa os Campos que estão armazenados dentro da tabela.
Dentro dos Campos que estão os dados que precisamos armazenar. Veja a disposição da
hierarquia:
BANCO DE DADOS
[Link]
149
Comandos Condicionais e de Laço
No Menu File usaremos duas opções de grande importância para nosso estudo: New Database para
criação de novos Bancos de Dados e Open Database para abrir um banco de dados já criado.
Vamos criar nosso programa de Controle de Estoque rudimentar que apresentamos no organograma
acima. Click na opção New. Pode-se criar Bancos de Dados de vários tipos, como Access, Dbase,
FoxPro, etc. Mas o Visual Basic tem como padrão o Microsoft Access que cria arquivos com
extensão MDB. Escolha então o Microsft Access/Version 7.0 MDB
Irá aparecer uma tela pedindo para digitarmos o nome do Banco de Dados que estamos criando:
Digite “Estoque”. Não é necessário colocar a extensão pois o tipo de arquivo, por padrão, já é MDB.
150
Comandos Condicionais e de Laço
A próxima janela que irá aparecer é a que gerência as tabelas. Para criarmos uma nova tabela é só
apertar o botão da direita do rato em "Propriedades" e acionar a opção “NEW TABLE”.
Irá aparecer outra janela onde nomeamos a tabela e criamos os campos que esta tabela terá:
Table Name: Nome da Tabela, obedecendo as mesmas regras impostas para nomeação de
variáveis, ou seja, não começar no números, não conter espaços, não usar símbolos como hifem (-),
etc.
Digite: Mercadoria
Field List: é um Listbox onde aparece a lista dos campos que foram inseridos na tabela. Para
inserir os campos aperte o botão "Add Field". Vai aparecer a seguinte janela:
151
Comandos Condicionais e de Laço
152
Comandos Condicionais e de Laço
Size: Tamanho definido para o campo. Se colocamos 2 para o campo, poderá ser digitado somente
2 caracteres. Esta opção é liberada somente para o tipo Text.
Digite 30
Aperto o botão "OK" para gravar o campo e continue inserindo outros campos como na tabela
abaixo:
Field Name Data Type Size
Quantidade Integer N/A
Valor Currency N/A
Código Text 3
Geralmente se usa colocar o código no inicio. Se quiser movê-lo para cima é só colocar "0" no ítem
OrdinalPosition.
Veja como ficará depois de pronto:
153
Comandos Condicionais e de Laço
Aperte o botão Build The Table para que a tabela seja gravada e inserida no banco de dados.
O nome da tabela "Mercadoria" agora já aparece dentro da janela "Database Windows", se clicarmos
com o botão da direita em cima desta tabela ira aparecer um menu onde podemos criar uma outra
tabela (New Table), digitar dados na tabela (Open) ou até modificar a estrutura da tabela (Design).
Crie agora as tabelas abaixo:
Tabela: Cliente
Field Name Data Type Size
CódCliente Text 3
Nome Text 30
LimiteCrédito Currency N/A
154
Comandos Condicionais e de Laço
Tabela: Vendas
Field Name Data Type Size
Código Text 3
CódCliente Text 3
ValorVenda Currency N/A
QuantidadeVendida Integer N/A
Criamos uma tabela Vendas onde será lançado o código do cliente que efetuou a compra, o codigo
da mercadoria que este cliente comprou, o valor total de sua compra e a quantidade de mercadoria
que ele levou. Este exemplo é simples mas vai servir para nosso aprendizado.
155
Comandos Condicionais e de Laço
Name: O nome do indice. Através deste nome que ativaremos o indice em nosso programa.
Available Fields: Neste ListBox aparece a relação de campos que nossa tabela contém. Dê um click
no campo que deseja indexar. Ao fazer isto o nome do campo ira aparecer no Indexed Fields
sinalizando que aquele determinado campo irá ser indexado.
Crie então um indice com o nome de "IndCódigo" e selecione o campo CódCliente. Marque a caixa
de verificação Primary Index, habilite também a propriedade Unique e click o botão OK.
Unique informa ao Visual Basic que a chave do indíce é exclusiva (única). Um índice chave ajuda a
otimizar a procura por registros. Ele consiste de um ou mais campos que organizam unicamente
todos os registros de uma tabela em uma ordem predefinida. Se o índice consiste de um campo, os
valores desse campo precisam ser únicos. Se o índice consiste de mais de uma campo, valores
duplicados podem ocorrer em cada campo, mas cada combinação de valores de todos os campos
indexados precisa ser única. Os campos que compõe a chave de índice não são necessariamente
únicos.
Primary Index indica que um objeto Index representa um índice primário para uma tabela. Um índice
primário consiste em um ou mais campos que identificam com exclusividade todos os registros de
uma tabela em uma ordem predefinida. Como o índice do campo tem que ser exclusivo, a
propriedade Unique do objeto Index é definida como True. Se o índice primário consistir de mais de
um campo, cada campo pode conter valores duplicados mas as combinações de valores de todos os
campos indexados devem ser únicas. Um índice primário consiste em uma chave para a tabela e
geralmente contém os mesmos campos da chave primária.
Faça a mesma coisa para a tabela de mercadoria. O nome do indice também pode ser IndCódigo.
Para a tabela de Vendas nomeie o indice como indClienteMercadoria e defina para chave de índice
os campos CódCliente e Código nesta ordem:
156
Comandos Condicionais e de Laço
Colocamos estes dois campos como chave do índice pois para localizarmos os dados referente a
venda, como quantidade e valor vendido, temos que saber (procurar por) qual cliente comprou e
qual mercadoria ele comprou.
Agora que temos o arquivo "[Link]" (que é o nosso banco de dado) já criado. Vamos fechar
definitivamente o Visual Data Manager e voltar para o projeto do Visual Basic. A utilidade do Visual
Data Manager é somente na criação do banco de dados, as tabelas, os índices, etc.; mas para
manipular os dados, como incluir, alterar, consulta, exclusão e relatórios devemos desenvolver um
programa para isto dentro do Visual Basic.
157
Comandos Condicionais e de Laço
158
Comandos Condicionais e de Laço
No menu "Project" do Visual Basic click na opção "AddForm" para inserirmos um novo formulário em
nosso projeto. Será o formulário para cadastramento de mercadoria.
159
Comandos Condicionais e de Laço
Neste novo formulário altere o Caption para “Cadastro de Mercadoria” e o Name para
“frmCadMercadoria”. Vamos montar esta interface, depois abriremos outros Form para Cliente e
Vendas.
Coloque um frame, 4 labels e 4 caixa de texto com os Names: txtCódigo, txtDescrição, txtQuantidade
e txtValor.
Coloque também 7 botões de comando no formulário como na. Para nomea-los use os Captions de
cada um prefixado com “cmd”:
Importante: Coloque a propriedade TabIndex do Botão "cmdIncluir " como "0" para que ele seja o
primeiro a possuir o foco quando entrar na janela.
Para rodar este programa e ver o resultado será necessário ligar este formulário ao menu
mnuMercadoria. Para fazer isto vamos até o menu localizado no frmEstoque, click no Cadastro para
abrir as opções. Dê dois clickes na opção Mercadoria que uma janela de codificação será aberta.
Digite:
160
Comandos Condicionais e de Laço
O Método Show abre um novo formulário a partir de outro, e usamos ele para abrir o formulário
frmCadMercadoria.
Vamos aproveitar e codificar a opção Sair do menu também. Dê dois clicks nele e digite:
Este simples comando “END” encerra toda a aplicação fechando todas as janelas que podem estar
abertas.
Para completar este raciocínio, vamos até o formulário frmCadMercadoria e para o botão cmdSair
vamos fazer a seguinte codificação:
161
Comandos Condicionais e de Laço
Se este ajuste não for feito e um objeto de banco de dados for declarado, o Visual Basic gerará um
erro. A biblioteca DAO (Data Access Objects) fornece um conjunto de objetos de programação que
precisaremos usar para gerência os Bancos de Dados.
Temos que criar agora duas variáveis do tipo Banco de Dados e outra do tipo Tabela. Uma servirá
para fazer referência ao nome e caminho do Banco de Dados como um todo, e a outra irá fazer
referência a uma tabela especifica.
Onde criar estas variáveis?
No nosso exemplo temos que criá-las na seção General da janela de codificação do formulário.
Variáveis criadas ali possuem abrangência em todo o formulário. Se criarmos ela dentro de alguma
outra rotina (ou vento) a abrangência destas variáveis serão somente dentro da própria rotina.
162
Comandos Condicionais e de Laço
A variável BancoDeDados é do tipo Database pois ela sempre terá em seu conteúdo o nome do
banco de dados que será aberto. Depois criamos uma variável para a tabela de Mercadoria de nome
TBMercadoria.
O Objeto Recordset é a representação lógica de uma tabela. Usaremos este objeto para manipular
todos os dados da tabela. Veja as principais propriedades de um Recordset (somente manipulados
na codificação do programa):
Sintáxe: [Link]
AbsolutePosition : Indica o numero do registro corrente da tabela em uso.
BOF : Retorna True quando a tabela chegou ao inicio e False quando esta em outro ponto.
DateCreated : Retorna a data de criação da tabela manipulada pelo Recordset.
EOF : Retorna True quando a tabela chegou ao fim e False quando esta em outro ponto.
Index : Especificamos o nome do índice que será associado a tabela.
NoMatch : Retorna True se uma pesquisa efetuada dentro da tabela foi bem-sucedida.
PercentPosition : Retorna um percentual referente a posição que a tabela se encontra com
comparação com o total de registros da tabela.
RecordCount : Retorna a quantidade de registro que uma tabela possui.
O próximo passo será abrir o banco de dados e abrir a tabela de mercadoria. Para fazer i sto
selecione o formulário frmCadMercadoria e abra a janela de codificação dele criando um evento
chamado FORM_LOAD. Este evento é chamado sempre que este formulário é chamado pelo
Windows.
163
Comandos Condicionais e de Laço
Associamos a variável BancoDeDados ao método OpenDatabase, que vai realmente abrir o arquivo
na prática. Uma vez aberto ao arquivo, sempre que fizermos referência a ele usaremos a variável
BancoDeDados.
Na abertura do arquivo usados o Objeto [Link] que retorna o nome do diretório corrente, onde
esta localizado o arquivo pretendido. Depois concatenamos este diretório com o nome do arquivo a
ser aberto.
Para abrir a tabela usamos o método OpenRecordSet, e como argumento informamos o nome da
tabela a ser aberta e a constante dbOpenTable que informa que o RecordSet a ser aberto é do tipo
tabela.
Note que é necessário antes do método OpenRecordSet usar o nome do objeto Database
BancoDeDados, pois, dentro da hierarquia, a tabela esta dentro do Banco de Dados.
Fizemos tudo isto para deixar disponível para uso o banco de dados Estoque e sua tabela
Mercadoria.
Usamos a propriedade Index para TBMercadoria e determinamos que o índice corrente será
IndCódigo.
164
Comandos Condicionais e de Laço
Fechamos primeiro a tabela Mercadoria representada pela variável TBMercadoria e depois o banco
de dados Estoque representada pela variável BancoDeDados. Ambas usaram o método Close.
Fazendo isto quando o usuário apertar o botão incluir, os botões que ele não pode pressionar
enquanto não concluir a inclusão ficarão desabilitados. Deve-se fazer isto para todos os botões.
165
Comandos Condicionais e de Laço
Na alteração o método é semelhando a inclusão. Durante a alteração o usuário só terá liberado para
ele os botões "Gravar" e "Sair".
No evento click do botão gravar habilite todos novamente. Com exceção do próprio botão gravar que
não pode ser habilitado ate que se incluia ou altere algo.
Outro detalhe que é bom lembrar é desabilitar o botão Gravar no evento Form_Load para que esteja
devidamente desabilitado quando entrar na janela de cadastro de mercadoria. Desabilitamos
também o Frame, pois assim todos os objetos contido dentro dele serão também desabilitados.
Fazemos isto para que o usuário não fique "passeando" pelas caixas de texto sem definir antes
(através dos botões) o que ele quer fazer.
Uma formatação para as caixas de texto que receber numeros é bem vindo para dar um aspecto
visual mais interessante.
166
Comandos Condicionais e de Laço
Criamos uma formatação para as caixas de texto no evento LostFocus para quando o usuário
terminar de digitar o valor se ajustar.
Habilitamos a tecla Enter criando um evento KeyPress no formulario. Não esquecer de habilitar a
propriedade KeyPreview.
Nomeia a função que estamos criando de AtualizaCampos, coloque do tipo Function e o Scope
(abrangência) Private. Com isto, estamos criando uma função que poderá ser usada somente no
formulário corrente.
Ao clicar em Ok será aberta uma janela de codificação para podermos digitar o que a função ira
conter:
167
Comandos Condicionais e de Laço
A finalidade desta função é inserir o conteúdo existente nas caixas de textos do formulário para
dentro dos campos da tabela de mercadoria.
Com isto, sempre que precisarmos gravar os dados que o usuário digitou no formulário para dentro
de seus respectivos campos na tabela usamos a função AtualizaCampos.
Repita o processo para criar agora a função AtualizaFormulário:
Note que o AtualizaFormulário faz o caminho inverso: Descarrega os dados existente na tabela de
seus respectivos campos para dentro das caixas de texto existente no formulário.
Por fim, vamos criar uma função para limpar as caixas de texto. Dê o nome de LimpaFormulário:
Vamos usar esta função sempre que precisarmos que as caixas de texto fiquem vazias.
168
Comandos Condicionais e de Laço
Quando uma tabela é aberta o Visual Basic se posiciona no primeiro registro existente dentro dela.
Entretanto, quando ainda não existe nada digitado dentro da tabela, conseqüentemente não existirá
nenhum registro para se posicionar. Neste caso o fim de arquivo é encontrado logo na abertura da
tabela.
A propriedade EOF é quem informa se o fim de arquivo esta ativo ou não. Se EOF for True
(verdadeiro) significa que a tabela chegou ao fim de arquivo, se for False, significa que a tabela esta
posicionada em algum registro em algum lugar.
Recapitulando: A propriedade EOF retorna True se a posição do registro atual for posterior ao último
registro da tabela, ou seja, se o fim do arquivo for localizado, e False se a posição do registro atual
for no último registro ou anterior a ele.
O Visual Basic possui também a propriedade BOF para informar se o inicio do arquivo foi
encontrado.
A propriedade BOF retorna True se a posição do registro atual for anterior ao primeiro registro e
False se a posição do registro atual estiver no primeiro registro ou for posterior a ele.
Os valores de retorno das propriedades BOF e EOF são determinados pela localização do indicador
do registro atual.
Podemos usar as propriedades BOF e EOF para determinar se um objeto Recordset contém
registros ou se você foi além dos limites de um objeto Recordset ao percorrer seus registros.
Perceba que somente se EOF for False que atualizamos o formulário, pois caso contrário, não
poderíamos atualizar o formulário pois não haveria dados a serem atualizados.
O primeiro botão que vamos codificar é o incluir. Ele funcionará da seguinte forma: Quando
clicarmos nele as caixas de textos serão limpas e o método AddNew será acionado. Este método é
usado para avisar à tabela que alguns dados serão incluídos.
Depois de usar o AddNew temos que atualizar os campos, ou seja, passar tudo que foi digitado nas
caixas de texto para seus respectivos campos dentro da tabela TBMercadoria. Fazendo isto usamos
169
Comandos Condicionais e de Laço
o método Updated para efetuar a gravação propriamente dita e atualizar a tabela com os novos
campos.
Veja um exemplo:
[Link]
TBMercadoria("Código") = “001”
TBMercadoria("Descrição") = “Calça Jeans”
TBMercadoria("Quantidade") = “12”
TBMercadoria("Valor") = “100”
[Link]
Esta rotina é o padrão para inclusão de [Link] que sempre inicia com AddNew e termina
com Updated Neste exemplo colocamos expressões string para serem inseridas nos campos, mas
poderiamos ter colocado variáveis.
No nosso exemplo vamos colocar as caixas de texto. Ficaria assim:
[Link]
TBMercadoria("Código") = txtCódigo
TBMercadoria("Descrição") = txtDescrição
TBMercadoria("Quantidade") = txtQuantidade
TBMercadoria("Valor") = txtValor
[Link]
Desta forma o que o usuário digitar nas caixas de texto serão incluídos dentro dos campos da tabela.
Isto é uma forma simplificada de fazer inclusão de dados. Mas nós vamos usar um forma mais
complexa:
Veja o que foi feito: Sempre que o usuário clicar neste botão o programa limpa o formulário para
deixar as caixas de texto vazias para serem preenchidas com novos dados. O Frame é habilitado
para que as caixas de texto possam ser manipuladas. Em seguida o foco é passado para o caixa de
texto txtCódigo pois é a primeira que deve ser digitada pelo usuário
Ainda não aplicamos o método AddNew pois ainda não sabemos se o usuário vai incluir um código
válido. Primeito o programa tem que analizar o código que ele digitou, verificar se ele real mente não
170
Comandos Condicionais e de Laço
existe para depois usar o método AddNew. Fazemos isto no evento LostFocus da Caixa de Texto
txtCódigo.
Neste evento verificamos primeiramente se o botão CmdGravar esta habilitado. Se estiver é porque
a inclusão foi acionada.
O programa procura o código digitado. Se ele existir sera dado um aviso ao usuario e o processo de
inclusão será cancelado, caso contrário (ou seja, se o código não existir dentro da tabela) o método
AddNew é chamado a fim de preparar a tabela para receber um novo registro.
Pronto, a janela já esta preparada para receber os dados. Mas agora falta fazer a codificação para o
botão Gravar.
171
Comandos Condicionais e de Laço
Atualizamos os campos da tabela com os dados digitado nas caixas de textos e depois chamamos o
método Update que fará a gravação fisica dentro do banco de dados.
Tente incluir vários dados na tabela para podermos usá-los posteriormente nos próximos
exercícios.
Um recurso interessante que pode ser acrescentado é desabilitar os botões de Alteração,
Consulta , Exclusão, Anterior e Próximo quando a tabela estiver vazia, pois se não houver
nenhum registro, não vai haver nada para alterar, consultar, excluir, etc. Somente o botão de
inclusão que poderá ficar habilitado.
A maneira mas usual de saber se a tabela esta vazia ou não é através da propriedade
RecordCount que infoma quantos registros existem gravados dentro da tabela.
O botão Próximo irá mostrar na tela o próximo registro existente. Note que para fazer este
movimento usamos a propriedade MoveNext (mova para o próximo), depois fazermos um teste com
a propriedade EOF para verificar se foi movido para o ultimo registro na tabela. Se estiver no último,
dali ele não pode passar pois não encontrará nada. Encontrando então o último registro, se tentar
passar dali a propriedade MovePrevious (move para o anterior) é acionado. Depois disto
atualizamos o formulário.
O botão Anterior possui a mesma lógica, mas invertemos as outras propriedades para fazer agora o
teste de início de arquivo. Ou seja, se o usuário estiver no primeiro registro ele não poderá voltar um
registro, pois antes do primeiro não existira nada.
Se você usar MoveNext quando o último registro for o atual, a propriedade EOF será configurada
para True e não haverá registro atual. Se você usar MoveNext novamente, um erro ocorrerá; EOF
permanece True. Se recordset referir-se a um Recordset tipo table (que é o nosso caso), a
172
Comandos Condicionais e de Laço
movimentação segue o índice atual. Você pode definir o índice atual usando a propriedade Index. Se
você não configurar o índice atual, a ordem de registros retornados será indefinida.
12.4 ALTERAÇÃO
Para alteração vamos fazer algo semelhante ao que fizemos na inclusão. A diferença ficará numa
propriedade nova para nós que é EDIT. Esta propriedade abre a tabela para que o dado que esta
sendo alterado seja editado.
Note que não liberamos a caixa de texto txtCódigo para alteração, pois sendo ela a chave de índice,
não pode ser alterada. Quando necessitar de alteração no código, ele deve ser excluído e incluído
novamente.
12.5 CONSULTA
Para consulta vamos usar a função INPUTBOX. Aprendemos a usá-la nos capítulos anteriores. Ela
solicita ao usuário a digitação de algum dado e armazena numa determinada variável.
Então criamos uma variável de nome ProcuraCódigo e usamos ela para receber o que o usuário
digitar.
Feito isto, usamos o método Seek para efetuar uma procura dentro da tabela.
173
Comandos Condicionais e de Laço
Seek: Localiza o registro de um objeto Recordset tipo table indexado que satisfaça os critérios
especificados para o índice atual e torna esse registro o registro atual.
Após o Seek colocamos um sinal de comparação para determinar o tipo de procura que este método
fara. Podemos usar “=” ,”<”, “>”, “<=”, “>=”, etc
O método Seek pesquisa os campos-chave especificados e localiza o primeiro registro que satisfaça
os critérios especificados na comparação dentro da chave de índice. Uma vez encontrado, esse
registro torna-se o registro atual e a propriedade NoMatch é definida como False. Se o método Seek
falhar em localizar um registro correspondente, a propriedade NoMatch é configurada como True e o
registro atual é indefinido.
Se comparação for igual (=), maior ou igual a (>=) ou maior do que (>), o Seek começa a pesquisa
no início do índice. Se comparação for maior do que (<) ou maior ou igual a (<=), o Seek começa a
pesquisa no final do índice e continua em direção ao início a menos que existam entradas de índice
duplicadas no final. Neste caso, Seek começa por uma entrada arbitrária entre as entradas de índice
duplicadas no final do índice.
Quando informamos uma chave para o método Seek procurar, esta chave deve ser no mesmo
formato que o estabelecido no índice do arquivo (index). Por exemplo: no TBMercadoria a chave do
índice é o Código, então o Seek somente faz a procura pelo código. Não podemos pedir para
procurar pela Descrição da mercadoria, pois para isto deveria existir um índice para descrição.
Em nosso exemplo se NoMatch for True (ou seja, se não encontrou nenhum registro que seja igual
ao conteúdo da variável ProcuraCódigo) movemos para o registro anterior e depois o formulário é
atualizado. Fazemos isto pois quando uma procura não é bem sucedida a tabela é posicionada no
fim de arquivo, e como não existe nenhum registro nesta posição, movimentamos para um registro
antes, onde o ultimo registro incluído se encontra.
Quando clicarmos no botão Consultar uma janela como a que esta abaixo aparecerá no video:
Digitamos o código que queremos procurar e ao clicar Ok a busca é iniciada. Se não encontrar uma
mensagem será apresentada:
174
Comandos Condicionais e de Laço
12.6 EXCLUSÃO
Quando se ai deletar algo é bom solicitar ao usuário uma confirmação, pois a deleção acidental
pode causar resultados catastróficos. Então é bom que o usuário tenha certeza do que esta fazendo.
Quando usamos a propriedade Delete o registro atual (aquele que esta aparecendo no vídeo) é
excluído da tabela.
Mas para a tela não ficar vazia (uma vez que aquele registro que estava lá foi eliminado) usamos a
procedure cmdAnterior_click que é a rotina que usamos quando o botão anterior é acionado.
Fazemos isto para posicionar a tabela no registro anterior ao que foi deletado e mostrá-lo na tela.
Desta forma a tela não fica vazia.
Em nosso programa podemos localizar um registro com a consulta ou através dos botões Anterior e
Próximo. Localizando podemos clicar no botão Excluir que o registro desaparece.
175
Comandos Condicionais e de Laço
Option Explicit
Dim BancoDeDados As Database
Dim TBCliente As Recordset
[Link] = False
[Link] = False
[Link] = False
[Link] = False
[Link] = False
[Link] = False
[Link] = True
[Link] = True
[Link] = True
txtCó[Link] = False
[Link]
[Link]
End Sub
End Sub
End Sub
176
Comandos Condicionais e de Laço
[Link]
cmdAnterior_Click
End If
End Sub
[Link] = True
[Link] = True
[Link] = True
[Link] = True
[Link] = True
[Link] = True
[Link] = False
[Link] = True
[Link] = False
txtCó[Link] = True
AtualizaCampos
[Link]
End Sub
[Link] = False
[Link] = False
[Link] = False
[Link] = False
[Link] = False
[Link] = False
[Link] = True
[Link] = True
LimpaFormulário
[Link] = True
txtCó[Link]
End Sub
[Link]
If [Link] = True Then
[Link]
End If
AtualizaFormulário
177
Comandos Condicionais e de Laço
End Sub
End Sub
[Link] = "IndCódigo"
[Link] = False
[Link] = False
End Sub
[Link]
[Link]
End Sub
178
Comandos Condicionais e de Laço
[Link] = True
[Link] = True
[Link] = False
[Link] = True
[Link] = False
Else
[Link]
End If
End Sub
TBCliente("CódCliente") = txtCódCliente
TBCliente("Nome") = txtNome
TBCliente("LimiteCrédito") = txtLimiteCrédito
End Function
txtCódCliente = TBCliente("CódCliente")
txtNome = TBCliente("Nome")
txtLimiteCré[Link] = Format(TBCliente("LimiteCrédito"), "Standard")
End Function
txtCódCliente = ""
txtNome = ""
txtLimiteCrédito = ""
End Function
179
Comandos Condicionais e de Laço
A criação do formulário será como no exemplo acima; ou seja, comparando com os anteriores, a
diferença é somente o acréscimo de dois labels que ficarão ao lado do código da mercadoria e do
cliente. O primeiro label conterá a descrição da mercadoria, e vamos nomeá-lo para lblDescrição, e o
segundo terá o nome do cliente, e vamos nomeá-lo para lblNomeCliente.
Para esta tabela é necessário criar um índice em que a chave de procura seja o Código da
Mercadoria e o Código do Cliente. Usamos para isto o Visual Data Manager:
180
Comandos Condicionais e de Laço
Note que esses dados não existem na tabela de Vendas. O que existe nesta tabela é somente o
código da mercadoria. A descrição esta em outra tabela (Mercadoria), assim como o nome do cliente
também esta em outra tabela (Cliente). Para podermos acessar estas tabelas e capturar somente a
descrição da mercadoria e nome do cliente, temos somente um ponto de referência, que é o código
deles que existe na tabela de Vendas.
A lógica usada neste programa consiste em pegarmos o código existente na tabela de vendas e
buscar a descrição daquele código em outra tabela. Para fazer isto todas as tabelas envolvidas
devem ser abertas, assim como seus índices, pois será através do índice que a procura será feita.
Exemplificando através da tabela de mercadoria:
Como na tabela de vendas existe o código da mercadoria que foi vendida, e na tabela de mercadoria
existe a descrição da mercadoria para aquele código, usamos o índice para procurar dentro da
tabela de mercadoria, o código existente dentro da tabela de vendas. Isto é possível desde que a
tabela de mercadoria esteja indexada pelo código, pois a procura será feita por ele.
Para podermos então codificarmos o formulário que terá acesso aos dados da tabela de vendas,
vamos criar as variáveis que serão usadas para lidar com o banco de dados e as tabelas:
Criamos uma variável para cada tabela que será aberta. Precisamos agora criar um evento
Form_Load para abrir todas essas tabelas.
181
Comandos Condicionais e de Laço
Veja que abrimos todas as três tabelas que serão usadas neste formulário, e abrimos também todos
os índices relativo a cada uma.
As nossas funções auxiliares sofrerão alguma mudança pois acrescentamos em nosso formulário
dois labels, e um conterá a descrição da mercadoria e outro o nome do cliente.
Note que quando formos atualizar o formulário será necessário apresentar nos dois labels os dados
contido em outras tabelas, por isto é necessário colocar um Seek para cada item a ser procurado.
Quando o usuário, por exemplo, aperta o botão "Avançar" o programa avança um registro na tabela
de Vendas e usa os códigos contidos nela para tentar localizar suas respectivas descrições e nome
do cliente.
182
Comandos Condicionais e de Laço
183
Comandos Condicionais e de Laço
Para facilitar nosso trabalho, criamos aqui uma função CancelaDigitação que tem por finalidade
anular o que o usuário estiver fazendo, voltar os botões e frame para seu estado natural. Usaremos
esta função quando o usuário digitar algum código inválido.
Com as funções prontas, vamos completar a codificação do Form_Load, pois apenas abrimos as
tabelas, precisamos agora verificar se a tabela de vendas está vazia, e desabilita o botão "Gravar" e
o frame:
A inclusão para esta tabela segue o estilo que usamos para os outros formulários. Existe somente
uma diferença fundamental que é o aparecimento do nome do cliente e a descrição da mercadoria
quando o usuário digitar o código correspondente. Ou seja, numa inclusão, quando o usuário digitar
o código da mercadoria que foi vendida, o programa terá que acessar a tabela de Mercadoria,
procurar o código que o usuário acabou de digitar, e trazer de lá a descrição daquele código.
Este trabalho todo pode ser feito no evento LostFocus da caixa de texto. Por que este evento?
Porque esta procura será feita DEPOIS que o usuário digitar o código e passar para a próxima caixa
de texto (ou seja, quando o objeto perder o foco).
Então, diante disto, precisamos criar dois evento LostFocus. Uma para a caixa de texto txtCódigo e
outro para txtCódCliente:
184
Comandos Condicionais e de Laço
A inclusão de registros dentro da tabela de vendas é igual ao apresentado nos outros programas:
185
Comandos Condicionais e de Laço
A alteração segue os padrões anteriores, lembrando que nesta tabela de vendas não podemos
alterar o Código da Mercadoria e o Código do Cliente, pois ambos fazem parte da chave do índice
da tabela. Se necessitar alterar o código, exclua e inclua novamente:
186
Comandos Condicionais e de Laço
Os botões Anterior e Próximo devem fazer uma pesquisa na tabela de Mercadoria e Clientes para
atualizar os labels, a fim de que apareça a descrição da mercadoria e o nome do cliente:
Perceba que esta rotina move a tabela de vendas para o registro anterior, e depois ao chamar a
função AtualizaFormulário faz uma procura dentro da tabela de mercadoria e depois dentro da
tabela de clientes usando como chave de busca o conteúdo existente dentro da tabela de vendas.
187
Comandos Condicionais e de Laço
[Link] = False
[Link] = False
[Link] = False
[Link] = False
[Link] = False
[Link] = False
[Link] = True
[Link] = True
[Link] = True
txtCó[Link] = False
txtCó[Link] = False
[Link]
[Link]
End Sub
End Sub
[Link] = True
[Link] = True
[Link] = True
[Link] = True
[Link] = True
[Link] = True
[Link] = False
[Link] = True
[Link] = False
txtCó[Link] = True
txtCó[Link] = True
AtualizaCampos
[Link]
188
Comandos Condicionais e de Laço
End Sub
[Link] = False
[Link] = False
[Link] = False
[Link] = False
[Link] = False
[Link] = False
[Link] = True
[Link] = True
LimpaFormulário
[Link] = True
txtCó[Link]
End Sub
[Link]
If [Link] = True Then
[Link]
End If
AtualizaFormulário
End Sub
End Sub
[Link] = "IndCódigo"
189
Comandos Condicionais e de Laço
[Link] = "IndCódigo"
[Link] = "indClienteMercadoria"
[Link] = False
[Link] = False
End Sub
[Link]
[Link]
[Link]
[Link]
End Sub
TBVendas("Código") = txtCódigo
TBVendas("CódCliente") = txtCódCliente
TBVendas("ValorVenda") = txtValorVenda
TBVendas("QuantidadeVendida") = txtQuantidadeVendida
End Function
lblDescriçã[Link] = ""
[Link] = ""
End Function
190
Comandos Condicionais e de Laço
Exit Sub
End If
lblDescrição = TBMercadoria("Descrição")
End Sub
lblNomeCliente = TBCliente("Nome")
End Sub
txtCódigo = TBVendas("Código")
txtCódCliente = TBVendas("CódCliente")
txtValorVenda = Format(TBVendas("ValorVenda"), "Standard")
txtQuantidadeVendida = TBVendas("QuantidadeVendida")
[Link] "=", txtCódigo
[Link] "=", txtCódCliente
lblDescrição = TBMercadoria("Descrição")
lblNomeCliente = TBCliente("Nome")
End Function
191
Comandos Condicionais e de Laço
AtualizaFormulário
[Link] = True
[Link] = True
[Link] = True
[Link] = True
[Link] = True
[Link] = True
[Link] = False
[Link] = True
[Link] = False
End Function
Deixamos o botão Consulta de fora propositadamente. Vamos voltar nele nos próximos capítulos.
Data
DBGrid
192
Comandos Condicionais e de Laço
Este controle economiza uma séria de linhas de programação, fazendo o intercâmbio entre os
controles de um formulário com a tabela do Banco de Dados.
Vamos usar a mesma tabela de Mercadoria para criar um formulário e manipular esta tabela através
do controle data.
Crie um projeto novo e coloque os seguintes controles nele. Repare que é semelhante ao que
fizemos no capítulo anterior, mas na verdade tem grandes mudanças na codificação. Mude o
Caption deste controle para "Mercadoria".
As duas propriedades principais deste controle são: DatabaseName e RecordSource.
DatabaseName: Nesta propriedade selecionamos o nome do banco de dados que será manipulado.
Uma caixa igual a que aparece abaixo será apresentada. Em nosso exemplo, selecione
[Link] que é o banco de dados que estamos trabalhando.
193
Comandos Condicionais e de Laço
RecordSource: Nesta propriedade deve ser selecionado o nome da tabela que será manipulada
pelo objeto Data. Dentro do Banco de Dados escolhido ([Link]) existem 3 tabelas: Vendas,
Mercadoria e Cliente. As 3 irão aparecer. Escolha "Mercadoria".
Cada caixa de texto deve ser agora anexada ao controle data e, por conseguinte, aos seus
respectivos campos. Por exemplo: A caixa de Texto txtCódigo deve ser anexada ao campo Código.
Esta anexação é feita usando as propriedades DataField e DataSource das caixas de texto.
DataSource: Origem dos dados. Aqui é informado o nome da controle data que possui a tabela que
vamos manipular. Selecione Data1
DataField: Nome do Campo. Na caixa de combinação que aparece, esta o nome de todos os
campos da tabela existente no controle data. Escolha o campo que corresponda com a caixa de
texto selecionada.
Pronto. Não precisa digitar nada na codificação do programa. Com somente este passos já temos
pronto um programa que altera os dados da tabela, pois tudo que for digitado nas caixa de texto será
inserido automaticamente dentro dos registros da tabela. Use o controle data para avançar ou voltar,
ir para o primeiro registro ou o ultimo.
194
Comandos Condicionais e de Laço
Este controle data anexa dados não somente em caixas de texto, mas tambem em outros controles,
como por exempo o DBGrid, que é muito útil para o programador.
13.2 DBGRID
No projeto desenvolvido no capítulo anterior, deixamos de codificar o botão de Consulta. Vamos
fazer isto agora usando um DBGrid para auxiliar na consulta. Adicione um novo formulário e mude a
propriedade Name para frmConsulta. Neste formulário vamos criar todas as rotinas de consulta que
irão aparecer para o usuário.
Insira um CommandButton no formulário, um objeto do tipo Data e um objeto do tipo DBGrid:
DBGrid Data
Estes Controles serão inseridos na seguinte disposição:
No objeto Data mude a propriedade name para datVendas e o Caption para “Dados das Vendas”.
No objeto DBGrid mude a propriedade name para gridVendas e o Caption para “Lançamento das
Vendas”.
O Objeto Data possui algumas propriedades que devem ser alteradas, como o DatabaseName e
RecordSource. Escolha "[Link]" para uma e "Vendas" para outra.
Trabalhando somente com essas duas propriedade anexamos a tabela Vendas do Banco de Dados
[Link] no objeto Data, que nomeamos para datVendas.
Com isto, sempre que fizermos agora qualquer evento no datVendas será refletido diretamente na
tabela Vendas.
O objeto que manipulará os dados foi então criado, que é o Data, mas onde os registros do irão
aparecer?
Poderíamos colocar cada Campo anexado a uma caixa de texto, mas em lugar disto vamos colocar
todos os registros existentes na tabela Vendas dentro de um objeto DBGrid.
O DBGrid possui uma propriedade chamada DataSource. Nesta propriedade informamos o nome do
objeto Data que inserimos no formulário. Fazendo isto estaremos fazendo uma ligação entre o banco
de dados e a tabela, já definida no objeto Data, para o objeto DBGrid. Com isto o DBGrid já saberá
qual tabela que ele irá manipular.
195
Comandos Condicionais e de Laço
A propriedade Custom deste objeto abre uma janela onde estão as principais propriedades deste
objetos. Ao clicar será mostrado uma janela para configurar estas propriedades que irão dar forma
ao DBGrid.
Selecionando no topo desta janela a seção Columns abriremos novas propriedades para serem
configuradas.
196
Comandos Condicionais e de Laço
Columns: Seleciona em qual coluna de dados do DBGrid que terá as propriedades abaixo
disponível para serem configuradas.
Caption: Título da Coluna selecionada.
DataField: Campo da tabela que terá seus dados exibidos na coluna selecionada.
DefaultValue: Valor padrão para um determinado campo.
NumberFormat: Determina o formato com que os dados da coluna serão mostrados no vídeo. Usa
as mesmas regras da função FORMAT.
197
Comandos Condicionais e de Laço
Uma forma rápida e recomendada para transferir os dados da tabela para suas respectivas
propriedades é a seguinte:
Selecione o DBGrid no formulário.
Posicione o ponteiro do rato sobre ele e pressione o botão da direita.
Irá aparecer um menu como o que esta abaixo:
198
Comandos Condicionais e de Laço
Isto fará com que todos os dados relativo a tabela que foi informada na propriedade DataSource
sejam automaticamente ajustadas no DBGRid. Use a propriedade (Custom) somente para modificar
os Caption das Colunas, se houver necessidade. Desta forma o DBGrid ficará assim:
O botão fechar será configurado para esconder este formulário e retornar para o formulário anterior.
Note que usamos o Hide no lugar de Unload, pois o Unload retirna o formulário da tela e da
memória também, enquanto que o hide mantém o formulário na memória. A vantagem disto é que o
acesso a esta janela se torna mais rápido no segundo acesso que for feito a ela e os valores das
variáveis do formulário ainda continuará em uso. Neste caso vamos precisar dos valores dos
campos que o usuário selecionou para, na tela de Vendas, usá-las.
Este tipo de consulta que foi feito é bastante simples. Logicamente que pode-se usar outros métodos
mais sofisticados, como o SQL por exemplo. Mas isto já faz parte dos recursos avançados do Visual
Basic.
Volte agora na tela de Vendas para podermos codificar o botão "Consultar"
No método Show de frmConsulta, usamos como argumento a constante "vbModal" para indicar que
essa janela deve ser do tipo modal, ou seja, exclusiva. Não se tem acesso a outra janela enquanto o
usuario não concluir o que deseja fazer na janela aberta.
199
Comandos Condicionais e de Laço
Usamos o Seek para procurar os códigos que foi selecionado na janela frmConsulta.
Note que usamos o "_" para fazer uma quebra de linha.
200
Comandos Condicionais e de Laço
14 IMPRESSÃO
Printer
Crystal Reports
201
Comandos Condicionais e de Laço
14.1 PRINTER
No nosso programa vamos acrescentar um item no menu principal chamado “impressão do Estoque”
e com isto vamos imprimir o conteúdo da tabela mercadoria.
Usaremos um novo objeto para os chamados Printer. E será este objeto que manipulará tudo que
enviaremos para a impressora, criando, assim, um canal de comunicação entre nosso programa e a
porta em que a impressora esta ligada.
Muitas peculiaridades de uma impressão, como falta de papel, impressora em linha, fila de
impressão, etc.. Tudo isto será organizado pelo próprio Windows, deixando o programador livre para
executar somente uma tarefa: Despachar seu relatório para a impressora.
As propriedades principais do Printer são:
ColorMode: Determina ou mostra a capacidade de impressão colorida do dispositivo.
Copies: Especifica a quantidade de cópias de uma página que deve ser impressa.
CurrentX: Determina a coordenada horizontal que a impressora irá imprimir.
CurrentY: Determina a coordenada vertical que a impressora irá imprimir.
DeviceName: Mostra o nome da impressora padrão suportada pelo dispositivo
FontName: Determina qual fonte de letra a impressora usará para impressão.
FontBold: Determina se a fonte será em negrito.
FontItalic: Determina se a fonte será em itálico.
Fonts: Fornece uma lista de todas as fontes disponíveis para impressão.
FontSize: Determina o tamanho que a fonte de letra escolhida usará.
FontUnderline: Determina se a fonte será sublinhada.
Orientation: Determina a orientação do papel: Retrato ou Paisagem. Usamos as constantes
para definir o tipo escolhido:
vbPRORPortrait 1 Retrato
vbPRORLandscape 2 Paisagem
Page : Retorna o número da página que esta sendo impressa.
202
Comandos Condicionais e de Laço
Port: Retorna o nome da porta de impressão que será usada pela impressora padrão.
203
Comandos Condicionais e de Laço
Os métodos:
EndDoc: Finaliza a impressão de um relatório
KillDoc: Termina imediatamente a impressão
NewPage: Força a impressão passar para a próxima página.
Print <expressão> : Imprime uma expressão ou variável especificada.
O Objeto Printer não aparece na caixa de ferramentas, nem possui um ícone como outros objetos.
Ele é interno que não possui formato visual.
Para desenvolver nossa rotina de impressão, dê um click na opção “Impressão Estoque” no menu e
vamos codificar o programa:
Criamos primeiro as variáveis que irão manipular o Banco de Dados e a tabela. Como vamos
imprimir o conteúdo da tabela de mercadoria isto se torna necessário.
A variável Linha irá fazer um contador de linhas, para podermos controlar quantas linhas estão
sendo impressa numa página.
Depois colocamos uma mensagem para o usuário ter certeza que realmente quer imprimir o
relatório. Se o MsgBox retornar o número 7 é sinal que o usuário digitou escolheu não.
204
Comandos Condicionais e de Laço
iriam aparecer no relatório seria a ordem em que foram digitados. Como abrimos um índice que
ordena todos os dados na ordem de código, o relatório será impresso então nesta ordem. Caso
houvesse necessidade de criar um relatório na ordem alfabética da descrição das mercadorias,
então seria necessário criar um índice pelo campo “Descrição”, ou uma SQL ordenado pela
"Descrição", e abri-lo na rotina de impressão.
Usamos o objeto Printer para definir com qual fonte de letra o relatório será impresso e qual o
tamanho usado
Abrimos um DO WHILE para sempre verificar se o fim do arquivo foi atingido. Enquanto não for (Not
[Link]) executa as rotinas definidas entre o DO WHILE e o LOOP.
Em seguida é verificado se o contador de linha é igual a 1. Se for chama uma função chamada
Cabeçalho. Esta função irá imprimir o cabeçalho de nosso relatório.
O conteúdo dos campos da tabela de mercadoria é inserido dentro das variáveis, para depois
podermos imprimir no papel estas variáveis. Usamos a função Format para melhorar a formatação
numérica.
Usamos a propriedade CurrentX para definir qual será a coordenada horizontal a ser utilizado
durante a impressão.
A propriedade Print é quem efetivamente faz a impressão. Em conjunto com o Print usamos a função
TAB que efetua uma tabulação para cada variável que será impressa. Isto ajuda a alinhar as
expressões impressas.
Note que colocamos um “;” após o nome da variável que será impressa. Usamos isto para o Objeto
Printer continuar imprimindo na mesma linha. No ultimo campo a ser impresso
TBMercadoria("Valor") já não é necessário, pois a próxima impressão já será na linha seguinte.
Fazemos depois um incremento de + 1 na variável linha. Isto é para atualizar o contador de linha.
MoveNext posiciona a tabela no próximo registro, pois o atual já foi impresso e agora é necessário
ler o registro seguinte. Se o registro seguinte for o fim do arquivo, quando a execução do programa
encontrar o LOOP esta rotina será encerrada.
205
Comandos Condicionais e de Laço
No nosso exemplo definimos que numa página pode conter no máximo 50 linhas. Então quando o
contador de linha chegar neste ponto, o Objeto Printer chamará uma nova página (NewPage) e o
contador de linha volta a ser igual a 1.
Encerramos nossa rotina com um EndDoc que finaliza a impressão e um Close fechando a tabela e
o banco de dados.
Neste programa esta faltando, para encerrar, a função que cria o cabeçalho:
Quando colocamos um print sozinho, sem nenhuma expressão acompanhado, indica que queremos
forçar a impressão de uma linha em branco.
Linha = 1
[Link] = "Arial"
[Link] = 10
206
Comandos Condicionais e de Laço
If Linha = 1 Then
Cabeçalho
End If
[Link] = 300
Linha = Linha + 1
[Link]
Loop
[Link]
[Link]
[Link]
End Sub
End Function
207
Comandos Condicionais e de Laço
Vamos usar este gerador de relatório para criar um relatório de Mercadoria. Não serão necessárias
codificações complexas, pois o programa automatiza muitas tarefas.
Ao aparecer o Programa Crystal Reports entre na opção NEW.
208
Comandos Condicionais e de Laço
Irá aparecer uma janela onde devemos escolher qual estilo de relatório será criado. Vamos usar o
"Standard"
Para que o programa crie nosso relatório devemos passar algumas informações, e essas
informações serão coletadas através dessas opções que vem a seguir:
Aperte o botão Data File para escolher o banco de dados que sera usado no relatório. Depois de
escolhido irá aparecer a relação de todas as tabelas existentes no Banco de Dados. Escolha o
Arquivo "[Link]".
209
Comandos Condicionais e de Laço
210
Comandos Condicionais e de Laço
Nesta tela selecionamos os campos que vão compor o relatório. Escolha um campo na lista que
aparece no "Database Fields", aperte o botão "Add" e dê um título para o campo (que irá aparecer
no cabeçalho) no item Column Heading.
211
Comandos Condicionais e de Laço
Se quisermos criar grupos ou subgrupos, usamos esta tela. Como por exemplo, um relatório que
aparece primeiro o grupo de Material Esportivo e depois o Grupo de Roupa Social. Quando
escolhemos um campo que será a chave do grupo, o relatório ordena o relatório primeiro pelo grupo.
No nosso caso, não existe grupo. Aperte o "Next"
Irá aparecer esta mensagem, alertando que como não foi escolhido nenhum grupo não será possível
entrar nesta opção. Aperte o botão OK e vamos direto para a opção "6 - Select"
212
Comandos Condicionais e de Laço
Nesta tela pode-se fazer um filtro dos registros que irão compôr o relatório. Não faremos nenhum
tipo de filtro.
Aqui colocamos um título para o relatório e escolhemos um estilo na lista que aparece em "Style".
Escolha Shading . Cada estilo monta o relatório num formato diferente. Deve-se escolher o que
mais se adapta ao tipo que relatório que se esta criando.
Aperte agora o botão "Preview Report" para ver como ficou.
213
Comandos Condicionais e de Laço
Vamos agora colocar um total para o "Valor". Dê um click com o mou se em cima do registro e aperte
o botão da direita.
Dentre as várias opções que irá aparecer, escolha "Inset Grand Total". Será então inserido um
totalizador para o "Valor".
214
Comandos Condicionais e de Laço
Uma vez feito tudo isto, nosso relatório esta pronto. Vamos agora salvar o arquivo e mandar
executar em nosso programa.
Va no menu "File", opção "Save" e grave este relatório com o nome de "Mercadoria".
Feche o Cristal Reports e volte para o nosso programa.
Crie mais um formulário para o projeto, e dê o nome de "frmRelatórios". Abra uma opção no menu
principal do programa e acrescente-o nele.
Nesta janela o usuário irá escolher o tipo de relatório que ele deseja e pressiona o botão "Imprimir".
Note que inserimos no formulário um novo controle chamado CrystalReports. Ele quem irá na
verdade fazer todo o trabalho "pesado" de gerar o relatório.
Vamos então codificar o botão imprimir:
215
Comandos Condicionais e de Laço
Primeiro verificamos se o usuário escolheu o relatório de mercadoria. Caso seja positivo mudamos o
ponteiro do rato para uma ampulheta (para não deixar o usuário fazer nada ate que o relatório seja
concluido.
Na propriedade ReportFileName coloque o arquivo que criamos. Lá existe a matriz de nosso
relatório. Em DataFiles especificamos o nome do banco de dados que será lido pelo relatório.
CopiesToPrinter determina quantas copias terá o relatório. Na propriedade Destination informamos
que o relatório deve ser gerado na tela primeiro antes de ir para a impressora. Por fim, usamos o
Action que envia todas as informações captadas para o Crystal e cria o relatório.
Quando o relatório é criado e mostrado na tela, usamos os botões que fica na parte inferior para
manipular o relatório.
Os botões em forma de seta são utilizados para navegar nas páginas do relatório. O botão em forma
de impressora envia o relatório para a porta de impressão.
O relatório de Vendas tem uma particulariadade. Nele deve conter o nome do cliente e o nome da
mercadoria comprada, entretanto na tabela de Vendas não existe esses dados, existe somente os
códigos relacionados. Como o Crystal Reports faz o relacionamento entre tabelas de forma quase
que automaticas, temos que somente inserir os respectivos campos.
216