Documente Academic
Documente Profesional
Documente Cultură
Passo a Passo
Lionardo Fonseca Paiva Lionardo@base.com.br
Lionardo@base.com.br
1 Edio
Sugestes e criticas sero bem vindas. Envi-las para o autor Lionardo Fonseca Paiva pelo e-mail: lionardo@base.com.br
Lionardo@base.com.br
Sumrio
1 APRESENTAO DO VISUAL BASIC 5 ..........................................................9 1.1 APRESENTAO DAS JANELAS .........................................................................11 1.1.1 Padronizao em programas para Windows..........................................12 1.1.2 Barra de Menus e Botes........................................................................13 1.1.3 Os Controles (Caixa de Ferramentas)....................................................14 1.1.4 Propriedades dos Objetos.......................................................................15 1.1.5 O Formulrio ( Form ) ...........................................................................18 1.1.6 Caixa de Projetos ...................................................................................20 1.1.7 Janela de Codificao ............................................................................20 1.2 SALVANDO UM PROJETO..................................................................................23 2 OS CONTROLES BSICOS ..............................................................................27 2.1 FORMULRIO E SUAS PROPRIEDADES.................................................29 2.1.1 Propriedades Principais do Form ..........................................................29 2.1.2 As Propriedades Principais do CommandButton ...................................34 2.1.3 Propriedades Principais do Label..........................................................38 2.1.4 Propriedades Principais do TextBox ......................................................39 2.1.5 Eventos relacionados ao Objeto TextBox ...............................................42 2.1.6 Caixa de Texto para vrias linhas..........................................................48 2.1.7 Propriedades Principais do CheckBox...................................................49 2.1.8 Propriedades Principais do OptionButton .............................................51 2.1.9 Propriedades Principais do Frame ........................................................54 3 SELECIONANDO ITENS...................................................................................61 3.1 O OBJETO LISTBOX .........................................................................................63 3.1.1 Propriedades Principais do ListBox.......................................................63 3.1.2 Propriedades em tempo de execuo......................................................65 3.1.3 Eventos do ListBox .................................................................................67 3.1.4 Mtodos AddItem, RemoveItem e Clear.................................................67 3.2 O OBJETO COMBOBOX ....................................................................................71 3.2.1 Propriedades Principais do ComboBox .................................................72 3.2.2 Os Mtodos .............................................................................................73 4 O FOCO ................................................................................................................77 4.1 O FOCO ...........................................................................................................79 4.1.1 Propriedades TabIndex e TabStop .........................................................79 5
Lionardo@base.com.br
A Tecla Enter.......................................................................................... 80 Mtodo SetFocus .................................................................................... 82 Eventos GotFocus e LostFocus .............................................................. 83 Mnemnico (Tecla de Acesso)................................................................ 87
MENUS ............................................................................................................... 101 6.1 MENUS .......................................................................................................... 103 6.1.1 Criando Menus ..................................................................................... 103 6.1.2 Menus Instantneos.............................................................................. 109
VARIVEIS E MATRIZES.............................................................................. 111 7.1 AS CARACTERSTICAS DE UMA VARIVEL .................................................... 113 7.1.1 O Comando Dim................................................................................... 113 7.1.2 Os Tipos de Varivel ............................................................................ 115 7.1.3 As Variveis Nmericas ....................................................................... 116 7.1.4 Varivel String ..................................................................................... 116 7.1.5 Varivel Boolean.................................................................................. 117 7.1.6 Varivel Date ....................................................................................... 117 7.1.7 Varivel Object..................................................................................... 118 7.1.8 Varivel Variant ................................................................................... 118 7.1.9 Null ....................................................................................................... 118 7.2 ABRANGNCIA E TEMPO DE VIDA DE UMA VARIVEL .................................. 118 7.3 MATRIZES ..................................................................................................... 124 7.3.1 Matrizes Unidimensional ..................................................................... 125 7.3.2 Matrizes Multidimensional................................................................... 125 7.3.3 Matrizes Dinmicas.............................................................................. 126 7.3.4 Matrizes no ComboBox e no ListBox ................................................... 128 7.3.5 A Propriedade Index dos Objetos ........................................................ 128
OPERADORES .................................................................................................. 133 8.1 OPERADORES ................................................................................................ 134 8.1.1 Operadores Matemticos ..................................................................... 134 8.1.2 Operadores Relacionais ....................................................................... 135 8.1.3 Operadores Lgicos ............................................................................. 135 8.1.4 Operador de String............................................................................... 136
COMANDOS CONDICIONAIS E DE LAO ................................................ 140 9.1 COMANDOS CONDICIONAIS ........................................................................... 142
9.2 10
10.1 FUNES .......................................................................................................154 10.1.1 Funes matemticas............................................................................154 10.1.2 Funes de Converso..........................................................................156 10.1.3 Funes de Data e Hora.......................................................................159 10.1.4 Funes de String .................................................................................165 10.1.5 Funes de Manipulao de Matrizes ..................................................168 10.1.6 Funes Lgicas ...................................................................................169 10.1.7 Funes de Disco..................................................................................170 10.1.8 Funes de Teste...................................................................................172 10.1.9 Funes de Escolha ..............................................................................173 10.2 A FUNO FORMAT ...................................................................................179 11 CRIAO DO BANCO DE DADOS ...........................................................194
11.1 BANCO DE DADOS ...................................................................................197 11.1.1 Caractersticas......................................................................................197 11.1.2 Visual Data Manager (VisData)...........................................................198 11.1.3 Criando indices.....................................................................................205 12 MANIPULAO DO BANCO DE DADOS................................................208
12.1 CRIANDO JANELAS .........................................................................................210 12.1.1 Abrindo um banco de dados .................................................................213 12.1.2 Abrindo um indice.................................................................................216 12.1.3 Fechando um banco de dados ..............................................................217 12.1.4 Cuidados especiais ...............................................................................217 12.1.5 Funes de apoio..................................................................................220 12.2 ADICIONANDO DADOS ...................................................................................222 12.3 PRXIMO E ANTERIOR ...................................................................................227 12.4 ALTERAO ..................................................................................................228 12.5 CONSULTA .....................................................................................................229 12.6 EXCLUSO .....................................................................................................230 12.7 CONSIDERAES FINAIS ................................................................................231 12.8 CADASTRO DE CLIENTES ................................................................................232 12.9 LANAMENTO DAS VENDAS ..........................................................................237 13 13.1 13.2 14 USANDO O CONTROLE DATA .................................................................254 CONTROLE DATA...........................................................................................256 DBGRID.......................................................................................................258 IMPRESSO ..................................................................................................266 7
Lionardo@base.com.br
14.1 14.2
Lionardo@base.com.br
10
Controles Bsicos
Disposio padro das janelas do Visual Basic O Visual Basic 5 se tornou a mais poderosa ferramenta de desenvolvimento de aplicaes e o limite desta linguagem a imaginao de cada um. Para o programa ser apresentado para ns, precisamos dar um click no cone Visual Basic 5 encontrado na pasta Microsoft Visual Basic 5.0, como mostrado na figura 2.
11
Lionardo@base.com.br
A Verso 5 desta linguagem destinado exclusivamente a criao de programas em 32 bits, ou seja, para Windows 95 ou superior ou Windows NT.
Nesta verso, quando abrimos o Visual Basic, ele nos d uma sria de opes sobre o que desejamos criar: um executvel, uma DLL, um ActiveX, etc. Por padro usaremos somente "standard EXE" que o usual para criao de programas executveis.
Controles Bsicos Sempre use teclas de atalho para o usurio cortar caminho. Lembre-se que nem todos usurios gostam de usar o mouse intensivamente. Alguns preferem, sempre que podem, usar o teclado. Ento d esta opo. Sempre d a possibilidade ao usurio de cancelar uma alterao feita em uma determinada janela. O boto Cancelar existe nos melhores programas existente no mercado. Quando um usurio escolhe uma aplicao para Windows para sua empresa e diverso, ele sabe que no vai encontrar dificuldades na operao do programa, pois todos so semelhantes em vrios aspectos, ento mantenha essa semelhana.
Usamos as opes do menu do Visual Basic para configurar nosso ambiente de trabalho, janelas, cores, inserir novos formulrios, mdulos, salvar o projeto, sair do Visual, etc. No usamos os menus para construir nenhuma aplicao, suas opes so de assistncia. Vamos no decorrer deste livro comentar as opes principais e mais usadas. Como o acesso aos menus geralmente um processo mais lento do que o acesso a botes, o Visual Basic d a possibilidade de podermos cortar caminho atravs da barra de botes. As principais opes do Menu foram duplicadas em forma de botes.
13
Lionardo@base.com.br
Os botes existente no lado esquerdo de nosso projeto, dentro de uma janela vertical, so chamados de controles, ou caixa de ferramentas, e sero esses controles que iro montar nossa aplicao. Atravs deles inserimos os objetos que precisamos para criar nossos formulrios. Quando entramos no Visual Basic pela primeira vez, nem sempre todos os controles esto disponveis. Para podermos configurar quais controles queremos que aparea em nosso projeto, precisamos acessar o menu Project, opo Components. Ser mostrado uma lista de Controles que podem ser anexados a Caixa de Ferramentas para podermos usar em nosso projeto. Com um click do mouse sobre a caixa de seleo
Relao dos controles disponveis para serem selecionados e acrescidos na Caixa de Ferramentas.
14
Controles Bsicos dos controles, pode-se marcar ou desmarcar quais controles necessitamos. Para termos acesso a todos os controles padro do Visual Basic, selecionamos todos que possuem a extenso OCX. Confira no campo Active Setup Control Library o nome do arquivo que possui o controle.
Barra de Ferramentas: Dentro dela esta todos os controles (objetos) que podemos usar em nosso projeto. Para usar um deles precisamos selecionar ( clicando nele com o mouse) e inseri-lo dentro de nosso Formulrio. Cada Objeto possui uma srie de propriedades que podemos personalizar para usar de acordo com nossa necessidade. Temos aqui Objetos para colocar rtulo, caixa de edio, manipular Banco de Dados, caixa de Opo, barra de status, inserir figura, boto de comando, etc. Toda interface de nosso formulrio pode ser montado a partir desses controles. Uma vez inserido um desses Objetos dentro de nosso formulrio, podemos manipular sua aparncia e sua funo atravs das propriedades que cada Objeto desse possui. Dependendo da verso do Windows que estiver usando, alguns Controles podem no aparecer, pois existe alguns que so especifico do Windows 95.
15
Lionardo@base.com.br
Titulo Properties e o nome dado para o formulrio selecionado no projeto. Nesta caixa aparece no canto direito o nome dado pelo usurio ao Objeto selecionado, e no canto direito o tipo de Objeto. No exemplo mostramos o objeto de nome Form1 tipo Form (formulrio). Podemos tambm selecionar outro objeto que existe em nosso formulrio nesta caixa, clicando na seta para baixo, e selecionando outro objeto que ali esteja disponvel para seleo.
Nesta coluna aparece o nome das Propriedades. Cada Objeto possui uma quantidade diversa de propriedade para vrios aspectos diferente. Como por exemplo, a Propriedade BorderStyler que especifica o tipo de borda que o Objeto ter. A Propriedade Caption que da um ttulo ao Objeto, Propriedade BackColor onde se escolhe a cor de fundo que o objeto ter. Lembrando que essas propriedades atuam somente no Objeto selecionado. Se queremos mudar uma determinada propriedade de um Boto de Comando por exemplo, precisamos selecion-lo na forma, e depois levar o mouse at a propriedade que se quer mudar.
Esta coluna onde modificamos a propriedade escolhida, seja atravs de uma lista de opes (ComboBox), ou digitada diretamente.
Vamos por ora ressalvar duas propriedades que a maioria absoluta dos objetos possuem: Caption e Name. A propriedade Caption responsvel pela legenda (ttulo) que o objeto ter quando aparecer em nosso formulrio. Por exemplo, num objeto CommandButton (Boto de Comando), o Caption quem coloca o ttulo que ir aparecer dentro do boto. 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 boto Cancelar termos o nome de
16
Controles Bsicos cmdCancelar, este o nome que vamos usar na codificao deste objeto. Este nome fica atribudo ao objeto. Para se dar nomes ao alguns objetos algumas regras tem que serem seguidas, como por exemplo, no pode conter espaos em branco, no se pode usar sinais como #$&+-^ . Como padro acostuma-se a usar as trs primeiras letras do nome para abreviar o tipo do Objeto, para durante a codificao do programa facilitar na identificao de qual objeto estamos usando. Por exemplo: Um boto de comando do tipo CommandButton, e abreviamos como cmd, um formulrio do tipo Form, e abreviamos como frm, uma mscara de edio do tipo MaskEdBox, e abreviamos como msk. Essas abreviaes ficam a critrio do programador.
Mas para compor a propriedade Name, no colocamos somente abreviaes do tipo de objeto que ele representa, mas tambm o que se trata o Objeto. Por exemplo: temos duas caixa de opes (OptionButton), onde temos a opo para o usurio 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 mouse em cima de qualquer objeto, e o tipo aparecer dentro de uma caixinha amarela.
17
Lionardo@base.com.br
Nesta janela onde colocamos todos os Objetos necessrios para montar nosso projeto. Um projeto pode ter vrios formulrios. Chamamos de formulrio, mas na verdade se trata de uma janela que nosso programa vai usar, seja uma janela de cadastramento, janela principal, janela de aviso. No importa. Sempre que uma janela for aparecer em nosso programa, temos que criar um Formulrio (Form). Quando abrimos o Visual Basic aparece um formulrio vazio, somente com o ttulo Form1 o Menu de Controle com o cone padro do Visual Basic e os botes de Minimizar, Maximizar e Fechar. No corpo do formulrio existe somente uma srie de pontos pequenos espalhados. Esses pontos no aparece quando nossa aplicao executada. Eles tm a funo nica de auxiliar no alinhamento dos objetos que so inseridos dentro do formulrio. Se no existisse esses pontos ficaria mais difcil colocar os OptionButton (optMasculino e optFeminino) um abaixo do outro na mesma posio.
18
Boto Maximizar Boto Minimizar rea de titulo. Caption do f l Menu de Controle. rea onde sero inseridos os objetos para criao de nosso formulrio. Chamamos de Control Box a unio dos botes minimizar, maximizar, fechar e o menu de controle
Para se inserir um Objeto da caixa de ferramentas para o formulrio existem dois procedimentos: Escolha o objeto que se quer usar, e de dois clicks com o mouse em cima dele, e logo o objeto ir aparecer no centro do formulrio. Esse mtodo no muito aconselhado pois o Controle escolhido no vai para onde voc precisa dele, e sim sempre para o centro do formulrio, obrigando-o a ir com o mouse at o objeto e arrast-lo para onde realmente necessitamos dele. O modo mais aconselhado para insero de objetos no formulrio, dando um click com o mouse no objeto, e depois leve o ponteiro do mouse para o formulrio (dentro do formulrio o ponteiro do mouse ir se transformar numa cruz), e ento clicando no boto esquerdo do mouse faa um quadrado. O objeto ir aparecer dentro de seu quadrado. Isto til pois podemos inserir o objeto exatamente onde precisamos.
+ +
Criando o objeto, com boto do mouse apertado. Soltando o boto do mouse, o objeto criado na posio e dimenso escolhida.
19
Lionardo@base.com.br
Ao selecionar o formulrio pretendido, aperte este boto e o formulrio ir aparecer no centro da tela. Caso o componente no seja um formulrio, este boto estar desabilitado.
Selecionando um formulrio, aperte este boto para ver sua codificao. Nesta janela de cdigo aparecer os procedimentos, funes e eventos. Se o componente escolhido no tiver opo de codificao, ento este boto estar desabilitado.
20
Controles Bsicos bom lembrarmos que cada objeto possui vrios eventos diferentes, e nossa tarefa bsica codificar cada evento que nosso programa necessitar. Somente ocorre eventos durante a execuo do programa. Por exemplo, existe um evento chamado Click, que para quando damos um click com o mouse no objeto. Evento MouseMove para quando o mouse se movimentar dentro do objeto. Evento KeyPress para quando um tecla for pressionada dentro do objeto. Estudaremos mais detalhado esses eventos. Por ora importante entender a utilidade deles, e qual a finalidade deles em nossa codificao.
Objeto a ser codificado. Quando damos dois clickes em um objeto, o nome dele j vem para este campo.
Nome dos eventos disponvel para o objeto selecionado. Ao clicar nesta caixa os eventos aparecem.
Crie um Projeto novo, e no objeto Form modifique as propriedades: Caption = Janela Teste Name = frmJanelaTeste Em seguida insira um CommandButton no formulrio e mude as propriedades tambm: Caption = Fechar Name = cmdFechar D agora dois clickes no boto Fechar dentro do formulrio. A janela de cdigo ser aberta e ser mostrado a seguinte codificao: Private Sub cmdFechar_Click()
21
Lionardo@base.com.br
End Sub O Cursor ficar piscando acima do comando End Sub, esperando voc digitar algo ali. Sempre que criamos um evento aparece o nome Private Sub sinalizando o inicio do procedimento. Depois vem o nome do procedimento, que no nosso caso cmdFechar_Click. Note que o nome que damos para o Objeto selecionado quando chamados a janela de cdigo. Aps o sinal de sublinhado aparece o nome do evento, igual o que aparece na caixa de combinao acima. Note na janela de codificao que o campo Object ser o cmdFechar, pois este objeto quem estava selecionado quando chamados a janela de codificao. Ao lado esta uma lista de Eventos, e o evento Click j estar pronto para ser codificado. Podemos trocar com o mouse o evento ( Procedure ) que queremos codificar ou at o objeto ( Object ). Mas vamos manter no nosso exemplo. Digite o comando: Unload frmJanelaTeste. O comando Unload serve para retirarmos da memria a janela que esta aberta. Agora aperte o boto Executar para rodar a aplicao. Ao apertar o boto fechar a janela desaparecer o voltaremos para o Tempo de Projeto. Para se entender melhor em que momento do programa esses eventos so chamados, s imaginar o seguinte: quando executamos uma aplicao Windows qualquer, o usurio pode fazer vrias tarefas (ou eventos) como apertar uma tecla, o boto do mouse, movimentar o mouse, dimensionar o tamanho de uma janela, etc. Pois bem, quando qualquer um desses possveis eventos so executados o Windows verifica se existe alguma codificao para aquele evento, se existir ele executa todas as linhas at encontrar a expresso End Sub
22
Controles Bsicos
Quando precisarmos criar uma codificao dentro de nosso formulrio mas que tenha seu alcance estendido para todos os procedimentos e eventos do formulrio, e no para algum determinado, escolhemos o Object General, que significa Geral (na caixa de eventos aparecer o nome declaration). Se declararmos ali uma varivel ela ter validade para todo o formulrio. Veremos isto melhor no Captulo sobre variveis.
23
Lionardo@base.com.br
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 no ter problema de localizao.
24
Controles Bsicos
EXERCCIOS PROPOSTOS
1 - Descreva 5 botes da barra de botes que voc acha mais importante: Nome Descrio
2 - Qual opo do menu nos d a possibilidade de incluir mais Objetos dentro da Caixa de Ferramentas?
3 - Explique com suas palavras o que voc entendeu sobre: Caixa de Ferramentas:
Objetos:
Propriedades:
Formulrio:
Janela de Projetos:
Codificao:
25
Lionardo@base.com.br
D dois clickes no boto OK e na janela de codificao escreva Print Oba! Deu Certo!, como esta na janela acima. Feche a janela, e voltando ao formulrio d agora dois clickes no boto Fechar. A janela de codificao volta a aparecer e nos digitaremos Unload frmCadastroPaciente. Execute o programa e veja que fizemos com que o boto OK mostre na janela a frase Oba! Deu Certo! e o boto Fechar termina o programa. O Comando Print tem a finalidade de mostrar na janela aberta a expresso que esta na sua frente entre aspas. Na verdade numa programao profissional ele no usado, pois no definimos sua localizao na tela. Ele sempre imprime a expresso no canto superior esquerda. Estamos usando ele aqui somente para fins didticos. Vamos substitui-lo depois pelo Objeto Label. 5 - Qual a diferena dos arquivos com extenso .vbp dos com extenso .frm
26
Lionardo@base.com.br
28
Controles Bsicos
A principal propriedade do Form a propriedde Name, pois atravs dela que o Visual Basic ir sugerir o nome que sera dado para o arquivo do Formulrio (*.frm), mas essa propriedade Name no importante somente no objeto Form, mas em todos os objetos. O Visual Basic automaticamente nomeia todos os objetos que so inseridos no formulrio, mas nem sempre serve para ns. Por exemplo, quando inserimos um CommandButton no Form ele por Default j ir possuir o Name como Command1. SEMPRE bom mudarmos esse padro. A importncia do Name nos objetos fundamental para quando fazemos alguma referencia ao objeto. Por exemplo, se na codificao do programa, por algum motivo, precisarmos nos referenciar a um boto colocado no formulrio cuja finalidade fechar a janela, seria mais prtico que o Name dele seja "cmdFechar", em vez de "Command1". Desta forma, visualmente, saberemos que se trata de um boto de comando cuja finalidade fechar algo. Ento importante sempre termos o cuidado de nomearmos TODOS os objetos que colocamos no formulrio com nomes bem descritivos e que nos d uma pista do que se trata o objeto em questo. As outras propriedades vamos estud-las no decorrer deste livro.
exibio de cores: "Palette" e "System". O "System" mostra as cores definidas no sistema de cores do Windows. Muito til, pois sempre existe aquela situao que o usurio entra nas configurao do Windows, altera a aparncia das cores e depois o seu programa no acompanha a mudana. Se precisar 29
Lionardo@base.com.br
que o programa desenvolvido tenha as cores sempre adaptadas de acordo com o padro de cores escolhido na aparncia do Windows ento deve-se usar sempre as cores mostradas no "System" dessa propriedade. BorderStyle: Muda o tipo de borda do formulrio. None: sem borda, sem barra de titulo, sem menu de controle, sem boto maximizar e sem boto minimizar, e no pode redimensionar a janela.
Fixed Single: Borda fixa. Aceita o Menu de Controle, Maximizar, Minimizar, barra de ttulo, mas no pode ser redimensionado. (Default) Sizable: Borda comum. Possui o Menu de Controle, Maximizar, Minimizar, barra de ttulo e pode ser redimensionada. Fixed Dialog: Muito usada para janelas que vo manter um dialogo com o usurio. Ela pode ter Menu de controle e a barra de ttulo, mas no ter os botes de maximizar e Minimizar. No pode ser redimensionada. Fixed ToolWindow: No possui o menu de controle, o boto Maximizar e o boto minimizar. Tambm no pode ser redimensionada. Aparecer somente a barra de ttulo e o boto Fechar prprio do Windows 95. Este tipo de formulrio no aparece na barra de tarefas do Windows. Sizable ToolWindow: No possui o menu de controle, o boto Maximizar e o boto minimizar. Pode ser redimensionada. Aparecer somente a barra de ttulo e o boto Fechar prprio do Windows 95. Este tipo de formulrio no aparece na barra de tarefas do Windows. Caption: Ser o texto mostrado na barra de ttulo do formulrio ( da janela ). ControlBox: Retira ou coloca o menu de controle e os botes maximizar, minimizar e fechar da janela. Enabled: Se esta opo estiver com False, ou seja, estando o Enabled desabilitado, isto indicar que nenhum objeto desta janela, e nem a prpria
30
Controles Bsicos janela, poder responder a eventos gerados pelo usurio, como clicar do mouse, pressionamento de teclas, etc. Font: Escolhe a fonte de letra padro que ser usada para todos objetos inseridos neste formulrio. Icon: Nesta propriedade escolhemos um arquivo de cone para associar a esse formulrio. Esse cone o que vai aparecer quando a janela for minimizada e no lado esquerda da barra de ttulo ( Menu de Controle ). KeyPreview : determina se os eventos do teclado no formulrio sero executados antes dos eventos correspondentes aos Objetos inseridos no formulrio. MaxButton: Habilita ou no o boto de maximizao. MDIChild: Determina se a janela ser uma janela filha. Ou seja, ter uma outra janela mestre que agrupara o Form que se esta criando. MinButton: Habilita ou no o boto de minimizar. MouseIcon: Sempre que o mouse for movido em cima do formulrio, o cone associado a esta propriedade aparecer (desde que a propriedade MousePointer esteja customizada). MousePointer: Nesta propriedade especificamos o tipo de ponteiro que o mouse ter quando se mover sobre o formulrio. Veja os tipos existentes:
0 1 2
Lionardo@base.com.br
3 4 5 6 7 8 9 10 11 12 13
Seleo de escrita cone Seleo de Mover Objetos Redimensionamento na diagonal Redimensionamento na vertical Redimensionamento na diagonal Redimensionamento na horizontal Seleo alternada Sinal de ocupado. No disponvel ( Ocupado ) Trabalhando em segundo plano ( Somente 32-bit Visual Basic.)
14
15 99
Todos os Tamanhos. (Somente 32-bit Visual Basic.) Aparece o cone escolhido na propriedade MouseIcon
Name: Nome definido para o Objeto formulrio. Picture: Inseri uma figura em nosso formulrio como papel de parede. ShowInTaskbar: Habilita ou no a possibilidade da janela aparecer na barra de tarefas do Windows. Visible: Determina se quando executarmos o programa essa janela ir ficar visivel ou invisvel. WindowState: Determina se, quando executarmos o programa, a janela ir aparecer na tela do computador Normal, Maximizada ou Minimizada.
Crie um formulrio Novo (opo File / New Project no menu). No Formulrio criado mude as propriedades: Caption = Lanamentos dos Exames
32
Controles Bsicos Name = frmLanamentoExames Configure a janela para no aparecer o boto de Maximizar. Para isto mude a Propriedade MaxButton para False. Faa com que o ponteiro do mouse mude para o desenho de um sinaleiro com a luz vermelha acesa toda vez que o mouse mover no formulrio. Para isto a propriedade MousePointer deve ser Custom e na propriedade MouseIcon identificamos a pasta (diretrio) onde esta o arquivo de cone que contm o sinaleiro. Veja a figura:
Escolha agora o cone que ser associado ao formulrio (janela). A propriedade que usaremos para este fim ser Icon. Procure o arquivo que contem o desenho de uma placa de trnsito Stop contida na pasta Computer. Veja a figura:
33
Lionardo@base.com.br
o que acontece.
34
Controles Bsicos Cancel: Se esta opo for ajustada como verdadeira, o boto ser associado a tecla ESC, e sempre que pressionarmos esta tecla ser como se tivssemos apertado o boto. Caption: O ttulo que ser exibido dentro do boto. Default: Estando o boto com essa propriedade como True indica que este boto ser o Padro da janela, e sempre que apertarmos a tecla Enter ser como se tivssemos apertado o boto. Enabled: Determina se o boto ser habilitado para pressionamento por parte do usurio ou no. Font: Escolhe a fonte de letra que o Caption ter. Name: O nome que daremos para o Objeto boto de comando. Visible: Determina se o boto ser visvel para o usurio quando o programa estiver em execuo.
35
Lionardo@base.com.br
grfico em seu interior. Se escolher Style do tipo "Graphical" o CommandButton aceitar figuras, e elas devem ser inseridas na propriedade Picture do objeto CommandButton
Em um formulrio novo acrescente dois botes de comando. Mude as propriedades deles da seguinte forma:
Propriedade
Explicao ttulo para o boto nomear o boto habilitar ESC habilitar ENTER
36
Controles Bsicos D dois clickes no boto Cancelar. Ir aparecer a janela de codificao para o boto Cancelar. Digite: Print Voc apertou a tecla ESC. Estando ainda na janela de codificao, leve o ponteiro do mouse at o topo desta janela onde esta o nome: Object. Na frente estar o nome do boto que estvamos trabalhando na codificao. Aperte o boto. Ir aparecer o nome dos objetos que temos: cmdCancelar, cmdOk, Form, e General.
Nesta caixa de combinao d um click no objeto cmdOK. Com isto ser criado automaticamente um evento Click para este objeto.
Com isto, criamos um evento para o boto OK e para o Boto cancelar. Execute agora a aplicao e aperte a tecla ENTER e depois a tecla ESC.
37
Lionardo@base.com.br
apertarmos o boto
2.1.3
Esse objeto um texto, no editvel, que usamos geralmente para rotular outros Objetos. A Finalidade bsica dele de colocar um texto na forma.
AutoSize: Com esta propriedade habilitada indicamos ao Controle para automaticamente dimensionar seu tamanho ao tamanho do texto do label. Note na figura que, quando o AutoSize foi passado para True, as marcas de seleo do label foi ajustado para o tamanho do texto label1. BackColor: Escolhe a cor de fundo que envolver o label. 38
Controles Bsicos BackStyle: Escolhe entre o fundo Transparente ou Opaco para o label. BorderStyle: Escolhe entre colocar uma moldura envolvendo o label ou no. Caption: A propriedade principal do label. Determina o texto que ser exibido dentro do Objeto. Enabled: Habilita ou desabilita o objeto. Quando esta em False fica com a cor de seu contedo acinzentada. Font: Escolhe a fonte de letra que ter o texto digitado na propriedade Caption. ForeColor: Escolhe a cor da fonte de letra Name: Nomeia o Objeto label. Como j foi dito importante que todos os objetos seja nomeado. A inicial do label lbl. Visible: Indica se o objeto ser visvel ou no para o usurio. WordWrap: Quando o AutoSize esta em true, no possvel expandir o texto digitado na propriedade Caption em outras linhas. Mas se passarmos essa propriedade WordWrap para True isto poder ser feito, bastando para isto dimensionarmos o label.
39
Lionardo@base.com.br
BackColor: Escolhe a cor de fundo da Caixa de Texto. Geralmente branco. BorderSytle: Tipo da borda: Fixa e simples, ou sem borda. Enabled: Estando False o objeto no estar habilitado para interagir com o usurio. Font: Escolhe a fonte de letra que ser mostrada dentro da caixa de texto. ForeColor: Escolhe a cor da fonte de letra. Locked: Estando em false trava qualquer digitao na caixa de texto MaxLength: Quantidade mxima de caracteres dentro da caixa de texto. MultiLine: Habilita a possibilidade de se digitar mais de uma linha na caixa de texto. Name: Nomeia o objeto TextBox. Geralmente com a inicial txt. Exemplo: Se formos usar essa caixa de texto para que o usurio digite o nome do paciente, poderamos abreviar assim: txtNomePaciente. PasswordChar: Se durante a digitao 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 digitao 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 usurio dentro da caixa de texto incorporado nesta propriedade.
40
Controles Bsicos Coloque 3 caixa de texto em nosso formulrio, de forma que a disposio das mesmas fiquem como na figura abaixo.
Usaremos a primeira caixa de texto para digitarmos o nome do paciente. A segunda para digitarmos o sexo dele (Masculino ou Feminino) e a terceira para ser digitado o nome do exame que ele vai fazer. Para tanto, vamos mudar algumas propriedades destas 3 caixas de texto. Propriedade Text1 Text2 Text3 Name Text MaxLength ForeColor TxtNome deixar vazio 30 Vermelho txtSexo deixar vazio 9 Preto TxtExame deixar vazio 15 Preto
Propriedade Name
Label1 lblNomePaciente
Label2 lblSexo
Label3 LblExame 41
Lionardo@base.com.br
Sexo True 3D
Pratique nesta janela e veja se o nome realmente esta com o limite de 30 caracteres.
Controles Bsicos Change: Ocorre sempre que o usurio altera o valor contido na caixa de texto. Click: Ocorre quando o usurio pressiona o boto esquerdo do mouse sobre a caixa de texto. DlbClick: Se o usurio apertar duas vezes o boto esquerdo do mouse sobre a caixa de texto KeyDown: Ocorre quando o usurio aperta uma tecla no teclado. KeyUp: Ocorre quando o usurio solta a tecla apertada. KeyPress: Ocorre quando uma tecla pressionada e solta. Como argumento possui uma varivel cujo contedo a tecla pressionada (cdigo correspondente na tabela ASCII). Cod. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 Cod. 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 Cod. 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 Cod. 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 43
Backspace
@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \
` a b c d e f g h i j k l m n o p q r s t u v w x y z { |
Lionardo@base.com.br
29 30 31
61 = 93 ] 125 62 > 94 ^ 126 63 ? 95 _ 127 Estes caracteres no so aceitos pelo Microsoft Windows.
} ~
MouseMove: Ocorre quando movemos o ponteiro do mouse sobre a caixa de texto. MouseDown: Ocorre quando o usurio aperta o boto do mouse (seja da direita ou da esquerda) sobre a caixa de texto. MouseUp: Ocorre quando o usurio solta o boto do mouse (seja da direita ou da esquerda) sobre a caixa de texto.,
Conhecendo os eventos e vamos comear a us-los. No que j criamos posicione o txtNome e d dois clickes janela assim:
sabendo para que eles servem formulrio frmLanamentoExames cursor sobre a caixa de texto com o mouse. Ir aparecer uma
O Objeto ativo ser o txtNome e o evento ser o Change. Para caixa de texto esse evento o que primeiro aparece. Vamos mud-lo passando para o evento KeyPress. Para fazer isto, leve o ponteiro do mouse at a caixa de combinao que esta o nome Change e clique no boto que
44
Controles Bsicos esta do lado direito da janela. Aparecer a lista de Eventos disponveis para a caixa de texto. Click sobre o nome KeyPress. Ele ir agora criar um outro procedimento de evento chamado Private Sub txtNome_KeyPress(KeyAscii As Integer). Vamos usar esse evento no objeto txtNome para no aceitar o usurio digitar nmeros nesta caixa de texto. A linha de comando ficar assim:
Private Sub txtNome_KeyPress(KeyAscii As Integer) if Keyascii >= vbKey0 and Keyascii <= vbKey9 then Keyascii = 0 endif EndSub
Pronto! Quando o usurio digitar um dgito numrico no teclado ele ser ignorado pela caixa de texto. Existem algumas expresses novas como KeyAscii, If, vbKey0 e vbKey9. Vamos falar melhor deles nos prximos 45
Lionardo@base.com.br
captulos. Por ora, para se ter um entendimento melhor do que ocorreu durante a execuo deste evento vamos explicar rapidamente essas novas expresses: KeyAscii : uma varivel criada pelo evento KeyPress cujo contedo ser o valor (na tabela ASCII) correspondente a tecla digitada. VbKey0 : Uma constante que simboliza o nmero Zero. vbKey9 : Uma constante que simboliza o nmero nove. If : Comando condicional. Significa Se. Ou seja, se a tecla digitado for maior ou igual a zero e tambm menor e igual a nove ento faa algo. Rode o programa e verifique que a caixa de texto j esta devidamente codificada para no aceitar nmeros. Para melhorarmos ainda mais nossa aplicao, vamos analisar o seguinte: No podemos deixar o usurio digitar o sexo do paciente antes de digitarmos o nome dele! Temos que fazer uma codificao que verifique se o usurio digitou o nome, e somente depois liberar a digitao do sexo. OK? Vamos l! Selecione o Objeto lblSexo e mude Enabled dele para False, e o Objeto tambm para False. a propriedade txtSexo.Enabled
Note que quando executarmos o programa o label Sexo estar na cor cinza e a caixa de texto abaixo no aceitar digitao. Ento vamos agora colocar uma codificao que verifique se na caixa de texto txtNome existe algo digitado. Se existir, libera a digitao do Sexo, se no existir continua sem liberao. D dois clickes com o mouse no Objeto txtNome e veja se o evento Change est ativo para ser configurado. Se no 46
Controles Bsicos tiver leve o mouse at a caixa de combinao com dos eventos e selecione a palavra Change. a lista
Como foi explicado acima, esse evento acionado sempre que o usurio altera um valor digitado na caixa de texto. Mas isto no 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 contedo. Com isto, conclumos que sempre que digitarmos algo ali (letra, nmero, barra de espao, delete, Backspace, etc.) o evento Change ser acionado. Digite aberta: o seguinte cdigo na janela de codificao
O programa ir policiar a caixa de texto txtNome. Se a sua propriedade Text (que contm o que o usurio 47
Lionardo@base.com.br
digitou), for igual a vazio (), ento as propriedades Enabled do lblSexo e do txtSexo sero desabilitadas, caso contrario ( Else ), essas propriedades sero habilitadas. Note que podemos mudar a propriedade de um Objeto tanto a nvel de codificao em tempo de execuo, como em tempo de projeto. Execute o programa, o digite seu nome na caixa de texto Nome do Paciente. Observe que quando voc comear a digitar automaticamente a caixa de texto Sexo ser liberada. Agora use a tecla Backspace para voltar a digitao e apagar o nome digitado. Veja que quando se apaga o ultimo caractere e a caixa de texto fica vazia as propriedades Enabled do Sexo so desabilitadas automaticamente.
Aumente o tamanho da caixa de texto na vertical, para darmos espaos para as novas linha que sero inseridas. Mude as propriedades: Propriedade Text1 Descrio MultiLine Text ScrollBars True Vazio 2 - Vertical Habilita mltiplas linhas Tira o texto Text1 Coloca barra de rolagem vertical
48
Controles Bsicos
Caption: O texto anexado ao Objeto CheckBox. Enabled: Habilita ou no esse Objeto. Estando desabilitado no aceitar que o usurio faa evento com a caixa de checagem. Font: Escolhe uma fonte de letra para o texto digitado no Caption Name: Nomeia o Objeto. A inicial abreviada para este tipo de controle chk. Value: Determina o estado o objeto: 0 - Unchecked, 1 - Checked e 2 - Grayed.
49
Lionardo@base.com.br
No exemplo Lanamento de Exames, Elimine a caixa de texto txtExames e o label lblExames. Em seu lugar coloque 4 caixas de checagem. Mude as seguintes propriedades: Propriedade Check1 Check2 Check3 Check4 Name
chkRaioX chkSangue chkGravidez chkEspermo grama
Caption
Raio X
Sangue
Gravidez
Espermogr ama
Pronto! Agora ficou mais fcil escolher o exame que o paciente quer fazer. Na codificao 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 critrio do usurio. Mas no nosso exemplo vai ser difcil um paciente entrar em nosso laboratrio e no fazer NENHUM exame. Se o nome dele esta sendo
50
Controles Bsicos processado no computador porque pelo menos um exame ele vai fazer. Depois vamos fazer uma rotina que verifica isto. Algumas outras alterao teremos que fazer tambm, como por exemplo no deixar o programa aceitar que um paciente do sexo masculino faa exame de Gravidez, ou do sexo feminino fazer Espermograma. Mas antes de trabalharmos nisto necessrio conhecermos mais um objeto importante.
51
Lionardo@base.com.br
Para nosso programa de Lanamento de Exames vamos trocar a caixa de edio onde o usurio digita o Sexo do paciente por dois boto de opo. Como s existe dois tipos de sexo e uma pessoa no pode ter mais de um sexo ( pelo menos teoricamente! ), nossa aplicao mais prtica se usarmos esse objeto. Apague o lblSexo e o txtSexo e coloque em seu lugar dois Controles OptionButton. Propriedade Name Caption Option1 optMasculino Masculino Option2 OptFeminino Feminino Os Botes de Opo quando so inseridos no formulrio automaticamente so conjugados, de maneira que quando selecionamos um o outro desmarcado. No importa quantos sejam.
Vamos agora ponderar alguns pontos: Se o usurio no digitar o nome do paciente primeiro, ele no podero escolher o sexo, e se no escolher o sexo ele no poder escolher a exame que o paciente far, pois o tipo de exame necessita do sexo do paciente, para evitar que algum do sexo masculino faa exame de gravidez. Ento para corrigir esses problemas, vamos primeiro passar todas as propriedades Enabled dos Objetos OptionBottum e CheckBox para False. Com isto, sempre que se entrarmos no formulrio pela primeira vez esses objetos estaro indisponvel para o usurio manipular at que ele cumpra algumas determinaes. Vamos agora liberar a escolha do Sexo depois que um nome tiver sido digitado na Caixa de Texto txtNome.
52
Controles Bsicos Chame a janela de Codificao e na rotina txtNome_Change() altere para ter as seguintes linhas de comando:
Rode o programa e teste para verificar se esta tudo correndo bem. Todas os objetos de escolha esto 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 usurio escolher um determinado sexo para o paciente seja liberado os exames correspondente. D dois clickes com o mouse no objeto optMasculino. A janela de codificao ser aberta e o evento Click j ter sido criado. Vamos ento habilitar os exames para esse Objeto:
53
Lionardo@base.com.br
Colocamos Enabled = True para os exames liberados para o objeto optMasculino e Enabled = False para os exames que no esto liberados. Faa a mesma coisa para o optFeminino agora.
Execute o programa. Esta funcionando perfeitamente. Tentamos tirar o mximo de possibilidades de erro que um usurio pode cometer.
Controles Bsicos Enabled: Determina se todos todos os objetos colocados no interior da moldura estar ou no disponvel para o usurio. Name: Nome dado ao objeto. A inicial abreviada fra. Cuidado para no colocar frm a abreviatura do Objeto Form.
Vamos fazer uma ultima alterao em nosso programa de Lanamento de Exames. Nossa interface est precisando de uns retoques, e para fazer esse incremento vamos colocar um objeto Frame envolvendo os OptionButton e os CheckBox.
Perceba que a aparncia de nosso programa melhorou muito agora. E ainda usamos a propriedade Caption do Frame para rotular as opes de escolha do sexo e do exame. Vale comentar que para que os objetos que estaro dentro do Frame seja realmente anexados a ele, necessrio que esses objetos sejam criados dentro dele. Assim, sempre que movermos a moldura, os Objetos acompanharam. Ento, para que no nosso exemplo as coisas funcionem com perfeio, devemos apagar os objetos OptionButton e CheckBox, inserir as duas molduras em seus respectivos lugares e somente depois criar (dentro do Frame) os objetos apagados.
55
Lionardo@base.com.br
EXERCCIOS PROPOSTOS
1 - Explique a finalidade dos Objetos: Form: CommandButton: Label: TextBox: CheckBox: OptionButton Frame:
2 - Explique:
3 - Quais as abreviaturas que usamos para os Objetos: Form: CommandButton: Label: TextBox: CheckBox OptionButton 56
Controles Bsicos Frame: 4 - Pela aparncia descreva que tipo de Borda possui os formulrios abaixo:
7 - Descreva as propriedades do objeto TextBox relacionadas abaixo: Font Locked Name Text
57
Lionardo@base.com.br
8 - O que um Evento?
10 - Em que situao podemos usar uma Caixa de Checagem e um Boto de Opo? Exemplifique.
11 - A propriedade Enabled existe em quase todos Objetos, e sua finalidade : ( ) Deixar o Objeto invisvel ( ) Mudar a cor do Objeto ( ) Fazer com que o Objeto no aceite interferncia do Usurio. 12 - Crie um novo formulrio que contenha as seguintes especificaes: Alguns pontos deste nosso simples programa tem que ser levado em considerao: Se for primeira compra o cliente pode comprar somente a vista. Se o valor da compra for maior que 200 reais ele poder comprar
58
Controles Bsicos com 60 dias. Logicamente que no campo valor no poder aparecer letras.
59
Lionardo@base.com.br
60
Controles Bsicos
3 SELECIONANDO ITENS
ListBox ComboBox
61
Lionardo@base.com.br
62
Selecionando Itens
Caixa de Lista um objeto onde pode-se adicionar ou remover vrios itens, e o usurio pode selecionar um ou vrios destes itens. Caixa de Lista Vazia com vrios nomes inseridos na propriedade List
Este tipo de objeto muito til para mostrarmos uma relao de nomes ou cdigos para se um (ou vrios) 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 comeando com 0 (zero) at na quantidade existente de itens. Exemplo: se temos 4 nomes dentro do ListBox, Maria, Jos, Cornlios, Pedro e Peter, ento 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.
Columns ajustado para 0. Columns ajustado para 1. Columns igual a 2. Os Os nomes ficam em 1 coluna Os nomes ficam e 1 coluna nomes ficam dispostos em de forma vertical. de forma horizontal. duas colunas de 63 forma
Lionardo@base.com.br
Enabled: Habilita ou no o ListBox para o usurio 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
List: o Local onde digitamos os itens que estaro dentro do ListBox. Os nomes digitados nesta propriedade em tempo de projeto so automaticamente inseridos dentro do ListBox, mas existe outro processo de se incluir dados no objeto em tempo de execuo.
MultiSelect: Quando esta propriedade esta habilitada significa que a caixa de lista aceitar mltiplas selees, ou seja, poder ser selecionado mais de um tem. As opes so 0 - None para seleo somente de 1 tem. 1 - Simple para seleo de vrios itens usando apenas o clicar do mouse ou barra de espao. 2 - Extended o padro do Windows para multiplas selees. Para selecionar mais de 1 item usa-se a combinao de tecla CTRL + Click do mouse ou barra de espao. Name: Nome que o Objeto ListBox ter. A abreviao padro lst. Sorted: Classifica os itens existente dentro do ListBox em ordem alfabtica ou numrica ascendente. Esta propriedade em tempo de execuo tem a finalidade de informar o estado que se encontra o Sorted.
Style: CheckBox
Style: Standard
Selecionando Itens CheckBox, onde os itens existentes no ListBox so acompanhados de um quadradinho do lado esquerdo para se fazer a seleo dos itens. Para multiplas selees esse tipo de ListBox mais intuitivo para o usurio.
Coloque um Objeto ListBox no formulrio, e d um nome para o objeto de lstNomes, e na propriedade List Digite os nomes contido na figura abaixo.
Execute o programa e veja como ficar a disposio dos nomes digitados dentro do Objeto. Note que podemos selecionar somente um nome. Vamos tentar selecionar vrios nomes. Habilite a propriedade MultiSelect com 2 - Extended. Rode o programa novamente e veja que agora vrios nomes podem ser selecionado. Vamos agora colocar esses nomes em 2 colunas. Para isto a propriedade Columns deve conter o valor 2. Mude o IntegralHeight para False para melhorar a aparncia. Em tempo de execuo voc ver o resultado. Mude a propriedade Sorted para True e todos os itens ficar na ordem alfabtica.
65
Lionardo@base.com.br
SelCount: Quando a propriedade MultiSelect esta ativada, possibilitando a seleo de vrios itens dentro da caixa de lista, o SelCount retorna a quantidade de itens que foi selecionado. Selected: Retorna True ou False sinalizando se algum item foi selecionado. necessrio informar o ndice correspondente. Exemplo: Selected(2): Se o item que possui o ndice 2 for selecionado retornar True, se qualquer outro for selecionado retornar False. Text: Retorna o texto do item selecionado. No necessita de ndice. List: Retorna o texto do item especificado no ndice. Exemplo: List(2) ir mostrar o texto existendo na lista referente ao ndice 2.
No exemplo que criamos acima, um ListBox com nomes inseridos nele, vamos fazer algumas mudanas. Acrescente mais 3 botes no formulrio. Propriedadades Caption Name Boto1 Quantidade cmdQuantidade Boto2 ndice Cmdndice Boto3 Text cmdText formulrio. A
Vamos agora codificar o programa para quando o usurio apertar o boto Quantidade aparecer a quantidade de 66
Selecionando Itens itens dentro da caixa de Lista. Quando apertar o boto ndice mostrar o ndice correspondente ao item selecionado. O boto Texto ir mostrar o texto selecionado dentro do ListBox. Veja os Cdigos a serem usados:
Note que as propriedades esto retornado valores que esto sendo inseridos no Objeto lblQuantidade e na sua propriedade Caption em tempo de execuo.
Lionardo@base.com.br
O Mtodo RemoveItem retira do ListBox o item selecionado, e o Clear limpa todo o Objeto.
Vamos criar um formulrio novo (Menu File/New Project). Dentro do formulrio inserir trs botes de comando, uma caixa de lista e uma caixa de texto.
Propriedadades Boto1 Boto2 Boto3
Caption Name
Propriedadades
Adicionar CmdAdicionar
Caixa de Lista
Remover cmdRemover
Caixa de Texto
Name Text
LstNomes
As propriedades do formulrio ser Relao de Nomes para o Caption e frmRelaoDeNomes para o Name. Veja ao lado como ficar a janela.
O programa funcionar da seguinte forma: Digita-se um nome na Caixa de Texto e ao teclar o boto Adicionar o contedo ser transferido para a Caixa de Lista. Quando quisermos remover algum item, selecionamos e apertamos o boto Remover. O boto Limpar Tudo remove todo o contedo do ListBox.
68
Selecionando Itens O mtodo AddItem requer na sua sintaxe o texto que ser adicionado ao ListBox. Chamamos ento o objeto txtNome e sua propriedade Text que contm o texto. O mtodo RemoveItem necessita do nmero do ndice que o item existente dentro ListBox possui. Para se obter este ndice usamos a propriedade ListIndex.
Execute o programa e digite alguns nomes, adicionando, removendo alguns e depois limpando tudo. Alguns problemas apareceram: Sempre que adicionamos algo o ultimo nome digitado na caixa de texto continua l. Do jeito que o programa esta ele aceita adicionarmos nomes em branco. Se apertarmos o boto Remover sem ter um nomes no ListBox selecionado ele retorna um erro de execuo, pois a propriedade ListIndex retorna o ndice do item selecionado. Ou seja, tem que haver uma seleo do item que se quer apagar. A tecla ENTER no aceita na confirmao dos nomes digitados. Nossa! todos. Quantos problemas. Mas vamos ento resolver
O Objeto txtNome tem sua propriedade Text adicionada ao lstNomes, e em seguida igualada a um contedo vazio. Resolvemos o primeiro problema. Rode o programa comprove isto! Agora temos que desabilitar o boto Adicionar e somente deix-lo habilitado quando o usurio digitar algo na caixa de texto (objeto txtNome). Sendo assim no corremos o risco de algo vazio ser inserido na caixa de lista.
69
Lionardo@base.com.br
Primeiro passo ser selecionarmos em tempo de projeto o Objeto cmdAdicionar. V na propriedade Enabled e passe para False. Crie agora um evento Change para a caixa de texto txtNome: Veja que na codificao verificamos se o txtNome esta vazio. Se tiver desabilita o boto Adicionar, e no tiver vazio habilita o boto. Usamos o Evento Change porque ele o responsvel pela verificao constante do que foi digitado na caixa de texto. Sempre que digitamos, alteramos ou apagamos algo numa caixa de texto o evento Change chamado. Note agora que se comearmos a digitar um nome qualquer na caixa de texto o boto aparece. Se apagarmos o contedo digitado, com delete ou backspace, o boto desabilitado. Para resolver o terceiro problema, teremos que primeiro somente aceitar o mtodo RemoveItem se houver um item selecionado. Se no houver ele no executa esse mtodo. Ento vamos a luta! Em tempo de projeto mude a propriedade Enabled do boto Remover para False. Iremos habilita-lo somente quando um item for selecionado usando o evento click do objeto lstNomes. No evento Click do objeto lstNomes solicitado ao programa para habilitar o boto remover. Depois, quando o usurio aperto o boto e remover o item pretendido, colocamos o boto remover novamente desabilitado. 70
Selecionando Itens Rode o programa e veja o que acontece. Para o usurio que esta digitando desconfortaste ter que digitar um nome e ter que usar o mouse (tirar a mo do teclado) para inserir um nome e depois clicar novamente na caixa de texto para digitar outro nome. Para resolver esse problema simples. Selecione o boto Adicionar e mude a propriedade Default dele para True. Assim sempre que o usurio digitar um nome e teclar ENTER ser como se tivesse apertado o boto Adicionar. Agora o programa est pronto! Pode vend-lo!
Este objeto na verdade uma combinao da caixa de texto e da caixa de lista. Uma diferena que este Objeto possui em relao a caixa de lista que ele no aceita multiseleo. Somente acessado um item de cada vez. Objeto ComboBox com sua caixa de Lista recolhida. Ela somente acessada ao darmos um click com o mouse na seta para baixo do lado direito. Da forma em que esta podemos digitar na caixa de texto apresentada. ComboBox com a caixa de lista expandida. Pode-se escolher um nome qualquer na lista que ele ser automaticamente levado at a caixa de texto.
Uma das grandes vantagens da Caixa de Combinao a economia de espaos na tela. Podemos colocar uma relao enorme de itens dentro de uma caixa de combinao que ela ser apresentada somente com uma caixa de texto, e a relao aparece somente se o usurio necessitar, digitando assim na seta para baixo do Objeto. 71
Lionardo@base.com.br
0 - Dropdown Combo: a opo padro do Objeto. Aqui pode-se digitar qualquer nome na rea de digitao, clicar a seta para baixo e escolher qualquer um dos itens que ele ser automaticamente inserido na rea de texto. 1 - Simple Combo: Caixa de Combinao simples. Aparece em destaque a rea de edio de texto, onde podemos digitar algum item; ou selecionar qualquer um que esteja na caixa de lista, que ser inserido na rea de texto. O boto em forma de seta para baixo no existe neste tipo de ComboBox. Se aumentarmos o tamanho da Caixa de Combinao na vertical, aparecer a lista e esta ficar fixa. Caso deixamos ela somente do tamanho da rea de texto, ento a lista no aparecer, e se quisermos saber quais nomes existe teremos que apertar no teclado a seta para baixo ou para cima, para que os itens existentes dentro da Lista apaream.
2 - Dropdown List: Neste tipo de Caixa de Combinao o usurio pode somente escolher um item relacionado na lista, no podendo digitar nada. A rea de texto no aceitar digitao. Text: Nesta propriedade digita-se um texto que ficar, como padro, fixo na rea de texto na caixa de combinao. Geralmente deixa-se em branco. Podemos usar essa propriedade tambm, em tempo de execuo, para saber qual texto o usurio digitou ou selecionou. 72
Selecionando Itens
3.2.2 Os Mtodos
Usamos para o ComboBox os mesmos mtodos usados para o ListBox: AddItem, RemoveItem e Clear. O modo de manipul-los na janela de codificao tambm o mesmo.
Crie um formulrio novo e coloque nele um ComboBox e um label conforme figura abaixo: nomeie a Caixa de Combinao para cboNomes e deixe a propriedade Text vazia. O label nomei-o para lblNomes, o Caption deixe vazio e o AutoSize como True. Crie forma: um evento Load para o formulrio da seguinte
O Evento Form_Load do formulrio o primeiro que lido pelo programa assim que a janela aparece na tela em tempo de execuo. Tudo que for codificado para este evento ser, ento, executado antes da leitura pelo programa de qualquer objeto inserido no formulrio. Defina a propriedade Style do cboNomes como 2. Assim o usurio no poder digitar nenhum nome, somente escolher na lista. Crie um evento Click para o cboNomes:
73
Lionardo@base.com.br
Estamos solicitando ao programa para quando o usurio der um click na lista de nomes aparecer a mensagem que ele escolheu determinado nome. O sinal de & que aparece na codificao o responsvel pela concatenao (juno, emenda)da expresso Nome escolhido com o contedo de cboNomes.Text.
74
Selecionando Itens
EXERCCIOS PROPOSTOS
1 - Descreva as seguintes propriedades do ListBox: List: Sorted: MultiSelect: Selected: ListCount ListIndex:
3 - Marque Verdadeiro ou Falso para as afirmaes: a) As propriedades existentes em tempo de projeto no possvel us-las em tempo de execuo. ( ) b) A propriedade NewIndex retorna o ultimo ndice entrado na caixa de Lista. ( ) c) A propriedade Name e Caption possuem o mesmo valor. ( ) 4 - Explique os mtodos: AddItem: RemoveItem: Clear:
75
Lionardo@base.com.br
8 - Desenvolva um cadastro de mercadoria, onde o usurio digitar a descrio das mesmas (TextBox) e elas sero includas dentro de uma lista (ListBox). Crie os botes Adicionar e Remover. Na mesma janela, quando o usurio selecionar qualquer das mercadorias dentro da Caixa de Lista, dando duplo click, a descrio da mercadorias ser mostrada num label. Veja a disposio da janela:
76
Selecionando Itens
4 O FOCO
77
Lionardo@base.com.br
78
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 usurio. 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 mouse em outro objeto o foco transferido para outro objeto, ou seja, um ganha o foco e outro perde o foco. A seqncia que a tecla TAB usa para dar foco aos objetos no formulrio a ordem que eles foram inseridos no formulrio. Se voc inseri um boto de comando e depois insere uma caixa de texto, ento quando executarmos o programa o primeiro a receber o foco ser o boto de comando. Quando apertar a tecla TAB o foco ser ento transferido para a caixa de texto. Podemos tambm passar o foco para um determinado objeto usando o mouse.
79
Lionardo@base.com.br
Neste exemplo, quando o programa executado e apertamos a tecla TAB o foco passado do boto de comando para a caixa de texto e depois para a caixa de checagem. Mas se quisermos alterar esta ordem s mudar o numero existente na propriedade TabIndex. Vamos passar a ordem de tabulao destes objetos para: Boto de comando, caixa de checagem e depois caixa de texto. Para fazer isto basta alterar a propriedade da caixa de texto para 1. A propriedade TabStop possui a finalidade de fazer a tecla Tab ignorar o controle na tabulao. Ou seja, o objeto que tiver TabStop = False, no receber o foco via teclado, somente se o usurio clicar com o mouse no objeto.
Quando o objeto esta com a propriedade Enabled = False ou Visible = False, o foco no passa por eles, nem via teclado nem via mouse. O Objeto Label no possui foco, pois ele no interage com o usurio.
4.1.2
A Tecla Enter
O Windows possui a tecla TAB para mudar o posicionamento do Foco, porm a grande massa de usurios que sempre acostumou usar a tecla ENTER para passar o foco de um objeto para outro no se adaptou ainda. Se voc quizer fazer um programa que habilite a funcionalidade da tecla ENTER para mudana de foco, aqui vai a dica:
80
Selecionando Itens
Crie um formulrio e acrescente nele algumas caixas de texto como no exemplo a seguir:
A propriedade TabIndex desses objetos devem estar na ordem crescente. O foco ira acompanhar exatamente o que for inserido nesta propriedade. Se colocar o boto Fechar com o TabIndex 1, ele sera o segundo a receber o foco. Defina a verdadeiro. propriedade KeyPreview do formulrio para
Com isto, o programa dara prioridade aos eventos de teclado do formulrio como um todo antes de verificar os eventos de teclado de cada objeto inserido no form.
81
Lionardo@base.com.br
Uma vez feito isto, precisamos agora criar o evento de teclado para o formulario. Entre na janela de codificao e chame o evento KeyPress do Form. Repetindo: Do Form!
Os codigos digitados neste evento sera avaliado a cada pressionamento de tecla. Criamos ento a seguinte codificao:
O Programa verifica se foi pressionado a tecla ENTER que referenciada aqui pela constante VbKeyReturn. Se foi pressionado chamado a funo SendKeys que fora o pressionamento da tecla TAB, ou seja, seria como se o programa dissesse para a mquina: Se o usurio apertar a tecla ENTER troque pela tecla TAB. Por fim usamos "KeyAscii = 0" para cancelar o Beep que emitido sempre que a tecla ENTER pressionado.
Selecionando Itens NomeDoObjeto: Um objeto Form que representa um formulrio, ou um objeto Control que representa um controle no formulrio ou folha de dados ativo Use o mtodo SetFocus quando voc quiser que um determinado campo ou controle tenha o foco, para que toda a entrada do usurio 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 no tem o foco. Por exemplo, voc no pode definir as propriedades Visible ou Locked de um controle como False quando esse controle tem o foco. Voc no 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, porm, mover o foco para um controle se sua propriedade Locked estiver definida como True.
Lionardo@base.com.br
tambm pode reverter ou alterar as condies que voc define no procedimento de evento GotFocus do objeto. Outros usos para os procedimentos de evento LostFocus e GotFocus so ativar, desativar, ocultar e exibir outros objetos.
84
Selecionando Itens
Crie um novo projeto e coloque no formulrio os objetos relacionados abaixo: Formulrio: Caption:Recursos Humanos Name:frmRecursosHuma nos 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
Funcionrio
Label 2: Caption:Cargo Label 3: Caption: Nome do Cnjuge Enabled: False Name: lblNomeConjuge Frame 1: Caption:Estado Civil Frame 2: Caption: Setor
Os botes de opo OptionButton para estado civil, d o nome de optEstadoCivil para todas as trs opes. Com isto 85
Lionardo@base.com.br
o Visual Basic perguntar se voc esta criando um array de controle, e pode responder que sim. Fazendo isto, criamos uma matriz de nome optEstadoCivil com 3 elementos, sendo que o elemento 1 representa a opo casado, elemento 2 representa opo Solteiro e elemento 3 opo Viuvo. A ordem de tabulao a seqncia dos objetos dispostos no formulrio. Os dois boto de comando deve ter o TabStop = False, pois no sero includos na tabulao. A caixa de texto txtNomeConjuge somente poder ser habilitada se funcionrio for casado. Para isto a para o objeto optEstadoCivil deve ser esta desabilitada, e o estado civil do seguinte codificao feito:
Note que usamos o SetFocus para, no caso do usurio escolher a opo Casado, o foco ir para a caixa de texto txtNomeConjuge. Para entender melhor esse evento, veja que o Visual Basic criou automaticamente um argumento chamado Index do tipo integer. O contedo deste argumento o nmero do ndice correspondente a opo da matriz optEstadoCivil. Vamos criar um evento LostFocus para txtNomeConjuge:
86
Selecionando Itens
Este evento acionado sempre que o objeto perde o foco, ou seja, codificamos para no momento que tiver perdendo o foco verificar se o nome do cnjuge foi preenchido. Se no foi da uma mensagem avisando que obrigatrio o preenchimento e retorna o foco para a caixa de texto para que o nome seja ento digitado. Rode o programa e veja o resultado. Colocamos o mtodo SetFocus dentro de um evento LostFocus para demostrar sua utilizao, mas esta uma prtica no recomendada, pois imagine se voc clica na opo casado por engano, e quer voltar para a opo solteiro (que seria o correto). O programa no deixaria, pois exigiria a digitao do nome do cnjuge.
87
Lionardo@base.com.br
Sempre que possvel use as mesmas teclas de acesso em todo seu programa. Se numa janela voc tem o boto Cancelar com o mnemnico na letra n, ento sempre que este boto aparecer em outras janelas tente repetir a tecla de acesso usada. Outra dica: No use tecla de acesso para opes perigosas, como por exemplo um boto Apaga Tudo. Se colocarmos uma tecla de acesso ALT+P nele corremos o risco de do usurio apertar esta combinao por engano e limpar tudo. Estas opes delicadas sempre bom obrigar o usurio a usar o mouse ou a tecla TAB para ele ter certeza do que esta fazendo.
anterior,
vamos
colocar
teclas
de
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 prximo, que no nosso exemplo so as caixas de texto, necessrio que a ordem do TabIndex esteja rigorosamente crescente.
88
5 CONTROLES ESPECIAIS
MaskEdBox CommonDialog
Lionardo@base.com.br
Alguns controles do Visual Basic necessitam de uma explicao mais profunda devida a sua grande utilidade dentro da linguagem de programao. Habitualmente estes controles so pouco tratados em literaturas sobre o Visual Basic, e devido a isto vamos aprofundar mais sobre eles aqui.
5.1
MASKEDBOX
Este objeto semelhante a uma caixa de texto, entretanto ele possui alguns recursos adicionais, como a possibilidade de colocar uma mscara para o texto que ir ser digitado e validar a digitao automaticamente. Vejas as principais propriedades: AllowPrompt : Determina se o caractere informado como prompt vlido durante a digitao. AutoTab : Determina se quando o usurio terminar de preencher a mascara do objeto o foco automaticamente passado para o objeto seguinte, sem necessidade do usurio apertar TAB ou o mouse. ClipMode : Determina se, diante de um evento de copiar ou recortar dados do objeto Maskedit para a rea de transferncia, devem ser enviados os dados digitados com os caracteres que compem a mscara ou no.
* ClipText : Retorna o texto digitado no objeto sem os caracteres que compem a mscara.
90
Selecionando Itens Format : Determina o formato que os dados sero exibidos. Seque os mesmos padres estabelecidos para a funo Format (veja no captulo Funes Auxiliares) Use a propriedade Format para exibir dados em um formato consistente, ou seja, os dados sero exibidos neste formato, mesmo que o usurio digite os dados diferentemente do formato. Por exemplo, se voc definir a propriedade Format para dd/mmm/yyyy, todas as datas digitadas sero exibidas no formato 18/Set/1995. Se o usurio digitar a data como 18/09/95 (ou qualquer outro formato de data vlido), o Visual Basic converter a exibio para o formato estabelecido, que dia / ms-por-extenso-abreviado / ano-com-4-digitos. A propriedade Format afeta apenas a maneira como um valor exibido e no como ele armazenado. Da mesma forma, um formato de exibio no aplicado at que o usurio termine a digitao e o controle perca o foco. Nada exibido no campo para sugerir ou controlar o formato no qual os dados so inseridos. Se voc precisar controlar a maneira como os dados so digitados, use uma mscara de entrada alm de ou ao invs de um formato de exibio de dados. Se voc quiser que os dados sejam exibidos exatamente como foram inseridos, no defina a propriedade Format. * FormattedText : Retorna o texto digitado, incluindo os caracteres que compem a mscara. Mask : Mscara 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 exibio literais no campo com espaos em branco a serem preenchidos. Por exemplo, se todos os nmeros de telefones que inserir em um campo tiverem o mesmo formato, voc poder criar uma mscara de entrada: (###) ###-#### (___) ___ -____ (062) 621-3862
Uma mscara de entrada garante que os dados se ajustem ao formato definido e voc poder especificar os tipos de valores que podero ser inseridos em cada espao em branco. Por exemplo, a mscara de entrada anterior solicita que todas as entradas contenham exatamente os dgitos necessrios para completar um cdigo de rea e nmero de telefone, e que somente dgitos possam ser inseridos em cada espao em branco. Voc pode definir uma mscara de entrada usando os seguintes caracteres. 91
Lionardo@base.com.br
0 9 #
L ? A a & C , . : ; - /
< > \
Dgito (de 0 a 9, entrada requerida, sinais de mais (+) e menos (-) no permitidos). Dgito ou espao (entrada no requerida, sinais de (+) e menos (-) no permitidos). Dgito ou espao (entrada no requerida, os espaos so exibidos como vazios enquanto os dados so editados, mas so removidos quando perde o foco, sinais de mais e menos permitidos). Letra (de A a Z, entrada requerida). Letra (de A a Z, entrada opcional). Letra ou dgito (entrada requerida). Letra ou dgito (entrada opcional). Qualquer caractere ou espao (entrada requerida). Qualquer caractere ou um espao (entrada opcional). Marcador de posio decimal e separadores de milhares, de data e de hora. (O caractere realmente usado depende das configuraes do Painel de Controle do Windows). Faz com que todos os caracteres sejam convertidos para minsculos. Faz com que todos os caracteres sejam convertidos para maisculos. Faz com que o caractere seguinte seja exibido literalmente (por exemplo, \A exibido simplesmente como A).
Quando voc define uma mscara de entrada e a propriedade Format para o mesmo objeto, a propriedade Format tem precedncia quando os dados so exibidos. Isso significa que mesmo voc tendo salvo uma mscara de entrada, ela ignorada quando os dados so formatados. O dado original como foi digitado no alterado; a propriedade Format s afeta a maneira como os dados so exibidos. MaxLength : Determina a quantidade mxima de caracteres que o MaskEdBox pode ter. Name: Nomeia o objeto. Geralmente inicia o nome com msk PromptChar : Escolhe o caractere padro que ser exibido simbolizando o estado vazio. Por default possui o caractere _, e aconselho a substituir pelo caractere de espao. Esta propriedade no aceita vazio. PromptInclude : Determina se o caractere inserido na propriedade PromptChar ser includo na propriedade Text. * Text : Contm o texto digitado pelo usurio no objeto. Evento ValidationError : Este evento ocorre sempre que o usurio digita alguma entrada que no corresponde a mscara estabelecida.
92
Selecionando Itens
e 3 labels:
Nomeie o maskedit para mskCGC e coloque altere a propriedade Mask para ##.###.###/###-##. Rode o programa e veja o resultado. Vamos ver agora como algumas propriedades recebem o contedo digitado. Abra a janela de codificao e digite:
Cada propriedade recebe o contedo de uma maneira. Quando precisar armazenar ou apresentar esse contedo s escolher a forma que necessitar. Perceba que os pontos e a barra esta fixa, mas aparece um inconveniente sinal de _. Para retir-lo mude a propriedade PromptChat para (uma barra de espao). Agora sim, aparece somente nossa formatao. Vamos agora criar um evento ValidationError para quando o usurio digitar alguma tecla invlida o Visual Basic dar um alerta:
93
Lionardo@base.com.br
Numa mscara onde se exige a digitao de nmeros, se digitar uma letra do alfabeto ou tentar digitar mais digitos que a mascara suporta, a mensagem de advertncia ir aparecer.
5.2 COMMONDIALOG
O Visual Basic traz algumas caixas de dilogos prontas para Abrir arquivo, Salvar, Imprimir, escolher Cor, ou escolher fontes de letra. Sua utilizao simples e basta inserirmos o objeto CommonDialog no formulrio para ativarmos os dilogos. Na codificao do programa usamos a propriedade Action para o Visual Basic abrir o dilogo pretendido: * Action : Determina o tipo de dilogo que ser exibido: 0 Nenhum dilogo. 1 Mostra caixa de dilogo Abrir Arquivo 2 Mostra caixa de dilogo Salvar Arquivo 3 Mostra caixa de dilogo Escolher Cor 4 Mostra caixa de dilogo Escolher Fonte de Letra 5 Mostra caixa de dilogo de Impresso. 6 Executa o WINHELP.EXE. As principais propriedades deste objeto podem ser acessadas selecionando (Custom) ou clicando no boto direito do mouse e selecionando Propriedades no menu:
94
Selecionando Itens
DialogTitle: Determina o texto que ir aparecer na barra de ttulo. FileName: Nome e Caminho padro para um determinado arquivo. InitDir: Diretrio padro onde sempre ser iniciado o dilogo Filter: Especifica os tipos de arquivos que podero ser selecionados. Veja a regra de uso desta propriedade: Descrio | Tipo de arquivo | Primeiro usamos um texto descritivo para o arquivo que ser selecionado. Depois uma barra vertical (|), e a extenso que este arquivo usa e finaliza com outra barra. Textos (*.txt) | *.txt | Documentos (*.Doc) | Figuras (*.bmp,*.pcx) | *.bmp;*.ico | Colocando desta forma veja como ficar a caixa de dilogo:
95
Lionardo@base.com.br
Color: Especifica a cor selecionada no dilogo. Essa propriedade serve no s para capturar a cor escolhida como para levar para a janela Color a cor em uso.
96
Selecionando Itens
FontName: Nome da fonte corrente, usado no momento em que a janela de escolha de fonte foi chamada. Tambm informa qual o nome da nova fonte escolhida. FontSize: Determina o tamanho da fonte corrente e o novo tamanho escolhido. Min e Max: Tamanho mnimo e mximo que um usurio pode escolher para uma determinada fonte de letra. Flags: Determina algumas opes para a caixa de dlogo. Coloque 1. Style: Determina como ser o tipo da fonte de letra.
Lionardo@base.com.br
Copies: Determina a quantidade de cpias padro para serem impressas. FromPage: Pgina inicial a ser impressa. ToPage: Pgina final a ser impressa. Min: Limite mnimo de um intervalo de impresso Max: Limite mximo de intervalo de impresso. PrinterDefault: Determina se o usurio poder alterar a impressora padro do Windows.
Mtodos Aplicveis ao Controle: Podemos usar mtodos para exibir as caixas de dilogo. NomeDoObjeto.ShowColor Exibe janela para escolha de cores. NomeDoObjeto.ShowFont Exibe janela para escolha de fonte de letra. 98
Selecionando Itens NomeDoObjeto.ShowOpen arquivo. NomeDoObjeto.ShowSave arquivo. NomeDoObjeto.ShowPrinter impresso. Exibe janela com opes de Exibe janela com opes para salvar Exibe janela com opes de abrir
99
Lionardo@base.com.br
Com isto o usurio 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 forar o Visual Basic a ler somente as fontes de tela. Consulte o Help para ver os outros Flags possveis.
100
Selecionando Itens
6 MENUS
101
Lionardo@base.com.br
102
Selecionando Itens
6.1 MENUS
A maioria das aplicaes possuem menus para facilitar o usurio na localizao de todas as janelas que compem um programa. Para criar menus, usamos o menu TOOLS opo Menu Editor. Sempre que criarmos menu temos que seguir algumas regras como colocar acesso Mnemnico em todos os itens e seguir um padro, como, pr exemplo, o menu Arquivo colocar o sublinhado na letra A, colocar ... quando este menu abre uma janela de dilogo, estabelecer uma Tecla de Atalho para as principais opes do menu e colocar um trao de separao para separar sees dentro de um mesmo menu, como pr exemplo, no menu ao lado, usou este recurso para separar algumas opes.
Lionardo@base.com.br
Caption : Nesta propriedade definimos o titulo do item que ir aparecer no menu. Nesta propriedade prefixamos um letra com o smbolo & para que o Visual Basic destaque a letra com sublinhado. Se for um item da barra de menus, ao teclarmos ALT e a letra destacada, o menu desse item ser aberto automaticamente. Se for um item de uma menu j aberto, basta acionarmos somente a letra destacada para executarmos a funo vinculada ao mesmo. Name : Usamos esta propriedade para definirmos o identificador para o item. Nomeamos cada item de um menu para podemos manipul-los atravs de codificaa. Para menus usamos abreviao mnu Index : Permite criar uma matriz para identificar os itens do menu. Para que a matriz seja estabelecida o name deve ser igual para os que vo compor a matriz. ShortCut : Determinamos uma combinao de tecla para que o menu seja acessado de forma mais rpida. Quando definimos tecla de atalho para um item do menu, a rotina anexada chamada independente do local onde o foco esteja. WindowList : Quando esta propriedade esta habilitada, numa aplicao com vrias janelas, o Visual Basic cria uma lista das ultimas janelas que foram acessadas. Checked : Sempre que o usurio clica no item que possui esta propriedade habitada para True o Visual Basic coloca um sinal de marcado ao lado do nome. Se clicar novamente esta marca retirada. Usamos esta propriedade quando queremos mostrar para o usurio o estado Ligado ou Desligado de algum item do menu. Enabled: Habilita ou no 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 invisvel para o usurio at que determinada condio seja estabelecida, usamos esta propriedade. Usamos os botes de setas para Baixo de para Cima para movermos um item de lugar depois de criado. O boto seta para Direita transforma o item selecionado em submenu item imediatamente acima. O boto seta para esquerda volta o item um nvel. O boto Next o default, ou seja, ele acionado sempre que digitamos ENTER. Ele passa para o prximo item de menu a ser digitado ou na seqncia. Insert usado para inserir um item de menu entre outros j criados e Delete apaga o item selecionado.
104
Selecionando Itens Num projeto novo vamos criar um menu para um programa de controle de estoque. Vamos primeiramente definir as opes mestre que vo ficar no topo do menu.
Para criarmos estes itens basta abrirmos a janela de criao de menu e fazer os lanamentos conforme estabelecido abaixo:
Pronto. Execute o programa e veja o menu j criado automaticamente. Mas logicamente precisamos agora criar subitens em cada uma dessas opes. Selecione &Lanamento e aperte a tecla Insert e depois o boto seta para a direita. Fazendo estaremos criando subitens para o item Cadastro. Vamos criar as opes Mercadoria e Fornecedor. Note que quando apertamos ENTER para o prximo ele no insere um novo item. Temos que repetir a operao Insert e Seta para Direita.
105
Lionardo@base.com.br
Agora repita o processo para criar subitens para Lanamento de nomes Entrada e outro Sada e coloque uma tecla de atalho para cada um conforme modelo:
106
Selecionando Itens
Criar um menu simples, e o nico evento que existe para os menus o Click que exatamente igual ao evento Click usado para CommandButton. Se em tempo de projeto dermos um click num item de menu o Visual Basic abre a janela de codificao para digitarmos alguma rotina de programao para o menu. Afinal, um menu no somente enfeite. Cada item seu teve efetuar um determinado evento. Vamos criar um evento Click para as opo Entrada Saida bastante simples: e
107
Lionardo@base.com.br
Execute o programa e veja que clicando nas opes com o mouse ou apertando as teclas de atalho correspondentes o MsgBox acionado. Vamos agora voltar ao Editor de Menu e na opo Cadastro inclua no final o item Sair. Vamos colocar um item Separador para esteticamente ficar mais apresentvel. Este item colocando inserindo o caractere - no caption.
108
Selecionando Itens
Lionardo@base.com.br
Shift : retorna um nmero inteiro que informa qual tecla estava pressionada no momento em que algum boto do mouse tambm foi pressionado. 1 SHIFT pressionado. vbShiftMask 2 CTRL pressionado. vbCtrlMask 4 ALT pressionado vbAltMask X : Coordenada para linha Y : Coordenada para Coluna
Na aplicao anterior coloque no formulrio um CommandButton e crie um evento MouseUp para ele com a seguinte codificao:
Como no especificamos as coordenadas, como padro o Visual Basic estabelece a posio atual do mouse. Note que pedimos para o menu mnuCadastro ser carregado sempre que apertamos o boto direito do mouse sobre o objeto Command1. Se chamarmos este evento sobre o formulrio ou qualquer outro objeto nada acontecer.
110
Selecionando Itens
7 VARIVEIS E MATRIZES
111
Lionardo@base.com.br
112
Variveis e Matrizes
Lionardo@base.com.br
O comando DIM usado para declararmos para o programa a existncia de uma varivel e o tipo que ela . Este comando obrigatrio e podemos declarar as variveis no momento em que estamos necessitando delas, j em uso. Exemplo: Function CalculaFormula() x = 10 y = 13 CalculaFormula = x*y+30 End Function Este exemplo bem simples somente para mostrar que usamos duas varivels chamadas x e y e no as declaramos. Precisamos delas e usamos. Caso fosse usar o comando Dim, esta mesma funo ficaria assim: Function CalculaFormula() Dim x As Integer Dim y As Integer x = 10 y = 13 CalculaFormula = x*y+30 End Function A expresso Integer significa tipo de varivel numrica que poder aceitar somente nmeros inteiros. Veremos melhor esses tipos adiante. Este mtodo extremamente til, pois imagine um programa onde existe uma imensa quantidade de variveis. Se todas foram previamente declaradas saberemos de antemo os nomes dela e para que servem. Podemos forar o Visual Basic a aceitar em nosso programa somente variveis que foram declaradas. Para tanto temos que acessar o TOOLS no menu principal, opo OPTIONS:
114
Variveis e Matrizes No menu options, janela Environment, habilite a opo Require Variable Declaration (Requer Varivel Declarada). Assim sempre que usar uma varivel que no foi declarada pelo comando Dim e no tem seu tipo definido o Visual Basic apresentar uma janela de alerta. Faa isto agora! Usando isto, o Visual Basic ir exigir a declarao das variveis, e no corremos o risco de, quando digitarmos o nome de alguma varivel errada, ele aceitar. Exemplo: Criamos uma varivel de nome: ClienteCadastrado. E em algum canto de nossa codificao digitamos: ClienteCadastado. Faltou a letra r. Se a opo Require Variable Declaration estiver habilitada o Visual Basic nos avisar que este nome no existe como varivel. Caso contrrio, o Visual Basic ir imagin-la como uma nova varivel e aceitar o erro. No corra risco!
Descrio
Numrico Inteiro Numrico Inteiro Numrico Inteiro Numrico real Numrico real
Abrangncia
-32.768 a 32.767 -2.147.483.648 a 2.147.483.648 0 a 255 -3,402823E38 a -1,401298E-45 1,401298E-45 a 3,402823E38 -1,79769313486232E308 a 4,94065645841247E324 4,94065645841247E-324 a 1,79769313486232E308 -922.337.203.685.477,5808 a 922.337.203.685.477,5807 2.147.483.648 de caracteres nos sistemas 32 bits 65.536 de caracteres nos sistemas 16 bits entre 01/01/100 a 31/12/9999 True (verdadeiro) False (falso)
Currency String
Date Boolean
Data e Hora
115
Lionardo@base.com.br
Object Variant
Variveis e Matrizes Se usssemos neste exemplo 12 & 13 resultaria em 1213 apesar da expresso 13 ser numrica. Quando criamos uma varivel do tipo String podemos delimitar previamente o tamanho que ela ter. Veja a sintaxe: Dim NomeEscola as String * 30 Criamos uma varivel de nome NomeEscola do tipo String (texto) e que ter no mximo 30 caracteres. Se colocarmos mais que isto em seu contedo o excedente ser ignorado. Se colocarmos menos que isto ser preenchido com espaos em branco.
Lionardo@base.com.br
a - 3 = #12/07/96# ( uma data menos um valor numrico subtrai a quantidade de dias na data.
7.1.9 Null
Quando o contedo da varivel um dado invlido ela retorna a palavra-chave Null.
Variveis e Matrizes NomeTeste = Fechar End Sub Private Sub Command2_Click() Command2.Caption = NomeTeste End Sub Repare, a varivel NomeTeste foi criada dentro da rotina Private Sub Command1 e na outra rotina Private Sub Command2 fazemos referencia a ela. Como ela foi criada dentro da Private Sub Command1 ela tem validade somente l. Este exemplo nosso retornar um erro, pois NomeTeste no existe para Private Sub Command2. Entretanto, se queremos que uma varivel tenha uma abrangncia em todas as rotinas criadas dentro do formulrio, ento na janela de cdigo do formulrio na parte superior mude o Object para General e o Proc para declarations). As variveis que forem criadas ali valer para todas as rotinas criadas para o formulrio e seus objetos anexados a ele.
Exemplo: Option Explicit Dim teste As String Private Sub Command1_Click() teste = "Testando a Variavel" Print teste End Sub Veja que a varivel teste foi criada fora da rotina Private Sub, mas possui abrangncia dentro dela. Se criarmos um outro formulrio e pedirmos para imprimir a varivel teste ir ocasionar um erro, pois a validade desta varivel somente dentro do formulrio em que ela foi criada. Caso precisamos de uma varivel de carter publico, que tenha validade Global, em todos os formulrios e rotinas de nossa aplicao, ser necessrio inserir um mdulo (Menu Insert opo Module) e dentro dele criar a varivel com o comando PUBLIC no lugar de DIM. Veja exemplo: Public Teste as String 119
Lionardo@base.com.br
Resumindo: Veja ento as formas de se declarar uma varivel: Varivel pblica todo o programa: podemos declarar uma varivel pblica, especificando-a com o comando Public na seo Declarations de qualquer mdulo. Varivel pblica ao mdulo: atravs do comando de declarao Dim na seo Declarations do mdulo desejado, especificamos que uma varivel ser pblica apenas ao mdulo onde fora declarada. varivel local rotina (Sub ou Function): declarando uma varivel com o comando Dim dentro de qualquer procedimento Sub ou Function a mesma ser reconhecida apenas pelo procedimento.
Crie um novo projeto e coloque nele um boto de comando e dois Labels. No esquea de habilitar no Menu Tools/Options a opo Require Variable Declaration. Codifique o boto da seguinte forma: Segundo Label. Deixar Caption Vazio e Ligar o AutoSize. Nome: lblTreino
Vamos agora codificar o boto. D dois clickes nele e digite os seguinte comandos:
120
Variveis e Matrizes
Foi criado uma varivel de nome Teste, e seu contedo Modelo Informtica. Assim, sempre que fizermos referencia a Teste ir aparecer o valor contido nela.
Execute o programa e aperte o boto. Onde estava o Label lblTreino ir aparecer o contedo da varivel. Como criamos a varivel dentro da rotina Private Sub cmdTesteVariavel_Click ela ter validade somente ali dentro. Para comprovar isto, crie outro boto:
Nesta codificao do segundo boto apenas mandamos inserir o contedo da varivel Teste para o Label
Rode o programa e aperte o segundo boto. Ir aparecer uma mensagem de erro alertando que a varivel Teste no existe: 121
Lionardo@base.com.br
Agora apague a linha Dim Teste as String. V at o Object (Caixa de Combinao na parte superior), chame a opo General, e digite: Colocando o comando Dim no object General as todas variveis criadas ali tem abrangncia em toda a janela de codificao do formulrio (todas as rotinas existentes).
Rode o programa e aperte o segundo boto cmdSegundoTeste e veja o que acontece: A mensagem de erro que aparecia antes no aparece mais, pois agora a varivel abrange esta rotina tambm. Mas no existe nenhum contedo para a varivel Teste at o momento em que o boto cmdTesteVarivel seja pressionado. A varivel Teste ter um contedo somente quando o boto cmdTesteVarivel for pressionado. At ento, a varivel existe mas seu contedo vazio. 122
Variveis e Matrizes Para entender melhor, cmdSegundoTeste para: mude a codificao do boto
123
Lionardo@base.com.br
7.3 MATRIZES
Nas matrizes podemos armazenar vrios dados (seja texto, nmeros ou datas) em uma nica varivel. O que diferencia essencialmente uma matriz de uma varivel que a primeira possui nveis dentro de si, e em cada nvel podemos armazenar dados. Veja o exemplo de uma declarao e inicializao de uma matriz: Dim NomeCliente(3) as String NomeCliente(0) = Fernando Henrique NomeCliente(1) = Fernando Collor NomeCliente(2) = Jos Sarney Criamos um matriz de nome NomeCliente e definimos como sendo uma String. Entretanto, definimos tambm que essa matriz ter 3 nveis somente. Em cada nvel podemos colocar um elemento (um contedo) dentro dele. Todos os elementos da matriz precisam ser do mesmo tipo estabelecido no comando Dim. Porm, se declararmos um matriz do tipo Variant, cada elemento poder ser de um tipo de dado diferente. Para acessarmos um determinado contedo temos que especificar o nmero que acompanha o nome da matriz. Chamamos esses nmeros de ndice, e so estes ndices que localiza os elementos dentro da matriz. Exemplo: Se desejamos imprimir a matriz que contm o nome Jos Sarney temos que digitar: Print NomeCliente(2) Se digitar somente NomeCliente o Visual Basic no ir retornar um erro em tempo de execuo:
Este erro acontece porque uma vez definido NomeCliente como matriz, ela poder somente ser chamada como uma matriz (com seu ndice). A abrangncia e tempo de vida de uma matriz segue as mesmas regras estabelecida para as variveis. As regras de nomeao de uma matriz tambm so as mesmas aplicadas as variveis. 124
Variveis e Matrizes
Se quiser personalizar as matrizes para algumas comearem a partir de um determinado numero de outras a partir de outro, podemos especificar na criao o menor e o maior ndice que a matriz ter: Dim Contador (1 to 10) as Integer Dim NomeCliente( 5 to 10) as String O primeiro exemplo ter um ndice de 1 a 10 e no outro um ndice de 5 a 10. Qualquer nmero informado fora desse intervalo retornar um erro.
125
Lionardo@base.com.br
Option Base 1 Dim Contador(3,2) as String. 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) = Maro Contador(1,2) = Venda Ruim Contador(2,2) = Venda Regular Contador(3,2) = Venda Boa Veja como ficaria a representao grfica dessa matriz Coluna 1 Linha 1 Linha 2 Linha 3 Janeiro Fevereiro Maro (1,1) (2,1) (3,1) Coluna 2 Venda Ruim Venda Regular Venda Boa (1,2) (2,2) (3,2)
Perceba que esses tipos de matriz so multidimensional porque criam subdivises dentro de cada elemento. Poderamos 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 subdividem em outros 8 elementos, formando no total 120 elementos (3X5X8). Confesso que a primeira impresso horrvel. Mas a possibilidade existe e o bicho no to feio. Podemos usar matrizes multidimensional como uma planilha eletrnica de clculo.
Variveis e Matrizes Usamos o comando ReDim para fazer esse Redimensionamento da matriz. Exemplo: Se precisarmos incluir mais 1 elemento na matriz NomeCliente usariamos o comando: ReDim NomeCliente(1) NomeCliente(1) = Joo Figueiredo Se depois precisarmos colocar mais 2 elementos usariamos: ReDim NomeCliente(3) NomeCliente(1) = Joo Figueiredo NomeCliente(2) = Jos Sarney NomeCliente(3) = Fernando Collor Neste exemplo quando redimensionamos pela segunda vez tivemos que colocar um contedo novamente para o NomeCliente(1) pois o comando ReDim sempre apaga os dados armazenados anteriormente. Quando no queremos que isto acontea usamos a clusula Preserve Juntamento com o ReDim. Assim os contedos anteriores so preservados. Veja: ReDim NomeCliente(1) NomeCliente(1) = Joo Figueiredo Se depois precisarmos colocar mais 2 elementos usaramos: ReDim Preserve NomeCliente(3) NomeCliente(2) = Jos Sarney NomeCliente(3) = Fernando Collor
127
Lionardo@base.com.br
Objetos como o ComboBox e o ListBox usam matrizes para fazer referencia ao seu contedo atravs 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 propriedade ListCount retorna a quantidade de itens existentes. No nosso exemplo, o NewIndex seria igual a 3 e o ListCount igual a 4. LstPresidentes.List(3) retorna a expresso Fernando Henrique. Print lstPresidentes.List(lstPresidentes.NewIndex) retorna a expresso Fernando Henrique tambm.
128
Variveis e Matrizes Por exemplo, vamos colocar dois Labels no formulrio e mudar sua propriedade Name para lblTestaMatriz. No primeiro o Visual Basic aceitar o nome sem problemas, no segundo Label quando tentarmos colocar o mesmo nome j usado anteriormente por outro Label, o Visual Basic avisar que o nome j existe e pergunta se no queremos usar uma matriz:
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 nmeros 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 codificao para este objeto, teramos que sempre colocar o ndice correspondente ao objeto que estamos trabalhando.
Note que o evento click que criamos para o Label possui um argumento Index As Integer. A varivel index ter em seu contedo o nmero do ndice correspondente ao Objeto clicado. Ou seja, se chamarmos o evento 129
Lionardo@base.com.br
click atravs do Label1 o nmero do ndice ser 0. Se usarmos o Label2 o ndice ser 1.
Crie um novo formulrio e nele coloque CheckBox com as seguintes propriedades: Propriedades Name Caption Check1 chkNome Figueiredo Check2 chkNome Jos Sarney Check3 chkNome Collor
Coloque tambm no formulrio um Label. Deixe o Caption vazio, o Autosize em True e nomeio lblTeste.
Para conseguirmos o mesmo efeito sem usar matriz teramos que criar um evento click para cada opo do CheckBox.
130
Variveis e Matrizes
EXERCCIOS PROPOSTOS
1 - Cite trs regra que temos que respeitar na criao de uma varivel:
Lionardo@base.com.br
132
8 OPERADORES
Lionardo@base.com.br
8.1 OPERADORES
A finalidade bsica dos operadores so para comparar, calcular, igualar, concatenar... enfim, fazer operaes envolvendo variveis ou campos de Banco de Dados.
134
Operadores
135
Lionardo@base.com.br
O resultado ser falso. 10 maior que 5. Seria Verdadeira a comparao, mas como possui o Not, e ele inverte o resultado, o retorno falso. Xor: Este operador exige preciso. No admite confuso na comparao dos relacionamentos. Ou uma coisa ou outra. Nunca as duas. 8 > 10 Xor 8 > 6 Retorna verdadeiro, pois o resultado das duas comparaes foram diferentes. A primeira falsa e a segunda verdadeira. 8 > 10 Xor 6 > 8 Retorna falso, pois o resultado das duas comparaes foram semelhantes. A primeira falsa e a segunda tambm. 10 > 8 Xor 8 > 6 Retorna falso, pois o resultado das duas comparaes foram semelhantes. A primeira verdadeira e a segunda tambm. Eqv: Abreviatura de Equivalente. Faz uma equivalncia lgica entre duas expresses. 10 > 8 Eqv 8 > 6 Retorna verdadeiro, pois ambas comparaes so iguais. 8 > 10 Eqv 8 > 6 Retorna falso, pois as comparaes retornam valores diferentes. Imp: Abreviatura de Implicao (uma coisa implica em outra). O resultado ser False somente se a primeira comparao 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 diferena. 10 > 8 Imp 6 > 8 Retorna Falso, pois a primeira comparao Verdadeira e a segunda falsa. 10 > 8 Imp 8 > 6 Retorna Verdadeiro. 8 > 10 Imp 6 > 8 Retorna Verdadeiro.
136
Operadores Resulta em Lionardo Fonseca Paiva. O operador + tambm pode ser usado, mas no aconselhado, uma vez que o & possui uma abrangncia maior, convertendo expresses de outros formatos para o string para forar a concatenao.
Vamos criar um programa em que o usurio ir digitar um valor qualquer, ele valor ser multiplicado pelo numero informado e o resultado era apresentado no "Label4" juntamente com o nome do usurio. Nomeie as caixas txtMultiplicado e txtNome de texto para txtValor,
Vamos codificar o boto "cmdResultado": Isto far com que o programa calcule o valor informado e concatene este valor com o nome do usurio.
137
Lionardo@base.com.br
Importante o programador tentar cercar o mximo de erros possiveis que o usurio pode cometer, como por exemplo, se for digitado caracteres do alfabeto onde se espera numeros ou deixar um dos itens em branco, o programa ir dar a seguinte mensagem de erro:
Para se evitar isto o programa deve verificar se os dados digitados so vlidos para depois efetuar o clculo.
138
Operadores
EXERCCIOS PROPOSTOS
1 - Qual a diferena entre o operador / e o operador \ ?
4 - Explique os operadores lgicos e exemplifque: And: Exemplo: Or: Exemplo: Xor: Exemplo: Not: Exemplo: 5 - D um exemplo de cada operador de comparao relacionado abaixo: > >= < <= <> =
139
Condicionais Lao
141
Lionardo@base.com.br
9.1
COMANDOS CONDICIONAIS
Como o prprio nome j indica, estes comandos executam determinadas aes desde que algumas condies sejam favorveis (verdadeiras). IF <<Condio>> THEN... END IF Traduzindo: IF = Se, THEN = Ento, END IF = Fim do Comando Se. Quando colocamos uma estrutura condicional IF dentro do nosso programa estamos querendo que o computador avalie uma condio e conforme for o resultado siga determinado caminho. Veja um exemplo: Dim Contador as Integer Contador = 20 IF Contador < 20 Then Print Contador menor que 20 End If Print Fim do Programa O programa verifica: Se contador for menor que 20 ento imprima no formulrio Contador menor que 20. Quando terminar imprima Fim do Programa. Quando uma determinada condio que colocamos no comando IF verdadeira ele comea a executar todas as linhas que existem entre IF e END IF. Se a condio no for verdadeira ento o programa passa a execuo para a linha aps 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 no maior que 20. Esta condio falsa. Ento, sendo assim, ele no executar as linhas existentes dentro da estrutura IF...END IF, e s ir imprimir no formulrio a frase Fim do Programa. 142
IF <<Condio>> THEN... ELSE... END IF Traduzindo: IF = Se, THEN = Ento, ELSE = Seno, END IF = Fim do Comando Se. Acrescentamos na estrutura o comando ELSE, que sempre executado quando a condio no 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, seno, imprima Contador maior ou igual a 20. Perceba que agora o programa ir executar um comando da estrutura, seja um ou outro, mas pelo menor um ser executado. Se a condio for verdadeira o comando executado sempre o que esta aps o comando IF, se for falsa ele ignora as instrues que existem aps o comando IF e passa a execuo para a linha aps o ELSE e vai at o final. Lembre-se: Sempre que usar o comando IF necessrio usar o comando THEN aps a condio, e depois encerrar a estrutura condicional IF com END IF. IF <<Condio>> THEN... ELSEIF... ENDIF Traduzindo: IF = Se, THEN = Ento, ELSEIF = Seno se, END IF = Fim do Comando Se. Modificamos comando ELSE para ELSE IF, que sempre executado quando a condio no verdadeira, mas ainda dependendo de uma outra condio. Dim Contador as Integer Contador = 20 IF Contador < 20 Then Print Contador menor que 20 143
Lionardo@base.com.br
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 no for verifica se ento igual a 20, seno ir imprimir que contador maior que 20. Veja outro exemplo:
SELECT CASE Significa Seleo de Casos. Ou seja, colocamos possibilidades (varios casos) para o Visual Basic e ele escolhe um. Veja a estrutura do comando: Opo = 3 Select Case Opo Case 1 Print Opo 1 acionada Case 2 144 vrias
Comandos Condicionais e de Lao Print Opo 2 acionada Case 3 Print Opo 3 acionada End Select Veja que este comando verifica se a Opo 1, depois verifica se 2 e depois se 3. Se a varivel Opo for 3 ele executar as instrues contidas na prxima linha. Caso a varivel Opo no seja 1,2 ou 3 ento o comando SELECT CASE encerrado. Opo = 3 Select Case Opo Case 1 Print Opo 1 acionada Case 2 Print Opo 2 acionada Case 3 Print Opo 3 acionada Case Else Print Opo no 1,2 ou 3 End Select Acrescentando na estrutura clusula CASE ELSE (caso contrrio), o Visual Basic ir verificar se a varivel 1,2 ou 3, no sendo ento ser CASE ELSE, e a linha seguinte a esta clusula ser executada. No comando Case podemos usar tambm intervalos, como por exemplo: Case 2 to 4 Ou seja, caso a condio esteja entre 2 e 4. Caso queira que na verificao da condio seja avaliado se a varivel maior ou menor que determinada expresso, usamos: Case Is > 50
145
Lionardo@base.com.br
Em um novo formulrio crie uma caixa de texto digitarmos uma data e um boto como esta abaixo:
para
Vamos codificar o boto para quando digitarmos uma data o programa verificar se igual a data de hoje ou no. Para obtermos da data de hoje do sistema temos que usar a funo Date.
O programa analizara a data digitada, e mostrar vdeo como a data em comparao com a data de hoje.
no
9.2
146
COMANDOS DE LAO
Comandos Condicionais e de Lao Estes comandos criam crculos viciosos, ou seja, criam um estrutura condicional que se repetem at a que condio seja satisfeita. DO WHILE <<Condio>> LOOP ( Faa enquanto ) Executa todos os comandos que existem entre DO WHILE e o LOOP. Quando a execuo do programa encontra o comando LOOP, o DO WHILE reavaliado e a rotina continua at que a condio estabelecida esteja satisfeita. Contador = 0 Do While Contador < 10 Contador = Contador + 1 Print Contador Loop Print Fim da execuo
Inicializamos uma varivel de nome Contador com Zero, e pedimos para o programa: Repita as instrues 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 condio de novo. Somente quando a condio for verdadeira, ou seja, quando Contador for maior ou igual a 10, que o programa executar a linha aps o LOOP. Perceba que dependendo do resultado da condio os comandos existentes dentro da estrutura podem no serem executados, passando direto para a linha aps o comando LOOP. DO ... LOOP WHILE <<Condio>> ( Repita enquanto ) Neste caso o Comando Do abre a seqncia de repetio, mas no faz nenhum teste de condio. Este teste feito no final da estrutura com o comando LOOP WHILE, ou seja, obrigatoriamente as instrues contidas aps o comando DO sero executadas. Contador = 0 Do Contador = Contador + 1 Print Contador Loop While contador < 10 Print Fim da execuo Retorne para repetir os comandos enquanto o Contador for menor que 10.
147
Lionardo@base.com.br
DO UNTIL <<Condio>> LOOP ( Faa at que) Executa todos os comandos que existem entre DO UNTIL e o LOOP. Quando a execuo do programa encontra o comando LOOP, o DO UNTIL reavaliado e a rotina continua at que a condio estabelecida esteja satisfeita. Contador = 0 Do Until contador >= 10 Contador = Contador + 1 Print Contador Loop Print Fim da execuo
Inicializamos uma varivel de nome Contador com Zero, e pedimos para o programa: Repita as instrues 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 condio de novo. Somente quando a condio for verdadeira, ou seja, quando Contador for realmente maior ou igual a 10, que o programa executar a linha aps o LOOP. Semelhante ao DO WHILE, dependendo do resultado da condio os comandos existentes dentro da estrutura podem no serem executados, passando direto para a linha aps o comando LOOP. DO ... LOOP UNTIL <<Condio>> ( Repita at que ) O Comando DO abre a seqncia de repetio, mas no faz nenhum teste de condio. Este teste feito no final da estrutura com o comando LOOP UNTIL, ou seja, obrigatoriamente as instrues contidas aps o comando DO sero executadas. Contador = 0 Do Contador = Contador + 1 Print Contador Loop Until Contador >= 10 Print Fim da execuo
Retorne para repetir os comandos at que o Contador seja maior ou igual a 10.
148
Comandos Condicionais e de Lao O comando FOR faz uma contagem de um determinado intervalo de nmeros. Sempre que essa contagem encontra com o comando NEXT (prximo) a execuo do programa retorna ao comando FOR at que o nmero final seja alcanado. Exemplo: Contador = 0 Conte de um at 10 For Contador = 1 to 10 Print A varivel Contador agora vale &Contador Next Print Fim da execuo Neste programa o Visual Basic inicializa a varivel Contador em zero, e o comando FOR avisa vamos contar at 10, comeando pelo 1. As instrues contidas na linha abaixo so executadas, e quando o comando NEXT encontrado a execuo volta para o FOR, e a varivel 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 Varivel = 1 TO 10 STEP 2 EXIT <<Comando>> Exit Sub: Fora a sada da Sub rotina. Quando a execuo 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: Fora a sada da funo. Quando a execuo 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: Fora a sada de um LOOP, seja WHILE ou UNTIL, mesmo que a condio estabelecida no seja verdadeira: Contador = 0 Do While Contador < 10 Contador = Contador + 1 Print Contador if Contador = 5 then Exit Do end if 149
Lionardo@base.com.br
Loop Print Fim da execuo Exit For: Fora a sada de um FOR..NEXT, mesmo que o nmero final no tenha sido alcanado. Contador = 0 For Contador = 1 to 10 Print A varivel Contador agora vale &Contador If Contador = 6 Exit For end if Next Print Fim da execuo expresses de outros formatos para o string para forar a concatenao.
150
EXERCCIOS PROPOSTOS
1 - Cite duas diferenas entre um lao DO WHILE e um lao DO - LOOP WHILE?
2 - Qual intruo que verifica sua condio antes da execuo das rotinas que fazem parte do lao?
3 -Se necessitassemos executar um vrios comandos e funes repetidamente at que uma determinada condio fosse verdadeira, qual loop usuariamos?
151
10 FUNES DE AUXILIO
Data e Hora Converso String Matemtica Entrada de Dados Identificao Manipulao de Matriz
153
Lionardo@base.com.br
10.1 FUNES
Funes nada mais que rotinas prontas para executar determinadas aes. Existem no Visual Basic diversos tipos de funes que nos auxiliam na programao em todos os aspectos. So funes que fazem clculos, funes que exibem resultados, funes para todos os gostos. Vamos comear a ver algumas dessas funes e com isto descobriremos o poder que elas exercem dentro da linguagem e sua utilidade. Existem funes que precisam de um argumento para executar uma tarefa, outras somente retorna algum valor sem necessidade do argumento, como visto nos exemplos abaixo:
10.1.1
Funes matemticas
ABS: Retorna sempre um valor positivo (absoluto). VarivelNumrica = Abs(Expresso numrica) Print Abs(-45) Valor Impresso: 45 ATN: Retorna o arco-tangente de um nmero. VarivelNumrica = Atn(Expresso numrica) COS: Calcula o cosseno de um ngulo VarivelNumrica = Cos(<expressoNumrica>) FIX: Retorna a parte inteira de um nmero, ignorando as casas decimais, se houver. No faz arredondamento VarivelNumrica = Fix(<expressoNumrica>) Print Fix(145.87) Valor Impresso: 145 Print Fix(-145.87) Valor Impresso: -145 HEX: Retorna a representao hexadecimal de um nmero decimal. VarivelNumrica = Hex(<expressoNumrica>) INT: Retorna a parte inteira de um nmero, ignorando as casas decimais, se houver. No faz arredondamento. Se o argumento for um nmero negativo ser incrementado em um. VarivelNumrica = INT(<expressoNumrica>) 154
Comandos Condicionais e de Lao Print Int(145.87) Valor Impresso: 145 Print Int(-145.87) Valor Impresso: -146 LOG: Calcula o logaritmo natural de um nmero VarivelNumrica = LOG(<expressoNumrica>) RND: Retorna um nmero randmico, ou seja, escolhe um nmero aleatoriamente. VarivelNumrica = Rnd[(<expressoNumrica>)] SGN: Retorna -1 se o argumento for um nmero negativo, e 1 se for um nmero positivo. VarivelNumrica = Sgn(<expressoNumrica>) SIN: Calcula o seno de um ngulo. VarivelNumrica = Sin(<expressoNumrica>) SQR: Calcula a raiz quadrada de um nmero. VarivelNumrica = Sqr(<expressoNumrica>) TAN: Calcula a tangente de um ngulo. VarivelNumrica = Tan(<expressoNumrica>)
155
Lionardo@base.com.br
Para todos os labels deixe o Caption vazio e habilite o AutoSize. Faa a seguinte codificao para o boto:
10.1.2
Funes de Converso
CBOOL: Converte uma expresso para um valor lgico (True ou false). Se o argumento for um zero, retornar False, caso contrrio ser True. VarivelLgica = CBool(<expresso>) Print Cbool(43) 156
Comandos Condicionais e de Lao Valor Impresso: True Print Cbool(0) Valor Impresso: False Print Cbool(4 = 6) Valor Impresso: False. O resultado da comparao no verdadeira. CBYTE: Converte uma expresso para um tipo Byte. VarivelByte = cbyte(<expresso>) Print Cbyte(155.56) Valor Impresso: 156 Print Cbyte(355.56) Erro. Overflow. Expresses do tipo byte no podem ser maior que 255. CCUR: Converte uma expresso numrica para um tipo-moeda. VarivelCurrency = Ccur(<expresso numrica>) Print Ccur(120) Valor Impresso: 120 CDATE: Converte uma expresso para um tipo Data. Entretanto, esta converso se concretizar desde que a expresso usada como argumento seja mesmo no formato de uma data, ou seja, dia/ms/Ano. Se pedirmos para fazer converso da palavra teste para data ser retornado um erro. VarivelData = Cdate(<expresso>) Print Cdate(12/04/95) Valor Impresso: 12/04/95 Print Cdate(120495) Erro. O contedo informado como argumento no esta formatado como data. Print Cdate(30/02/95) Erro. O argumento no uma data real importante salientar que essa converso necessrio principalmente quando o usurio digita uma data e esta data vai ser objeto de clculo. Ento a converso necessria. CDBL: Converte uma expresso numrica em um nmero de ponto flutuante de preciso dupla. VarivelNumrica = Cdbl(<expresso numrica>) CINT: converte uma expresso numrica em um nmero inteiro. Faz arredondamento. VarivelNumrica = CInt(<expresso numrica>) 157
Lionardo@base.com.br
Print CInt(45.40) Valor Impresso: 45 Print CInt(45.60) Valor Impresso: 46 CLNG: Converte uma expresso numrica em um nmero inteiro longo. VarivelNumrica = CLng(<expresso>) VarivelNumrica = CLng(<expresso numrica>) Print Clng(45.40) Valor Impresso: 45 Print Clng(45.60) Valor Impresso: 46 A diferena entre a funo CINT e CLNG a abrangncia da prpria varivel. CSNG: Converte uma expresso numrica em um nmero de ponto flutuante de preciso simples. VarivelNumrica = CSng(<expresso >) CSTR: Converte uma expresso numrica, data ou outra em uma string (texto). VarivelString = CStr(<expresso>) Print Cstr(452) Valor Impresso: 452 CVAR: Converte uma expresso de qualquer tipo para o tipo variante. VarivelVariant = Cvar(<expresso>) STR: Converte um valor numrico para o tipo String (texto). Valido somente para argumentos numricos. VarivelString = Str(<expressoNumrica>) Print Str(452) Valor Impresso: 452 STRCONV: Retorna uma string convertida de acordo com o tipo de converso especificado. VarivelString = Strconv(<ExpressoString>, <TipoDeConverso>) Tipos de converso que podemos usar: vbUpperCase Converte toda a expresso em letras maisculas. vbLowerCase Converte toda a expresso em letras minsculas. 158
Comandos Condicionais e de Lao vbProperCase Converte somente a primeira letra em maiscula e o restante em minsculo. Print StrConv(Lionardo, vbUpperCase) Valor Impresso: LIONARDO Print StrConv(LIONARDO, vbProperCase) Valor Impresso: Lionardo ASC: Retorna o cdigo ANSI do primeiro caractere de uma String. VarivelNumrica = Asc(<string>) Print Asc("B") Valor Impresso: 66 (Numero correspondente na tabela ASCII da letra B.) CHR: Retorna o caractere correspondente ao cdigo na tabela ASCII VarivelString = Chr(<cdigoDoCaractere>) Print Chr(66) Valor Impresso: B VAL: Converte uma String com caracteres numricos em uma varivel nmerica. VarivelNumrica = Val(<stringNumrica>) Print Var(003) Valor Impresso: 3 Print Var(123) Valor Impresso: 123
10.1.3
DATE: Retorna a data corrente do sistema operacional. VarivelData = Date DATEADD: Incrementa uma data nos dias, meses ou anos especificados. VarivelVariant = DateAdd(<Intervalo>, <Incremento>,<ExpressoData>) Retorna uma Variant que contm uma data qual foi adicionado um determinado intervalo de tempo. <Intervalo> Expresso de seqncia de caracteres que o intervalo de tempo que voc quer adicionar. Tipos de caracteres usados: 159
Lionardo@base.com.br
yyyy q m y d w ww h n s
Ano Trimestre Ms Dia do ano Dia Dia da semana Semana Hora Minuto Segundo
<Incremento> Expresso numrica que o nmero de intervalos que voc quer adicionar. Pode ser positivo (para obter datas no futuro) ou negativo (para obter datas no passado). <ExpressoData> Data que est sendo adicionada. Print DateAdd("d",2,"31/07/96") Valor Impresso: 02/08/96 A funo 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"). A funo DateAdd no retornar uma data invlida. O exemplo abaixo adiciona um ms a 31 de janeiro: DateAdd("m", 1, "31-Jan-95") Neste caso, DateAdd retorna 28-Fev-95 e no 31-Fev-95. Se date for 31-Jan-96, ele retornar 29-Fev-96 pois 1996 um ano bissexto. DATEDIFF: Calcula o intervalo entre duas datas. VarivelData=DateDiff(<intervalo>, <expressoData1>, <expressoData2>) <Intervalo> Expresso de seqncia de caracteres, que o intervalo de tempo que voc usa para calcular a diferena entre uma data e outra. O argumento intervalo tem estas configuraes: yyyy Ano q Trimestre 160
Comandos Condicionais e de Lao m y d w ww h n s Ms Dia do ano Dia Dia da semana Semana Hora Minuto Segundo
<ExpressoData1 e 2> Duas datas que voc quer usar no clculo. Dim data1 As Date Dim data2 As Date Data1 = #31/7/96# Data2 = #8/8/96# Print DateDiff("d", data1, data2) Valor Impresso: 8 A funo DateDiff pode ser usada para determinar quantos intervalos de tempo especificados existem entre duas datas. Por exemplo, voc poderia usar DateDiff para calcular o nmero de dias entre duas datas ou o nmero de semanas entre o dia de hoje e o final do ano. Se quiser saber o nmero 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 nmero de semanas entre as duas datas. Se date1 cair numa segunda-feira, DateDiff contar o nmero de segundas-feiras at a date2. Ele conta date2, mas no date1. Se, contudo, interval for Semana ("ww"), a funo DateDiff retornar o nmero de semanas do calendrio entre as duas datas. Ele conta o nmero de domingos entre date1 e date2. DateDiff contar date2 se ela cair num domingo; mas no contar a date1, mesmo que caia num domingo. Se date1 se referir a um ponto no tempo posterior date2, a funo DateDiff retornar um nmero negativo. Se data for um literal de data (uma data entre sinais numricos (#)), o ano, se especificado, se tornar uma parte permanente dessa data. Contudo, se data estiver entre aspas ("") e voc omitir o ano, o ano atual ser inserido no cdigo sempre que a expresso data for avaliada. Isto torna possvel escrever um cdigo que pode ser usado em anos diferentes. DATEPART: extrai de uma determinada data uma parte dela relativo a dia, ms, semana, quinzena, etc. 161
Lionardo@base.com.br
ParteDaData = DatePart(<intervalo>, <expressoData>) Intervalo pode ser: yyyy Ano q Trimestre m Ms y Dia do ano d Dia w Dia da semana ww Semana h Hora n Minuto s Segundo Dim Data As Date Data = #8/2/96# Print DatePart("m", data) Valor Impresso: 8 DATESERIAL: Retorna uma data para um dia, ms e ano especificados, ou seja, informe cada item separado que a funo monta a data. VariavelData = DateSerial(<ano>, <ms>, <dia>) Print DateSerial("96","08","02") Valor Impresso: 02/08/96 DATEVALUE: Retorna a data especificada numa string, ou seja, converte uma varivel String para o tipo Data. VarivelData = DateValue(<VarivelStringDeData>) Print DateValue("02/08/96") Valor Impresso: 02/08/96 DAY: Retorna o dia do ms referente a uma data. VarivelNumrica = Day(<expressoData>) Print Day("02/08/96") Valor Impresso: 2 HOUR: Retorna a hora de uma expresso de data e hora. VarivelNumrica = Hour(<ExpressoHora>) Print Hour("12:34:12") Valor Impresso: 12 Print Hour(now) Valor Impresso: 15 162
MINUTE: Retorna o minuto de uma expresso de data e hora. VarivelNumrica = Minute(<ExpressoHora>) MONTH: Retorna o ms de uma data. VarivelNumrica = Month(<ExpressoData>) NOW: Retorna a data e a hora correntes do sistema operacional. VarivelData = Now Print Now Valor Impresso: 02/08/96 15:08:07 SECOND: Retorna os segundos de uma expresso de data e hora. VarivelNumrica = Second(<ExpressoHora>) TIME: Retorna a hora corrente do sistema operacional. VarivelData = Time Print Time Valor Impresso: 15:08:07 TIMER: Calcula a quantidade de segundos passados desde a meia noite. VarivelNumrica = Timer TIMEVALUE: Retorna a hora especificada numa string, ou seja, converte uma String cujo contedo esta no formato de hora para uma varivel tipo Data e Hora. VarivelData = TimeValue(<ExpressoStringDeHora>) WEEKDAY: Retorna o dia da semana de uma data, ou seja, seu numero correspondente: 1 para Domingo at 7 para Sbado. VarivelNumrica = WeekDay(<ExpressoData>) YEAR: Retorna o ano de uma data. VarivelNumrica = Year(<ExpressoData>)
163
Lionardo@base.com.br
Para criar um programa que faa calculos de data bastante simples se usarmos as funes acima de forma correta. Abra um novo projeto e desenvolva um formulrio como no modelo:
a seguinte codificao:
Na caixa de texto txtDataCompra incluido dados no formato Texto, mesmo que seja uma data. Para o visual Basic entender que a expresso ali existente deve ser tratada como uma data e no como um texto, usamos a funo de converso Cdate. Vamos agora fazer a seguinte verificao: se o dia do pagamento cair num Domingo, fazer com que a data de pagamento passe para a Segunda-feira.
164
10.1.4
Funes de String
INSTR: Retorna a posio da primeira ocorrncia de uma seqncia de caracteres dentro de outra Varivel = InStr ({<posioInicial>,] <string>, <SubStringAPesquisar>[, <MtodoDeComparao]) Posio Inicial: Expresso numrica que define a posio inicial de cada pesquisa. Se omitido, a pesquisa comea na posio do primeiro caractere.. Este argumento necessrio se o Mtodo de Comparao for especificado. String : Expresso de seqncia de caracteres que est sendo pesquisada. 165
Lionardo@base.com.br
SubStringAPesquisar : Expresso de seqncia de caracteres procurada. MtodoDeComparao : Especifica o tipo comparao de seqncias de caracteres. Este argumento pode ser omitido, pode ser 0 ou 1. Especifique 0 (padro) para realizar uma comparao binria. Especifique 1 para realizar uma comparao textual que desconsidere maisculas/minsculas. Se este argumento for omitido, a configurao de Option Compare determinar o tipo de comparao. Print InStr(8,"Lionardo Fonseca", "FO",1) Valor Impresso: 10 A partir do 8 caractere procure na expresso Lionardo Fonseca em que posio comea a expresso FO, e ignore diferenciao maisculas/minsculas. Print InStr(8,"Lionardo Fonseca", "FO",0) Valor Impresso: 0 (no encontrado). LCASE: Converte uma expresso string para minsculas. VarivelString = Lcase (<stringAConverter>) Print Lcase(Editora Terra) Valor Impresso: editora terra LEFT: Retorna uma quantidade de caracteres que se encontra da esquerda para a direita. VarivelString = Left(<string>, <QuantidadeDeCaracteres>) Print Left("Lionardo",4) Valor Impresso: Lion LEN: Retorna o nmero de caracteres de uma expresso String ou nmero de bytes requerido para armazenar uma varivel. VarivelNumrica = Len (ExpressoCaractere>) Print Len(Lionardo) Valor Impresso: 8 LTRIM: Remove os espaos em branco esquerda de uma String. VarivelString = Ltrim (<ExpressoString>) MID: Retorna uma Substring de uma String, ou seja, retorna um nmero especificado de caracteres de uma seqncia de caracteres. SubString=Mid(<string>,<posioInicial>[, <quantidadeDeCaracteres>]) 166
Comandos Condicionais e de Lao String : Expresso de seqncia de caracteres a partir da qual os caracteres so retornados. PosioInicial: Posio de caractere em String na qual a parte a ser considerada inicia. Se Posio Inicial for maior do que o nmero de caracteres em String, Mid retorna uma seqncia de caracteres de comprimento zero. QuantidadeDeCaracteres: Nmero de caracteres a serem retornados. Se omitidos ou se o nmero de caracteres do texto for inferior ao QuantidadeDeCaracteres (inclusive o caractere em PosioIncial), sero retornados todos os caracteres desde a PosioInicial at o final da seqncia de caracteres. Print Mid("Lionardo Fonseca Paiva",10,8) Valor Impresso: Fonseca Na expresso String Lionardo Fonseca Paiva, a partir do 10 caractere conte 8 para frente e retorne a String que esta neste intervalo. RIGHT: Retorna uma substring com os caracteres que se encontram da direita para a esquerda dentro de uma expresso String. VarivelNumrica=Right([<ExpressoString>, <QuantidadeDeCaracteres>) Print Right(Lionardo Fonseca,7) Valor Impresso: Fonseca RTRIM: Remove os espaos direita em uma String. VarivelString = Rtrim(<string>) SPACE: Retorna uma String com uma determinada quantidade de espaos vzios. VarivelString = Space(<quantidadeDeCaracteres>) STR: Retorna a representao de um nmero como uma String. VarivelString = Str (<ExpressoNumrica>) STRCOMP: Compara duas expresses Strings. VarivelNumrica=StrComp(<string>,<string>[,Comparao>]) Comparao: Especifica o tipo de comparao de seqncias de caracteres. Este argumento pode ser omitido, pode ser 0 ou 1. Especifique 0 (padro) para fazer uma comparao binria. Especifique 1 para fazer uma comparao de texto. 167
Lionardo@base.com.br
Valores de retorno da funo: -1 quando a primeira String for menor que a Segunda, 0 quando forem iguais e 1 quando a primeira String for maior que a segunda. STRING: Repete um determinado caractere a quantidade de vezes estabelecido na funo. String = String (<QuantidadeDeCaracteres>, <caracteres>) Print String(30,"-") Valor Impresso: -----------------------------TRIM: Remove os espaos esquerda e direita de uma string. VarivelString = Trim(<String>) UCASE: Converte uma expresso String para maisculas. VarivelString = Ucase (<string>) Print Ucase(Editora Terra) Valor Impresso: EDITORA TERRA
10.1.5
ARRAY: Retorna um Array do tipo Variant. ArrayVariant = Array (<NmeroDeElemento>) NmeroDeElemento: consiste de uma lista delimitada por vrgula de um nmero arbitrrio de valores que so atribudos aos elementos da matriz contidos em Variant. Se nenhum argumento for especificado, ser criada uma matriz de comprimento zero. Embora uma Variant que contm uma matriz seja conceitualmente diferente de uma matriz cujos elementos so do tipo Variant, o modo como so acessados os elementos da matriz o mesmo. A notao usada para se referir a um elemento de uma matriz consiste no nome da varivel seguido por parnteses que contm um nmero do ndice que indica o elemento desejado. O limite inferior de uma matriz criada com a funo Array determinado pelo limite inferior especificado com a instruo Option Base. Dim VariavelMatriz As Variant VariavelMatriz = Array("Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sb") Print VariavelMatriz(2) Print VariavelMatriz(4) Valor Impresso: Ter Valor Impresso: Qui 168
LBOUND: Retorna o menor ndice de uma matriz. VarivelNumrica = Lbound(<NomeDaMatriz>) Dim VariavelMatriz As Variant VariavelMatriz = Array("Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sb") Print LBound(VariavelMatriz) Valor Impresso: 0 UBOUND: Retorna o maior ndice de uma matriz. VarivelMatriz = Ubound(<NomeDaMatriz>]) Dim VariavelMatriz As Variant VariavelMatriz = Array("Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sb") Print UBound(VariavelMatriz) Valor Impresso: 6
10.1.6
Funes Lgicas
IIF: Analisa uma expresso lgica, e retorna valores para quando for falso ou verdadeiro. ExpressoDeRetorno = IIF (<ExpressoLgica>, <ExpressoParaVerdadeiro>, <ExpressoParaFalso>) Print iif(10 > 2,10 maior que 2, 2 maior que 10) Valor Impresso: 10 maior que 2 Print iif(10= 5,Igual, Diferente) Valor Impresso: Diferente SWITCH: Avalia uma lista de expresses e retorna o valor associado quela primeiro avaliada como verdadeira. Switch(Expr-1, Valor-1[, Expr-2, Valor-2 , Expr-etc, Valor-etc]) Expr : Expresso variant que voc quer avaliar. Valor : Valor ou expresso que retornado se a expresso correspondente for True. A lista de argumentos da funo Switch consiste de pares de expresses e valores. As expresses so avaliadas medida que aparecem 169
Lionardo@base.com.br
na lista da esquerda para a direita e retornado o valor associado primeira expresso para avaliar True. Se as partes no forem corretamente pareadas, ocorre um erro em tempo de execuo. Por exemplo, se expr-1 for True, Switch retornar valor-1. Se expr-1 for False, mas expr-2 for True, Switch retornar valor-2, e assim por diante. Switch retornar um valor Null se nenhuma das expresses for True. Switch avalia todas as expresses, mesmo que retorne apenas uma delas. Por este motivo, voc deve ficar atento para efeitos colaterais indesejveis. Por exemplo, se a avaliao de qualquer expresso resultar num erro de diviso por zero, ocorrer um erro. 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 expresso na lista foi impresso, pois foi a primeira a ter uma condio verdadeira. Note que o ultimo valor (C<3) tambm verdadeiro, mas como a funo Switch encerra sua execuo quando encontra a primeira ocorrncia 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
10.1.7
Funes de Disco
CURDIR: Retorna o diretrio corrente. VarivelString = CurDir[(<drive>)] Print CurDir("C:") Valor Impresso: C:\WINDOWS\Desktop\ DIR: Retorna o nome de um arquivo, diretrio ou pasta correspondente a um padro especificado ou atributo de arquivo, ou a etiqueta de volume de uma unidade de disco. VarivelString = Dir[(Nomedocaminho[, Atributos])]
170
Comandos Condicionais e de Lao Nomedocaminho : Expresso de seqncia de caracteres que especifica um nome de arquivo e pode incluir diretrio ou pasta e unidade de disco. Null retornado se nomedocaminho no for encontrado. Atributos : Constante ou expresso numrica, cuja soma especifica atributos de arquivo. Se omitido, todos os arquivos normais que tiverem Nomedocaminho correspondente so retornados. As configuraes do argumento Atributos so: vbNormal 0 Normal. vbHidden 2 Oculto. vbSystem 4 Arquivo de sistema,. vbVolume 8 Etiqueta de volume; se especificada, todos os outros atributos so ignorados. vbDirectory 16 Diretrio ou pasta. FILEDATETIME: Retorna a data e a hora da ltima atualizao do arquivo. VarivelData = FileDateTime(<NomeArquivo>) Print FileDataTime("C:\WINDOWS\SYSTEM.INI") Valor Impresso: 03/08/96 16:50:20 FILELEN: Retorna o tamanho do arquivo em bytes. VarivelNumrica = FileLen(<NomeArquivo>) Print FileLen("C:\WINDOWS\SYSTEM.INI") Valor Impresso: 3481 GETATTR: Verifica os atributos de um arquivo ou diretrio. VarivelNumrica = GetAttr(<NomeArquivo>) Veja os valores de retorno desta funo: 0 1 2 4 16 32 backup. Print GetAttr("C:\WINDOWS\SYSTEM.INI") Valor Impresso: 32 171 vbNormal vbReadOnly vbHidden vbSystem vbDirectory vbArchive Normal. Somente Leitura. Oculto. Arquivo de sistema Diretrio ou pasta. O arquivo foi modificado desde o ltimo
Lionardo@base.com.br
10.1.8
Funes de Teste
ISARRAY: Testa se uma varivel uma matriz VarivelBoolean = IsArray(<varivel>) ISDATE: Testa se o argumento pode ser convertido para uma data. Esta data deve estar dentro dos padres de data. VarivelBoolean = IsDate(<expresso>) ISEMPTY: Verifica se uma varivel foi inicializada. IsEmpty retornar True se a varivel estiver iniciada; caso contrrio retornar False. Se a expresso contiver mais de uma varivel, o retorno ser sempre False. VarivelBoolean = IsEmpty(<expresso>) ISERROR: Testa se uma expresso um valor de erro. VarivelBoolean = IsError(<expresso>) ISMISSING: Testa se um argumento opcional foi passado como parmetro para uma procedure ou funo. VarivelBoolean = IsMissing(<NomedoArgumento>) ISNULL: Testa se uma varivel possui valor invlido. VarivelBoolean = IsNull(<Expresso>) ISNUMERIC: Testa se o argumento pode ser convertido para um nmero. VarivelBoolean = IsNumeric(<Expresso>) Print IsNumeric(AB) Valor Impresso: False Print IsNumeric(03) Valor Impresso: True ISOBJECT: vlido. VarivelBoolean = IsObject(<Expresso>) VARTYPE: Retorna o tipo de varivel especificada como argumento: VarivelNumrica = VarType(<Varivel>) Retorna os valores abaixo: 172 Testa se uma expresso referencia a um objeto OLE
Comandos Condicionais e de Lao 0 1 2 3 4 5 6 7 8 9 10 11 12 13 17 8192 Empty (No iniciada). Null Nenhum dado vlido. Inteiro (Integer). Inteiro por extenso (Long) Nmero de ponto flutuante de preciso simples (Single). Nmero de ponto flutuante de preciso dupla (Double). Moeda (Currency). Data (Date). Seqncia de caracteres textos (String). objeto de Automao OLE (Object). Erro (Error). Booleano Boolean). Variant (usada somente com matrizes de Variantes). Um objeto que no seja de Automao OLE (DataObject). Byte Matriz (Array).
TYPENAME: Retorna o nome descritivo do tipo de uma varivel. VarivelString = TypeName(<Varivel> Eis os nomes de retorno da funo: Byte Um byte. Integer Um inteiro. Long Um inteiro por extenso. Single Um nmero de ponto flutuante de preciso simples. Double Um nmero de ponto flutuante de preciso dupla. Currency Um valor de moeda. Date Uma data. String Uma seqncia de caracteres. Boolean Um valor Booleano. Error Um valor de erro. Empty No iniciado. Null Nenhum dado vlido. Object Um objeto que suporta Automao OLE.
10.1.9
Funes de Escolha
CHOOSE: Seleciona um valor de uma lista de argumentos. Varivel = Choose (<ndice>, <escolha>[, <escolha>]...)
173
Lionardo@base.com.br
ndice : Expresso numrica ou campo que resulta num valor entre 1 e o nmero de opes disponveis. Escolha : Expresso Variant que contm uma das possveis opes. Choose retorna um valor da lista de opes com base no valor de ndice. Se ndice for 1, Choose retorna a primeira opo da lista; se ndice for 2, retorna a segunda opo 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 opo-1 = "um", opo-2 = "dois" e opo-3 = "trs", Choose retorna "trs". Esta capacidade particularmente til se ndice representar o valor num grupo de opes. Se ndice no for um nmero inteiro, ele ser arredondado para o nmero inteiro mais prximo antes de ser avaliado. Print Choose(2,"Apostilas","CD-ROM","Livros","Servios Grficos") Valor Impresso: CD-ROM INPUTBOX: Exibe um aviso numa caixa de dilogo, aguarda at que o usurio insira texto ou escolha um boto e retorna o contedo da caixa de texto. Varivel=Inputbox(<expresso>,<barraDeTtulo>,<escolhaDefault>) EmpressoPrompt : Expresso de seqncia de caracteres exibida como a mensagem numa caixa de dilogo. O tamanho mximo de prompt de aproximadamente 1024 caracteres, dependendo da largura dos caracteres usados. BarraDeTtulo : Expresso de seqncia de caracteres exibida na barra de ttulos da caixa de dilogo. Se voc omitir este argumento, o nome do aplicativo ser includo na barra de ttulos. EscolhaDefault : Expresso de seqncia de caracteres exibida na caixa de texto como a resposta padro se nenhuma outra entrada for fornecida. Se voc omitir EscolhaDefault, a caixa de texto ser exibida vazia. Se o usurio escolher "OK" ou pressionar ENTER, a funo InputBox retorna o contedo da caixa de texto, qualquer que seja ele. Se o usurio escolher "Cancelar", a funo retorna uma seqncia de caracteres de tamanho zero (""). Observao : Se quiser especificar mais do que o primeiro argumento nomeado, voc dever usar InputBox em uma expresso. Se quiser omitir alguns argumentos posicionais, voc dever incluir o delimitador de vrgula correspondente. 174
Valor Impresso: <Ser o nome digitado na caixa de texto> MSGBOX: Exibe uma caixa de dilogo para exibir informaes e obter respostas simples atravs de botes de comando. VarivelNumrica = MsgBox (<ExpressoPrompt>,<BotesDisponveis>, <BarraDeTtulo>) ExpressoPrompt : Expresso de seqncia de caracteres exibida como a mensagem numa caixa de dilogo. O tamanho mximo de ExpressoPrompt de aproximadamente 1024 caracteres, dependendo da largura dos caracteres usados. Se ExpressoPrompt for composto por mais de uma linha, voc poder separar as linhas usando um caractere de retorno de carro (Chr(13)), um caractere de alimentao de linha (Chr(10)) ou uma combinao de caracteres de retorno de carro e alimentao de linha (Chr(13) & Chr(10)) entre cada linha. BotesDisponvel : Expresso numrica que a soma de valores que especificam o nmero e tipo de botes a serem exibidos, o estilo de cone a ser usado, a identidade do boto padro e a modalidade da caixa de mensagem. Se omitido, o valor padro ser 0. Veja abaixo os tipos de botes disponvel:
Valor 0 1 2 3 4 5 16
Descrio Exibe apenas o boto "OK". Exibe os botes "OK" e "Cancelar". Exibe os botes "Anular", "Repetir" e "Ignorar". Exibe os botes "Sim", "No" e "Cancelar". Exibe os botes "Sim" e "No". Exibe os botes "Repetir" e "Cancelar". Exibe o cone "Mensagem crtica". 175
Lionardo@base.com.br
32 48 64 0 256 512 0
VbSystemModal
4096
Exibe o cone "Consulta de advertncia". Exibe o cone "Mensagem de advertncia". Exibe o cone "Mensagem de informao". O boto "Primeiro" o padro. O boto "Segundo" o padro. O boto "Terceiro" o padro. Janela restrita do aplicativo; o usurio deve responder caixa de mensagem antes de continuar seu trabalho no aplicativo atual. Janela restrita do sistema; todos os aplicativos so suspensos at que o usurio responda caixa de mensagem.
O primeiro grupo de valores (05) descreve o nmero e tipo de botes exibidos na caixa de dilogo; o segundo grupo (16, 32, 48, 64) descreve o estilo de cone; o terceiro grupo (0, 256, 512) determina qual boto o padro; e o quarto grupo (0, 4096) determina modalidade da caixa de mensagem. Quando adicionar nmeros para criar um valor final para o argumento buttons, use somente um nmero de cada grupo. Observao Estas constantes so especificadas pelo Visual Basic para aplicativos. Assim, os nomes podem ser usados em qualquer lugar do cdigo em lugar dos valores reais. BarraDeTtulo : Expresso de seqncia exibida na barra de ttulos da caixa de dilogo. Se voc omitir BarraDeTtulo, o nome do aplicativo ser includo na barra de ttulos. Estes so os valores que esta funo retorna, para informar qual foi a ao do usurio:
Valor de Retorno 1 2 3 4 5 6 7
Se a caixa de dilogo exibir um boto "Cancelar", pressionar a tecla ESC ter o mesmo efeito que escolher "Cancelar". Se quiser especificar mais do que o primeiro argumento nomeado, voc dever usar MsgBox em uma expresso. Se quiser omitir alguns argumentos de posio, voc dever incluir o delimitador de vrgula correspondente. MsgBox Atmica") ("Deseja Continuar?",VbYesNoCancel, "Ativar Bomba
177
Lionardo@base.com.br
Vamos fazer uma codificao para o boto 1 e o boto 2 como esta abaixo. Perceba que usamos o MSGBOX no s para enviar uma mensagem para o usurio, como para executar uma determinada ao dependendo do que o usurio escolher.
178
Lionardo@base.com.br
Valor Impresso: 12345,3 Perceba que no podemos colocar uma formatao menor que os nmeros que sero impressos, pois seno a formatao no ir alcanar toda a extenso dos nmeros. O smbolo # substitudo por nmeros quando existir nmero para ser substitudo. Note que o nmero decimal .3 e apesar de termos usado uma formatao para casas decimais com dois smbolos ##, no apareceu as duas casas decimais. Se quisermos forar o aparecimento de zeros quando no tiver nmero 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 tambm para formatao de nmeros sem casas decimais: Print Format(45,0000) Valor Impresso: 0045 Se quisermos uma formatao diferente para nmeros negativos, basta colocar essa formatao aps 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 formatao de valores numricos: 0 Exibe um dgito ou um zero. Se a expresso tiver um dgito na posio em que o 0 aparece na seqncia de caracteres de formato, ele ser exibido; caso contrrio, exibido um zero nessa posio. Se o nmero possui um nmero de dgitos inferior ao de zeros (em qualquer lado da casa decimal) na expresso de formato, exibe zeros esquerda ou direita. Se o nmero tiver mais dgitos direita do separador decimal do que zeros direita do separador decimal na expresso de formato, arredonda o nmero para tantas casas decimais quantos forem os zeros existentes. Se o nmero tiver mais dgitos esquerda do separador decimal do que zeros esquerda do separador decimal na expresso de formato, exibe os dgitos a mais sem modificaes. # Exibe um dgito ou nada. Se a expresso tiver um dgito na posio em que o smbolo # aparece na seqncia de caracteres de formato, ele ser exibido; caso contrrio, nada ser exibido nessa posio. Este smbolo funciona como o espao reservado para o dgito 0, mas os zeros esquerda e direita no so exibidos se o nmero tiver a mesma 180
Comandos Condicionais e de Lao quantidade ou menos dgitos do que existem # caracteres em qualquer um dos lados do separador decimal na expresso de formato. . Espao reservado para decimal Para algumas localidades, usada uma vrgula como separador decimal. O espao reservado para decimal determina quantos dgitos so exibidos esquerda e direita do separador decimal. Se a expresso de formato contiver apenas sinais de nmeros esquerda deste smbolo, os nmeros inferiores a 1 comeam com um separador decimal. Se voc quiser que um zero esquerda seja sempre exibido com nmeros fracionrios, use 0 como o primeiro espao reservado para dgito esquerda do separador decimal. O caractere real utilizado como espao reservado para decimal na sada formatada depende do Formato Numrico reconhecido pelo sistema. % Espao reservado para porcentagem A expresso multiplicada por 100. O caractere de porcentagem (%) inserido na posio onde ele aparece na seqncia de caracteres de formato. , 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 nmero que tenha quatro ou mais casas esquerda do separador decimal. O uso padro do separador de milhar especificado no formato que contm um separador de milhar delimitado por espaos reservados de dgito (0 ou #). Dois separadores de milhar adjacentes ou um separador de milhar imediatamente esquerda do separador decimal (sendo ou no especificado um decimal) significa "aplique uma escala ao nmero dividindo-o por 1000 e arredonde-o conforme necessrio." Use essa tcnica para aplicar escalas a nmeros extensos. Por exemplo, a seqncia de caracteres de formato "##0,," pode ser usada para representar 100 milhes como 100. Nmeros inferiores a 1 milho so exibidos como 0. Dois separadores de milhar adjacentes em qualquer posio que no seja a imediatamente esquerda do separador decimal sero considerados apenas como especificao do uso de um separador de milhar. O caractere real utilizado como o separador de milhar na sada formatada depende do Formato Numrico reconhecido pelo sistema. E- E+ e- e+ Formato cientfico Se a expresso de formato contiver pelo menos um espao reservado para dgito (0 ou #) direita de E-, E+, e- ou e+, o nmero exibido em formato cientfico, sendo E ou e inserido entre o nmero e seu expoente. O nmero de espaos reservados para dgito direita determina o nmero de dgitos do expoente. Use E- ou e- para incluir um sinal de subtrao (-) ao lado 181
Lionardo@base.com.br
de expoentes negativos. Use E+ ou e+ para incluir um sinal de subtrao ao lado de expoentes negativos e um sinal de adio (+) ao lado de expoentes positivos. - + $ ( ) space Exibe um caractere literal Para exibir uma caractere diferente dos listados, preceda-o com uma barra invertida (\) ou coloque-o entre aspas (" "). \ formato Muitos caracteres da expresso de formato tm um significado especial e no podem ser exibidos como caracteres literais a menos que sejam precedidos por uma barra invertida. A barra propriamente no exibida. Sua utilizao equivale a colocar o caractere seguinte entre aspas. Para exibir uma barra invertida, use duas barras invertidas (\\). Exemplos de caracteres que no podem ser exibidos como caracteres literais so caracteres de formatao de data e hora (a, c, d, h, m, n, p, q, s, t, w, y e /:), caracteres de formatao numrica (#, 0, %, E, e, vrgula e ponto) e os caracteres de formatao de seqncias de caracteres (@, &, <, >, e !). "ABC" Exibe a seqncia de caracteres que est entre aspas. Para incluir uma seqncia de caracteres em Format a partir do cdigo, voc deve usar Chr(34) para delimitar o texto (34 cdigo de caractere para aspas). Usamos tambm como argumento na formatao de expresses numricas algumas palavras-chave que correspondem a algum tipo de formato padro. General Number : Exibe o nmero na forma em que se encontra, sem separadores de milhar. Print Format(123456.7, "General Number") Valor Impresso: 123456,7 Currency : Exibe o nmero com o separador de milhar, se apropriado; exibe dois dgitos direita do separador de casa decimal. Note que a sada baseada nas configuraes do Painel de Controle. Print Format(123456.7, "Currency") Valor Impresso: R$123.456,70 Exibe o caractere seguinte da seqncia de caracteres de
182
Comandos Condicionais e de Lao Fixed : Exibe pelo menos um dgito esquerda e dois dgitos 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 nmero com o separador de milhar, pelo menos um dgito esquerda e dois dgitos direita do separador de casa decimal. Print Format(123456.7, "Standard") Valor Impresso: 123.456,70 Percent : Exibe o nmero multiplicado por 100 com um sinal de porcentagem (%) anexado direita; sempre mostra dois dgitos direita do separador de casa decimal. Print Format(123456.7, "Percent") Valor Impresso: 12345670,00% Print Format(1, "Percent") Valor Impresso: 100,00% Scientific : Usa a notao cientfica padro. Print Format(123456.7, "Scientific") Valor Impresso: 1,23E+05
183
Lionardo@base.com.br
184
Lionardo@base.com.br
w Exibe o dia da semana como um nmero (1 para domingo at 7 para sbado). ww Exibe a semana do ano como um nmero. Print Format("01/08/96","ww") Valor Impresso: 31 m Exibe o ms como um nmero sem zeros esquerda. Se m vier imediatamente depois de h ou hh, exibido o minuto em lugar do ms. Print Format("01/08/96","m") Valor Impresso: 8 mm Exibe o ms como um nmero com zeros esquerda. Se m vier imediatamente depois de h ou hh, exibido o minuto em lugar do ms. Print Format("01/08/96","mm") Valor Impresso: 08 mmm Exibe o ms como uma abreviado em trs letras. Print Format("01/08/96","mmm") Valor Impresso: Ago mmmm Exibe o ms como um nome completo. Print Format("01/08/96","mmmm") Valor Impresso: Agosto q Exibe o trimestre do ano como um nmero. Print Format("01/08/96","q") Valor Impresso: 3 y Exibe o dia do ano como um nmero. Print Format("01/08/96","y") Valor Impresso: 214 yy Exibe o ano como um nmero de dois dgitos. Print Format("01/08/96","yy") Valor Impresso: 96 yyyy Exibe o ano como um nmero de quatro dgitos. Print Format("01/08/96","yy") Valor Impresso: 1996 h 186 Exibe a hora como um nmero sem zeros esquerda.
Comandos Condicionais e de Lao Print Format("09:13:55","h") Valor Impresso: 9 hh Exibe a hora como um nmero com zeros esquerda. Print Format("09:13:55","h") Valor Impresso: 09 n Exibe o minuto como um nmero sem zeros esquerda. nn Exibe o minuto como um nmero com zeros esquerda. s Exibe o segundo como um nmero sem zeros esquerda. ss Exibe o segundo como um nmero com zeros esquerda. t t t t t Exibe uma hora como uma hora completa (inclusive hora, minuto e segundo), formatada usando o separador de hora definido pelo formato de hora reconhecido pelo sistema. Print Format(now,"ttttt") Valor Impresso: 23:17:27 Usando estes caracteres especiais podemos formatar uma data de vrias 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 relao das palavras-chaves aceita pela funo Format para expresses de data e hora: General Date : Exibe a data e a hora nos formatos estabelecidos nas configuraes do Windows. Caso a expresso seja somente uma data, ser exibido Print Format(now,"general date") Valor Impresso: 01/08/96 23:21:25 Print Format("01/08/96","general date") Valor Impresso: 01/08/96 Print Format("09:24:11","general date") Valor Impresso: 09:24:11 Long Date : Exibe uma data de acordo com o formato por extenso de data de seu sistema. Print Format("01/08/96","Long Date") 187
Lionardo@base.com.br
Valor Impresso: Quinta-feira, 1 de Agosto de 1996 Medium Date : Exibe uma data usando o formato mdio de data apropriado para a verso 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("09:24:11","Long Time") Valor Impresso: 09:24:11 Medium Time : Exibe uma hora no formato 12 horas usando horas e minutos e a designao AM/PM. Print Format("09:24:11","Medium Time") Valor Impresso: 09:24 AM Short Time : Exibe uma hora usando o formato 24 horas. Print Format("09:24:11","Short Time") Valor Impresso: 09:24
188
Altere a propriedade AutoSize dos labels para True e digite a seguinte codificao:
Lionardo@base.com.br
& Exibe um caractere ou nada. Se a seqncia de caracteres tem um caractere na posio em que & aparece, ele ser exibido; caso contrrio, nada ser exibido. Os espaos reservados so preenchidos da direita para a esquerda a menos que exista um caractere ! na seqncia de caracteres de formato. Veja abaixo. ! Fora preenchimento da esquerda para a direita dos espaos reservados. O preenchimento padro feito da direita para a esquerda. < > Exibe todos os caracteres no formato de minsculas. Exibe todos os caracteres no formato de maisculas.
190
EXERCCIOS PROPOSTOS
1 - Mostre a diferena entre as funes matemticas FIX e INT:
2 - Para converter uma varivel para o tipo Data usamos qual funo?
3 - Para converso de uma varivel numrica para o formato String (texto) usamos qual funo? 4 - Caso necessitamos de converter uma expresso string INFORMATICA para informatica usamos qual funo? Exemplifique:
6 - Para saber o intervalo entre a data 27/08/96 e 31/12/96 em: Quantidade de dias: Quantidade de meses: Quantidade de semanas: 7 - Para extrair o dia de uma data usamos qual funo?
8 - Mostre a finalidade das funes: NOW: DATE: TIME: 9 - Mostre a sintaxe completa das funes que: a) Extrai da frase Editora Terra a expresso Terra: 191
Lionardo@base.com.br
10 - Mostre como ficaria a codificao de um programa que criasse uma matriz chamada MESES cujo contedo fosse os meses de Janeiro a Dezembro:
11 - Considerando que: A = Editora B = Grfica C = Editora D = IIF(A=B, Igual, Diferente) E = IIF(A=C, Igual, Diferente) F = IIF(C=B, Igual, Diferente) QuaL o contedo das variveis D, E e F?
12 - Descreva a finalidade das Funes: Isdate: Isempty: Isnumeric: 13 - Desenvolva um programa que tenha no formulrio uma caixa de texto para o usurio digitar um numero de 0 a 5 e crie um evento Change cuja codificao a seguinte: Print Choose(Text1.text, Zero,Um, Dois,Trs,Quatro,Cinco) Descreva o que o programa far:
192
MSGBOX:
Data e Hora:
String:
193
195
Lionardo@base.com.br
196
11.1.1
Caractersticas
Um arquivo que contm dados ir possuir a extenso MDB. Exemplo: Se temos um banco de dados de um controle de estoque possivelmente ele ter o nome de Estoque.MDB. Dentro de um arquivo deste podemos ter vrias 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 sero armazenado os dados. Por exemplo, na tabela Mercadoria temos o campo de Descrio da Mercadoria, Quantidade no Estoque, Valor de Venda, etc. Tudo isto representa os Campos que esto armazenados dentro da tabela. Dentro dos Campos que esto os dados que precisamos armazenar. Veja a disposio da hierarquia:
BANCO DE DADOS Estoque.MDB
TABELA: Mercadoria
TABELA: Fornecedor
TABELA: Cliente
197
Lionardo@base.com.br
Quando estamos na fase de desenvolvimento de um programa que ir gerenciar um banco de dados, podemos deixar j criado o Banco de Dados com suas tabelas e campos. Somente os Dados que sero inseridos pelo usurio na medida que for trabalhando com seu programa. Para criar um banco de dados o Visual Basic traz uma ferramenta chamada Visual Data Manager. Ele se encontra no menu ADD-INS.
11.1.2
No Menu File usaremos duas opes de grande importncia para nosso estudo: New Database para criao 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 opo New. Pode-se criar Bancos de Dados de vrios tipos, como Access, Dbase, FoxPro, etc. Mas o Visual Basic tem como padro o Microsoft Access que cria arquivos com extenso MDB. Escolha ento 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. No necessrio colocar a extenso pois o tipo de arquivo, por padro, j MDB.
198
A prxima janela que ir aparecer a que gerncia as tabelas. Para criarmos uma nova tabela s apertar o boto da direita do mouse em "Propriedades" e acionar a opo NEW TABLE.
Ir aparecer outra janela onde nomeamos a tabela e criamos os campos que esta tabela ter:
199
Lionardo@base.com.br
Table Name: Nome da Tabela, obedecendo as mesmas regras impostas para nomeao de variveis, ou seja, no comear no nmeros, no conter espaos, no usar smbolos 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 boto "Add Field". Vai aparecer a seguinte janela:
200
Usamos essa janela para criar todos os campos da tabela. Name: Nome do Campo. Digite: Descrio Type: Uma caixa de combinao onde escolhemos o tipo de dado que ter este campo. Usamos as mesmas regras para tipo de varivel (veja o captulo sobre variveis). Text: Textos e nmeros, como nomes e endereos, nmeros de telefone e cdigos postais. Um campo de texto pode conter de 0 a 255 caracteres. Voc deve definir a propriedade Size com a extenso mxima de seu texto, ao declarar um campo como sendo do tipo Text. Memo: Textos e nmeros extensos, como comentrios ou explicaes. O tamanho de um campo Memo limitado pelo tamanho mximo do banco de dados. Date/Time : Datas e horas. Currency : Utilizado quando um campo contm valores monetrios.Os nmeros direita da parte decimal so arredondados durante os clculos. O tipo de dados Currency mantm um nmero fixo de dgitos direita da parte decimal. Boolean : Yes/No, True/False, On/Off ou campos que contm apenas um valor, entre dois. Binary : Objetos criados em outros programas usando o protocolo OLE. Pode ser Qualquer valor que possa ser expresso em binrios com at 1.2 gigabytes de tamanho. Este tipo utilizado para armazenar figuras, arquivos ou outros dados binrios no processados. Byte: Valores positivos de 0 a 255. Armazenado em variveis tipo Byte. 201
Lionardo@base.com.br
Integer : Valores de 32.768 a +32.767. Armazenado em variveis tipo Integer. Long : 2.147.483.648 a 2.147.483.647 (cerca de 2.1 GB). Armazenado em variveis tipo Inteiro Long. Single : 3,402823E38 a 1,401298E45 para nmeros negativos e 1,401298E45 a 3,402823E38. Armazenado em variveis tipo Single. Double : 1,79769313486232E308 a 4,94065645841247E324 para valores negativos e 4,94065645841247E324 a 1,79769313486232E308 para valores positivos. Armazenado em variveis tipo Double. Escolha para nosso exemplo o tipo Text Size : Tamanho definido para o campo. Se colocamos 2 para o campo, poder ser digitado somente 2 caracteres. Esta opo liberada somente para o tipo Text. Digite 30
FixedField:Campo Fixo VariableField: Campo Varivel, que o padro. AllowZeroLength: Permitir comprimento zero, ou seja, quando esta opo esta selecionada o campo aceita (""). Se esta opo no tiver habilitada e o usurio tentar gravar um campo que no tenha nada digitado (como um daado no-obrigatrio no programa) ocorrer um erro em tempo de execuo. Required: Quando esta opo esta marcada o campo se torna obrigatrio, ou seja, necessrio informar valores para o campo, seno ocorre erro em tempo de execuo. DefaultValue: Quando temos um campo que no pode ficar vazio, sempre interessante digitar algo aqui nesta opo, pois os valores que 202
Comandos Condicionais e de Lao informarmos como DefaultValue ser armazenado para o campo quando nada for digitado pelo usurio. Por Exemplo, existe um campo valor obrigatrio, mas o usurio no digitou nada neste local, ento no momento da gravao o programa grava automaticamente a expresso especificada no DefaultValue. Aperto o boto "OK" para gravar o campo e continue inserindo outros campos como na tabela abaixo: Field Name Quantidade Valor Cdigo Data Type Integer Currency Text Size N/A N/A 3
Geralmente se usa colocar o cdigo no inicio. Se quiser mov-lo para cima s colocar "0" no tem OrdinalPosition. Veja como ficar depois de pronto:
Aperte o boto Build The Table para que a tabela seja gravada e inserida no banco de dados.
203
Lionardo@base.com.br
O nome da tabela "Mercadoria" agora j aparece dentro da janela "Database Windows", se clicarmos com o boto 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 CdCliente Nome LimiteCrdito Tabela: Vendas Field Name Cdigo CdCliente ValorVenda QuantidadeVendida
Size 3 30 N/A
204
Criamos uma tabela Vendas onde ser lanado o cdigo 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.
11.1.3
Criando indices
Usamos ndices nas tabelas para melhorar a performance do acesso durante uma determinada procura. Quando criamos um ndice o Visual Basic faz uma ordenao lgica da tabela atravs de uma chave composta por um ou mais campos. Se precisamos ordenar uma tabela por cdigo para que a procura de um determinado dado digitado seja feita pelo cdigo de maneira mais rpida, ento indexamos a tabela pelo campo que possui o cdigo. Se precisamos colocar uma relao de clientes em ordem alfabtica pelo nome digitado, ento indexamos a tabela pelo campo que possui o nome do cliente. No nosso exemplo, durante a digitao de novos clientes e novas mercadorias, devemos ficar atentos para no cadastrar dois clientes com o mesmo cdigo ou duas mercadorias com o mesmo cdigo. Para verificar isto, sempre que o usurio digitar uma nova mercadoria o programa deve fazer uma procura nas mercadorias j cadastradas para saber se aquele novo cdigo que o usurio digitou j existe ou no. Ento, se temos que fazer uma procura rpida por cdigo ser necessrio indexar a tabela Mercadoria pelo campo Cdigo. O Visual Basic ento ordenar logicamente a tabela pelo cdigo de forma ascendente, e sempre que uma nova mercadoria for cadastrada ela ser automaticamente inserida de forma ascendente dentro da tabela. 205
Lionardo@base.com.br
Para se criar um ndice podemos usar tambm o Visual Data Manager atravs do Design, onde ser apresentado novamente a estrutura que se criou da tabela. Use o boto "Add Index" para adicionar indices.
Name: O nome do indice. Atravs deste nome que ativaremos o indice em nosso programa. Available Fields: Neste ListBox aparece a relao de campos que nossa tabela contm. 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 ento um indice com o nome de "IndCdigo" e selecione o campo CdCliente. Marque a caixa de verificao Primary Index, habilite tambm a propriedade Unique e click o boto OK. Unique informa ao Visual Basic que a chave do indce 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 206
Comandos Condicionais e de Lao combinao de valores de todos os campos indexados precisa ser nica. Os campos que compe a chave de ndice no so necessariamente nicos. Primary Index indica que um objeto Index representa um ndice primrio para uma tabela. Um ndice primrio 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 primrio consistir de mais de um campo, cada campo pode conter valores duplicados mas as combinaes de valores de todos os campos indexados devem ser nicas. Um ndice primrio consiste em uma chave para a tabela e geralmente contm os mesmos campos da chave primria. Faa a mesma coisa para a tabela de mercadoria. O nome do indice tambm pode ser IndCdigo. Para a tabela de Vendas nomeie o indice como indClienteMercadoria e defina para chave de ndice os campos CdCliente e Cdigo nesta ordem: 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 "Estoque.Mdb" (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 criao do banco de dados, as tabelas, os ndices, etc.; mas para manipular os dados, como incluir, alterar, consulta, excluso e relatrios devemos desenvolver um programa para isto dentro do Visual Basic.
207
Lionardo@base.com.br
Abertura do Banco de Dados e suas tabelas Adicionar Navegao Alterao Consulta Excluso
208
209
Lionardo@base.com.br
210
Comandos Condicionais e de Lao No menu "Project" do Visual Basic click na opo "AddForm" para inserirmos um novo formulrio em nosso projeto. Ser o formulrio para cadastramento de mercadoria.
Neste novo formulrio 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: txtCdigo, txtDescrio, txtQuantidade e txtValor. 211
Lionardo@base.com.br
Coloque tambm 7 botes de comando no formulrio como na. Para nomea-los use os Captions de cada um prefixado com cmd: Importante: Coloque a propriedade TabIndex do Boto "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 necessrio ligar este formulrio ao menu mnuMercadoria. Para fazer isto vamos at o menu localizado no frmEstoque, click no Cadastro para abrir as opes. D dois clickes na opo Mercadoria que uma janela de codificao ser aberta. Digite:
O Mtodo Show abre um novo formulrio a partir de outro, e usamos ele para abrir o formulrio frmCadMercadoria. Vamos aproveitar e codificar a opo Sair do menu tambm. D dois clicks nele e digite:
Este simples comando END encerra toda a aplicao fechando todas as janelas que podem estar abertas. Para completar este raciocnio, vamos at o formulrio frmCadMercadoria e para o boto cmdSair vamos fazer a seguinte codificao:
212
O Comando Unload retira a janela informada da memria e da tela, voltando a execuo do programa para a janela anterior, que no nosso caso o menu principal. Agora estamos prontos para comear a codificar o nosso Banco de Dados.
12.1.1
Uma vez que vamos trabalhar com manipulao de dados, temos que verificar se o Visual Basic est apto para fazer esta manipulao. Os servios necessrios para executar essas funes esto em uma DLL do Microsoft DAO 3.5 Object Library. Para que nosso programa leia essa DLL temos que ir at o menu Project/References e selecionar esta DLL:
213
Lionardo@base.com.br
Se este ajuste no 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 programao que precisaremos usar para gerncia os Bancos de Dados. Temos que criar agora duas variveis do tipo Banco de Dados e outra do tipo Tabela. Uma servir para fazer referncia ao nome e caminho do Banco de Dados como um todo, e a outra ir fazer referncia a uma tabela especifica. Onde criar estas variveis? No nosso exemplo temos que cri-las na seo General da janela de codificao do formulrio. Variveis criadas ali possuem abrangncia em todo o formulrio. Se criarmos ela dentro de alguma outra rotina (ou vento) a abrangncia destas variveis sero somente dentro da prpria rotina.
A varivel BancoDeDados do tipo Database pois ela sempre ter em seu contedo o nome do banco de dados que ser aberto. Depois criamos uma varivel para a tabela de Mercadoria de nome TBMercadoria. O Objeto Recordset a representao lgica de uma tabela. Usaremos este objeto para manipular todos os dados da tabela. Veja as principais propriedades de um Recordset (somente manipulados na codificao do programa): Sintxe: NomeDoRecordSet.Propriedade 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 criao 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. 214
Comandos Condicionais e de Lao NoMatch : Retorna True se uma pesquisa efetuada dentro da tabela foi bem-sucedida. PercentPosition : Retorna um percentual referente a posio que a tabela se encontra com comparao com o total de registros da tabela. RecordCount : Retorna a quantidade de registro que uma tabela possui. Os principais mtodos usamos pelo Recordset: AddNew : Prepara a tabela para receber um novo registro. Close : Fecha a tabela, e conseqentemente o objeto recordset. Delete : Remove a registro atual da tabela. Edit : Prepara a tabela para que o registro corrente seja alterado. FindFirst <Condio> : Procura o primeiro registro dentro da tabela que satisfaa a condio estabelecida (Somente para objeto Recordset tipo dynaset ou snapshot). FindLast <Condio> : Procura o ultimo registro dentro da tabela que satisfaa a condio estabelecida (Somente para objeto Recordset tipo dynaset ou snapshot). FindNext <Condio > : Procura o prximo registro dentro da tabela que satisfaa a condio estabelecida (Somente para objeto Recordset tipo dynaset ou snapshot). FindPrevious <Condio> : Procura o registro anterior dentro da tabela que satisfaa a condio estabelecida (Somente para objeto Recordset tipo dynaset ou snapshot). MoveFirst : Move a tabela para o primeiro registro. MoveLast : Move a tabela para o ultimo registro. MoveNext : Move a tabela para o seguinte seguinte. MovePrevious : Move a tabela para o registro anterior. Seek <Operador de Comparao>,<Item a Procurar> : Localiza um registro dentro da tabela. A tabela tem que estar indexada. (Somente para objeto Recordset tipo table) Update : Grava as alteraes e incluses na tabela. O prximo passo ser abrir o banco de dados e abrir a tabela de mercadoria. Para fazer isto selecione o formulrio frmCadMercadoria e abra a janela de codificao dele criando um evento chamado FORM_LOAD. Este evento chamado sempre que este formulrio chamado pelo Windows.
215
Lionardo@base.com.br
Associamos a varivel BancoDeDados ao mtodo OpenDatabase, que vai realmente abrir o arquivo na prtica. Uma vez aberto ao arquivo, sempre que fizermos referncia a ele usaremos a varivel BancoDeDados. Na abertura do arquivo usados o Objeto App.Path que retorna o nome do diretrio corrente, onde esta localizado o arquivo pretendido. Depois concatenamos este diretrio com o nome do arquivo a ser aberto. Para abrir a tabela usamos o mtodo 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 necessrio antes do mtodo 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 disponvel para uso o banco de dados Estoque e sua tabela Mercadoria.
12.1.2
Abrindo um indice
Prximo passo abrir o ndice que esta tabela ir trabalhar. Este ndice necessrio para ordenar os dados que forem digitados num determinada ordem (no nosso caso a ordem por cdigo) e fazer uma procura rpida pela chave de indexao. O ndice da tabela Mercadoria o IndCdigo e possui como chave de indexao o campo Cdigo.
Usamos a propriedade Index para TBMercadoria e determinamos que o ndice corrente ser IndCdigo. 216
12.1.3
extremamente importante Fechar todas tabelas e banco de dados toda vez que sairmos de um programa ou formulrio. Arquivos abertos perigoso e pode trazer resultados indesejveis. Para fecharmos com segurana um banco de dados usamos o Evento do objeto Formulrio chamado Unload. Este evento chamado sempre que o formulrio retirado da tela (e da memria). Note que este evento o contrrio do evento Load, que lido quando o formulrio colocado na tela. Porque no podemos fechar os arquivos de Banco de Dados no evento click do boto Sair? Por que o usurio pode querer inventar de sair deste formulrio usando outros recursos do Windows que no seja o boto sair, como a opo Fechar do Control Box, Alt-F4, etc. Para no correr risco colocamos o fechamento no evento Unload.
Fechamos primeiro a tabela Mercadoria representada pela varivel TBMercadoria e depois o banco de dados Estoque representada pela varivel BancoDeDados. Ambas usaram o mtodo Close.
12.1.4
Cuidados especiais
Algo que extremamente importante no desenvolvimento de qualquer programa tentar prever o mximo possivel de erros que o usurio pode cometer e tentar previni-los. Imagine a situao: o usurio esta no meio de uma incluso e resolver apertar a tecla excluir ou alterar, sendo que nem terminou a incluso. Ou ento esta numa alterao e resolve apertar o boto alterar novamente. Para podermos tentar cercar esses erros usamos a propriedade Enabled nos botes. Quando o usurio estiver numa incluso somente os botes Gravar e Cancelar deve estar habilitado. Ou seja, ou o usurio confirma o que esta fazendo ou cancela. Se esta numa alterao a mesma coisa ocorre. E assim por diante. Para fazermos isto temos que usar o Enabled em cada boto como veremos abaixo: 217
Lionardo@base.com.br
Fazendo isto quando o usurio apertar o boto incluir, os botes que ele no pode pressionar enquanto no concluir a incluso ficaro desabilitados. Deve-se fazer isto para todos os botes.
Na alterao o mtodo semelhando a incluso. Durante a alterao o usurio s ter liberado para ele os botes "Gravar" e "Sair". 218
No evento click do boto gravar habilite todos novamente. Com exceo do prprio boto gravar que no pode ser habilitado ate que se incluia ou altere algo. Outro detalhe que bom lembrar desabilitar o boto Gravar no evento Form_Load para que esteja devidamente desabilitado quando entrar na janela de cadastro de mercadoria. Desabilitamos tambm o Frame, pois assim todos os objetos contido dentro dele sero tambm desabilitados. Fazemos isto para que o usurio no fique "passeando" pelas caixas de texto sem definir antes (atravs dos botes) o que ele quer fazer.
Uma formatao para as caixas de texto que receber numeros bem vindo para dar um aspecto visual mais interessante.
219
Lionardo@base.com.br
Criamos uma formatao para as caixas de texto no evento LostFocus para quando o usurio terminar de digitar o valor se ajustar. Habilitamos a tecla Enter criando um evento KeyPress no formulario. No esquecer de habilitar a propriedade KeyPreview .
12.1.5
Funes de apoio
Para que nosso programa de cadastro tenha um cdigo mais limpo e de fcil entendimento vamos criar algumas funes que sero teis em nossa programao. Para criar essas funes chame a janela de codificao, selecione TOOLS no menu principal do Visual Basic, e escolha a opo Add Procedure...
220
Nomeia a funo que estamos criando de AtualizaCampos, coloque do tipo Function e o Scope (abrangncia) Private. Com isto, estamos criando uma funo que poder ser usada somente no formulrio corrente. Ao clicar em Ok ser aberta uma janela de codificao para podermos digitar o que a funo ira conter:
A finalidade desta funo inserir o contedo existente nas caixas de textos do formulrio para dentro dos campos da tabela de mercadoria. 221
Lionardo@base.com.br
Com isto, sempre que precisarmos gravar os dados que o usurio digitou no formulrio para dentro de seus respectivos campos na tabela usamos a funo AtualizaCampos. Repita o processo para criar agora a funo AtualizaFormulrio:
Note que o AtualizaFormulrio faz o caminho inverso: Descarrega os dados existente na tabela de seus respectivos campos para dentro das caixas de texto existente no formulrio. Por fim, vamos criar uma funo para limpar as caixas de texto. D o nome de LimpaFormulrio:
Vamos usar esta funo sempre que precisarmos que as caixas de texto fiquem vazias.
Comandos Condicionais e de Lao Outra modificao ser efetuada no evento Form_Load do formulrio frmCadMercadoria:
Quando uma tabela aberta o Visual Basic se posiciona no primeiro registro existente dentro dela. Entretanto, quando ainda no existe nada digitado dentro da tabela, conseqentemente no 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 no. 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 posio do registro atual for posterior ao ltimo registro da tabela, ou seja, se o fim do arquivo for localizado, e False se a posio do registro atual for no ltimo registro ou anterior a ele. O Visual Basic possui tambm a propriedade BOF para informar se o inicio do arquivo foi encontrado. A propriedade BOF retorna True se a posio do registro atual for anterior ao primeiro registro e False se a posio do registro atual estiver no primeiro registro ou for posterior a ele. Os valores de retorno das propriedades BOF e EOF so determinados pela localizao do indicador do registro atual. Podemos usar as propriedades BOF e EOF para determinar se um objeto Recordset contm registros ou se voc foi alm dos limites de um objeto Recordset ao percorrer seus registros. 223
Lionardo@base.com.br
Perceba que somente se EOF for False que atualizamos o formulrio, pois caso contrrio, no poderamos atualizar o formulrio pois no haveria dados a serem atualizados. O primeiro boto que vamos codificar o incluir. Ele funcionar da seguinte forma: Quando clicarmos nele as caixas de textos sero limpas e o mtodo AddNew ser acionado. Este mtodo usado para avisar tabela que alguns dados sero includos. 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 o mtodo Updated para efetuar a gravao propriamente dita e atualizar a tabela com os novos campos. Veja um exemplo: TBMercadoria.AddNew TBMercadoria("Cdigo") = 001 TBMercadoria("Descrio") = Cala Jeans TBMercadoria("Quantidade") = 12 TBMercadoria("Valor") = 100 TBMercadoria.Updated Esta rotina o padro para incluso de dados.Repare que sempre inicia com AddNew e termina com Updated Neste exemplo colocamos expresses string para serem inseridas nos campos, mas poderiamos ter colocado variveis. No nosso exemplo vamos colocar as caixas de texto. Ficaria assim: TBMercadoria.AddNew TBMercadoria("Cdigo") = txtCdigo TBMercadoria("Descrio") = txtDescrio TBMercadoria("Quantidade") = txtQuantidade TBMercadoria("Valor") = txtValor TBMercadoria.Updated Desta forma o que o usurio digitar nas caixas de texto sero includos dentro dos campos da tabela. Isto uma forma simplificada de fazer incluso de dados. Mas ns vamos usar um forma mais complexa: 224
Veja o que foi feito: Sempre que o usurio clicar neste boto o programa limpa o formulrio 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 txtCdigo pois a primeira que deve ser digitada pelo usurio Ainda no aplicamos o mtodo AddNew pois ainda no sabemos se o usurio vai incluir um cdigo vlido. Primeito o programa tem que analizar o cdigo que ele digitou, verificar se ele realmente no existe para depois usar o mtodo AddNew. Fazemos isto no evento LostFocus da Caixa de Texto txtCdigo. Neste evento verificamos primeiramente se o boto CmdGravar esta habilitado. Se estiver porque a incluso foi acionada. O programa procura o cdigo digitado. Se ele existir sera dado um aviso ao usuario e o processo de incluso ser cancelado, caso contrrio (ou seja, se o cdigo no existir dentro da tabela) o mtodo AddNew chamado a fim de preparar a tabela para receber um novo registro.
225
Lionardo@base.com.br
Pronto, a janela j esta preparada para receber os dados. Mas agora falta fazer a codificao para o boto Gravar.
226
Comandos Condicionais e de Lao Atualizamos os campos da tabela com os dados digitado nas caixas de textos e depois chamamos o mtodo Update que far a gravao fisica dentro do banco de dados. Tente incluir vrios dados na tabela para podermos us-los posteriormente nos prximos exerccios. Um recurso interessante que pode ser acrescentado desabilitar os botes de Alterao, Consulta , Excluso, Anterior e Prximo quando a tabela estiver vazia, pois se no houver nenhum registro, no vai haver nada para alterar, consultar, excluir, etc. Somente o boto de incluso que poder ficar habilitado. A maneira mas usual de saber se a tabela esta vazia ou no atravs da propriedade RecordCount que infoma quantos registros existem gravados dentro da tabela.
227
Lionardo@base.com.br
O boto Prximo ir mostrar na tela o prximo registro existente. Note que para fazer este movimento usamos a propriedade MoveNext (mova para o prximo), 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 no pode passar pois no encontrar nada. Encontrando ento o ultimo registro, se tentar passar dali a propriedade MovePrevious (move para o anterior) acionado. Depois disto atualizamos o formulrio. O boto Anterior possui a mesma lgica, mas invertemos as outras propriedades para fazer agora o teste de inicio de arquivo. Ou seja, se o usurio estiver no primeiro registro ele no poder voltar um registro, pois antes do primeiro no existira nada. Se voc usar MoveNext quando o ltimo registro for o atual, a propriedade EOF ser configurada para True e no 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 movimentao segue o ndice atual. Voc pode definir o ndice atual usando a propriedade Index. Se voc no configurar o ndice atual, a ordem de registros retornados ser indefinida.
12.4 ALTERAO
Para alterao vamos fazer algo semelhante ao que fizemos na incluso. A diferena ficar numa propriedade nova para ns que EDIT. Esta 228
Comandos Condicionais e de Lao propriedade abre a tabela para que o dado que esta sendo alterado seja editado. Note que no liberamos a caixa de texto txtCdigo para alterao, pois sendo ela a chave de ndice, no pode ser alterada. Quando necessitar de alterao no cdigo, ele deve ser excludo e includo novamente.
12.5 CONSULTA
Para consulta vamos usar a funo INPUTBOX. Aprendemos a us-la nos captulos anteriores. Ela solicita ao usurio a digitao de algum dado e armazena numa determinada varivel. Ento criamos uma varivel de nome ProcuraCdigo e usamos ela para receber o que o usurio digitar.
Feito isto, usamos o mtodo Seek para efetuar uma procura dentro da tabela. Seek: Localiza o registro de um objeto Recordset tipo table indexado que satisfaa os critrios especificados para o ndice atual e torna esse registro o registro atual. Aps o Seek colocamos um sinal de comparao para determinar o tipo de procura que este mtodo fara. Podemos usar = ,<, >, <=, >=, etc O mtodo Seek pesquisa os campos-chave especificados e localiza o primeiro registro que satisfaa os critrios especificados na comparao dentro da chave de ndice. Uma vez encontrado, esse registro torna-se o registro atual e a propriedade NoMatch definida como False. Se o mtodo Seek falhar em localizar um registro correspondente, a propriedade NoMatch configurada como True e o registro atual indefinido. 229
Lionardo@base.com.br
Se comparao for igual (=), maior ou igual a (>=) ou maior do que (>), o Seek comea a pesquisa no incio do ndice. Se comparao for maior do que (<) ou maior ou igual a (<=), o Seek comea a pesquisa no final do ndice e continua em direo ao incio a menos que existam entradas de ndice duplicadas no final. Neste caso, Seek comea por uma entrada arbitrria entre as entradas de ndice duplicadas no final do ndice. Quando informamos uma chave para o mtodo 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 Cdigo, ento o Seek somente faz a procura pelo cdigo. No podemos pedir para procurar pela Descrio da mercadoria, pois para isto deveria existir um ndice para descrio. Em nosso exemplo se NoMatch for True (ou seja, se no encontrou nenhum registro que seja igual ao contedo da varivel ProcuraCdigo) movemos para o registro anterior e depois o formulrio atualizado. Fazemos isto pois quando uma procura no bem sucedida a tabela posicionada no fim de arquivo, e como no existe nenhum registro nesta posio, movimentamos para um registro antes, onde o ultimo registro includo se encontra. Quando clicarmos no boto Consultar uma janela como a que esta abaixo aparecer no video:
Digitamos o cdigo que queremos procurar e ao clicar Ok a busca iniciada. Se no encontrar uma mensagem ser apresentada:
12.6 EXCLUSO
230
Quando se ai deletar algo bom solicitar ao usurio uma confirmao, pois a deleo acidental pode causar resultados catastrficos. Ento bom que o usurio tenha certeza do que esta fazendo. Quando usamos a propriedade Delete o registro atual (aquele que esta aparecendo no vdeo) excludo da tabela. Mas para a tela no ficar vazia (uma vez que aquele registro que estava l foi eliminado) usamos a procedure cmdAnterior_click que a rotina que usamos quando o boto anterior acionado. Fazemos isto para posicionar a tabela no registro anterior ao que foi deletado e mostr-lo na tela. Desta forma a tela no fica vazia. Em nosso programa podemos localizar um registro com a consulta ou atravs dos botes Anterior e Prximo. Localizando podemos clicar no boto Excluir que o registro desaparece.
231
Lionardo@base.com.br
Option Explicit Dim BancoDeDados As Database Dim TBCliente As Recordset Private Sub cmdAlterar_Click() cmdIncluir.Enabled = False cmdAlterar.Enabled = False cmdConsultar.Enabled = False cmdExcluir.Enabled = False cmdAnterior.Enabled = False cmdProximo.Enabled = False cmdGravar.Enabled = True cmdSair.Enabled = True Frame1.Enabled = True txtCdCliente.Enabled = False txtNome.SetFocus TBCliente.Edit End Sub Private Sub cmdAnterior_Click() TBCliente.MovePrevious 232
Comandos Condicionais e de Lao If TBCliente.BOF = True Then TBCliente.MoveNext End If AtualizaFormulrio End Sub Private Sub cmdConsultar_Click() Dim ProcuraCdCliente As String ProcuraCdCliente = InputBox("Digite Cliente a ser consultado") TBCliente.Seek "=", ProcuraCdCliente If TBCliente.NoMatch = True Then MsgBox ("Cliente no cadastrado!") TBCliente.MovePrevious End If AtualizaFormulrio End Sub Private Sub cmdExcluir_Click() If MsgBox("Confirma Excluso?", vbYesNo) = vbYes Then TBCliente.Delete cmdAnterior_Click End If End Sub Private Sub cmdGravar_Click() cmdIncluir.Enabled = True cmdAlterar.Enabled = True cmdConsultar.Enabled = True cmdExcluir.Enabled = True cmdAnterior.Enabled = True cmdProximo.Enabled = True cmdGravar.Enabled = False cmdSair.Enabled = True 233 o Cdigo do
Lionardo@base.com.br
Frame1.Enabled = False txtCdCliente.Enabled = True AtualizaCampos TBCliente.Update End Sub Private Sub cmdIncluir_Click() cmdIncluir.Enabled = False cmdAlterar.Enabled = False cmdConsultar.Enabled = False cmdExcluir.Enabled = False cmdAnterior.Enabled = False cmdProximo.Enabled = False cmdGravar.Enabled = True cmdSair.Enabled = True LimpaFormulrio Frame1.Enabled = True txtCdCliente.SetFocus End Sub Private Sub cmdProximo_Click() TBCliente.MoveNext If TBCliente.EOF = True Then TBCliente.MovePrevious End If AtualizaFormulrio End Sub Private Sub cmdSair_Click() Unload frmCadClientes End Sub Private Sub Form_KeyPress(KeyAscii As Integer) 234
If KeyAscii = vbKeyReturn Then SendKeys ("{TAB}") KeyAscii = 0 End If End Sub Private Sub Form_Load() Set BancoDeDados = OpenDatabase(App.Path & "\Estoque.MDB") Set TBCliente = BancoDeDados.OpenRecordset("Cliente", dbOpenTable) TBCliente.Index = "IndCdigo" cmdGravar.Enabled = False Frame1.Enabled = False If TBCliente.EOF = False Then AtualizaFormulrio End If End Sub Private Sub Form_Unload(Cancel As Integer) TBCliente.Close BancoDeDados.Close End Sub
Private Sub txtCdCliente_LostFocus() txtCdCliente.Text = Format(txtCdCliente.Text, "000") TBCliente.Seek "=", txtCdCliente.Text If TBCliente.NoMatch = False Then MsgBox "Cliente j existente. Tente outro Cdigo" AtualizaFormulrio cmdIncluir.Enabled = True 235
Lionardo@base.com.br
cmdAlterar.Enabled = True cmdConsultar.Enabled = True cmdExcluir.Enabled = True cmdAnterior.Enabled = True cmdProximo.Enabled = True cmdGravar.Enabled = False cmdSair.Enabled = True Frame1.Enabled = False Else TBCliente.AddNew End If End Sub Private Sub txtValor_LostFocus() txtLimiteCrdito.Text = Format(txtLimiteCrdito.Text, "Standard") End Sub
Private Function AtualizaCampos() TBCliente("CdCliente") = txtCdCliente TBCliente("Nome") = txtNome TBCliente("LimiteCrdito") = txtLimiteCrdito End Function Private Function AtualizaFormulrio() txtCdCliente = TBCliente("CdCliente") txtNome = TBCliente("Nome") txtLimiteCrdito.Text Format(TBCliente("LimiteCrdito"), "Standard") End Function Private Function LimpaFormulrio() txtCdCliente = "" txtNome = "" 236
A criao do formulrio ser como no exemplo acima; ou seja, comparando com os anteriores, a diferena somente o acrscimo de dois labels que ficaro ao lado do cdigo da mercadoria e do cliente. O primeiro label conter a descrio da mercadoria, e vamos nome-lo para lblDescrio, e o segundo ter o nome do cliente, e vamos nome-lo para lblNomeCliente. Para esta tabela necessrio criar um ndice em que a chave de procura seja o Cdigo da Mercadoria e o Cdigo do Cliente. Usamos para isto o Visual Data Manager:
237
Lionardo@base.com.br
Note que esses dados no existem na tabela de Vendas. O que existe nesta tabela somente o cdigo da mercadoria. A descrio esta em outra tabela (Mercadoria), assim como o nome do cliente tambm esta em outra tabela (Cliente). Para podermos acessar estas tabelas e capturar somente a descrio da mercadoria e nome do cliente, temos somente um ponto de referncia, que o cdigo deles que existe na tabela de Vendas. A lgica usada neste programa consiste em pegarmos o cdigo existente na tabela de vendas e buscar a descrio daquele cdigo em outra tabela. Para fazer isto todas as tabelas envolvidas devem ser abertas, assim como seus ndices, pois ser atravs do ndice que a procura ser feita. Exemplificando atravs da tabela de mercadoria: Como na tabela de vendas existe o cdigo da mercadoria que foi vendida, e na tabela de mercadoria existe a descrio da mercadoria para 238
Comandos Condicionais e de Lao aquele cdigo, usamos o ndice para procurar dentro da tabela de mercadoria, o cdigo existente dentro da tabela de vendas. Isto possvel desde que a tabela de mercadoria esteja indexada pelo cdigo, pois a procura ser feita por ele. Para podermos ento codificarmos o formulrio que ter acesso aos dados da tabela de vendas, vamos criar as variveis que sero usadas para lidar com o banco de dados e as tabelas:
Criamos uma varivel para cada tabela que ser aberta. Precisamos agora criar um evento Form_Load para abrir todas essas tabelas.
Veja que abrimos todas as trs tabelas que sero usadas neste formulrio, e abrimos tambm todos os ndices relativo a cada uma. As nossas funes auxiliares sofrero alguma mudana pois acrescentamos em nosso formulrio dois labels, e um conter a descrio da mercadoria e outro o nome do cliente.
239
Lionardo@base.com.br
Note que quando formos atualizar o formulrio ser necessrio apresentar nos dois labels os dados contido em outras tabelas, por isto necessrio colocar um Seek para cada item a ser procurado. Quando o usurio, por exemplo, aperta o boto "Avanar" o programa avana um registro na tabela de Vendas e usa os cdigos contidos nela para tentar localizar suas respectivas descries e nome do cliente.
240
Para facilitar nosso trabalho, criamos aqui uma funo CancelaDigitao que tem por finalidade anular o que o usurio estiver fazendo, voltar os botes e frame para seu estado natural. Usaremos esta funo quando o usurio digitar algum cdigo invlido. Com as funes prontas, vamos completar a codificao do Form_Load, pois apenas abrimos as tabelas, precisamos agora verificar se a tabela de vendas est vazia, e desabilita o boto "Gravar" e o frame:
241
Lionardo@base.com.br
A incluso para esta tabela segue o estilo que usamos para os outros formulrios. Existe somente uma diferena fundamental que o aparecimento do nome do cliente e a descrio da mercadoria quando o usurio digitar o cdigo correspondente. Ou seja, numa incluso, quando o usurio digitar o cdigo da mercadoria que foi vendida, o programa ter que acessar a tabela de Mercadoria, procurar o cdigo que o usurio acabou de digitar, e trazer de l a descrio daquele cdigo. Este trabalho todo podemos fazer no evento LostFocus da caixa de texto. Por que este evento? Porque esta procura ser feita DEPOIS que o usurio digitar o cdigo e passar para a prxima caixa de texto (ou seja, quando o objeto perder o foco). Ento, diante disto, precisamos criar dois evento LostFocus. Uma para a caixa de texto txtCdigo e outro para txtCdCliente:
242
Usamos o SEEK para efetuar uma procura dentro da tabela TBMercadoria. O que ir procurar? Ir procurar o cdigo digitado na caixa de texto txtCdigo. Se NoMatch for igual a True sinal que no existe nenhuma mercadoria cadastrada com o cdigo digitado. Ento uma mensagem ser mostrada na tela: Mercadoria no cadastrada. Depois chamamos aquela funo que criamos chamada Cancela Digitao. Logicamente que se quisermos incrementar ainda mais nosso programa poderamos fazer com que o programa abrisse uma tela mostrando quais as mercadorias que existem cadastradas para o usurio escolher uma, ou algo assim. Mas para resumir nosso exemplo deixaremos assim. Se o cdigo digitado na caixa de texto for encontrado ento a descrio inserida dentro do label "lblDescrio" para que seja mostrada no formulrio. Fazemos a mesma coisa com a evento LostFocus de txtCdCliente:
243
Lionardo@base.com.br
A incluso de registros dentro da tabela de vendas igual ao apresentado nos outros programas:
244
Comandos Condicionais e de Lao A alterao segue os padres anteriores, lembrando que nesta tabela de vendas no podemos alterar o Cdigo da Mercadoria e o Cdigo do Cliente, pois ambos fazem parte da chave do ndice da tabela. Se necessitar alterar o cdigo, exclua e inclua novamente:
245
Lionardo@base.com.br
Os botes Anterior e Prximo devem fazer uma pesquisa na tabela de Mercadoria e Clientes para atualizar os labels, a fim de que aparea a descrio 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 funo AtualizaFormulrio faz uma procura dentro da tabela de mercadoria e depois dentro da tabela de clientes usando como chave de busca o contedo existente dentro da tabela de vendas.
Option Explicit Dim Dim Dim Dim BancoDeDados As Database TBVendas As Recordset TBMercadoria As Recordset TBCliente As Recordset
Private Sub cmdAlterar_Click() cmdIncluir.Enabled = False cmdAlterar.Enabled = False cmdConsultar.Enabled = False cmdExcluir.Enabled = False cmdAnterior.Enabled = False cmdProximo.Enabled = False cmdGravar.Enabled = True cmdSair.Enabled = True Frame1.Enabled = True txtCdigo.Enabled = False txtCdCliente.Enabled = False txtQuantidadeVendida.SetFocus TBVendas.Edit End Sub Private Sub cmdAnterior_Click() TBVendas.MovePrevious If TBVendas.BOF = True Then TBVendas.MoveNext End If AtualizaFormulrio End Sub Private Sub cmdExcluir_Click() If MsgBox("Confirma Excluso?", vbYesNo) = vbYes Then TBVendas.Delete cmdAnterior_Click End If 247
Lionardo@base.com.br
End Sub Private Sub cmdGravar_Click() cmdIncluir.Enabled = True cmdAlterar.Enabled = True cmdConsultar.Enabled = True cmdExcluir.Enabled = True cmdAnterior.Enabled = True cmdProximo.Enabled = True cmdGravar.Enabled = False cmdSair.Enabled = True Frame1.Enabled = False txtCdigo.Enabled = True txtCdCliente.Enabled = True AtualizaCampos TBVendas.Update End Sub Private Sub cmdIncluir_Click() cmdIncluir.Enabled = False cmdAlterar.Enabled = False cmdConsultar.Enabled = False cmdExcluir.Enabled = False cmdAnterior.Enabled = False cmdProximo.Enabled = False cmdGravar.Enabled = True cmdSair.Enabled = True LimpaFormulrio Frame1.Enabled = True txtCdigo.SetFocus End Sub Private Sub cmdProximo_Click()
248
Comandos Condicionais e de Lao TBVendas.MoveNext If TBVendas.EOF = True Then TBVendas.MovePrevious End If AtualizaFormulrio End Sub Private Sub cmdSair_Click() Unload frmLanamentoVendas End Sub Private Sub Form_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then SendKeys ("{TAB}") KeyAscii = 0 End If End Sub Private Sub Form_Load() Set BancoDeDados=OpenDatabase(App.Path & "\Estoque.MDB") SetTBMercadoria=BancoDeDados.OpenRecordset"Mercadoria", dbOpenTable) Set TBCliente=BancoDeDados.OpenRecordset("Cliente", dbOpenTable) Set TBVendas=BancoDeDados.OpenRecordset("Vendas", dbOpenTable) TBMercadoria.Index = "IndCdigo" TBCliente.Index = "IndCdigo" TBVendas.Index = "indClienteMercadoria" cmdGravar.Enabled = False Frame1.Enabled = False If TBVendas.EOF = False Then AtualizaFormulrio End If 249
Lionardo@base.com.br
End Sub Private Sub Form_Unload(Cancel As Integer) TBVendas.Close TBMercadoria.Clone TBCliente.Close BancoDeDados.Close End Sub Private Function AtualizaCampos() TBVendas("Cdigo") = txtCdigo TBVendas("CdCliente") = txtCdCliente TBVendas("ValorVenda") = txtValorVenda TBVendas("QuantidadeVendida") = txtQuantidadeVendida End Function
Private Function LimpaFormulrio() txtCdigo = "" txtCdCliente = "" txtValorVenda = "" txtQuantidadeVendida = "" lblDescrio.Caption = "" lblNomeCliente.Caption = "" End Function Private Sub txtCdigo_LostFocus() txtCdigo.Text = Format(txtCdigo.Text, "000") TBMercadoria.Seek "=", txtCdigo If TBMercadoria.NoMatch = True Then MsgBox "Mercadoria no cadastrada. Operao Cancelada" CancelaDigitao Exit Sub 250
Comandos Condicionais e de Lao End If lblDescrio = TBMercadoria("Descrio") End Sub Private Sub txtCdCliente_LostFocus() txtCdCliente.Text = Format(txtCdCliente.Text, "000") TBCliente.Seek "=", txtCdCliente If TBCliente.NoMatch = True Then MsgBox "Cliente no cadastrada. Operao Cancelada" CancelaDigitao Exit Sub End If lblNomeCliente = TBCliente("Nome") TBVendas.Seek "=", txtCdCliente.Text, txtCdigo.Text If TBVendas.NoMatch = False Then MsgBox "Vendas j existente. Tente outro cdigo" CancelaDigitao Else TBVendas.AddNew End If End Sub Private Sub txtValorVenda_LostFocus() txtValorVenda.Text = Format(txtValorVenda.Text, "Standard") End Sub Private Function AtualizaFormulrio() txtCdigo = TBVendas("Cdigo") txtCdCliente = TBVendas("CdCliente") 251
Lionardo@base.com.br
txtValorVenda = Format(TBVendas("ValorVenda"), "Standard") txtQuantidadeVendida = TBVendas("QuantidadeVendida") TBMercadoria.Seek "=", txtCdigo TBCliente.Seek "=", txtCdCliente lblDescrio = TBMercadoria("Descrio") lblNomeCliente = TBCliente("Nome") End Function Private Function CancelaDigitao() AtualizaFormulrio cmdIncluir.Enabled = True cmdAlterar.Enabled = True cmdConsultar.Enabled = True cmdExcluir.Enabled = True cmdAnterior.Enabled = True cmdProximo.Enabled = True cmdGravar.Enabled = False cmdSair.Enabled = True Frame1.Enabled = False End Function
Deixamos o boto Consulta de fora propositadamente. Vamos voltar nele nos prximos captulos.
252
253
Lionardo@base.com.br
Data DBGrid
254
255
Lionardo@base.com.br
Crie um projeto novo e coloque os seguintes controles nele. Repare que semelhante ao que fizemos no captulo anterior, mas na verdade tem grandes mudanas na codificao. Mude o Caption deste controle para "Mercadoria". As duas propriedades principais deste controle so: 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 Estoque.mdb que o banco de dados que estamos trabalhando.
256
RecordSource: Nesta propriedade deve ser selecionado o nome da tabela que ser manipulada pelo objeto Data. Dentro do Banco de Dados escolhido (Estoque.mdb) existem 3 tabelas: Vendas, Mercadoria e Cliente. As 3 iro 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 txtCdigo deve ser anexada ao campo Cdigo. Esta anexao feita usando as propriedades DataField e DataSource das caixas de texto.
257
Lionardo@base.com.br
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 combinao 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. No precisa digitar nada na codificao 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 avanar ou voltar, ir para o primeiro registro ou o ultimo.
Este controle data anexa dados no 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 captulo anterior, deixamos de codificar o boto de Consulta. Vamos fazer isto agora usando um DBGrid para auxiliar na consulta. Adicione um novo formulrio e mude a propriedade Name para 258
Comandos Condicionais e de Lao frmConsulta. Neste formulrio vamos criar todas as rotinas de consulta que iro aparecer para o usurio. Insira um CommandButton no formulrio, um objeto do tipo Data e um objeto do tipo DBGrid: DBGrid Data Estes Controles sero inseridos na seguinte disposio:
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 Lanamento das Vendas. O Objeto Data possui algumas propriedades que devem ser alteradas, como o DatabaseName e RecordSource. Escolha "Estoque.MDB" para uma e "Vendas" para outra. Trabalhando somente com essas duas propriedade anexamos a tabela Vendas do Banco de Dados Estoque.mdb 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 ento criado, que o Data, mas onde os registros do iro aparecer? Poderamos 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 formulrio. 259
Lionardo@base.com.br
Fazendo isto estaremos fazendo uma ligao 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.
A propriedade Custom deste objeto abre uma janela onde esto as principais propriedades deste objetos. Ao clicar ser mostrado uma janela para configurar estas propriedades que iro dar forma ao DBGrid.
No Caption digitamos o ttulo que ser exibido no Grid. AllowAddNew: Habilita a possibilidade de se poder acrescentar registros na tabela. AllowDelete : Habilita a possibilidade de apagar registros AllowUpdate : Habilita a possibilidade de alterar os registros existentes 260
Comandos Condicionais e de Lao ColumnHeaders : Determina se o cabealho de cada coluna ser exibido. RecordSelectors : Determina se no DBGrid ir aparecer um seletor de registros AllowRowSizing : Habilita a possibilidade do usurio mudar o tamanho das colunas. Enabled : Habilita ou no a interao do DBGrid com o usurio. Selecionando no topo desta janela a seo Columns abriremos novas propriedades para serem configuradas.
Columns : Seleciona em qual coluna de dados do DBGrid que ter as propriedades abaixo disponvel para serem configuradas. Caption : Ttulo da Coluna selecionada. DataField : Campo da tabela que ter seus dados exibidos na coluna selecionada. DefaultValue : Valor padro para um determinado campo. NumberFormat : Determina o formato com que os dados da coluna sero mostrados no vdeo. Usa as mesmas regras da funo FORMAT.
261
Lionardo@base.com.br
Locked : Trava os dados contido nas colunas. AllowSizing : Habilitada a possibilidade de mudar o tamanho da coluna Visible : Indica se a coluna ser visvel ou no. Alignment : Alinha dos dados na coluna na forma determinada nesta propriedade. Uma forma rpida e recomendada para transferir os dados da tabela para suas respectivas propriedades a seguinte: Selecione o DBGrid no formulrio. posicione o ponteiro do mouse sobre ele e pressione o boto da direita. Ir aparecer um menu como o que esta abaixo:
262
Selecione a opo Retrieve Fields. 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 boto fechar ser configurado para esconder este formulrio e retornar para o formulrio anterior.
263
Lionardo@base.com.br
Note que usamos o Hide no lugar de Unload, pois o Unload retirna o formulrio da tela e da memria tambm, enquanto que o hide mantm o formulrio na memria. A vantagem disto que o acesso a esta janela se torna mais rpido no segundo acesso que for feito a ela e os valores das variveis do formulrio ainda continuar em uso. Neste caso vamos precisar dos valores dos campos que o usurio selecionou para, na tela de Vendas, uslas. Este tipo de consulta que foi feito bastante simples. Logicamente que pode-se usar outros mtodos mais sofisticados, como o SQL por exemplo. Mas isto j faz parte dos recursos avanados do Visual Basic. Volte agora na tela de Vendas para podermos codificar o boto "Consultar"
No mtodo Show de frmConsulta, usamos como argumento a constante "vbModal" para indicar que essa janela deve ser do tipo modal, ou seja, exclusiva. No se tem acesso a outra janela enquanto o usuario no concluir o que deseja fazer na janela aberta. Usamos o Seek para procurar os cdigos que foi selecionado na janela frmConsulta. Note que usamos o "_" para fazer uma quebra de linha.
264
265
14 IMPRESSO
267
Lionardo@base.com.br
14.1 PRINTER
Em nosso programa vamos acrescentar um item no menu principal chamado impresso do Estoque e com isto vamos imprimir o contedo da tabela mercadoria.
Usaremos um novo objeto para nos chamado Printer. E ser este objeto que manipular tudo que enviaremos para a impressora, criando, assim, um canal de comunicao entre nosso programa e a porta em que a impressora esta ligada. Muitas peculiaridades de uma impresso, como falta de papel, impressora em linha, fila de impresso, etc. Tudo isto ser organizado pelo prprio Windows, deixando o programador livre para executar somente uma tarefa: Despachar seu relatrio para a impressora. As propriedades principais do Printer so: ColorMode: Determina ou mostra a capacidade de impresso colorida do dispositivo. Copies: Especifica a quantidade de cpias de uma pgina 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 padro suportada pelo dispositivo FontName: Determina qual fonte de letra a impressora usar para impresso. FontBold: Determina se a fonte ser em negrito. FontItalic: Determina se a fonte ser em itlico. Fonts: Fornece uma lista de todas as fontes disponveis para impresso. FontSize: Determina o tamanho que a fonte de letra escolhida usar. 268
Comandos Condicionais e de Lao FontUnderline: Determina se a fonte ser sublinhada. Orientation: Determina a orientao do papel: Retrato ou Paisagem. Usamos as constantes para definir o tipo escolhido: vbPRORPortrait1 Retrato vbPRORLandscape 2 Paisagem Page : Retorna o nmero da pgina que esta sendo impressa. PaperSize: Determinamos o tamanho do papel. Podemos usamos as seguintes constantes: vbPRPSLetter 1 Letter, 8 1/2 x 11 in. VbPRPSLetterSmall 2 Letter Small, 8 1/2 x 11 in. VbPRPSTabloid 3 Tabloid, 11 x 17 in. VbPRPSLedger 4 Ledger, 17 x 11 in. VbPRPSLegal 5 Legal, 8 1/2 x 14 in. VbPRPSStatement 6 Statement, 5 1/2 x 8 1/2 in. VbPRPSExecutive 7 Executive, 7 1/2 x 10 1/2 in. vbPRPSA3 8 A3, 297 x 420 mm vbPRPSA4 9 A4, 210 x 297 mm vbPRPSA4Small 10 A4 Small, 210 x 297 mm vbPRPSA5 11 A5, 148 x 210 mm vbPRPSB4 12 B4, 250 x 354 mm vbPRPSB5 13 B5, 182 x 257 mm vbPRPSFolio 14 Folio, 8 1/2 x 13 in. VbPRPSQuarto 15 Quarto, 215 x 275 mm vbPRPS10x14 16 10 x 14 in. vbPRPS11x17 17 11 x 17 in. VbPRPSNote 18 Note, 8 1/2 x 11 in. vbPRPSEnv9 19 Envelope #9, 3 7/8 x 8 7/8 in. vbPRPSEnv10 20 Envelope #10, 4 1/8 x 9 1/2 in. vbPRPSEnv11 21 Envelope #11, 4 1/2 x 10 3/8 in. vbPRPSEnv12 22 Envelope #12, 4 1/2 x 11 in. vbPRPSEnv14 23 Envelope #14, 5 x 11 1/2 in. VbPRPSCSheet 24 C size sheet vbPRPSDSheet 25 D size sheet vbPRPSESheet 26 E size sheet vbPRPSEnvDL 27 Envelope DL, 110 x 220 mm vbPRPSEnvC3 29 Envelope C3, 324 x 458 mm vbPRPSEnvC4 30 Envelope C4, 229 x 324 mm vbPRPSEnvC5 28 Envelope C5, 162 x 229 mm vbPRPSEnvC6 31 Envelope C6, 114 x 162 mm 269
Lionardo@base.com.br
vbPRPSEnvC65 vbPRPSEnvB4 vbPRPSEnvB5 vbPRPSEnvB6 vbPRPSEnvItaly vbPRPSEnvMonarch vbPRPSEnvPersonal vbPRPSFanfoldUS vbPRPSFanfoldStdGerman vbPRPSFanfoldLglGerman vbPRPSUser
32 33 34 35 36 37 38 39 40 41 256
Envelope C65, 114 x 229 mm Envelope B4, 250 x 353 mm Envelope B5, 176 x 250 mm Envelope B6, 176 x 125 mm Envelope, 110 x 230 mm Envelope Monarch, 3 7/8 x 7 1/2 in. Envelope, 3 5/8 x 6 1/2 in. U.S. Standard Fanfold, 14 7/8 x 11 in. German Standard Fanfold, 8 1/2 x 12 in. German Legal Fanfold, 8 1/2 x 13 in. User-defined impresso que ser usada pela resoluo que a impressora ir -1 -2 -3 -4 Resoluo Draft Baixa Resoluo Mdia Resoluo Alta Resoluo
Port: Retorna o nome da porta de impressora padro. PrintQuality: Determina ou seta a usar. VbPRPQDraft vbPRPQLow vbPRPQMedium vbPRPQHigh
Os mtodos: EndDoc: Finaliza a impresso de um relatrio KillDoc: Termina imediatamente a impresso NewPage: Fora a impresso passar para a prxima pgina. Print <expresso> : Imprime uma expresso ou varivel especificada. O Objeto Printer no aparece na caixa de ferramentas, nem possui um cone como outros objetos. Ele interno que no possui formato visual. Para desenvolver nossa rotina de impresso, d um click na opo Impresso Estoque no menu e vamos codificar o programa:
270
Criamos primeiro as variveis que iro manipular o Banco de Dados e a tabela. Como vamos imprimir o contedo da tabela de mercadoria isto se torna necessrio. A varivel Linha ir fazer um contador de linhas, para podermos controlar quantas linhas esta sendo impressa numa pgina. Depois colocamos uma mensagem para o usurio ter certeza que realmente quer imprimir o relatrio. Se o MsgBox retornar o nmero 7 sinal que o usurio digitou escolheu no.
Na seqncia definimos o contador de linha para 1, e abrimos o banco de dados e a tabela de mercadoria. No necessrio abrir o ndice. Se no tivssemos aberto a ordem em que os registros iriam aparecer no relatrio seria a ordem em que foram digitados. Como abrimos um ndice que ordena todos os dados na ordem de cdigo, o relatrio ser impresso ento nesta ordem. Caso houvesse necessidade de criar um relatrio na ordem alfabtica da descrio das mercadorias, ento seria necessrio criar um ndice pelo 271
Lionardo@base.com.br
campo Descrio, ou uma SQL ordenado pela "Descrio", e abri-lo na rotina de impresso. Usamos o objeto Printer para definir com qual fonte de letra o relatrio ser impresso e qual o tamanho usado
Abrimos um DO WHILE para sempre verificar se o fim do arquivo foi atingido. Enquanto no for (Not TBMercadoria.EOF) 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 funo chamada Cabealho. Esta funo ir imprimir o cabealho de nosso relatrio. O contedo dos campos da tabela de mercadoria inserido dentro das variveis, para depois podermos imprimir no papel estas variveis. Usamos a funo Format para melhorar a formatao numrica. Usamos a propriedade CurrentX para definir qual ser a coordenada horizontal a ser utilizado durante a impresso. A propriedade Print quem efetivamente faz a impresso. Em conjunto com o Print usamos a funo TAB que efetua uma tabulao para cada varivel que ser impressa. Isto ajuda a alinhar as expresses impressas. 272
Comandos Condicionais e de Lao Note que colocamos um ; aps o nome da varivel que ser impressa. Usamos isto para o Objeto Printer continuar imprimindo na mesma linha. No ultimo campo a ser impresso TBMercadoria("Valor") j no necessrio, pois a prxima impresso j ser na linha seguinte. Fazemos depois um incremento de + 1 na varivel linha. Isto para atualizar o contador de linha. MoveNext posiciona a tabela no prximo registro, pois o atual j foi impresso e agora necessrio ler o registro seguinte. Se o registro seguinte for o fim do arquivo, quando a execuo do programa encontrar o LOOP esta rotina ser encerrada. No nosso exemplo definimos que numa pgina pode conter no mximo 50 linhas. Ento quando o contador de linha chegar neste ponto, o Objeto Printer chamar uma nova pgina (NewPage) e o contador de linha volta a ser igual a 1.
Encerramos nossa rotina com um EndDoc que finaliza a impresso e um Close fechando a tabela e o banco de dados. Neste programa esta faltando, cabealho: para encerrar, a funo que cria o
273
Lionardo@base.com.br
Quando colocamos um print sozinho, sem nenhuma expresso acompanhado, indica que queremos forar a impresso de uma linha em branco. Private Sub mnuImpresso_Click() Dim BancoDeDados As Database Dim TBMercadoria As Recordset Dim Linha As Integer If MsgBox("Inicia a impresso?",36,"Relao Mercadoria")=7 Then Exit Sub End If Linha = 1 Set BancoDeDados = OpenDatabase(App.Path & "\Estoque.MDB") Set TBMercadoria = BancoDeDados.OpenRecordset("Mercadoria", dbOpenTable) TBMercadoria.Index = "IndCdigo" Printer.FontName = "Arial" Printer.FontSize = 10 Do While Not TBMercadoria.EOF If Linha = 1 Then Cabealho End If
Printer.CurrentX = 300 Printer.Print Tab(3); TBMercadoria("Cdigo"); Printer.Print Tab(10); TBMercadoria("Descrio"); Printer.Print Tab(50); Format(TBMercadoria ("Quantidade"), "##,###"); Printer.Print Tab(70); Format(TBMercadoria("Valor"), "Currency") 274
Linha = Linha + 1 TBMercadoria.MoveNext If Linha >= 50 Then Printer.NewPage Linha = 1 End If Loop Printer.EndDoc TBMercadoria.Close BancoDeDados.Close End Sub Private Function Cabealho() Printer.Print Printer.Print Printer.Print Printer.Print Printer.Print Printer.Print End Function Tab(3); "Cd"; Tab(10); "Descrio"; Tab(50); "Quantidade"; Tab(70); "Valor" String(100, "-")
275
Lionardo@base.com.br
Vamos usar este gerador de relatrio para criar um relatrio de Mercadoria. No ser necessrio codificaes complexas, pois o programa automatiza muitas tarefas. Ao aparecer o Programa Crystal Reports entre na opo NEW.
Ir aparecer uma janela onde devemos escolher qual estilo de relatrio ser criado. Vamos usar o "Standard" 276
Para que o programa crie nosso relatrio devemos passar algumas informaes, e essas informaes sero coletadas atravs dessas opes que vem a seguir:
Aperte o boto Data File para escolher o banco de dados que sera usado no relatrio. Depois de escolhido ir aparecer a relao de todas as tabelas existentes no Banco de Dados. Escolha o Arquivo "Estoque.MDB".
277
Lionardo@base.com.br
278
Nesta tela selecionamos os campos que vo compor o relatrio. Escolha um campo na lista que aparece no "Database Fields", aperte o boto "Add" e d um ttulo para o campo (que ir aparecer no cabealho) no item Column Heading.
Lionardo@base.com.br
Se quisermos criar grupos ou subgrupos, usamos esta tela. Como por exemplo, um relatrio 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 relatrio ordena o relatrio primeiro pelo grupo. No nosso caso, no existe grupo. Aperte o "Next"
Ir aparecer esta mensagem, alertando que como no foi escolhido nenhum grupo no ser possvel entrar nesta opo. Aperte o boto OK e vamos direto para a opo "6 - Select"
280
Nesta tela pode-se fazer um filtro dos registros que iro compr o relatrio. No faremos nenhum tipo de filtro.
Aqui colocamos um ttulo para o relatrio e escolhemos um estilo na lista que aparece em "Style". Escolha Shading . Cada estilo monta o relatrio 281
Lionardo@base.com.br
num formato diferente. Deve-se escolher o que mais se adapta ao tipo que relatrio que se esta criando. Aperte agora o boto "Preview Report" para ver como ficou.
Vamos agora colocar um total para o "Valor". D um click com o mou se em cima do registro e aperte o boto da direita. 282
Comandos Condicionais e de Lao Dentre as vrias opes que ir aparecer, escolha "Inset Grand Total". Ser ento inserido um totalizador para o "Valor".
Uma vez feito tudo isto, nosso relatrio esta pronto. Vamos agora salvar o arquivo e mandar executar em nosso programa. Va no menu "File", opo "Save" e grave este relatrio com o nome de "Mercadoria". Feche o Cristal Reports e volte para o nosso programa. Crie mais um formulrio para o projeto, e d o nome de "frmRelatrios". Abra uma opo no menu principal do programa e acrescenteo nele.
283
Lionardo@base.com.br
Nesta janela o usurio ir escolher o tipo de relatrio que ele deseja e pressiona o boto "Imprimir". Note que inserimos no formulrio um novo controle chamado CrystalReports. Ele quem ir na verdade fazer todo o trabalho "pesado" de gerar o relatrio. Vamos ento codificar o boto imprimir:
Primeiro verificamos se o usurio escolheu o relatrio de mercadoria. Caso seja positivo mudamos o ponteiro do mouse para uma ampulheta (para no deixar o usurio fazer nada ate que o relatrio seja concluido. 284
Comandos Condicionais e de Lao Na propriedade ReportFileName coloque o arquivo que criamos. L existe a matriz de nosso relatrio. Em DataFiles especificamos o nome do banco de dados que ser lido pelo relatrio. CopiesToPrinter determina quantas copias ter o relatrio. Na propriedade Destination informamos que o relatrio deve ser gerado na tela primeiro antes de ir para a impressora. Por fim, usamos o Action que envia todas as informaes captadas para o Crystal e cria o relatrio.
Quando o relatrio criado e mostrado na tela, usamos os botes que fica na parte inferior para manipular o relatrio.
Os botes em forma de seta so utilizados para navegar nas pginas do relatrio. O boto em forma de impressora envia o relatrio para a porta de impresso. O relatrio de Vendas tem uma particulariadade. Nele deve conter o nome do cliente e o nome da mercadoria comprada, entretanto na tabela de Vendas no existe esses dados, existe somente os cdigos relacionados. Como o Crystal Reports faz o relacionamento entre tabelas de forma quase que automaticas, temos que somente inserir os respectivos campos.
285