Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Microsoft Visual Basic 4.0 1 Módulo 1 Criando Aplicações Visual Basic 1.1 Programação Procedural Versus Programação Orientada a Eventos Na programação procedural, ou seja, baseada nas chamadas de procedimentos/rotinas, a aplicação em si inicia na primeira linha do código e segue um fluxo determinado pelo próprio programa, durante a sua execução. Devido a essa característica, o usuário se vê amarrado à forma de trabalho da aplicação. Na programação orientada a eventos, as ações do usuário (comumente denominadas eventos) determinam o fluxo de execução do programa, ou seja, qual procedimentos/rotina será chamada. Isso significa que um programa desenvolvido com base nessa técnica, as chamadas das rotinas dependem dos eventos que ocorrem, em outras palavras, dependem do que o usuário fará ou não. Portanto, com base nisso, podemos definir um evento como sendo uma ação reconhecida por um controle, que nada mais é que um objeto adicionado ao formulário. Os diversos controles do Visual Basic (campos de entrada, lista de opções, caixas de seleção, etc.) reconhecem e respondem a um conjunto predefinido de eventos. Para que um controle responda a um evento de uma forma particular, você deverá escrever um procedimento na linguagem Visual Basic e atribuir esse código ao evento desejado. Por exemplo, você pode escrever uma rotina para avançar para o próximo registro de uma tabela de dados assim que o botão identificado pela Microsoft Visual Basic 4.0 2 legenda Avança de um formulário for pressionado. Você então atribui o nome dessa rotina ao evento Click do botão. Assim, toda vez que o botão for pressionado através de um clique do mouse, a rotina será chamada. Após o término de sua execução, haverá o retorno automático ao formulário. Podemos perceber então que o primeiro passo no desenvolvimento de uma aplicação no Visual Basic consiste na criação dos formulários, aplicando- lhes os controles (botões de ação, menus, caixas de listagem, caixas de combinação, etc.). Após isso passamos ao desenvolvimento das rotinas que serão vinculadas aos controles do formulário. Note que essa técnica difere do processo antigo, em que primeiro o programador definia o que seria feito pelo programa (desenvolvia as rotinas), para depois pensar na interface com o usuário. Agora o mesmo programador sentir-se-á mais livre da árdua tarefa de elaboração dessa interface, já que o Visual Basic executa a maior parte do processo, tendo assim mais tempo para se concentrar nas rotinas principais do programa. Isso torna a tarefa de desenvolvimento de aplicações mais produtiva. Do lado do usuário, um programa orientado a eventos é mais fácil de assimilar e utilizar, pois ele reflete a maneira como uma pessoa trabalharia no mundo real. Não há necessidade de se adaptar ao aplicativo. 1.2 Criando um programa Visual Basic Prática : Adicionar no formulário : 1 command : Propriedade Caption = &OK 1 Label : Propriedade Caption = Nome 1 Textbox : Limpar Propriedade Text 1 Label : Propriedade Caption = Endereço 1 Textbox : Limpar Propriedade Text Nomeá-los :Na janela de propriedades colocar no campo Name o nome com o prefixo indicativo do tipo de objeto. Microsoft Visual Basic 4.0 3 Exemplos: Objetos Prefixo Exemplo form frm frm_cliente check box chk chkapenasleitura combo box cbo cboidioma image img imgicon label lbl lblnome menu mnu mnufileopen text box txt txtnome Dica: Para chamar o Help clique no ícone e tecle F1 1.3 Algumas Propriedades Podemos defini-las em tempo de projeto ou em tempo de execução: • Tempo de Projeto : No objeto lblnome - clique sobre o objeto uma vez. Propriedade caption : vai para janela de propriedades. Resultado : &NOME ⇒ NOME ( Tecla de Atalho ALT+N ) • Tempo de Execução : No objeto txtnome - dê um double clique no objeto. No evento txtnome_click( ) - colocar : txtnome.text = “BOCA” ou lblnome.caption = txtnome.text Sempre: <nome objeto.propriedade> = <valor>. Executar ⇒ Clicar sobre o Label Nome. No objeto Form colocar : Caption exemplo Name frmexemplo Backcolor ( escolher ) Fillstyle ( escolher ) Microsoft Visual Basic 4.0 4 Uma proprieddade de um objeto1, pode ser alterada em tempo de execução por outro objeto2 1.4 Métodos Os métodos determinam a realização de uma ação para um determinado objeto. Essa ação quem define é o programador. Exemplos : txtnome.setfocus { posiciona o ‘foco’ para a caixa de texto do objeto txtnome}. lblcodigo.move 0,0 { posiciona o objeto lblcodigo para as coordenadas 0,0}. txtfrase.textwidth { retorna o tamanho da string do objeto txtfrase}. frmcliente.hide { esconde, mais permanece na memória principal, o objeto frmcliente}. 1.5 Eventos É uma ação reconhecida por um formulário ou por um controle, o agente da ação pode ser : o usuário ou o código. Exemplos : click dblclick keypress load gotfocus lostfocus Microsoft Visual Basic 4.0 5 1.6 Formulários e Controles Básicos Formulários O usuário interage com os controles no formulário para obter resultados Algumas Propriedades para Formulários backcolor ⇒ cor do fundo borderstyle ⇒ estilo da moeda caption ⇒ cabeçalho name ⇒ nome do objeto Alguns Métodos para Formulários hide ⇒ esconde nome ⇒ movimenta o formulário print ⇒ imprime setfocus ⇒ ativa o formulário show ⇒ mostra na tela o formulário ( semelhante chamada de rotina ). Alguns Eventos para Formulários click ⇒ 1 click dblclick ⇒ 2 clicks gotfocus ⇒ quando ele ganha o foco load ⇒ carrega mousedown ⇒ 1 click para baixo mouseup ⇒ 1 click para cima ( larga o botão ) unload ⇒ descarrega Obs. : Para obter mais informações, clique no formulário e tecle <F1>. Microsoft Visual Basic 4.0 6 Controle Label Mostra uma informação estática ( um rótulo). Exemplo : Fornecer instruções ao usuário. Nome ↑ ↑ label textbox Algumas Propriedades caption ⇒ rótulo font ⇒ tipo de letra autosize ⇒ tamanho automático appearance ⇒ aparência (2D,3D) Alguns Eventos (mais usados) click dblclick Controle Textbox Usado para obter informação do usuário. Obs. : Você pode utilizar o textbox em conjunto com o controle data, para exibir informações de um Banco de Dados Algumas Propriedades multiline ⇒ mais de uma linha passwordchar ⇒ senha ( **** ) Alguns Métodos Microsoft Visual Basic 4.0 7 move ⇒ move o objeto setfocus ⇒ deixa o objeto ativo Alguns Eventos change ⇒ qualquer alteração no campo click ⇒ evento clique gotfocus ⇒ evento ganho de foco Controle Commandbutton É utilizado para invocar uma ação. A maioria dos formulários possuem os controles OK e CANCEL Algumas Propriedades visible ⇒ visível ou não default ⇒ irá indicar que o botão é o que irá ficar ativo inicialmente quando o formulário for lido. ( note que deverá existir apenas um controle de comando default por formulário. Controle Combobox Permite que você selecione uma opção existente em uma lista pre- determinada, digitando-os em uma caixa de texto associada a esta lista Data Permite acessar dados armazenados em um arquivo de Banco de Dados. Algumas Propriedades Microsoft Visual Basic 4.0 8 editmode readonly top database Menu Permite a criação de menus personalizados para a sua aplicação, deixando-a com uma aparência mais profissional. Algumas Propriedades appearance name caption index Evento ( único ) click Ole Container Insere no formulário outros aplicativos ( som, .doc, planilha excel, etc). Picture Box O controle picture box é utilizado para exibir imagens de arquivos bitmap, icon e metafile. Timer Permite a você executar certas partes de seu código a intervalos de tempo. ( Background ) Exemplo : A cada ‘ t ‘ segundos você pode verificar se foi realizada a inclusão de um nome ou você pode inserir a hora atual. Microsoft Visual Basic 4.0 9 File List Box Apresenta uma caixa de listagem de itens. Seu ícone no toolbox corresponde à figura de uma folha com a ponta direita superior dobrada. Adiante faremos um exercício para melhor entendermos esse controle. Prática 1 O Objetivo desta prática é fazer com que o aluno se familiarize com o ambiente e obtenha conceito básicos dos objetos do Visual Basic. Vamos simular um pequeno editor de texto para que você entenda como o controle Timer vai realizando tarefas em segundo plano (background). Dentro do seu aplicativo. Inclua no formulário : 1 textbox propriedades ⇒ multiline = true name = txtedit scrollbar = 2-vertical text = <apaga> 1 timer propriedades⇒ interval = 1000(ms), name = timer 1 label propriedades ⇒ caption = <apagar> name = lbltime Na seção General (geral) inclua o seguinte código: Public tempo as date No procedimento sub form_load() inclua: tempo = now No procedimento timer_timer inclua: Microsoft Visual Basic 4.0 10 lbltime.caption = format(now-tempo, “long time”) Execute sua aplicação. Prática 2 Para vermos como o controle FileListBox funciona, vamos fazer o seguinte: Crie um objeto FileListBox em um novo formulário e dê a ele o Nome = File1 (Já é o nome default dele!). Depois insira o seguinte código no evento click do formulário: Private Sub Form_Click () Dim nome As String, I As Integer, Msg As String ' Declarando variaveis. File1.Pattern = "Arquivo.*" ' Setando a forma geral do nome do arquivo For I = 1 To 8 ' oito vezes. nome = "Arquivo." & I Open nome For Output As FreeFile ' cria um arquivo vazio. File1.Refresh ' abre e atualiza o file list box. Close ' fecha ao arquivo. Next I Msg = "Tecle OK para remover os arquivos criados." MsgBox Msg ' mostra mensagem. Kill "Arquivo.*" ' Remove os arquivos de teste. File1.Refresh ' atualiza o filelistbox. End Sub Agora execute a aplicação. Prática 3 • Crie um formulário (form) {nomeie, escolha um caption} Microsoft Visual Basic 4.0 11 • Insira um textbox e um label {nomear, limpar textos} • No evento form_mousemove inclua o seguinte código: Fillcolor = qbcolor (int (rnd * 15)) ‘ sortea-se uma cor para o fundo da ‘circunferência Fillstyle = int(rnd * 8) ‘ sortea-se um grid para a circunf. Circle (x,y), 250 ‘ desenha um círculo No evento Textbox_change() inclua: Label_caption = textbox.text ‘o que for escrito no textbox sairá no caption ‘ do label Prática 4 • Crie um form {nome:login} • Desenhe o seguinte layout Forneça seu nome e sua senha para logar: Nome OK Command ⇒ cmd Ok cmd Cancela Senha Cancelar Label Textbox ⇒ txtnome txtsenha Obs .: Nomear todos os objetos Limpar textos dos texbox’s Microsoft Visual Basic 4.0 12 Inserir Código : cmdcancela_click() msgbox “Esse botão cancela a aplicação” end cmdok_click() msgbox “Nome do usuário = “ & txtnome.text & “, senha = “& txtsenha.text txtsenha_change() If txtnome.text<> “ ” and txtsenha.text<> “ “ then cmdok.enable = true endif txtnome_change() If txtnome.text <> “ “ and txtsenha.text <> “ “ then cmdok.enable= true endif Prática 5 Vamos fazer um programa em Visual Basic que calcule o número de dias (aproximado) vividos pelo usuário após ele ter fornecido a idade. Adicione a um formulário (abra um novo projeto) 4 label’s, 2 textbox’s e 2 command’s, conforme a figura abaixo : Form1 Label1 Text1 Microsoft Visual Basic 4.0 13 Label2 Text2 Comand1 Comand2 Label3 Label4 A seguir ajuste as propriedades conforme a tabela a seguir : Objeto Propriedade Valor Label1 Autosize Caption Name TRUE Entre com seu nome : lblNome Label2 Autosize Caption Name TRUE Entre com sua idade : lblidade Label3 Autosize Caption Name TRUE (nenhum) lblNomeResposta Label4 Autosize Caption Name TRUE (nenhum) lblidadeResposta text1 Name Text txtNome (nenhum) text2 Name Text txtIdade (nenhum Command1 Caption Name Default &OK btnOK TRUE Command2 Caption Name &Cancela btnCancela Form1 Caption Name Dias vividos Idade Obs : A propriedade “default” do objeto command1 está setada em “TRUE” para que inicialmente, quando o usuário teclar ENTER, acione o botão OK. Microsoft Visual Basic 4.0 14 A seguir inserir o código btnOK_click() DIM idade as integer, dias as long idade = val(txtidade.text) dias = idade * 365 lblNomeResposta.caption = txtnome.text lblidadeResposta.caption = “Você viveu até hoje aproximadamente “ &dias& “dias.” btnCancela_click() end Para executar : 1. 4 2. Criando um .EXE • Selecione opção Make EXE File do menu File. • Escolha Options. • No quadro Version Number podemos entrar com o número da versão do programa. • No quadro application podemos informar o nome do programa ou um ícone. • No quadro version information podemos comentar o programa. Clique OK duas vezes depois execute o programa através da pasta onde foi gerado o executável. 1.7 Criando Rotinas para Validação de Dados Como fazer para inibir a entrada de dados numéricos em um textbox alfabético e/ou a entrada de dados alfabéticos em um textbox numérico ? Microsoft Visual Basic 4.0 15 Faça o seguinte, crie um novo formulário com apenas um objeto (um textbox) e no procedimento Keypress (para achá-lo clique sobre a seta da caixa de combinação denominada Proc) do objeto textbox e insira o código: If keyascii >= asc(“0”) and keyascii <= asc(“9”) then keyascii = 0 Isso irá inibir a entrada de dados numéricos. Asc(X) - retorna a ordem de X na tabela ascii, então, se o caractere teclado estiver entre 0 e 9 o campo é realimentado. Para inibir entrada alfabética, insira o código a seguir em txtidade_keypress() : If keyascii < asc(“0”) or keyascii > asc(“9”) then keyascii = 0 Para convertermos caracteres alfabéticos, por exemplo nomes de pessoas, para maiúsculos fazemos: Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii >= Asc("0") And KeyAscii <= Asc("9") Then KeyAscii = 0 ElseIf KeyAscii >= Asc("a") And KeyAscii <= Asc("z") Then KeyAscii = KeyAscii - 32 End If Módulo 2 Trabalhando com Formulários Microsoft Visual Basic 4.0 16 Cada formulário na sua aplicação é gravado com a extensão .FRM e contém: • As instâncias das propriedades do formulário e do controle. • Declaração das variáveis ao nível de formulário. Procedimentos e módulo “General”. {O código situado neste módulo pode ser “visto” por todos os procedimentos do formulário} 2.1 Configurando o Ambiente de Trabalho Menu Tools/Options Ambiente (Environment) Grid do formulário(Form design grid) : determina o espaçamento do grid do formulário. Janelas superiores(Windows on top) : Determina quais janelas sempre serão mostradas durante o projeto. Exige declarações de variáveis(Require variable declaration) : Determina a obrigatoriedade de declaração de variáveis (cuidado !!!) Checagem automática de sintaxe (Auto sintaxe check) : quando permitida fornece correção ao código durante implementação. Project Startup form : Indica qual formulário deverá ser executado incialmente. É comum o programador ter mais de um formulário em umaplicativo e com isso se esquecer de setar o início da execução para o formulário inicial. Vamos prestar atenção. Microsoft Visual Basic 4.0 17 Editor Fonte(Font) : Determina a fonte usada nos códigos. Tamanho(Size) : Determina o tamanho da fonte usada nos códigos. Cor do código(code color) : determina a cor do código. 2.2 Interagindo com o Usuário 2.2.1 Função MSGBOX Mostra informações ou questionamento ao usuário. Sintaxe : MSGBOX (Mensagem, [botão],[Título do Botão]) Mensagem - Informação enviada ao usuário. Botão - Tipo de caixa de diálogo + tipo de ícone. Valor Tipo de Ícone 16 ⊗ 32 ? 48 ! 64 i Valor Tipo de Caixa 0 OK 1 OK, Cancela 2 Aborta, Retorna, Ignora Microsoft Visual Basic 4.0 18 3 Sim, Não Cancela 4 Sim e Não 5 Retorna e cancela Valor Botão Default Ativo 0 1° Botão 256 2° Botão 512 3° Botão A função MSGBOX irá retornar um valor baseado no tipo de caixa escolhida. Botão Valor(constantes) OK vbok(1) Cancela vbcancel(2) Aborta vbabort(3) Retorna vbretry(4) Ignore vbignore(5) Yes vbyes(6) No vbno(7) Exemplo : Inserir o seguinte código em um objeto cmdaqui com caption = clique aqui. Clique Aqui No evento click do objeto cmdaqui insira o código Private Sub cmdaqui_Click() Dim Resposta As Integer Microsoft Visual Basic 4.0 19 Resposta = MsgBox("quer continuar?", 4 + 48 + 256, "mensagem") If Resposta = vbYes Then MsgBox "Escolheu SIM", 0 + 48 + 0, "Resultado" Else MsgBox "Escolheu NÃO", 0 + 48 + 0, "Resultado" End Sub 2.2.2 Caixa de Entrada (INPUTBOX Function) Esta função fornece um meio fácil de obter informações do usuário. É semelhante ao controle textbox, difere na emissão de uma caixa de diálogo. Sintaxe : INPUTBOX (Mensagem, Título da caixa, Mensagem Default) Exemplos: • Crie um objeto command (cmd) • No evento Dbclick insira o código Private Sub Form_DblClick() Dim arquivo As String arquivo = InputBox("Entre com o nome do arquivo", "Abrir Arquivo", "C:\") MsgBox "Arquivo " & arquivo & " aberto ! " End Sub Dica : Para mais informações, veja “INPUTBOX” no Help 2.3 Gerenciando Formulários Na maioria dos aplicativos a interface com o usuáro é composta por mais de um formulário. O formulário “STARTUP” é mostrado automáticamente quando a aplicação VB é inicializada. Microsoft Visual Basic 4.0 20 Ação Método ou Função Lê um formuláro na memória mas não mostra na tela LOAD Lê e mostra um formulário SHOW Mostra um formulário já lido SHOW Esconde um formulário mostrado na tela HIDE Esconde e tira da memória um formulário UNLOAD Exemplo : Frmform1.show Frmform1.hide Load Frmform1 Unload Frmform1 Formulário Modal ou Não-Modal Um formulário Modal não permite que o usuário interaja com outros formulários da aplicação ao mesmo tempo (como o “Save File as”) Um formulário Não-Modal permite que o usuário escolha entre os formulários. O método Show seta um formulário como modal ou não modal. Exemplo: Frmform1.show vbmodeless ‘ não modal Frmform1.show vbmodal ‘ modal Terminando uma aplicação END faz um Unload em todos os formulários e termina a aplicação. Microsoft Visual Basic 4.0 21 Prática 6 Faça um aplicativo que calcule raízes de um polinômio de grau dois. O polinômio é da forma : AX2 + BX + C = 0 Relembrando : A,B coeficientes da equação C termo independente Resolver uma equação do 2° grau é encontrar o valor ou os valores que se colocados no lugar da variável X, tornam a sentença verdadeira. A fórmula para encontra as raízes (X1,X2) é a seguinte: X = - B ± SQR( delta) , Delta = B^2 - 4AC 2A Os resultados deverão ser fornecidos por outro formulário. Você deverá fazer esta prática sozinho! Mesmo sem conseguir você estará assimilando com maior ênfase as características da programação orientada a evento e os “macetes” do ambiente Visual Basic. Deixe para olhar a resolução depois que você “eventualmente” se perdeu! Resolução: Passos : Microsoft Visual Basic 4.0 22 Crie um formulário com as seguintes propriedades : Name - Frmmain Caption - Equação do 2° grau Objetos : Label da Equação ientes A= 3 - Name lblB Caption B= - Name lblC o independente C= ular r 1 - Name lblDados Caption Dados 2 - Name lblA Caption Coefic 4 Caption Term Command 1 - Name cmdcalc Caption &Calcular Default TRUE 2 - Name cmdsai Caption &Sair Textbox 1 - Name TXTA Text <vazio> Microsoft Visual Basic 4.0 23 Maxlength 5 2 - Name TXTB Text <vazio> Maxlength 5 double , delta as double, A as double, B Raiz2 = (-(-b) - SQR(delta))/(2*A) FrmResultado.txtx1.text = Raiz1 Resultado.txtx2.text = Raiz2 FrmMain.Hide do.Show Elseif Delta = 0 then Raiz1 = (-(b) + SQR(delta))/(2*A) FrmResultado.txtx1.text = Raiz1 FrmResultado.txtx2.text = Raiz2 FrmResultado.Show Else Msgbox ‘Não existem raízes reais !!!” Endif EndSub CmdSair_click() End EndSub A seguir crie outro formulário com as seguintes caracteristicas: Name FrmResultado Caption Resultado 3 - Name TXTC Text <vazio> Maxlength 5 Código CmdCalcular_click() DIM Raiz1 as double, Raiz2 as as double, C as double A = VAL (txta.text) B = VAL (txtb.text) C = VAL (txtc.text) Delta = (B*B) - 4*A*C If Delta>0 then Raiz1 = (-(-b) + SQR(delta))/(2*A) Frm FrmResulta FrmMain.Hide Microsoft Visual Basic 4.0 24 me lblX1 = ult TRUE 2 text <vazio> Depois insira o código seguinte no evento click do objeto cmdvoltar FrmMain.txta.text = “ “ FrmMain.txtb.text = “ “ FrmMain.txtc.text = “ “ Frmresultado.Hide FrmMain.Show Execute a aplicação !!! Label 1 - Na Caption X1 2 - Name lblX2 Caption X2 = Command 1 - Name Cmdvoltar Caption &Voltar Defa Textbox 1 - Name txtx1 text <vazio> 2 - Name txtx Microsoft Visual Basic 4.0 25 Módulo 3 Aspectos de Programação Visual Basic 3.1 Atribuindo Valores [LET] nome_da_palavra = <valor> 3.3 Variáveis O que são variáveis ? Toda linguagem de programação precisa de algum lugar para armazenar o resultado de seus cálculos ou simplesmente para controlar o fluxo do programa. Assim como acontece na álgebra cotidiana, as linguagens de programação se valem de variáveis para armazenar dados na memória do computador. Uma variável de memória nada mais é do que uma posição da memória do computador reservada exclusivamente para que sejam guardadas informações e dados. A essa posição de memória damos um nome para referência dentro do nosso programa, como por exemplo, NomeCliente. Quem controla qual posição de memória do computador será reservada é a própria linguagem e o sistema operacional, ou seja, devemos apenas nos preocupar em nomear e declarar as variáveis. E já que estamos falando de variáveis, quando formos nomeá-las, deveremos seguir algumas regras básicas: ⇒ O nome precisa iniciar com uma letra. ⇒ Somente são permitidas letras, números e o caractere de sublinhado. Qualquer sinal de pontuação e espaço em branco será inválido. Microsoft Visual Basic 4.0 26 ⇒ No Visual Basic 4.0, os nomes podem ter até 255 caracteres de comprimento. Isso significa que podemos ter nomes de variáveis bem descritivos, como por exemplo, PrimeiroNomedoCliente. ⇒ Não podem coincidir com uma palavra reservada do Visual Basic, como nomes de funções ou procedimentos. ⇒ Precisam ser únicos dentro do escopo atual, ou seja, não podemos ter duas variáveis com o mesmo nome dentro de uma rotina, porém, entre rotinas diferentes, isso é perfeitamente possível. Escolha nomes sugestivos para as variáveis, de tal forma que descrevam sua função ou conteúdo que será armazenado nelas. Por exemplo para uma variável onde seria armazenado o resultado do cálculo do salário de um funcionário, poderíamos escrever nSalarioFunc, em vez de X, Y ou Z. 3.4 Declaração de Variáveis Dim Nomedavariavel [ as tipo de dados] 3.5 Tipos de Dados Como toda linguagem de programação, o Visual Basic também possui vários tipos de dados aplicáveis às varáveis, que definem quais os valores que essas poderão armazenar. O Visual Basic 4.0 define 11 tipos de dados básicos, cada qual com suas características peculiares, como largura da faixa de dados, tamanho em bytes, etc. A tabela a seguir relaciona todos esses tipos: Tipo de Dado Tamanho em Bytes Faixa de Valores Integer 2 Bytes - 32.768 a 32.767 Long 4 Bytes - 2.147.483.648 a 2.147.483.647 Single 4 Bytes - 3,402823E38 a - 1,401298E-45 (Val. Negativos) 1,401298E-45 a 3,402823E38 (Val. Positivos) Double 8 Bytes -1,79769313486232E308 a - Microsoft Visual Basic 4.0 27 4,9406564584124E-324 (Val. Negativos) 4,9406564584124E-324 a 1,79769313486232E308 (Val. Positivos) Currency 8 Bytes - 922.337.203.685.477,5808 a 922.337.203.685.477,5807 String 1 Byte por caractere De zero a 65.500 caracteres Em sistemas de 32 bits,máximo de 2E32 caracteres. Byte 1 Byte 0 a 255 Boolean 2 Bytes True (verdadeiro) ou False (falso) Date 4 Bytes Qualquer referência a objeto Variant 16 bytes + 1 byte para cada caractere Qualquer valor numérico, caractere, objeto ou valor nulo. Os tipos de dados determinam o que você pode armazenar numa variável. Por exemplo, você não pode entrar com uma expressão caractere numa variável do tipo numérico, nem tampouco digitar um número numa variável lógica. Vejamos os detalhes dos tipos de dados mais comumente utilizados. Tipos lnteger e Long Esses dois tipos de dados permitem o armazenamento de valores numéricos inteiros, com os quais podemos efetuar cálculos e operações matemáticas. A faixa de valores permitida para o tipo lnteger vai de -32.768 a 32.767, sendo portanto limitada para alguns tipos de operações. Variáveis desse tipo são muito úteis como contadores de loops For... Next, por serem de manipulação muito rápida pelo processador, pois necessitam de poucas instruções de máquina. O tipo Long, por outro lado, abrange uma faixa muito maior de valores, da ordem de 2 milhões, conforme pode ser constatado pela tabela anterior. Microsoft Visual Basic 4.0 28 Tipos Single e Double Single e Double também são tipos de dados numéricos, porém permitem a manipulação de valores decimais, como pesos, unidades de medidas, etc. Como os tipos anteriores, podemos efetuar qualquer operação matemática com eles. O que diferencia o tipo Single do tipo Double é a precisão nas casas decimais e a faixa de valores abrangida por cada um. Veja a tabela anterior para comparação. Variáveis do tipo Single são ditas de precisão simples, comumente chamadas apenas de variáveis de ponto-flutuante. Variáveis do tipo Double são denominadas variáveis de dupla precisão. Tipo Currency O Visual Basic possui um tipo de dado especial para tratamento de valores monetários, evitando-se assim erros de arredondamento durante cálculos matemáticos. Esse tipo de dado é chamado de Currency. Devemos utilizá-lo apenas para armazenamento de valores monetários. Se num determinado cálculo, o valor resultante tiver mais de quatro casas decimais, as casas decimais extras (a partir da quinta casa) serão truncadas. Assim, o número 5402,105782 será armazenado como 5402,1057 numa variável do tipo Currency. Tipo String O tipo de dado string é certamente o mais utilizado. Ele possibilita que uma sequência de caracteres seja armazenada numa variável. Essa sequência de caracteres pode conter desde letras do alfabeto até símbolos gráficos e números, muito embora não possamos efetuar cálculos com os números armazenados numa sequência. Devemos envolver a cadeia de caracteres com aspas ("). Com variáveis do tipo caractere, é possível efetuarmos algumas operações de comparação, concatenação (junção) de duas ou mais seqüências de caracteres ou extração de uma parte da seqüência. Não é possível, porém, efetuar cálculos matemáticos e aritméticos, já que qualquer número armazenado numa variável desse tipo será considerado como uma sequência de texto e não um valor numérico. Microsoft Visual Basic 4.0 29 Podemos determinar um tamanho máximo para urna variável do tipo String, simplesmente adicionando um asterisco (*) seguido por um número que define o tamanho máximo em caracteres. Por exemplo, para declarar uma variável strNomeCliente com um tamanho máximo de 50 caracteres, você escreveria: Dim strNomeCliente As String * 50 Se for armazenada uma cadeia de caracteres menor que o tamanho máximo especificado, a variável será preenchida com espaços em branco à direita para completá-la. Se por outro lado, você tentar armazenar mais caracteres do que o permitido, os excedentes serão descartados. Tipo Byte Variáveis do tipo Byte são também numéricas, mas somente podem armazenar números na faixa de O a 255. Esse tipo de variável também , é útil em contador de loops For... Next pequenos, cujo ciclo de repetição não ultrapasse 255. Tipo Boolean Uma variável do tipo Boolean pode conter apenas dois tipos de valores: True (verdadeiro) ou False (falso). São muito utilizadas como sinalizadores, ou seja, variáveis que indicam se uma determinada condição lógica retornou ou resultou num desses dois valores. Veja o pequeno exemplo a seguir : Dim blnrepete As Boolean blnrepete = True While blnrepete Microsoft Visual Basic 4.0 30 . . Wend Tipo Date Variáveis do tipo data permitem o armazenamento de valores que representam uma data do calendário ou um horário. Para armazenar uma data numa variável, especifique-a entre "#", como no seguinte exemplo: dtDataVencimento = #05/06/95# dthora = #05:25# Com valores do tipo data é possível executarmos adição ou subtração, para assim calcularmos uma nova data. Por exemplo: dtDataHoje = Now dtDataAmanha = dtDataHoje + 1 dtDataOntem = dtDataHoje - 1 Tipo Object Variáveis do tipo Object podem fazer referência a objetos definidos pelo Visual Basic ou mesmo campos de uma base de dados, como dados OLE ou binários. Elas são armazenadas em endereços de 32 bits. Para esse tipo de variável, precisamos utilizar o comando de atribuição Set para assinalar valores a ela, em não apenas o sinal de igualdade. Tipo Variant Microsoft Visual Basic 4.0 31 O dado Variant é um tipo especial, já que ele permite que qualquer valor seja armazenado. Se você declara uma variável mas não especifica seu tipo de dado, o Visual Basic automaticamente atribui a ela o tipo Variant. Assim, o dado que você armazenar na variável é que definirá o seu tipo naquele momento. Podemos atribuir também um valor nulo à variáveis variant, especificando a palavra-chave Null à direita do sinal de igual. Diversas funções podem ser utilizadas para determinar qual o tipo de dado armazenado numa variável Variant. 3.6 Constantes Agora que já falamos de variáveis, vejamos as constantes, que são o oposto das primeiras. As constantes, diferentemente das variáveis, não podem ter seus valores alterados durante a execução da aplicação. Elas são utilizadas principalmente para fornecer maior legibilidade ao código-fonte, substituindo expressões numéricas ou caractere mais complexos e de difícil entendimento. Um dos tipos de constantes mais famoso é o famigerado valor de PI (3,14159265358979... ). Como convenção, adotamos letras maiúsculas para os nomes de constantes, mas isso não é regra geral. Essa é uma prática comum para os programadores em C/C++, Pascal ou mesmo Assembly. 3.7 Matrizes Dim NomeMatriz (n,m) As <tipo de dados> Exemplo: Dim idade(30) As integer Dim nota( 60,4) As double 3.8 Tipos definidos pelo usuário Microsoft Visual Basic 4.0 32 Semelhantemente às variáveis estruturadas da linguagem C/C + + ou às variáveis registro do Pascal, o Visual Basic oferece a capacidade de definirmos nossos próprios tipos de dados. Definir um novo tipo de dado pode ser muito útil quando precisamos agrupar vários tipos de dados diferentes mas correlacionados numa única variável, facilitando assim seu tratamento. Você poderia pensar que as matrizes resolveriam esse problema, mas nesse caso não são tão convenientes. Para criar uma variável com um novo tipo de dado você utiliza o comando Type, colocado na seção Declarations do módulo. Vejamos um exemplo prático, onde criaremos uma variável tipada chamada tpcliente, contendo outras variáveis para armazenamento do código do cliente, do endereço do cliente, nome da firma, cidade onde reside, salário e departamento onde trabalha. Type tpcliente intCodigoCliente As Integer strendereco As String * 50 strcidade As String * 25 strempresa As String * 40 strdepto As String * 20 sglsalario As Single End Type Aqui podemos dizer que a variável tpcliente comporta-se como um registro completo de um banco de dados e as diversas variáveis que a compõem, são os campos do registro. tpCliente intCodigoCiiente strendereco strcidade strempresa strdepto sglsalario Microsoft Visual Basic 4.0 33 Após ter sido criado o tipo de dado definido pelo usuário, você deverá ainda declarar a(s) variável(eis) desse tipo específico, como ocorre com as demais variáveis: Dim DadosCliente As tpcliente Cada campo da variável estruturada é acessado através de uma sintaxe própria. Precisamos especificar a variável estruturada seguida pela variável campo desejada, separadas por um ponto. Por exemplo, para acessar o campo strEndereco, deveríamos especificar a seguinte expressão: DadosCliente.strEndereco = "Av. Paulista, no 1815, 6o andar" Se você tiver duas variáveis do mesmo tipo de dado definido pelo usuário, poderá assinalar o valor de uma à outra apenas com o sinal de atribuição (=), similarmente às variáveis simples. Por exemplo, suponhamos que você tenha criado um tipo de dado chamado ContaCorrente, e que a partir dele tenha declarado as variáveis ContaBanco1 e ContaBanco2. Assim você poderia atribuir todos os valores dos campos da variável ContaBanco1 a ContaBanco2 através da expressão: ContaBanco2 = Contabancol Você pode também ter campos numa variável tipada que é uma matriz de dados. Por exemplo: Type ConsumoMensal strmes(12) AS String * 15 intconsumo(12) As Integer End Type Aqui nós temos um novo tipo de dado que nos permite entrar com os consumos mensais de energia elétrica, e quem sabe desenvolver um sistema aplicativo que nos auxiliará a economizar energia. Um outro recurso interessante é que você pode ter uma estrutura de dados dentro de outra estrutura. Veja o seguinte exemplo: Type DadosPessoais strNome AS String * 20 strSobreNome As String * 40 btIdade As Byte btEstadoCivil As Byte End Type Type DadosEndereco strrua As String * 50 strBairro As String * 30 Microsoft Visual Basic 4.0 34 strCidade As String * 30 strEstado AS String * 2 End Type Type Funcionário DadosFuncionario As DadosPessoais DadosResidencia As DadosEndereco btCodigoEmpresa As Byte btCodigoCargo As Byte End Type Type Empresa strNomeEmpresa As String * 50 EnderecoComercial As DadosEndereco End Type Aqui definimos duas estruturas básicas, denominadas DadosPessoais e DadosEnderecos. A partir delas,pudemos montar as outras duas estruturas de forma mais organizada e legível. Obviamente, para saber o nome do funcionário, teríamos de escrever a expressão: Funcionario.DadosFuncionario.strNome = "William Pereira Alves" Microsoft Visual Basic 4.0 35 3.9 Operadores Aritméticos Operador Descrição + Efetua a soma entre dois ou mais números - Efetua a subtração entre dois ou mais números * Efetua a multiplicação entre dois ou mais números / Efetua a divisão entre dois números e resulta num número de ponto-flutuante \ Efetua a divisão entre dois números e resulta num número inteiro ^ Efetua a exponênciação Mod Retorna o resto de uma divisão não exata entre dois números Lógicos Operador Descrição And Efetua a operação lógica E. Se ambas as expressões forem verdadeiras, então o resultado será verdadeiro Or Efetua a operação lógica OU. Se uma das expressões (ou ambas) for verdadeira, então o resultado será verdadeiro Not Efetua a operação lógica NÃO. Inverte o estado lógico de uma expressão, se ela for verdadeira, torna-a falsa e vice-versa Xor Efetua a operação OU EXCLUSIVO. Se uma das expressões for verdadeira, o resultado será verdadeiro, porém se ambas forem verdadeiras, o resultado será falso Eqv Efetua a operação de equivalência de expressões. O resultado será verdadeiro somente se ambas as expressões forem equivalentes. Imp Efetua a operação de implicação lógica. Retorna verdadeira se uma expressão implica em outra Tabela do operador lógico Imp Microsoft Visual Basic 4.0 36 A primeira expressão é A segunda expressão é O resultado será Verdadeiro Verdadeiro Verdadeiro Verdadeiro Falso Falso Verdadeiro Nulo Nulo Falso Verdadeiro Verdadeiro Falso Falso Verdadeiro Falso Nulo Verdadeiro Nulo Verdadeiro Verdadeiro Nulo Falso Nulo Nulo Nulo Nulo Operadores Relacionais Operador Descrição < Menor que > Maior que <= Menor que ou igual a >= Maior que ou igual a = Igual a <> Diferente de String “&” ou “+” ⇒ concatenam duas strings msgbox “exemplo” & “concatenação” ⇒ Exemploconcatenção Prática 7 Vamos fazer uma aplicação que some dois vetores com 8 elementos do tipo inteiro cada um. Lembre-se que os vetores na linguagem Visual Basic inicia- se com índice zero (0). Crie um formulário com os seguintes objetos: Microsoft Visual Basic 4.0 37 Calcular Entrada do vetor A Entrada do Vetor B Ok Ok Resultado cmdok cmdok2 txtentrada txtentrada2 lblentrada cmdcalcular Tente fazer sozinho! Apenas em caso de emergência consulte a resolução. Resolução: Nomeie os objetos e depois insira o seguinte código: Na seção General (declarations) insira: Option Explicit ‘ na parte General (declarations) Dim vetorA(8), vetorB(8), vetorC(8) As Integer Microsoft Visual Basic 4.0 38 Dim i As Integer Na rotina click do botão calcular: Private Sub cmdcalcular_Click() lblsaida.Caption = "Resultado = " For i = 0 To 7 vetorC(i) = vetorA(i) + vetorB(i) lblsaida.Caption = lblsaida.Caption & " " & vetorC(i) Next i End Sub No evento click do primeiro botão Ok do formulário: Private Sub cmdok_Click() If i <= 8 Then vetorA(i) = Val(txtentrada.Text) i = 1 + i txtentrada.Text = "" txtentrada.SetFocus If i = 8 Then txtentrada.Enabled = False txtentrada.Text = "" cmdok.Enabled = False cmdok2.Enabled = True txtentrada2.SetFocus i = 0 End If End If No evento click do segundo botão Ok: Private Sub cmdok2_Click() Microsoft Visual Basic 4.0 39 If i <= 8 Then vetorB(i) = Val(txtentrada2.Text) i = i + 1 txtentrada2.Text = "" txtentrada2.SetFocus If i = 8 Then txtentrada2.Enabled = False txtentrada2.Text = "" cmdok2.Enabled = False End If End If End Sub No evento load do formulário: Private Sub Form_Load() lblentrada.Caption = "Entrada do vetor A" lblentrada2.Caption = "Entrada do vetor B" End Sub Microsoft Visual Basic 4.0 40 Prática 8 Fazer uma aplicação que simule uma calculadora, as operações possíveis serão: + soma - subtração / divisão com resto Mod resto \ divisão com inteiro ^ exponenciação * multiplicação Ajuste as propiedades dos objetos da seguinte forma: frm (formulário) caption = calculadora icon = <escolhe um ícone> name = frm calculadora cmd (botões de comando) 1. name = cmdsair caption = &sair 2. name = cmdlimpar caption = &limpar 3. name = cmdcalcular caption = &calcular default = true txt (caixas de texto) 1. name = txtresultado enable = false text = <vazio> 2. name = txtop2 tabindex = 2 text = <vazio> 3. name = txtop tabindex = 1 text = <vazio> 3. name = textop1 tabindex = 0 Microsoft Visual Basic 4.0 41 text = <vazio> lbl 1. name = lblresultado captiom = resultado 2. name = lblanuncio caption = operações : + - / mod ^ \ * 3. name = lbloperação caption = operação 4. name = lbloperador2 caption = operador2 5. name = lbloperador1 caption = operador1 6. name = lbligual caption = = A seguir insira o seguinte código: cmdcalcular_click( ) dim op1 as double, op2 as double, opção as string op1 = val (txtop1.text) op2 = val (txtop2.text) opção = txtop.text select case opção ‘nós ainda não vimos esta estrutura mas ela já nos é ‘ familiar case “+” : txtresultado.text = op1 + op2 case “-” : txtresultado.text = op1 - op2 case “/” : txtresultado.text = op1 / op2 case “\” : txtresultado.text = op1 \ op2 case “Mod” : txtresultado.text = op1 Mod op2 case “^” : txtresultado.text = op1 ^ op2 case “*” : txtresultado.text = op1 * op2 end select cmdlimpar.setfocus end sub No evento click do objeto cmdlimpar insira: cmdlimpar_click( ) txtop1.text = “ “ txtop2.text = “ “ txtop.text = “ “ txtop1.setfocus Microsoft Visual Basic 4.0 42 No evento click do botão sair escreva: cmdsair_click( ) end end sub Microsoft Visual Basic 4.0 43 Módulo 4 Estruturas de Controle Neste módulo, aprenderemos a criar estruturas de controle, que são importantes componentes de qualquer linguagem de programação. Estas estruturas permitem que você verifique a ocorrência de determinadas condições lógicas bem como reutilize blocos de código, tomando seu trabalho de programação mais produtivo. Como já adiantamos a você, as estruturas de controle são uma importante ferramenta de programação, permitindo não só a realização de desvios lógicos no processamento de seu programa, mas também a reutilização de blocos de código existentes até que determinado resultado seja obtido. O Visual Basic coloca à sua disposição uma série de comandos com esta finalidade, permitindo-lhe uma grande flexibilidade no desenvolvimento de suas aplicações. Como você já deve estar imaginando, a melhor maneira de aprender como estas estruturas operam é na prática, através de um novo aplicativo que iremos desenvolver. 4.1 Criando o Aplicativo Estruturas de Controle Vamos iniciar a criação de nosso aplicativo selecionando a opção New Project no menu File. Prática 9 Crie um formulário com o seguinte layout: Microsoft Visual Basic 4.0 44 FOR NEXT (LABEL1) Início (label2) Limite (label 3) Passo (label 4) Valor Atual de Início: (label 6) Iniciar (command) ESTRUTURAS DE CONTROLE (label 5, sem texto) (Text 5) Text 1 Text 2 Text3 Text 4 Imagem Determine as seguintes propriedades aos objetos: Vamos iniciar pelo Formulário. Propriedade Valor Caption Estrutura de Controle Name frmEstruturas Microsoft Visual Basic 4.0 45 Selecione agora o controle Label1: Propriedade Valor Alignment 2 - Center Caption FOR NEXT Font MS Sans Serif - Negrito - 14* Name LblTítulo * Ao selecionar o botão “...”, é aberta a janela “Fonte” onde você pode definir as características do texto a ser exibido. Passe agora para o controle Label2: Propriedade Valor Alignment 1 - Right Justify Caption Início: Name LblÍnicio Vamos ajustar agora o controle Text1. Propriedade Valor Name TxtÍnicio Text <apagar o valor atual> Microsoft Visual Basic 4.0 46 Selecione o controle Label3: Propriedade Valor Alignment 1 - Right Justify Caption Limite: Name LblLimite Passe agora para o controle Text2: Propriedade Valor Name TxtLimite Text <apagar o valor atual> Ajuste agora Label4: Propriedade Valor Alignment 1 - Right Justify Caption Passo: Name LblPasso Faça o mesmo com Text3: Propriedade Valor Name TxtPasso Text <apagar o valor atual> Selecionar agora Label5 e ajuste as suas propriedades conforme a tabela abaixo : Propriedade Valor Alignment 2 - Center Caption <apagar o valor atual> Name LblMsg Microsoft Visual Basic 4.0 47 Aproveite para alterar as propriedades do Label6 para : Propriedade Valor Alignment 1 - Right justify Caption <apagar o valor atual> Name Lblação Calma, agora falta pouco. Pode parecer cansativo, mas seja sincero: Quanto tempo você gastou para criar este aplicativo ? Uns poucos minutos não foi ? Pode ter certeza de que os minutos que você empenhou na criação deste aplicativo renderão bons conhecimentos sobre as estruturas de controle que estamos estudando agora. Respire fundo e passe para o próximo controle, que é o Text4. Faça as seguintes alterações : Propriedade Valor Name TxtValorAtual TabStop False Text <apagar o valor atual> O próximo passo será alterar o controle Text5: Propriedade Valor Name TxtAção TabStop False Text <apagar o valor atual> Complementando nosso aplicativo, altere as propriedades do controle Image1 para o seguinte: Microsoft Visual Basic 4.0 48 Propriedade Valor BorderStyle 1 - FixedSingle Enabled False Repita o mesmo para o controle Image2 : Propriedade Valor BorderStyle 1 - FixedSingle Enabled False Finalmente, ajuste as propriedades do controle Command1: Propriedade Valor Caption &Iniciar Default True Name BtnIniciar A única coisa que falta agora é definirmos o código que será associado ao botão "Iniciar" de nosso formulário, mas isto dependerá dos próximos assuntos que iremos aprender em seguida. 4.2 Adicionando Comentários em seu Código Agora que você já está ficando com mais prática na utilização do Visual Basic e pouco a pouco está desenvolvendo aplicativos cada vez mais sofisticados, está na hora de começar a documentar as suas rotinas. Talvez você até ache desnecessário fazer isto devido à simplicidade dos códigos que estamos criando, mas não custa nada documentar desde o início, pois é uma boa prática ir se acostumando a documentar as rotinas criadas por voce. Lembre-se de que uma rotina que é óbvia hoje pode não ser tão óbvia quando você voltar a estudá-la daqui há seis meses ou um ano. Microsoft Visual Basic 4.0 49 Imagine também que talvez outra pessoa irá analisar sua rotina no futuro, e que poderá ter grandes dificuldades para entender o que você fez. Documentar suas rotinas é muito importante para tornar seu código mais legível não só para você, mas também para as outras pessoas que irão analisá-lo mais tarde. Adotar este hábito saudável irá poupar seu tempo no futuro, quando será necessário relembrar por que você adotou determinadas soluções técnicas e , não outras aparentemente mais simples. A Instrução REM A instrução REM nada mais é do que uma abreviação da palavra Remark, que significa Comentário. Você pode incluir comentários em seus códigos de duas formas: através da instrução REM seguida do comentário desejado, ou do apóstrofo ( ‘ ) antes do comentário a ser incluído. Tudo o que estiver à direita da palavra Rem ou do sinal de apóstrofo será simplesmente ignorado pelo Visual Basic. Quando você utilizar a instrução REM, deixe um espaço em branco entre esta instrução e o comentário propriamente dito, como em: REM Este é um exemplo de comentário Já para o apóstrofo, não é necessário deixar o espaço em branco entre o sinal e o comentário: 'Exemplo de comentário usando o apóstrofo Estes comentários também podem ser utilizados em linhas de código que contêm outras instruções, como em: Microsoft Visual Basic 4.0 50 Dim Teste As lnteger 'Declara a variável Teste como Inteiro O único cuidado que deve ser tomado quando incluímos comentários em uma linha que contém instruções para o Visual Basic, é quando utilizamos a instrução REM. Neste caso, será necessário acrescentarmos o sinal de dois pontos ( : ) logo após a última instrução válida, para em seguida incluirmos a instrução REM. Você entenderá melhor vendo o exemplo abaixo: Dim Teste As lnteger: REM Não esqueça de incluir : antes de REM ! Note que este caso somente se aplica à utilização de REM em uma linha que já contém comandos. Este recurso é bastante útil durante a fase de desenvolvimento de aplicativos, pois podemos evitar a execução de determinadas linhas de nosso código pelo Visual Basic, sem que haja necessidade de apagarmos tais informações de nossas rotinas. Após os testes, basta eliminar os sinais de comentário para que o Visual Basic volte a interpretar as linhas de código existentes. Agora que já sabemos utilizar os comentários para documentar nossas rotinas, vamos iniciar nosso estudo pela estrutura de controle lf Then Else. Microsoft Visual Basic 4.0 51 4.3 Estrutura lf Then Else Uma das estruturas de controle mais utilizadas na programação em Visual Basic é sem dúvida alguma a instrução lf Then, que é utilizada para avaliar uma determinada expressão e definir se um determinado bloco de código deve ou não ser executado. A sintaxe para utilização deste comando é a seguinte: If Condição Then [Bloco de Código] [Elseif Condição-n Then [Bloco de Códígoll [Else [Bloco de Código]] End lf Detalhes: • Condição - É a condição a ser avaliada pelo VB. Esta condição utiliza os operadores de comparação que aprendemos anteriormente, sendo que a mesma tanto pode ser do tipo numérico como do tipo String. • Condlção-n - É uma outra condição lógica que pode ser avaliada pelo VB. O índice n indica que você pode inserir quantas condições lógicas quiser, bastando para isso repetir a instrução Elself. • Else - O bloco de código associado a esta instrução só será executado caso nenhuma das condições lógicas anteriores tenha sido verdadeira, ou seja, se todas as condições lógicas associadas ao lf e Elself resultaram em False, o VB executará o bloco de código associado ao Else. • End lf - Indica o final da estrutura de controle lf Then. Ao longo deste módulo você notará que a maioria das estruturas de controle são iniciadas pelo comando que as identifica e terminadas pela instrução Microsoft Visual Basic 4.0 52 End. Por questões de documentação, o VB aceita que você identifique que estrutura está sendo finalizada através do acréscimo do comando inicial da estrutura à palavra End, como em End lf por exemplo. Descrição A instrução lf ... Then (Se ... Então) sempre está associada a uma comparação lógica qualquer, como A > 10, por exemplo . Se a condição for verdadeira (True), o VB executa o bloco de código imediatamente abaixo desta linha até encontrar uma outra instrução Elself, Else ou Endif, quando então a execução do programa passa para a linha imediatamente abaixo da instrução Endif. Caso o primeiro teste lógico resulte em False, o VB irá procurar pela próxima instrução de comparação da estrutura lf Then. Caso exista alguma instrução Elself, o VB procederá da mesma forma como fez com a instrução lf, executando o bloco de código logo abaixo desta linha se a comparação for verdadeira, ou continuando a busca pela próxima instrução se a comparação for falsa. Caso todas as comparações lógicas anteriores tenham resultado em False e exista uma instrução Else no bloco de código, esta será executada sem a realização de qualquer tipo de comparação lógica. Caso não exista a condição Else em sua estrutura lf Then, a execução será encerrada quando o VB encontrar a instrução Endlf, que sinaliza o fim da estrutura de controle. Como já construímos um novo aplicativo para o estudo das estruturas de controle, vamos utilizá-lo para entender melhor como funciona o comando lf... Then. Prática 10 Alterando o Aplicativo Estruturas de Controle Selecione o botão "Iniciar" e dê dois cliques sobre o mesmo para ter acesso à janela de código. Entre com as seguintes instruções neste arquivo: Microsoft Visual Basic 4.0 53 Rem Estudo de lfThenElse Dim Inicio As Integer, Limite As Integer lnicio = Txtinicio.TEXT ' inicializa variável com o valor do controle Limite = TxtLimite.TEXT ' Idem lf Inicio > Limite Then ' Se Inicio > Limite executa esta opção TxtAção.TEXT = "A opção IF foi a escolhida! " Elseif Inicio = Limíte Then ' Se Inicio = Limite executa esta: TxtAção.TEXT = "A opção ELSEIF foi a escolhida!" Else 'Se nenhuma das anteriores executa esta: TxtAção. TEXT = "A opção ELSE foi a úníca escolhida! " Endif Faça um último ajuste em sua janela de código, selecionando a opção Form na caixa de listagem Object e a opção Load na caixa de listagem Proc. Digite a seguinte expressão nesta janela: LbiTitulo. Caption = "IF THEN " ' Altera o titulo da janela TxtPasso.Enabled = False 'Desabilita a TextBox Passo Execute o seu aplicativo e entre com os valores 100 e 10 nas caixas de texto Início e Limite. Não se preocupe com os demais controles, pois os mesmos serão utilizados pelos exercícios futuros no momento adequado. Por enquanto utilizaremos apenas as caixas de texto citadas. Clique sobre o botão "Iniciar" e veja o resultado obtido em nosso primeiro exemplo. Note que agora a condição associada à instrução IF não é mais verdadeira (início não é maior do que Limite) e desta forma o VB procurou a próxima instrução de comparação. Como existe uma condição lógica que analisa se o valor de Início e Limite são iguais, o VB executou esta opção, apresentando a mensagem correspondente a esta situação. Microsoft Visual Basic 4.0 54 Um último teste: entre com 1 e 10. Se você reparar com atenção, perceberá que nós estabelecemos três condições lógicas possíveis em nossa estrutura lf then se o valor Inicial fosse maior do que o valor Limite, se ambos os valores fossem iguais e se nenhuma das condições anteriores ocorresse. Aliás, foi o que ocorreu em nosso exemplo, pois os valores que entramos não satisfazem as condições do lf ou do ElselF. Diante disso a opção Else foi executada sem maiores perguntas. Vamos fazer uma leve modificação em nosso aplicativo. Pare a sua execução e dê dois cliques sobre o botão "iniciar" ou selecione F7 para abrir a janela de código. Acrescente a seguinte expressão dentro da estrutura lffhen, logo a seguir da opção Elself existente: Elself Inicio = 12 Then ' Somente se Inicio = 12 executa esta opção TxtAção. TEXT = "A 2a. opção ELSEIF foi escolhida! " Execute o seu aplicativo mais uma vez e entre com os valor 12 e 10 para ver o que ocorre: Pode parecer estranho, mas apesar de termos declarado o valor Início como sendo igual a 12 o VB não executou o segundo Elself como haviamos determinado. A explicação para este fato serve de alerta para quando você for criar seus próprios aplicativos utilizando as estruturas de controle lfThen. Observe seu código com cuidado e note que o segundo Elself que inserimos na estrutura somente será executado quando o valor Início for igual a 12 e o valor Limite for maior que 12, caso contrário a instrução IF será executada em primeiro lugar, pois sempre que 12 for maior do que o valor Limite, a primeira condição lógica será satisfeita e o VB não analisará nenhuma outra condição do lf. O mesmo acontecerá se você utilizar os valores 12 e 12, pois também neste caso o VB executará o primeiro Elseif da estrutura onde a condição estabelecida é valor Início = Limite, ignorando todas as demais condições. Instrução Será executada se... Microsoft Visual Basic 4.0 55 lf Início > Limite Elself Início = Limite 2o Elself Início = 12 e Limite > 12 Else Início < Limite Execute o aplicativo novamente com os valores 12 e 20 e veja que desta vez sua rotina foi executada sem maiores problemas. É importante perceber que o VB analisa as condições lógicas em seqüência, de forma que se você quiser que uma determinada ação seja tomada quando ocorrer uma situação bastante específica, coloque esta condição em primeiro lugar na estrutura lf then. Utilizando apenas uma Linha Você também pode definir condições lógicas lfthen utilizando apenas uma linha de código, tornando seu código bem compacto, porém menos legível. Geralmente, esta opção é mais utilizada durante a fase de testes de aplicativos devido sua praticidade, pois basta acrescentar a palavra REM na frente da expressão para que o seu aplicativo simplesmente ignore-a. Já, utilizando uma estrutura como a que estudamos no item anterior, teríamos bem mais trabalho para torná-la "transparente" para o Visual Basic. A sintaxe para esta estrutura não difere muito do que vimos anteriormente: lf Condição Then Expressão [Else Expressão] Um exemplo de utilização desta sintaxe poderia ser a seguinte condição: Microsoft Visual Basic 4.0 56 íf Teste = 'Sim' Then A = 1 Else A = O Note que o VB operaria da mesma forma que na estrutura completa, avaliando primeiramente se a condição proposta é verdadeira. Em caso afirmativo, seria atribuído à variável A o valor 1, caso contrário a mesma receberia o valor zero. Você também pode executar mais de um comando associado ao IF ou ao Else quando utiliza esta estrutura em uma única linha basta separá-los pelo sinal de dois pontos entre um e outro, como no exemplo a seguir: lf Teste = "Sim' Then A = l : Nome = "João” Else A = O: Nome = "Nulo" O único cuidado a ser tomado é que todos os componentes da expressão devem estar numa mesma linha e separados pelo sinal de dois pontos ( : ) um do outro. 4.4 Estrutura Select Case Você também pode selecionar um determinado grupo de comandos simplesmente avaliando o valor de uma expressão através da estrutura Select Case. Este comando possui a seguinte sintaxe: Select Case Expressão [Case condição-n [Bloco de Código1]... [Case Else [Bloco de Códígon] End Seíect Detalhes: Microsoft Visual Basic 4.0 57 • Expressão - É qualquer expressão numérica ou de string avaliada pelo Visual Basic. • Condição-n - É a condição lógica a ser avaliada pelo VB. O índice n indica que você pode inserir quantas condições lógicas quiser, bastando para isso repetir a instrução Case. • Case Else - O bloco de código associado a esta instrução só será executado caso nenhuma das condições lógicas anteriores tenha sido verdadeira. • End Seiect - Indica o final da estrutura de controle Select Case. Descrição: Inicialmente, é necessário definir a expressão que será avaliada pela estrutura Case, atribuindo a mesma à instrução Select Case. A partir daí o Visual Basic compara o valor desta expressão com a primeira instrução Case existente na estrutura de controle. Se os valores de ambas forem iguais, o Visual Basic executará o bloco de código associado à condição Case avaliada, e ao final desta passará o controle do programa para a primeira linha de código logo abaixo da instrução End Seiect. Caso o valor da instrução Case seja diferente da expressão associada ao Select Case, o Visual Basic passará para a próxima instrução Case da estrutura, repetindo o processo até encontrar uma instrução que satisfaça a condição lógica definida. Se não existir nenhuma instrução na estrutura de controle que satisfaça esta condição proposta, o VB poderá adotar dois caminhos: executar a instrução Case Else caso a mesma exista, ou simplesmente encerrar a execução da estrutura. A instrução Case Else será executada sempre que todas as demais condições existentes resultarem em False na comparação com a expressão definida em Select Case. Microsoft Visual Basic 4.0 58 Você entenderá melhor o que queremos dizer, observando na prática o funcionamento desta estrutura. Prática 11 Faça a seguinte alteração no código associado ao botão "iniciar" do nosso aplicativo: Rem Estudo de Select Case Dim Inicio As lnteger Inicio = Txtlnlcio. TEXT 'lnicializa variável com o valor do controle Select Case Inicio 'Avalia a expressão Case 1 'Verifica se Início = 1 TxtAção.TEXT = "Você escolheu o número 1 " Case 2 'Verifica se Inicio = 2 TxtAção.TEXT = "Você escolheu o número 2” Case 5 'Verifica se Início = 5 TxtAção. TEXT = "0 número 5 foí a sua escolha!" Case Else 'Se as condições anteriores forem Falsas TxtAção. TEXT = "Você não escolheu 1, 2 ou 5. " End Select I Necessitamos ainda de um outro pequeno ajuste em nosso formulário. Altere a rotina Form_load conforme abaixo: LblTítulo.Caption = "CASE SELECT" ' Altera o título da janela TxtPasso.Enabled = False 'Desabilita a TextBox Passo Microsoft Visual Basic 4.0 59 TxtLimite.Enabled = False 'Desabilita a TextBox Limite Como você pode reparar, apenas quando o valor de entrada for igual a 1, 2 ou 5 é que o VB emitirá uma mensagem específica. Para todos os demais valores informados o Visual Basic exibirá a mensagem associada à instrução Case Else. Execute agora o seu aplicativo e entre com o valor 1 na caixa de texto Início. Definindo Faixas de Valores No exemplo que criamos, todas as instruções Case estão vinculadas à ocorrência de um número ou string predeterminado, porém você pode definir que ações serão tomadas para determinadas faixas de valores. Você pode fazer isto simplesmente definindo a condição Case da seguinte forma: Case i To j Onde i é o valor inicial e j o valor final da faixa avaliada. Prática 12 Encerre a execução de seu aplicativo e faça uma rápida alteração na estrutura Select Case: Select Case Inicio 'Avalia a expressão Case 1 To 4 'Verifica se Inicio está entre 1 e 4 TxtAção.TEXT = "Você escolheu um número entre 1 e 4" Case 5 'Verifica se Início = 5 TxtAção.TEXT = "0 número 5 foi a sua escolha! " Microsoft Visual Basic 4.0 60 Case 6 To 8 'Verifica se Inicio está entre 6 e 8 TxtAção.TEXT = "Você escolheu um número entre 6 e 8 " Case Else 'Se as condições anteriores forem Falsas TxtAção.TEXT = "0 número escolhido é maior que 8! " End Select Execute seu aplicativo novamente e entre com alguns valores entre 1 e 10 e veja como o VB interpreta seus dados. Você perceberá que esta característica é muito útil quando os valores avaliados podem ter determinadas tolerâncias, pois permite que você torne seu código bem mais compacto do que definir uma condição Case para cada valor a ser avaliado. Utilizando Operadores de Comparação Você também pode utilizar operadores de comparação com a instrução Case, basta acrescentar o operador ls na expressão lógica definida por você, como por exemplo em: Case ls >= 20 Altere o código de seu aplicativo acrescentando mais uma instrução Case na estrutura de controle, logo abaixo da última instrução Case definida por você e antes da instrução Case Else: Case ls > 20 TxtAção.TEXT = "Você escolheu um número maior que 20 " Execute o seu aplicativo e entre com qualquer valor acima de 20 para ver o que acontece. Avaliando Expressões do Tipo String Até agora em nossos exemplos, sempre utilizamos valores numéricos para estudar o comportamento da estrutura Case, porém o Visual Basic também permite que você utilize valores do tipo String em suas expressões. Microsoft Visual Basic 4.0 61 Vamos alterar um pouco o código de nosso aplicativo, alterando os valores analisados nas instruções Case para dados do tipo string, como mostramos a seguir: Rem Estudo de Select Case Dim Inicio As String Início = Txtinlcio.TEXT 'lnicializa variável com o valor do controle Select Case Inicio 'Avalia a expressão Case "José " 'Verifica se Inicio é igual a José TxtAção.TEXT = "José foi escolhido " Case "João " 'Verifíca se Início = João TxtAção.TEXT = "0 nome é João!" Case "Maria " 'Verifica se Inicio = Maria TxtAção.TEXT = "Você dígitou Maria" Case Else TxtAção.TEXT = "Nenhum nome foí selecionado! 'Se as condições anteriores são False End Select Coloque seu aplicativo em execução e entre com os nomes José, jose, João e joao e repare como o VB trata cada um destes nomes. Note que nesta comparação de strings, o Visual Basic diferencia palavras acentuadas ou não e palavras grafadas em maiúsculas e minúsculas, por isso tome muito cuidado ao realizar comparações de strings, pois seu programa pode apresentar um comportamento bastante estranho apesar de você ter a certeza de que tudo está em perfeito estado. Vamos estudar agora a estrutura For Next, que é uma outra instrução muito utilizada na programação em Visual Basic. 4.5 Estrutura For Next Microsoft Visual Basic 4.0 62 Este comando repete um mesmo bloco de código um determinado número de vezes independentemente de qualquer condição lógica. A sintaxe deste comando é a seguinte: For Contador = Valorinicial To ValorFinal [Step Passo] [Bloco de Código] [Exit For] [Bloco de Código] Next [Contador] Detalhes: • Contador - É uma variável de memória numérica que será utilizada para controlar o número de execuções do bloco de código. • Valorlniclal - Valor de inicialização do contador. Você pode iniciá-lo com o valor zero, um ou mesmo qualquer outro que julgue necessário. • ValorFinal - É o valor final que a variável Contador assumirá antes de encerrar a execução do loop. • Passo - Você pode determinar se a variável contador será incrementada de um em um ou de dois em dois por exemplo. Caso você não informe este parâmetro, o Visual Basic considera que o incremento será positivo de uma em uma unidade. Você também pode definir números negativos para esta opção. • Exit For - Você pode interromper a execução do loop através desta instrução. Ao encontrá-la no meio de seu bloco de código, o loop é interrompido. Esta instrução normalmente está associada à ocorrência de uma determinada condição lógica. Descrição Para utilizar esta estrutura de controle você necessitará de uma variável de memória para ser o contador do número de repetições que a estrutura fará. Esta variável é inicializada com o valor especificado por você em Valorlnicial e é feita uma comparação de seu valor com o valor definido por você em ValorFinal. Se o valor do Contador é menor do que o valor de ValorFinal, o bloco de código localizado entre as declarações For e Next é executado uma vez. Microsoft Visual Basic 4.0 63 Ao final da execução do bloco de código, o Visual Basic incrementa a variável de controle o número de unidades especificado em Passo. É feita uma nova comparação, e se o contador ainda for menor que a variável ValorFinal, o ciclo se repete. Quando o contador atinge um valor maior que a variável limite, a execução do loop é encerrada e o Visual Basic passa para a linha imediatamente seguinte à declaração Next. Vamos aprender na prática como se comporta um loop do tipo For Next através do aplicativo que criamos no início deste módulo. Prática 13 Alterando o Aplicativo Estruturas de Controle. Selecione o botão "Iniciar" e dê dois cliques sobre o mesmo para ter acesso à janela de código. Entre com as seguintes instruções neste arquivo: Vamos considerar que o sinal @ indica que o comando continua na mesma linha, que por questões de editoração da apostila, o mesmo foi dividido em duas ou mais linhas. Rem Estudo de For Next Dim Contador As integer, Inicio As integer, Limite As integer, @ Passo As integer, Vezes As integer Início = Txtinlcio.TEXT 'lnicializa vanável com o valor do controle Limite = TxtLimite.TEXT 'Idem Passo = TxtPasso.TEXT 'Idem Vezes =0 'lnicializa a vanável Vezes com zero Microsoft Visual Basic 4.0 64 LblMsg.Captfon = " Enquanto Contador for menor ou igual a " & Limite @ & " o bloco de código será executado! " LblMsg.Refresh 'Atualiza o controle LblMsg For Contador = inicio To Limite Step Passo Vezes = Vezes +1 TxtValorAtual. TEXT = Contador TxtValorAtual.Refresh 'Atualiza o controle TxtAção.TEXT = "Executando o bloco de código pela " & Vezes & @ “ a. vez” TxtAção.Refresh 'Atualiza o controle Next Rem Depois de executar o loop o controle do programa passa para esta linha: TxtAção.Text = "0 bloco de código foí executado " & Vezes & " vezes!" Faça um ajuste na procedure Form-load, deixando apenas as seguintes linhas de código: LblTítulo.Caption = "FOR NEXT” ‘ Altera o titulo da janela LblAção.Caption = "Valor Atual do Contador" Execute o aplicativo e entre com os valores 1 para Inicio, 10 para Limite e 1 para Passo. Clique sobre o botão "iniciar" e veja o que ocorre. Dependendo da velocidade de seu microcomputador, você só conseguirá ver a última mensagem exibida na tela após o término do loop. Microsoft Visual Basic 4.0 65 Na prática, o que o sistema faz é exibir na tela os valores das variáveis definidas por nós conforme a instrução For Next vai alterando as mesmas. Para facilitar a sua vida vamos fazer uma pequena alteração em nosso aplicativo, incluindo mais algumas linhas de código a fim de "desacelerarmos" nosso computador. Acrescente as seguintes instruções logo abaixo da linha TxtAção.Refresh, de modo a deixar sua rotina com a seguinte aparência: For n = 1 To 100000 REM Este loop não faz nada! Next Na verdade, o que fizemos foi nada mais do que acrescentar um outro loop dentro do já existente, para fazer com que o Visual Basic gaste um determinado tempo entre uma atualização de tela e outra, e assim podermos ver o conteúdo das variáveis envolvidas no loop. Saiba que o valor de 100000 foi obtido experimentalmente, e dependendo da velocidade de seu computador, você terá que aumentar ou reduzir este valor até obter o intervalo desejado entre uma exibição e outra em seu monitor. Saindo de um Loop For Next Como já vimos no item anterior, sempre que você inicia a execução de um loop For Next, ele somente encerra sua operação quando o contador atingir um valor maior do que o valor final do loop. Na verdade, você pode interromper a execução do mesmo, utilizando para isso o comando Exit For. Geralmente, este comando é utilizado em conjunto com uma instrução lf, como a que vimos no início deste capitulo. Vamos supor que você deseja executar um bloco de código um determinado número de vezes ou até que um dado valor seja atingido. Este valor tanto pode ser proveniente do cálculo de uma fórmula qualquer como de uma variável de memória existente. Microsoft Visual Basic 4.0 66 Você poderia, por exemplo, definir esta condição da seguinte maneira: lf Vezes = Limite / 2 Then Exit For End lf Como a variável Vezes é incrementada em uma unidade a cada execução do loop, você pode definir que assim que o valor da mesma for igual ao valor da variável Limite dividido por dois, o loop será encerrado. É claro que neste caso, seria mais fácil definirmos logo de início o valor adequado para a variável Limite ao invés de acrescentarmos uma cláusula Exit For, mas como estamos apenas querendo mostrar a você o mecanismo desta instrução Exit, vamos aproveitar as variáveis de memória que já existem em nosso código, evitando assim termos que fazer mais alterações na rotina existente. Utilizando Instruções For Next Aninhadas No exemplo anterior, utilizamos duas instruções For Next aninhadas, isto é, uma dentro da outra. Veja a seguir, um fragmento do código que utilizamos em nosso exemplo: For Contador = Inicio To Limite Step Passo Vezes = Vezes + 1 TxtValorAtual.TEXT = Contador For n = 1 To 100000 Rem Este loop não faz nada! Next Next Até que olhando desta forma não há muitas dúvidas sobre que instrução Next está relacionada à primeira instrução For, mas e quando suas rotinas forem ficando cada vez maiores complexas? Ao analisar seu código, você pode ser levado a concluir erroneamente que um determinado Next está associado a uma instrução For, quando na verdade ambas não têm nada a ver uma com a outra, o que fatalmente o levará a cometer um erro de avaliação de sua rotina. Microsoft Visual Basic 4.0 67 Outro ponto importante é que se por um erro seu, uma instrução Next for encontrada antes da instrução For correspondente, o VB apresentará um erro em tempo de execução, paralisando a execução de seu aplicativo. Este tipo de erro bastante comum pode ser evitado, bastando para isso declarar junto à instrução Next o nome da variável de memória que é utilizada como contador pelo Visual Basic, como no exemplo a seguir: For Contador = Inicio To Limite Step Passo Vezes = Vezes + 1 TxtValorAtual.TEXT = Contador For n = 1 To 100000 Rem Este loop não faz nada! Next n ‘Incrementa a variável n Next Contador ‘Incrementa a variável Contador Para evitar erros de execução ao utilizar instruções For aninhadas, você sempre deve declarar a instrução acompanhada do nome da respectiva variável utilizada como contador do loop. Um último comentário sobre a estrutura For Next: Como você pode observar nos exemplos que criamos, o valor do contador sempre é armazenado em uma variável de memória, e por isso mesmo sempre é possível modificarmos o seu valor, alterando o comportamento do loop. Isto tanto pode ser um importante recurso de programação como uma fonte de dores-de-cabeça, dependendo da forma como você utilize esta possibilidade e da complexidade de seu código. A utilidade deste recurso é que você pode repetir a execução do loop indefinidamente até que uma determinada condição desejada seja obtida. Na verdade, existem outras formas mais adequadas de se fazer isto, porém não podemos deixar de considerar a possibilidade de realizarmos esta tarefa com a estrutura For Next. Microsoft Visual Basic 4.0 68 O ponto negativo é que alterando o valor do contador do loop durante a execução, você pode levar o seu programa a entrar num loop infinito caso a meta definida por você não possa ser atingida, além de tornar o seu aplicativo mais difícil de entender e depurar. Só para ter uma idéia do que queremos dizer, imagine que seu aplicativo faça uso do seguinte bloco de código: Private Sub BtniniciaLClíckO Rem Estudo de For Next com alteração do Contador durante a execução Dim Contador As integer, Resultado As Single, Vezes As integer Resultado = 100 ‘ lnicializa a variável com o valor 100 For Contador = 1 To 10 Resultado = Resultado + (1.005 ^ 2) 'Fórmula a ser calculada Vezes = Vezes + 1 'Número de execuções TxtValorAtual. TEXT = Resultado 'Exibe o resultado na Textbox TxtValorAtual.Refresh 'Atualiza o controle For n = 1 To 100000 'Loop para desacelerar o programa Rem Este loop não faz nada! Next n lf Resultado < 120 And Contador = 10 Then Contador =1'Ajusta valor do Contador Para o valor 1 Next Contador Rem Depois de executar o loop o controle do programa Rem passa para esta linha: TxtAção. TEXT = "0 bloco de código foí executado ". & Vezes & " vezes!" End Sub Note que o ponto crítico é a linha que analisa o valor atual da fórmula. Em nosso exemplo, sabemos que num determinado momento o valor da fórmula será maior que 120, fazendo com que o loop deixe de ser executado. Microsoft Visual Basic 4.0 69 Mas e quando os valores são definidos no decorrer do programa com valores entrados pelo usuário? Dependendo dos dados entrados pelo usuário, pode ser bastante complicado estimar se uma determinada condição irá ocorrer ou não, comprometendo o funcionamento de seu aplicativo. A nossa sugestão é que você evite alterar o valor do contador do loop durante a execução deste, se não tiver a certeza de que o valor limite para o encerramento do loop será atingido em um determinado momento da execução. Aliás, se você executar o aplicativo acima, verá que o valor limite para o encerramento do loop será atingido após 28 execuções, isto é, o contador mesmo foi reiniciado duas vezes após a execução inicial. 4.6 Estrutura DO...LOOP Este comando repete a execução de um bloco de código enquanto uma determinada condição for verdadeira, ou até que uma condição especificada torne-se verdadeira. Este comando pode ser declarado de duas formas distintas: Do [{While I Until} Expressão] [Bloco de Código] [Exit Do] [Bloco de Código] Loop Ou se você preferir, da seguinte maneira: Do [Bloco de Código] [Exit Do] [Bloco de Código] Loop [{While I Until} Expressão] Microsoft Visual Basic 4.0 70 Detalhes: • Expressão - É qualquer expressão numérica ou de string avaliada pelo Do While / Do Until. Utilizando o comando While o bloco de código associado ao loop é executado enquanto a expressão definida for verdadeira. Quando isto não mais ocorrer, o Visual Basic passará o controle do programa para instrução imediatamente seguinte à instrução Loop estrutura de controle. Já, utilizando a sintaxe Do Until, o bloco de código será executado até que uma determinada situação torne-se verdadeira, ou seja, enquanto a expressão especificada for falsa. • Exit Do - Você pode interromper a execução do loop através desta instrução. Ao encontrá-la no meio de seu bloco de código, o loop é imediatamente interrompido, e a execução do programa passa para a primeira instrução abaixo do comando Loop. Esta instrução normalmente está associada à ocorrência de uma determinada condição lógica. Descrição: O funcionamento desta estrutura é bastante simples, mas nem por isso menos poderosa que as outras instruções que estudamos anteriormente. Como você já deve ter percebido, existem duas formas de utilizarmos esta estrutura de controle, de modo que vamos iniciar pela sintaxe Do While primeiro. Inicialmente, é feita uma avaliação da expressão associada à instrução Do While. Se a mesma for verdadeira (resultar em True), o bloco de código associado a esta instrução é executado. Ao encontrar a instrução loop, o Visual Basic retorna à linha inicial, onde a expressão lógica é novamente avaliada. Se a mesma ainda for verdadeira, o bloco de código será executado outra vez, até encontrar a instrução loop. Isto se repetirá ininterruptamente enquanto a expressão lógica resultar em verdadeira. Aliás o nome Do While pode ser traduzido como Faça Enquanto. O mesmo ocorre com a expressão Do Until, só que de maneira contrária, já que esta expressão pode ser traduzida como Faça Até . Neste caso, o bloco de código será executado até que a expressão avaliada torne-se verdadeira. Microsoft Visual Basic 4.0 71 Como já dissemos a você, existem duas formas diferentes de utilização desta estrutura. A primeira, como vimos, parte inicialmente da análise da expressão antes da execução do bloco de código. Isto significa que, se a expressão lógica for falsa desde a primeira análise, o bloco de código não será executado uma vez sequer. Já com a segunda sintaxe, antes de mais nada o bloco de código será executado, independentemente do resultado da expressão. No final do bloco de código, está a instrução Loop While / Loop Until, associada à expressão lógica. Mais uma vez, ver na prática é o melhor caminho para entender a diferença entre ambas estruturas. Prática 14 Selecione mais uma vez o aplicativo Estruturas de Controle e faça as seguintes alterações no código associado a este projeto: Na procedure Form_load( ) altere o código existente para: LblTítulo.Caption = "DO WHILE" 'Altera o título da janela TxtPasso.Enabled = False 'Desabilíta a Textbox Passo LblAção.Caption = "Valor Atual de inicio:" 'Exibe a mensagem indicada Já para a procedure Btnlniciar_Click faça os seguintes ajustes: Rem Estudo de Do While Dim Inicio As integer, Limite As lnteger, Vezes As integer Início = Txtlnício.TEXT 'lnicializa variável com o valor do controle Limite = TxtLimite.TEXT 'idem Vezes = 0 'Inicializa a variável Vezes com zero LblMsg.Caption = "Enquanto Inicio for menor ou igual a " & Limite & " o bloco de código será executado!” LblMsg.Refresh 'Atualiza o controle LblMsg Microsoft Visual Basic 4.0 72 Do While Inicio <= Limite Inicio = Inicio + 1 'lncrementa a variável Início Vezes = Vezes + 1 'lncrementa a variável Vezes TxtValorAtual.TEXT = Início TxtValorAtual.Refresh 'Atualiza o controle TxtAção.TEXT = "Executando o bloco de código pela " & Vezes & "a . vez” TxtAção.Refresh 'Atualíza o controle For n = 1 To 100000 Rem Este loop não faz nada! Next Loop Rem Depois de executar o loop, o controle do programa Rem passa para esta linha: TxtAção.TEXT = "0 bloco de código foi executado " & Vezes & " vezes!" Execute o aplicativo e veja o que ocorre. A princípio, não existe muita diferença entre o comando For Next e a rotina que acabamos de desenvolver se você observar apenas a tela de resultados, mas lembre-se de que enquanto o For Next repete um bloco de código um determinado número de vezes, o comando Do While repete este mesmo bloco até que uma determinada condição seja atingida ou enquanto determinada situação for verdadeira. Faça agora duas pequenas alterações no código associado ao botão "Iniciar" para vermos na prática esta condição. Altere a seguinte linha do seu código: De: LblMsg.Caption = "Enquanto Inicio for menor ou igual a " & Limite & " o bloco de código será executado!" Microsoft Visual Basic 4.0 73 Para: LblMsg. Caption = "Enquanto Inicio for maior que " & Limite & " o bloco de código será executado!" Aproveite para alterar as seguintes linhas também: De: Do While Inicio <= Limite Inicio = Inicio + 1 'lncrementa a variável Início Para: Do While Inicio > Limite Inicio = Início - 2 'Decrementa a variável Inicio Execute novamente o aplicativo e entre com os valores 20 e 10. Utilizando a Segunda Sintaxe Do While Como já havíamos adiantado no início deste módulo, você tanto pode definir que o bloco de código associado à instrução Do While seja executado somente se a expressão de controle for verdadeira, ou mesmo que o bloco de código seja executado uma única vez antes de avaliarmos a expressão de controle. Você perceberá a diferença da seguinte forma: Execute o aplicativo que alteramos no item anterior e entre com os valores 20 e 20 nas respectivas caixas de texto. Você receberá a mensagem que o bloco de código não foi executado uma única vez sequer. Isto ocorre porque a avaliação da expressão Início > Limite resulta em False, já que 20 não é maior do que 20. Neste caso, o Do While passa o controle do programa para a instrução imediatamente seguinte ao comando Loop. Faça uma pequena alteração no seu código, de modo a deixar a avaliação da expressão para depois da execução do loop. Para fazer isto basta transferir a palavra While e a expressão associada a esta da linha que contém o Do para a linha Loop: Microsoft Visual Basic 4.0 74 Do Inicio = Inicio - 2 'Decrementa a variável inicio Vezes = Vezes + 1 ‘Incrementa a variável Vezes TxtValorAtual.TEXT = Inicio TxtValorAtual.Refresh 'Atualiza o controle TxtAção. TEXT = "Executando o bloco de código pela " & Vezes & "a. vez’ TxtAção.Refresh ‘Atualiza o controle For n = 1 To 100000 Rem Este loop não faz nada! Next Loop While Inicio > Liniite Reexecute o aplicativo e torne a entrar com os valores 20 e 20. Note que desta vez o bloco de código foi executado pelo menos uma vez antes que o Visual Basic avaliasse a expressão lógica definida por nós. Após a avaliação da expressão (que resultará em False), o Visual Basic não mais executará o loop, passando para a próxima instrução da rotina. 4.7 A Estrutura Do Until Como já havíamos antecipado a você, a diferença entre o Do Until e o Do While é o modo com que a estrutura avalia a expressão lógica associada à mesma. No caso do Do Until, o Visual Basic executará o bloco de código enquanto o resultado da expressão avaliada for False. Quando o mesmo se tornar verdadeiro (True), o Visual Basic encerra a execução do bloco de código. Prática 15 Vamos aproveitar parte do código que utilizamos para estudar o Do While, fazendo apenas algumas rápidas modificações. Microsoft Visual Basic 4.0 75 Rem Estudo de Do Until Dim Inicio As lnteger, Limite As Integer, Vezes As lnteger Inicio = Txtlnício.TEXT 'Inicializa variável com o valor do controle Limite = TxtLimite.TEXT 'Idem Vezes = O 'lnicializa a variável Vezes com zero LblMsg.Caption = “Enquanto Início for menor que “ & Limite &” o bloco de código será executado!” LblMsg.Refresh 'Atualíza o controle LblMsg Do Until Início > Limite Início = Início + 1 'íncrementa a variável Início Vezes = Vezes + 1 'lncrementa a variável Vezes TxtValorAtual.TEXT = Inicio TxtValorAtual.Refresh 'Atualiza o controle TxtAção.TEXT = "Executando o bloco de código pela " & Vezes & " a .vez" TxtAção.Refresh 'Atualiza o controle For n = 1 To 100000 Rem Este loop não faz nada! Next Loop TxtAção. TEXT = "0 bloco de código foi executado " & Vezes & " vezes! " End Sub Faça também um rápido ajuste na rotina Form-load( ), alterando a seguinte linha: LblTítulo.Caption = "DO UNTIL" 'Altera o título da janela Ponha seu programa para rodar e entre com os valores 1 e 10. Note que o resultado da expressão Inicio > Limite com estes valores será False, já que 10 é menor que 20. Mesmo assim o VB executará o bloco de código, sendo que só deixará de fazê-lo quando a expressão tornar-se verdadeira, ou seja, quando o Microsoft Visual Basic 4.0 76 valor de início for igual a 21, que por sua vez tornará a expressão avaliada verdadeira (21 > 20). Se você entrar com os valores 25 e 20, por exemplo, o Visual Basic não executará uma vez sequer o bloco de código, pois desde o início a avaliação da expressão associada ao Do Until resulta em Verdadeiro. Para garantir que seu bloco de código será executado pelo menos uma vez, faça as seguintes alterações no Código de seu aplicativo: Do Início = Início + 1 'lncrementa a varíável início Vezes = Vezes + 1 'lncrementa a variável vezes TxtValorAtual.TEXT = Início TxtValorAtual.Refresh 'Atualíza o controle TxtAção.TEXT = "Executando o bloco de código pela “ & Vezes & “ a. vez 11” TxtAção.Refresh 'Atualiza o controle For n = 1 To 100000 Rem Este loop não faz nada! Next Loop Until Início > Limite Agora é só executar o programa novamente com os valores 25 e 20 e ver o resultado obtido. Saindo do Loop com Exit Do Como já vimos anteriormente, você pode encerrar a execução de um loop a qualquer momento através da palavra de comando Exit. A estrutura Do While/Do Until não é exceção, pois também permite que você utilize este recurso sempre que necessitar interromper a execução de um loop qualquer. Aproveite o último exercício que criamos e acrescente as seguintes linhas antes da instrução Loop Until Início > Limite: Microsoft Visual Basic 4.0 77 if Início = 15 Then Exit Do End íf Execute novamente o seu aplicativo e entre com os valores 1 e 20 para ver o que ocorre. Assim que a variável Início atingir o valor predeterminado, o loop será encerrado, e o controle do programa passará para a próxima linha abaixo da instrução Loop. Note que não existe um número limite para o uso de instruções Exlt Do, ou seja, você pode utilizar esta declaração quantas vezes necessitar, como por exemplo no código abaixo: Do Inicio = Inicio +1 'lncrementa a variável Início Vezes = Vezes + 1 'lncrementa a variável Vezes lf Início = 15 Then Exit Do Elseif Início = 1 And seleção = False Then Exlt Do Elseif Início = 1 And Teste = 20 Then Exit Do End lf Loop Until Inicio > Limite Vamos aprender agora uma nova estrutura de controle bastante parecida com a estrutura Do Loop que acabamos de estudar, a While... Wend. 4.8 While Wend Este comando repete a execução de um determinado bloco de código enquanto uma determinada condição for verdadeira. Este comando possui a seguinte sintaxe: While condição [Bloco de Código] Wend Detalhes: Microsoft Visual Basic 4.0 78 • Condição - É qualquer expressão numérica ou de string avaliada pelo While. Descrição: O funcionamento desta estrutura é bem simples: se a condição especificada for verdadeira, o Visual Basic executará o bloco de código associado à estrutura. Ao atingir a declaração Wend, o Visual Basic retoma à primeira linha da estrutura e reavalia a expressão. Se a mesma ainda for verdadeira, o Visual Basic repetirá a execução do código, reiniciando o processo ao alcançar o Wend. Quando esta condição de controle tornar-se falsa, a execução do loop será interrompida, e o controle do programa passará para a linha imediatamente seguinte ao Wend. Apesar da simplicidade desta estrutura de controle, você deve preferencialmente utilizar-se da estrutura Do Loop, já que a mesma oferece uma maior flexibilidade na criação de loops, através da possibilidade de encerrá-los a qualquer momento. Na estrutura While... Wend não existe o comando Exit. O problema é que se você definir uma expressão de controle que nunca resultará em False, seu aplicativo será executado indefinidamente, já que não há a possibilidade de utilizar um comando Exit para encerrá-lo após um determinado número de execuções, ou da ocorrência de alguma condição que indique a anormalidade na execução do código. Caso você tenha interesse em ver na prática como esta estrutura de controle se comporta, faça as seguintes alterações no código de seu aplicativo: Rem Estudo de While... Wend Dim Início As lnteger, Limite As lnteger, Vezes As lnteger Microsoft Visual Basic 4.0 79 Inicio = TxtInício.TEXT 'lnícialíza varíável com o valor do controle Limíte = TxtLimite.TEXT 'Idem Vezes = 0 'Inicializa a variável Vezes com zero LblMsg.Caption = "Enquanto Início for menor que " & Limite & ", o bloco de código será executado!" LblMsg.Refresh 'Atualiza o controle LblMsg While Início < Limite lnício = Inicio + 1 'lncrementa a variável Vezes = Vezes + 1 'lncrementa a variável Vezes TxtValorAtual.TEXT = Inicio TxtValorAtual.Refresh 'Atualiza o controle TxtAção.TEXT = "Executando o bloco de código pela " & Vezes & " a .vez" TxtAção.Refresh 'Atualiza o controle For n = 1 To 100000 Rem Este loop não faz nada! Next Wend Rem Depois de executar o loop o controle do programa Rem passa para esta linha: TxtAção.TEXT = "0 bloco de código foi executado " & Vezes & " tezes! " End Sub Só para deixar bem documentado o que você está fazendo, altere a rotina Form-load( ) conforme a seguir: LblTítulo.Caption = "WHILE" 'Altera o título da janela Execute o seu aplicativo e repare que ele funciona de maneira idêntica à estrutura Do Loop que estudamos anteriormente. Microsoft Visual Basic 4.0 80 4.9 Utilizando Funções Nesta seção, aprenderemos o que são Funções e como utilízá-Ias em nossos aplicativos. Aprenderemos também o que são argumentos e valores de retomo de funções, além de vermos uma listagem completa das funções disponíveis no Visual Basic agrupadas de acordo com a sua finalidade. O Que São Funções ? As funções nada mais são do que um determinado tipo de rotina (procedimentos) que realiza tarefas específicas dentro de seu aplicativo, retomando ao aplicativo um determinado valor resultante ou não da execução destas tarefas. Basicamente, as funções dividem-se em dois tipos distintos: ⇒ Funções definidas pelo usuário, que são as rotinas desenvolvidas por você de acordo com as suas necessidades. ⇒ Funções internas do Visual Basic, que foram criadas pela própria equipe de desenvolvimento do Software na Microsoft. Nesta seção, aprenderemos sobre as funções internas do Visual Basic, ou seja, sobre aquelas funções que já estão prontas para serem utilizadas por você, não necessitando de nenhuma programação adicional. Como já adiantamos a você, as funções internas realizam tarefas bastante específicas, que podem ser agrupadas em várias categorias conforme a sua finalidade. Entre as várias categorias existentes podemos citar como exemplo as funções matemáticas, financeiras, de data, de manipulação de strings, ambientais, de conversão, etc. Por que Utilizar Funções? A grande vantagem da utilização das funções é permitir o reaproveitamento de determinadas partes seu código, evitando que você tenha que repeti-Ias mesmas várias vezes dentro de seu programa. Isto evita que o seu aplicativo fique enorme devido à repetição de várias linhas de código sem necessidade, bem como diminuir a possibilidade de Microsoft Visual Basic 4.0 81 ocorrerem erros, já que com menos linhas seu código ficará mais fácil de ler e de depurar. Além disso, se uma função foi criada e testada adequadamente, as chances da mesma apresentar algum problema no futuro são praticamente nulas ou muito reduzidas, dando uma maior confiabilidade à sua aplicação. Outra vantagem a ser destacada é que a manutenção de seu código ficará bem mais fácil, pois ao invés de corrigir linhas e linhas de comandos basta revisar apenas a função que sofreu alterações para atualizar todo o seu código de uma só vez. Outra vantagem indiscutível das funções é a maior facilidade na criação de suas aplicações, pois permite que você utilize não só as funções internas do Visual Basic, mas também as funções desenvolvidas por você e mesmo por outros programadores, resultando numa maior produtividade por parte do programador. Aliás foi pensando nisso que a Microsoft desenvolveu as funções internas do VB, poupando o seu trabalho de criação de funções básicas como as que retomam a data e hora do sistema ou de funções complexas, de difícil criação, como as que calculam valores de Seno e Cosseno, por exemplo. Utilizando as Funções Internas do Visual Basic A utilização das funções internas do Visual Basic é bastante simples, basta observar as informações (argumentos) que você deve fornecer ou não à função a ser utilizada. Você pode utilizar as funções internas do Visual Basic simplesmente declarando o nome da função desejada dentro de suas rotinas, como por exemplo, no código a seguir: Valor = Date Neste caso, Valor é uma variável que receberá uma resposta vinda da função Date. O único cuidado a ser tomado na utilização das funções é verificar se a função desejada necessita ou não de alguma informação adicional (chamada de argumento pelo VB) para conseguir realizar as tarefas às quais esta se propõe. Repare que nem todas as funções internas do VB exigem que você forneça esta informação adicional, sendo que para muitas delas basta incluir seu nome na linha de comando como fizemos no exemplo anterior. Microsoft Visual Basic 4.0 82 Vamos aprender agora um pouco mais sobre o que são argumentos e sua utilização. Argumentos de Funções O argumento é uma variável, constante ou mesmo uma expressão que você precisa informar à função para que ela possa executar a tarefa à qual se propõe. Um exemplo de função que necessita de argumento é a função que calcula o Cosseno de um determinado ângulo. Neste caso, você deve obrigatoriamente informar o valor do ângulo a ser calculado, como no exemplo a seguir: Valor = Cos(0,785) Note que neste caso o argumento deverá ser informado entre parênteses, logo após o nome da função. O tipo de dado de argumento varia conforme a função escolhida, sendo que ele tanto poderá ser do tipo de dados numérico, data, string, lógico, etc. Valores de Retorno Toda função sempre apresenta um valor de retorno, que nada mais é do que o resultado final obtido após a sua execução. Para que entenda melhor, imagine que você necessita calcular a raiz quadrada de um número qualquer como 16, por exemplo. Você pode fazer isto no Visual Basic através da função Sqr (de square), bastando para isso fornecer como argumento o valor a ser calculado, de forma que nossa função ficaria igual a Sqr(16). Como todos nós sabemos, a resposta encontrada por esta função será o valor 4. Mas fica uma dúvida, como o Visual Basic nos indicaria que esta foi a resposta encontrada? Como já havíamos adiantado a você, a resposta para esta pergunta é o Valor de Retomo. Isto que dizer que sempre que você utilizar uma função qualquer para a realização de urna tarefa, deverá associá-la a uma variável de memória ou controle de seu formulário, de modo a ter um lugar determinado para receber o valor retomado pela função. Microsoft Visual Basic 4.0 83 4.10 Funções Internas do Visual Basic 4.0 Funções Matemáticas Abs Retorna o Valor Absoluto de um Número Atn Calcula o Arco Tangente de um Número Cos Calcula o Cosseno de um Número Exp Retorna o Valor de e Elevado a uma Potência Fix Retorna a Parte Inteira de um Número Int Retorna a Parte Inteira de um Número Log Calcula o Logaritmo Natural de um Número Rnd Retorna um Número Aleatório (Randômico) Sgn Retorna um Inteiro Conforme o Sinal do Número Sin Calcula o Seno de um número Sqr Calcula a Raiz Quadrada de um Número Tan Calcula a tangente de um Número Funções de Data e Hora Date Retorna a Data Atual do Sistema DateAdd Retorna a Data Especificada Acrescida do Intervalo de Tempo Informado DateDif Retorna o Intervalo ed Tempo Decorrido entre Duas Datas Especificas DatePart Retorna a Parte Especificada de uma Determinada Data DateSerial Retorna uma Data para o Ano, Mês e Microsoft Visual Basic 4.0 84 Dia Especificados DateValue Retorna uma Data a Partir de uma Data na Forma de String Day Retorna o Número do Dia de uma Data (de 1 a 31) Format Formata uma Expressão de Acordo com as Instruções Definidas pelo Usuário Hour Retorna o Número da Hora (0 a 23) de uma Determinada Hora Especificada Minute Retorna o Número de Minutos da Hora Especificada (0 a 59) Mounth Retorna o Número do Mês de uma Determinada Data (1 a 12) Now Retorna a Data e Hora Atuais do seu Sistema Time Retorna a Hora Atual do Sistema Timer Retorna o Número de Segundos Decorridos desde 0:00h (de 0 a 59) Weekday Retorna o Número do Dia da Semana (1 - Domingo, ..., 7 - Sábado) Year Retorna o Número do Ano de uma Determinada Data Funções de Sistema Operacional Command Retorna o Argumento Informado na Linha de Comando Utilizado na Inicialização do Visual Basic ou de um Programa Executável Desenvolvido pelo mesmo CreateObject Cria um Objeto OLE CurDir Retorno a Pasta (ou diretório) Atual Dir Retorna o Nome do(s) Arquivo(s) ou Diretório(s) que combina(m) com o Padrão Especificado ou Atributo de Arquivo, ou Volume de um Drive DoEvents Interrompe Momentaneamente a Execução de seu Aplicativo para que o Sistema Operacional possa Processar outros Eventos Enviroment Retorna a String Associada a uma Microsoft Visual Basic 4.0 85 Variável de Ambiente do Sistema Operacional (como Path e Prompt, por exemplo) Error Retorna a Mensagem de Erro que Corresponde a um Dado Número de Erro GetObject Recupera um Objeto OLE de um Arquivo InputBox Exibe uma Caixa de Dialogo para que o Usuário possa Digitar uma Resposta Qualquer. Após Escolher um dos Botões Disponíveis, o VB Retorna o Valor Digitado LoadPicture Carrega uma Imagem dentro de uma Objeto Form Object, Controle PictureBox ou Controle Image MsgBox Exibe uma Mensagem em um Quadro de Dialogo e Espera que o Usuário Escolha um dos Botões Disponíveis. Após a Seleção, o VB retorna um Valor Indicando o Botão Escolhido QBColor Retorna o Valor da Cor RGB Correspondente ao Número de Cor Informado RGB Retorna um Número Representando uma Cor do Padrão RGB Shell Indica a Execução de um Programa Qualquer Spc Utilizada com o Comando Print # ou com o Método Print para Posicionar a Saída de uma Expressão Qualquer Tab Utilizada com o Comando Print # ou com o Método Print para Posicionar a Saída de uma Expressão Qualquer 4.11 Procedimentos Nesta seção, aprenderemos o que são procedimentos, seus tipos e como e onde criá-los. Microsoft Visual Basic 4.0 86 Veremos também como os mesmos podem aumentar em muito a nossa produtividade no desenvolvimento de aplicativos em Visual Basic. Qualquer necessidade de informações adicionais consulte as referências citadas na Bibliografia Básica. O que são Procedimentos ? Os Procedimentos (ou Procedures) nada mais são do que uma determinada seqüência de comandos que são executados de uma só vez ao serem chamados, operando como um bloco de código para o aplicativo. As funções que estudamos na seção anterior não deixam de ser procedures, pois apesar de você não poder ver o seu conteúdo, elas executam vários comandos internamente para realizarem as tarefas às quais as mesmas se propõem. Qual a Diferença entre Procedimentos Sub e Function? A diferença básica entre estes dois tipos de procedimentos é que os procedimentos Function podem retomar valores para o aplicativo que solicitou a execução do procedimento, enquanto os procedimentos Sub não retomam valores. Na seção anterior, você viu que ao chamarmos a função Date, obtivemos como resposta a data atual do sistema, sendo que esta resposta foi armazenada em uma variável de memória. Esta função poderia ser chamada em um procedimento como este: Private Sub BtnExecutar Click( ) Dim Valor As Date Valor = Date 'Função Date TxtEntrada. TEXT = "Função Date" TxtResultado. TEXT = Valor BtnExecutar.Enabled = False 'Desabilita o botão Executar BtnLimpar.Enabled = True 'Habílita o botão Limpar End Sub Neste caso o valor de retorno da função Date foi armazenado na variável de memória Valor. Microsoft Visual Basic 4.0 87 Se você tentasse fazer o mesmo corn uma procedure Sub, receberia a seguinte mensagem de erro do Visual Basic: Expested Function or variable Isto ocorre pois quando você atribui uma procedure a uma variável de memória como em NovoValor = Calculaldade(“12/03/65") você está indicando ao Visual Basic que CalculaIdade é uma procedure do tipo Function, e que o valor de retorno gerado pela mesma será armazenado na variável de memória NovoValor. Agora que você já sabe a diferença básica entre estes dois tipos de procedimento, vamos relembrar um pouco quais as vantagens de utilizarmos estes componentes em nossos aplicativos: Porque Utilizar Procedimentos ? Já falamos um pouco sobre a vantagem da utilização das funções no dia- a-dia do programador, mas tendo em vista apenas as funções internas do Visual Basic. (Abordaremos os procedimentos desenvolvidos pelo usuário, também conhecidos como UDF (de User Defined Functions) ou funções definidas pelo usuário (isto no caso das funções) nos exercícios práticos. Basicamente, existem três grandes vantagens em utilizarmos os procedimentos em nossos aplicativos: 1. A primeira grande vantagem é a possibilidade de reaproveitarmos rotinas criadas anteriormente por nós (ou por outros) no desenvolvimento de novas aplicações, poupando com isso tempo e esforço. Você pode aproveitar Funções e Subs que realizará tarefas bem específicas (como um cálculo científico bastante complexo) já existentes em outro aplicativo desenvolvido por você, ou mesmo criadas por algum colega que seja especialista no assunto. Neste caso, o único cuidado a ser adotado por você é fornecer os argumentos corretamente e saber o que esperar como resposta. 2. Outra vantagem indiscutível é a possibilidade de modularização de seu código, tornando mais legível e menos sujeito a erros. A modularização permite que você divida tarefas complexas em pedaços menores, como as Funções ou Subs. Desta forma, quando você tiver a certeza de que um determinado procedimento está operando corretamente, menores serão as chances de ocorrerem erros de processamento em seu aplicativo. Microsoft Visual Basic 4.0 88 3. Como vantagem adicional poderíamos citar a possibilidade de um programa ser desenvolvido por mais de um programador ao mesmo tempo. Basta definir que tarefas cada função deverá realizar, os dados que cada uma irá utilizar na entrada e a resposta que deverá ser obtida. Então, é só entregar a tarefa de codificação a cada um dos programadores e unir as Funções e Subs criadas por cada um deles em um único aplicativo. Isto significa que você pode padronizar determinados procedimentos para serem reaproveitados em outros aplicativos, Imagine que você esteja desenvolvendo um programa para a sua empresa e que normalmente você necessita calcular a média de dois números, por exemplo. Ao invés de reescrever as linhas de código que executam esta tarefa em cada um dos seus aplicativos, você poderia criar uma função que realizasse esta tarefa e simplesmente copiar o código desta função dentro de cada aplicativo quando fosse necessário. Uma solução bastante prática seria criar uma função que recebesse os dois valores a serem calculados como argumentos, e que a mesma retomasse o valor resultante do cálculo da média dos dois números. Desta forma você não precisaria perder tempo definindo variáveis ou tipo de dados, simplificando bastante o seu trabalho. Um exemplo de como esta função seria utilizada em seus futuros aplicativos poderia ser a seguinte linha de código: ValorMedio = CalculaMedia(12,5) Agora que você já sabe as vantagens que a utilização dos procedimentos pode trazer aos seus aplicativos, vamos aprender a criar estes componentes na prática. Microsoft Visual Basic 4.0 89 Prática 16 Crie um formulário como o da figura abaixo : Funções Entrada Resultado Executar Limpar Enabled = False Nomeie os objetos conforme os label’s fornecidos no layout. A seguir inclua o código seguinte no evento click do botão executar. CmdExecutar_click( ) Dim Valor as date Valor = Txtentrada.Text TxtResultado.Text = Month(Valor) ‘esta função retorna a ‘parte da data que diz respeito ao mês CmdExecutar.Enabled = False CmdLimpar.Enabled = True No evento click do objeto botão limpar insira o código: TxtEntrada.Text = “” Microsoft Visual Basic 4.0 90 TxtResultado.Text = “ “ CmdLimpar.Enabled = False CmdExecutar.Enabled = True Execute a aplicação colocando uma data (D/M/A) no campo de entrada e pressionando executar. Prática 17 Vamos ver agora, utilizando o formulário anterior, como funciona a função DATEDIFF, e como fazemos para criar um procedimento nosso. Altere o código do evento click do botão executar colocando o código. Dim Valor as Date, Retorno as Integer Valor = TxtEntrada.Text Retorno = Datediff (“d”, #1/1/95#, Valor) ‘Valor - 1/1/95 TxtResultado.Text = Retorno CmdExecutar.Enabled = False CmdLimpar.Enabled = True Agora digite na parte General (declarations) o seguinte procedimento Sub limpar TxtEntrada.Text = “” TxtResultado.Text = “ “ CmdLimpar.Enabled = False CmdExecutar.Enabled = True End Sub obs: Digite tudo. Microsoft Visual Basic 4.0 91 Depois insira a chamada deste procedimento no evento click do botão limpar. Sub cdmlimpar_click() limpar ‘Chamando procedimento limpar End sub Execute novamente a aplicação e veja os resultados. Consulte a tabela de funções e verifique outras funções de manipulação de datas. Prática 18 Construir um aplicativo VB que calcule a área de uma determinada figura geometrica. Formulário principal deverá conter o seguinte LayOut : Cálculo de áreas Escolha uma Opção Form O Cálculo da Área de um retângulo O Cálculo da Área de uma Circunferência O Cáluco da Área de um Triângulo Frame Termina Option Control Command Microsoft Visual Basic 4.0 92 Para cada cáculo de área deverá ser utilizado um formulário separado. Exemplo : Cálculo da Área do Triângulo Cálculo da Área de um Triângulo Forneça : Base Resultado Altura Calcular Voltar Fórmulas : Área do Triângulo = (Base * Altura)/2 Área do Retângulo = (LadoA * LadoB) Área da Circunferência = (Π * R2) , com Π = 3.1416 Este exercício não possui a resolução na apostila, tente realmente fazer sozinho!!! Microsoft Visual Basic 4.0 93 Prática 19 Contruiremos um aplicativo bastante simples que nos ensinará a trabalhar com o controle Progressbar: PROGRESSBAR Crie um formulário com o seguinte conteúdo : Utilizando PROGRESSBAR Inicio Fim Controle Progressbar Microsoft Visual Basic 4.0 94 Command Depois insira o seguinte código na sua aplicação : CmdInicio_Click( ) Dim I as Integer For I = 1 to 1000 Progressbar.Value = i / 10 Next I Cmd_Fim( ) End Execute sua aplicação e teste novos valores para o laço acima. Prática 20 Vamos construir um aplicativo que nos ensine a trabalhar com os controles: Lista de Drivers, Diretórios e Lista de Arquivos. • objetivo do nosso aplicativo é : o usuário “busca” através dos controles, um arquivo de figura e após selecioná-lo, o aplicativo imprimirá a figura em um segundo formulário. Crie um formulário com os seguintes objetos: Visualização de Figuras Visualizar Encerrar Microsoft Visual Basic 4.0 95 Drivers Diretórios FileListBox Command Ajuste as seguintes propriedades aos objetos: Formulário: Name FrmLista Caption visualização de Figuras Command: Name CmdEncerrar Caption Encerrar Name CmdVisualizar Caption &Visualizar Default True Enabled False Driver: Name DrvDrives Diretório : Name DirDiretórios Microsoft Visual Basic 4.0 96 FileListBox : Name Filarquivos Pattern *.bmp (ou Icon) Insira o código: CmdEncerrar_Click( ) End CmdVisualizar_Click( ) Dim Arquivo as string Arquivo = ucase(filarquivos.path + “\”+ Filarquivos.filename) FrmVisualização.show FrmVisualização.windowstate = 2 FrmVisualização.caption = ärquivo:”+ arquivo FrmVisualização!imgfigura.picture = loadpicture(arquivo) DirDiretórios_change( ) Filarquivos.path = disdiretorios.path CmdVisualizar.Enable = false Drvdrives_change( ) Dirdiretorios.path = Drvdrives.drive Cmdvisualizar.enable = false Filarquivos_click( ) Cmdvisualizar.enabled = true Depois disso abra um novo formulário com a seguinte forma: Microsoft Visual Basic 4.0 97 Image Retorna Command Propriedades: Formulário: Name FrmVisualização Image : Name ImgFigura Command: Name Cmdretorna Caption &Retorna Default True Microsoft Visual Basic 4.0 98 Depois disto, insira o seguinte código no procedimento CmdRetorna_Click(): FrmVisualização.WindowState = 0 Unload FrmVisualização Prática 21 Vamos aprender agora como trabalhar com os controles de barras verticais e horizontais (Controles ScrollBar). Crie um formulário com os seguintes objetos : Animação Controle Image Microsoft Visual Basic 4.0 99 (Situar na Posição 1800,600) Controle Barras Verticais Controle Barras Horizontais Propriedades: Formulário : Name FrmBarras BackColor &H00FFFFFF& Caption Animação(demonstração scrollBar) ScrollBar Vertical: Name VscrEixoY LargeChange 500 Max 2000(tamanho do eixo) SmallChange 100(grid) ScrollBar Horizontal: Name HscrEixoX LargeChange 500 Max 2000 SmallChange 100 Microsoft Visual Basic 4.0 100 Image: Name ImgFigura Picture (Sugestão : Arquivos de programa1\MicrosoftVisualBasic\Bitmap s\Assorted\Beany A seguir insira o código: HscrEixoX_Change( ) ImgFigura.Left = 1300 + HscrEixoX.Value End Sub VscrEixoY_Change( ) ImgFigura.Top = 600 + VscrEixoy_value End Sub Execute a aplicação e faça alterações nas propriedades dos controles de barra para melhor compreendê-los. Módulo 5 Criando Menus Personalizados Neste módulo, aprenderemos a melhorar ainda mais a interface de nossa aplicação com usuário , desenvolvendo menus personalizados para a execução de tarefas Microsoft Visual Basic 4.0 101 5.1 Incluindo Menus em nossa Aplicação O Menu Editor Criar menus de comandos no Visual Basic é bastante simples, pois o Menu Editor encarrega-se da parte gráfica, que sem dúvida alguma é a parte mais trabalhosa. Você praticamente só irá definir os nomes dos menus, os comandos que cada um conterá e os procedimentos que serão executados quando o usuário selecionar uma das opções disponíveis no mesmo. O Menu Editor não aparece na caixa de ferramentas junto com os demais controles, mas sim na barra de ferramentas do VB. Selecione o ícone correspondente ou a opção Menu Editor no menu Tools. 5.2 Criando uma Barra de Menu Da mesma forma que nunca devemos iniciar a criação de um aplicativo sem termos uma idéia bem-definida do que queremos que ele faça, também no caso dos menus é necessário ter em mente as opções que queremos que ele assuma, e os comandos que serão executados quando estas opções forem as escolhidas. Também será necessário definirmos se determinadas opções do menu ficarão desabilitadas quando determinados comandos estiverem sendo executados pelo usuário. Tudo isso deverá estar definido antes de iniciarmos o trabalho de criação dos menus, a fim de evitarmos erros de concepção em nosso projeto. O primeiro passo para criarmos urn menu é definirmos onde ele será incluído. Vamos abrir um novo projeto e deixar um formulário como a janela ativa do VB. O próximo passo a ser dado é definir o nome que o nosso menu terá, ou seja, o nome que será exibido na barra de menu de nosso aplicativo. Em nosso exemplo, queremos que o primeiro menu a ser exibido tenha o nome de Arquivo. Este nome deverá ser incluído na caixa de texto Caption do Menu Editor. Microsoft Visual Basic 4.0 102 Lembre-se de que sempre que você inclui o símbolo “&” antes de uma letra, ela é exibida no menu (ou controle) sublinhada, indicando que você pode acessá-la através da combinação de teclas ALT mais a letra destacada. Em nosso caso, as tecias ALT+A abrirão o menu Arquivo que estamos criando. Você também pode definir um nome para este menu. Da mesma forma como você faz com os controles de seu aplicativo, também é possível ajustarmos propriedades dos menus durante a execução de seu programa, habilitando e desabilitando opções, modificando nomes, etc. Este nome não aparece na tela, serve apenas para ser utilizado pelo seu código. Da mesma forma como já fizemos com vários controles de seu aplicativo, procure utilizar-se das letras mnu antes do nome do controle, a fim de facilitar o seu trabalho de codificação. Dê o nome de mnuArquivo para este controle e pronto, nosso menu já está criado, só que sem nenhum comando ainda. Por enquanto você só criou a palavra Arquivo no alto de sua tela. Clique sobre o botão "OK" para fechar o Menu Editor e veja que o menu já foi incorporado ao seu formulário. Coloque o seu aplicativo em execução e veja que o VB inclui o menu Arquivo, porém ele está vazio, isto é, não possui nenhum comando. Pare a execução do aplicativo e abra novamente o Menu Editor. 5.3 Adicionando Itens em um Menu Vamos incluir um ítem em nosso menu Arquivo. Clique sobre o botão “Next” (dentro da janela de Menu) e veja que o VB inclui uma nova linha em branco logo abaixo do menu existente, além de limpar os dados da janela. Vamos incluir mais um ítem no menu Arquivo, desta vez o comando Sair, que encerrará a execução de nosso aplicativo. Abra novamente o Editor de Menus e clique sobre a opção Abrir. A seguir, clique novamente sobre o botão "Next" para iniciar uma nova opção de menu e digite o comando &Sair. Passe para a caixa de texto Name e dê o nome de MnuArquivoSair para este comando. Note que desta vez não é necessário dar um nível para a direita ao comando Sair, pois o VB assume que você está indo na seqüência de criação do menu Arquivo. Microsoft Visual Basic 4.0 103 Feche a janela com o botão “OK” e dê uma olhada com está ficando o seu menu. Realmente está ficando muito bom! Só para você ter uma idéia melhor de como funcionam os níveis, abra novamente o Editor de Menus e dê mais um nível para a direita no item Sair. Feche a janela do Editor e veja que o VB criou um submenu dentro do menu Arquivo. O VB permite que você crie até quatro níveis de submenus em seus aplicativos, que cá entre nós, é mais do que suficiente para a maioria das aplicações. Apesar de termos citado no início deste módulo que os menus são importantes recursos para tornar sua aplicação amigável, é bom evitar exageros. Nada é mais cansativo do que ter que abrir três ou quatro menus em cascata até encontrar o comando desejado. O ideal é utilizar menus com no máximo dois níveis hierárquicos. Utilize agora o botão com a seta para a esquerda para retomar a opção Sair à sua Posição original. 5.4 A Posição dos Itens no Menu Você pode alterar facilmente a posição de um item no menu através das setas que apontam para cima e para baixo. Basta destacar o comando a ser movido e escolher o botão adequado. 5.5 Incluindo novos Itens Microsoft Visual Basic 4.0 104 Você pode incluir novos itens em um menu, simplesmente escolhendo o botão "lnsert". Basta selecionar um comando do menu e clicar sobre este botão. O VB deslocará o comando selecionado (e todos os abaixo deste) em uma linha, e você poderá incluir o novo comando em sua posição. Faça isso agora, selecionando o comando Sair com um clique e escolhendo o botão "Insert ". Dê o Caption de &Imprime a este botão e o Name de MnuArquivoImprime. Não se preocupe com este comando, pois vamos apagá-lo em seguida inclua mais um comando entre as opções Imprime e Sair, chamado de Ferramentas. Ajuste as suas propriedades conforme a seguir: Caption: &Ferramentas Name: MnuArquivoTools 5.6 Exibindo Separadores Você já deve ter notado que determinados menus possuem linhas separando os seus diversos itens, tornando-os mais organizados. Aliás, quase todos os menus do VB possuem um separador de itens, que nada mais é do que uma linha que atravessa o menu de lado a lado. Você também pode incluir este recurso em seus menus bastando para isso digitar na caixa de texto Caption um hífen (-). Faça isso agora, selecionando o comando Sair com um clique e escolhendo a seguir o botão "lnsert", como você já sabe, será incluída uma nova opção entre os comandos lmprime e Sair. Digite o sinal - na caixa de texto Caption e dê o nome de MnuSeparador para este controle. Feche o Menu Editor e veja o resultado obtido. Procure agrupar os comandos de seus menusdentro de uma determinada lógica. Observe como os produtores de software organizam seus menus, separando as operações de acordo com a finalidade das mesmas. Isto ajuda muito o usuário e até mesrno quem desenvolve, poistodos os comandos relacionados a uma determinada tarefa ficam juntos, permitindo a sua rápida localização. Microsoft Visual Basic 4.0 105 5.7 Eliminando Itens do Menu Tão fácil quanto incluir é eliminar itens do menu. Selecione o comando Imprime com um clique e em seguida escolha o botão "Delete". O item selecionado será eliminado do menu, e todos os itens serão reaiocados em suas novas posições. 5.8 Criando outro Menu Bem, até agora criamos o menu Arquivo e alguns itens debaixo do mesmo. Mas, e como podemos criar um novo menu, como um menu Ajuda (Help), por exemplo? Bem, o procedimento é o mesmo. Selecione o último comando do menu Arquivo (o comando Sair) e clique sobre o botão "Next". Como lhe dissemos, o VB assume que você pretende continuar criando comandos para o menu arquivo e obedece ao último nível existente. Neste caso, você pode comunicar ao VB que está criando outro menu, simplesmente utilizando-se da tecla com a seta para a esquerda, aumentando o nível do menu. Então é só complementar as informações que você deseja. Entre com os seguintes dados: Caption: A&juda Name: MnuAjuda Inclua logo abaixo deste item (porém num nível inferior) o comando Sobre com as seguintes especificações: Caption: S&obre Name: MnuAjudaSobre Pronto, já temos dois menus distintos criados. Vamos Incrementá-los um pouco, utilizando mais alguns recursos existentes no Menu Editor. Microsoft Visual Basic 4.0 106 5.9 Teclas de Atalho Você já viu que basta utilizarmos o sinal “& antes de uma letra de um nome ou comando para criar uma tecla de atalho. Só que esta combinação de teclas que criamos refere-se somente ao acionamento da barra de menus. Você também pode utilizar o Menu Editor para definir teclas de atalho que executem tarefas, sem a necessidade de acionamento dos comandos via menu. Um exemplo é o próprio Visual Basic., você pode abrir um projeto existente utilizando a combinação de teclas ALT+F (abre o menu File) e em seguida teclando “O” (de Open Project) ou sem ter que abrir nenhum menu através da combinação de teclas CTRL+O. Note que por coincidência, as duas letras são iguais, mas isto não é uma regra obrigatória. Você pode observar isto no menu Tools, na Opção Menu Editor. Note que a combinação de teclas para este comando é CTRL+E, e não CTRL+M como pode parecer. Repare ainda que a combinação de teclas de atalho é exibida no próprio menu ao lado do nome do comando. Vamos fazer isto agora, atribuindo a combinação de teclas CTRL+A à tarefa de abrir um arquivo. Selecione o comando Abrir no Menu Editor e clique sobre a caixa de listagem Shortcut (atalho). Em nosso caso, vamos selecionar a combinação CTRL+A (de Abrir). Note que não é necessário efetuar nenhum outro ajuste em seu aplicativo para que as teclas de atalho entrem em operação. Basta definir a procedure que está associada ao comando do seu menu e sempre que você acionar as teclas combinadas, o VB chamará automaticamente o procedimento correto. Perceba que a sua escolha passou a ser exibida no menu Arquivo, orientando o usuário sobre a nova possibilidade. Uma boa regra para a definição de teclas de atalho é procurar associá-las com o nome da tarefa a ser executada. CTRL+A para Abrir um arquivo, CTRL+S para Salvar, CTRL+I para Imprimir, e assim por diante. Microsoft Visual Basic 4.0 107 Outra sugestão é procurar definir as mesmas letras tanto paras as teclas de atalho como para as opções dos menus. Note que é mais fácil associar Salvar com CRTL+S e Imprimir com CTRL+I, por exemplo, do que Imprimir com CTRL+P (de Print). 5.10 Marcando Opções de Menu Outro recurso bastante interessante é a característica de acrescentarmos uma marca (ou check) em uma opção de menu, indicando a sua seleção ou não. Este recurso é muito utilizado para indicar ao usuário as opções que estão ativadas ou não no momento, como por exemplo a opção Toolbar do menu View do Visual Basic. Se você estiver visualizando a barra de ferramentas do software, a opção Toolbar estará marcada com o check, indicando a seleção. Se você clicar sobre este comando do menu novamente, apagará o check, e a barra de ferramentas deixará de ser exibida na tela. Para tornar a exibi-Ia basta repetir o procedimento, e a marca voltará a ser exibida ao lado do comando no menu. No nosso aplicativo, o comando Ferramentas no menu Arquivo utilizará esta opção. Para isso destaque este comando na janela que mostra a hierarquia dos menus e clique sobre a caixa de verificação Checked. Quando você observar o menu Arquivo da próxima vez, verá urna pequena marca do lado esquerdo do comando Ferramentas, indicando a sua seleção. Este recurso é muito interessante para ativar a exibição de janelas como caixas de Ferramentas, Paletas de Cores, exibir determinadas informaçõesa na tela, como a data e hora, por exemplo. 5.11 Desabilitando Opções de um Menu Microsoft Visual Basic 4.0 108 Você pode criar menus em que determinadas opções estão desabilitadas inicialmente, e conforme o usuário vai realizando determinadas tarefas, estas opções de menu vão sendo habilitadas. Este é um recurso super-importante para facilitar a vida dos usuários do seu sistema, pois se você deixar todas as opções dos menus habilitadas, pode haver casos (quase com certeza) que em determinadas situações, podem causar um erro ou pelo menos não executarem nada, deixando seu usuário perdido. Um exemplo seria deixar a opção Imprime habilitada antes de o usuário ter aberto um arquivo qualquer. Neste caso, ao selecionar o comando Imprime, como reagiria o seu aplicativo? Por isso procure sempre ir habilitando as opções, conforme forem surgindo condições para a realização das tarefas disponíveis nos menus. Para desabilitar uma opção de menu basta eliminar a marca da caixa de verificação Enabled do menu Editor. Mais tarde você poderá tornar esta opção ativa através de suas rotinas de código. Aliás, nós faremos o caminho inverso: desabilitaremos um comando quando ocorrerem determinadas condições em nosso aplicativo. 5.12 Ocultando Opções Outro recurso disponível é a capacidade de ocultarmos comandos em nossos menus, ou seja, o comando existe, tem suas propriedades definidas, está associado a um evento, porém não aparece no menu. Quando for o momento adequado, você altera a sua propriedade Visible e ele reaparece no menu, estando pronto para ser utilizado. Isto é muito comum em aplicativos bem-planejados, como o Word, por exemplo. Se você fechar todas as janelas de documento abertas, o menu arquivo do Word exibirá quatro ou cinco opções de comandos. Se você abrir um arquivo qualquer, estas opções aumentam para doze comandos disponíveis! Microsoft Visual Basic 4.0 109 A grande vantagem deste tipo de recurso é que você exibe menus inteligentes, que apresentem somente opções aplicáveis à situação que o usuário se encontra no momento, tornando seu aplicativo mais fácil de ser usado pelos usuários. 5.13 Associando Eventos aos Comandos de Menu Feche a janela do Menu Editor e selecione o menu Arquivo em seu formulário. Assim que ele for aberto, clique sobre a opção Sair. O Visual Basic automaticamente abrirá a janela de códigos para que você crie os procedimentos que farão o seu aplicativo funcionar. No caso específico da opção Sair do menu Arquivo, queremos que esta opção execute a tarefa de finalizar a aplicação. Desta forma vamos solicitar ao VB que execute o comando End quando este comando for selecionado no menu: Private Sub MnuSair End End Sub Execute o seu aplicativo e veja que o VB realmente obedece ao comando do menu. Microsoft Visual Basic 4.0 110 Módulo 6 Quadros de Diálogo e Uso de Arquivos 5.1 Criação de Quadros de Lista Você usa quadros de lista quando tem uma série de escolhas para apresentar ao usuário e deseja limitar as escolhas. Ao contrário, um quadro combo é usado mais para escolhas sugeridas; ou seja, os usuários podem entrar com sua própria escolha no quadro de texto de um quadro combo, se quiserem. Digamos, por exemplo, que você tenha uma lista personalizada de aplicações do Windows, às quais o seu programa consegue iniciar; as escolhas poderão aparecer em um quadro de lista. Ou então, você pode apresentar as várias opções de atributo de arquivo (arquivo simples, leitura, escondido etc.) quando gravar em um arquivo. Em geral, os quadros de lista podem ser úteis em qualquer lugar onde existe uma série de escolhas. E como esses quadros de lista podem ter barras de paginação, o número dessas escolhas pode ser muito maior do que você pode apresentar em um menu (o que os torna usuais em quadros de diálogo). Como exemplo, vamos reunir um programa de minibancos de dados. Os bancos de dados normalmente ordenam seus registros de dados de acordo com alguma chave. Você pode fazer isso aqui com um quadro de lista. Digamos que esse programa de bancos de dados deve acompanhar um inventário de estoque numa farmácia ou na sua gaveta de medicamentos. Você poderia querer acompanhar coisas como: Nome do produto Quantidade do produto Comentários Por exemplo, se tivéssemos sete vidros de aspirina, cada um com 100 comprimidos, os dados poderiam ser estes: Nome do produto: "Aspirina" Quantidade do produto: "7" Microsoft Visual Basic 4.0 111 Espaço adicional para comentários: "Vender até quinta-feira." Cada um desses itens ("Aspirina", "7" e "Vender até quinta-feira.") é chamado campo em um banco de dados . Juntos, eles compõem um registro. Para preparar nossa aplicação, podemos incluir um menu à nossa janela principal, com um item chamado Find Record... [encontrar registro]; quando selecionado, um quadro de diálogo será aberto com um quadro de lista mostrando os nomes associados a cada registro - por exemplo, Aspirina, Bandagem, Creme para Mãos etc. Dando um duplo clique em um desses nomes, o usuário pode fazer aparecer o registro correspondente (isto é, o quadro de diálogo desaparece e os dados do registro são colocados em quadros de texto na janela principal). Uma das propriedades dos quadros de lista que nos ajudará aqui é a propriedade Sorted; se for True, o Visual Basic manterá todos os itens no quadro de lista ordenados alfabeticamente. Em outras palavras, o Visual Basic cuidará automaticamente da ordenação dos nossos produtos. Para projetar essa aplicação, inicie o Visual Basic, chame esse projeto de Database.vbp e dê ao formulário a legenda "Database". Precisaremos de três quadros de texto nesse formulário principal, que podemos chamar Name, Number e Comment, aos quais podemos dar os Names NameField, NumberField e CommentField. De fato, podemos tornar o quadro de comentário um quadro de texto multilinhas, de modo que possamos armazenar bastante texto nele. Em seguida, podemos incluir um menu chamado File, com os seguintes itens:Add Item, Find Item..., Save File.... Load File... e Exit. Para a primeira escolha de menu, Add Item, vamos usar o Name AddAnItem (Addltem é uma palavra reservada, como veremos); esse item está disponível para que o usuário possa preencher o banco de dados. Depois de editar os três quadros de texto, o usuário poderá selecionar Add Item para incluir esse dado a um novo registro no nosso banco de dados. Podemos usar o Name Findltem para a próxima escolha de menu, Find Item ... ; esse item é aquele que abrirá o quadro de diálogo (o quadro de diálogo conterá o quadro de lista que mantém os nomes do produto de cada registro, ordenados alfabeticamente). Quando o usuário der um duplo clique em um item na lista, o quadro de diálogo desaparecerá e o registro correto aparecerá na janela principal. Você aprenderá a incluir o código para os dois itens de menu seguintes, Save File... e Load File.... neste módulo sobre arquivos. Enquanto isso, dê-lhes os Names Saveltem e Loadltem. Vamos escrever primeiro a procedure AddAnltem_Click( ). Acione a escolha de menu Add Item, abrindo este gabarito de procedure Sub: Microsoft Visual Basic 4.0 112 Sub AddAnItem_Click( ) End Sub Quando o usuário acionar Add Item, ele desejará que o conteúdo ativo dos quadros de texto seja armazenado no banco de dados. Podemos fazer isso definindo algumas variáveis globais (observe que elas devem ser variáveis globais, e não em nível de formulário, pois nosso quadro de diálogo um formulário inteiramente separado - terá que alcançar todas elas) da seguinte forma em um módulo chamado Database.Bas (Selecione o ícone de inserção de módulos no toolbar): Global Names(100) As String Global Numbers(100) As String Global Comments(100) As String Global TotalRecords As Integer Desse modo, estamos separando espaço suficiente para manter registros para 100 produtos. Observe também que estamos registrando o número total de registros em um inteiro global chamado TotalRecords. Agora estamos livres para preencher esses arrays com dados, pois o usuário colocou os dados de que precisamos nos quadros de texto da janela principal antes de acionar Add Item. Ou seja, podemos armazenar dados em nossos arrays de bancos de dados dessa forma em AddAnItem_Click( ). Observe que incrementamos TotalRecords primeiro, pois estamos incluindo um novo registro: Sub AddAnItem_Click( ) TotalRecords = TotalRecords + 1 Names(TotalRecords) = NameField.Text Numbers(TotalRecords) = NumberField.Text Comments(TotalRecords) = CommentField.Text . . End Sub Por exemplo, suponha que estamos para criar o primeiro registro, e estes são os dados nos quadros de texto da janela principal: Microsoft Visual Basic 4.0 113 Nome do produto: "Aspirina" Quantidade do produto: "7" Espaço adicional para comentários: "Vidros com 100 comprimidos cada." Você definiria Names(1) com "Aspirina", Numbers(1) com "7" e Comments(1) com "Vidros com 100 comprimidos cada.". Agora que armazenamos os dados, temos que incluir o nome desse produto (Aspirina) ao nosso quadro de lista organizado em ordem alfabética automaticamente, de modo que o usuário possa selecionar com facilidade os registros. Fazemos isso com o método AddItem. Observe que este é um método, o que significa que temos que conectá-lo ao nome do quadro de lista que queremos mudar. Por exemplo, podemos chamar de NameList o quadro de lista que mantém todos os nomes de produto, o que significa que incluiríamos essa linha em AddAnltem_Click( ): Sub AddAnItem_Click( ) TotalRecords = TotalRecords + 1 Names(TotalRecords) = NameField.Text Numbers(TotalRecords) = NunmberField.Text Comments(TotalRecords) = CommentField.Text Form2.NameList.Addltem NameField.Text End Sub Form2 é o nome do segundo formulário, que aparecerá quando o usuário quiser selecionar um registro. Em geral, é assim que você usa AddItem no Visual Basic: formulário.quadro_de_lista.Addltem string$ [índice] O argumento opcional chamado índice especifica a posição da nova entrada no quadro de lista, onde 0 (no alto do quadro de lista) é a primeira posição, a próxima é 1, e assim por diante. Microsoft Visual Basic 4.0 114 Como nosso quadro de lista será ordenado automaticamente, não especificaremos um índice para nossas entradas. Em contrapartida, para remover um item, você poderá usar o método Removeltem: formuláno.quadro_de_lista.RemoveItem índice Aqui, um índice não é opcional. Você deverá usá-lo para especificar qual item na lista deverá ser removido. E isso é tudo para a inclusão de um item. O passo seguinte é encontrar itens conforme a necessidade. Acione a escolha de menu Find Item... para fazer surgir este gabarito: Sub FindItem_Click( ) End Sub O trabalho real de encontrar um registro será feito pelo segundo formulário, Form2. Agora podemos mostrá-lo na tela. Sub FindItem_Click( ) Form2.Show End Sub E isso é tudo para Findltem_ Click( ). Vamos projetar agora o quadro de diálogo chamado Form2. Crie Form2 acionando o item New Form do menu File do Visual Basic, dando-lhe uma legenda de Find Item.... Remova os botões Min e Max, dando ao formulário uma borda fixa por meio da seleção da propriedade Minbotton, Maxbotton e BorderStyle. Em seguida, crie um quadro de lista acionando a ferramenta de quadro de lista na caixa de ferramentas. Dê a esse quadro de lista o Name que já usamos, NameList. Defina a propriedade Sorted para True, de modo que as entradas nele apareçam em ordem alfabética. Observe que o Name, NameList, aparece no quadro de lista; ele desaparecerá em tempo de execução. Não existem barras de paginação nessa Microsoft Visual Basic 4.0 115 lista, mas elas aparecerão automaticamente se a lista for muito longa para o quadro. Agora inclua os dois botões de controle normais para um quadro de diálogo, OK e Cancel, com os Names OKButton e CancelButton. É sempre bom tornar o botão OK o padrão (isto é, definir sua propriedade Default para True). Como antes, é fácil escrever a procedure CancelButton - tudo que precisamos fazer é esconder Form2 da seguinte forma: Sub CancelButton_Click( ) Form2.Hide End Sub Agora vamos trabalhar com a procedure OKButton_Click( ) do quadro de diálogo: OKButton_Click( ) End Sub Quando o usuário acionar o botão OK - ou der duplos cliques em um item no quadro de lista, ele terá selecionado um item no quadro de lista, e deveremos mostrar o registro correspondente. Então acionar em Aspirina preencherá os quadros de texto da janela principal com os dados que já armazenamos usando Add Item: Nome do produto. "Aspirina" Quantidade do produto: “7" Espaço adicional para comentários: “Vidros com 100 comprimidos cada." Em geral, podemos determinar qual o item selecionado em um quadro de lista (um item sempre está selecionado em quadros de lista) usando estas propriedades do quadro de lista: Microsoft Visual Basic 4.0 116 Text O item atualmente selecionado List Array de string contendo todos os itens Listlndex O índice do item selecionado (base O) ListCount Número total de itens na lista A propriedade mais usada é Text, um string que mantém o item atualmente selecionado. No entanto, os outros também são muito úteis (e poderíamos notar que Text = List(Listlndex)). No nosso caso, teremos que encontrar o registro correspondente à seleção e exibi-lo. Podemos encontrar o registro correto com um loop, em OKButton_click( ), da seguinte forma: Sub OKButton_click( ) For loop_index = 1 To 100 If Names(loop_index) = NameList.Text Then Exit For Next loop_index . . Aqui estamos apenas comparando o nome do produto selecionado com os nomes de produto de cada registro. Quando encontrarmos o que queremos (ele deverá estar na lista, pois o quadro de lista simplesmente mostra esses nomes), saímos do loop com o comando Exit For do Visual Basic. Nesse ponto, podemos preencher os campos corretamente no formulário principal e esconder Form2 da seguinte forma: Sub OKButton_click( ) For loop_index = 1 To 100 If (Names(loop_index) = NameList.Text) Then Exit For Next loop_index Microsoft Visual Basic 4.0 117 Form1.NameField.Text = Names(loop_index) Form1.NumberField.Text = Numbers(loop_index) Form1l.CommentField.Text = Comments(loop_index) Form2.Hide End Sub Devemos observar que os eventos importantes para quadros de lista são Click, quando o usuário faz uma seleção, e DblClick, quando o usuário faz uma escolha. Isso significa que dar um duplo clique em um item é o mesmo que acionar o botão OK, de modo que podemos incluir a mesma procedure: Sub NameList_DblClick( ) For loop_index = 1 To 100 If (Names(loop_index) = NameList.Text) Then Exit For Next loop_index Form1.NameField.Text = Names(loop_index) Form1.NumberField.Text = Numbers(loop_index) Form1.CommentField.Text = Comments(loop_index) Form2.Hide End Sub A única coisa restante a fazer é tornar o item Exit ativo no menu da janela principal, o que fazemos pelo modo comum, com o comando End do Visual Basic: Sub ExitItem ( ) End End Sub Você irá utilizar o programa acima digitando dados nos quadros de texto da janela principal. Quando você quiser ler um registro, poderá selecionar Find Item... no menu File para gerar nosso quadro de diálogo na tela. Selecione o Microsoft Visual Basic 4.0 118 item no quadro de lista e acione o botão OK, ou então dê um duplo clique no item do quadro de lista, e os registros desse item aparecerão na janela principal. Entretanto, poderíamos observar que tivemos que duplicar o mesmo código em NameList.DblClick( ) e OKButton_Click( ) - isto é, os dois mostram os registros do produto selecionado. Uma maneira de evitar isso é colocar esse código em um módulo, e chamá-lo a partir dessas duas procedures. Por exemplo, se criássemos uma procedure Sub contendo todo esse código, chamada GetItem( ), poderíamos mudar NameList.DbiClick( ) e OKButton_Click( ) para: Sub NameList.DblClicko GetItem End Sub Sub OKButton_Click( ) Getltem End Sub Com GetItem igual a: Sub Getltem( ) For loop_index% = 1 To 100 If (Names(loop_index%) = Form2.NameList.Text) Then Exit For Next Ioop_index% Form1.NameField.Text = Names(loop_index%) Form1.NumberField.Text = Numbers(loop_index%) Form1.CommentField.Text = Comments(loop_index%) Form2.Hide End Sub Os arrays globais Names( ), Numbers( ) e Comments( ), logicamente, não são ligados a formulário algum. Esse módulo é como qualquer outro arquivo associado ao projeto ativo; ou seja, ele é salvo e carregado junto com os outros. Microsoft Visual Basic 4.0 119 5.2 Criação dos nossos próprios Tipos De Dados Como o programa de bancos de dados se encontra, estamos mantendo três arrays de dados: Global Names(100) As String Global Numbers(100) As String Global Comments(100) As String Na verdade, campos como estes são normalmente reunidos no seu próprio tipo (e isso nos leva a um poderoso conceito no Visual Basic). Em geral, esse tipo de declaração (que ocorre sempre no módulo global) se parece com isto: Type nometipo nomeelemento As tipovariável [nomeelemento As tipovariável] [nomeelemento As tipovariável] . . End Type Por exemplo, podemos criar um tipo Record para nosso banco de dados da seguinte forma: Type Record Name As String * 50 Number As String * 20 Comment As String * 200 End Type Esse código define um novo tipo de dados, Record, que contém os campos individuais, como mostramos acima. Observe que estamos dando a cada string um tamanho definido - isso é o que significam os caracteres * 50, *20 e * 200. Name As String * 50 significa que o string chamado Name terá exatamente 50 caracteres de extensão. Podemos declarar um array desse tipo chamado, digamos, TheData( ), da seguinte forma: Microsoft Visual Basic 4.0 120 Type Record Name As Stririg * 50 Number As String * 20 Comment As String * 200 End Type Global TheData(100) As Record Podemos alcançar qualquer um deles usando o operador ponto (.) (assim como fazemos para alcançar uma propriedade do Visual Basic): TheData(3).Name = "Cenoura" TheData(3).Number = "287" TheData(3).Comment = "Preço muito alto?" Vamos usar esse novo array na nossa aplicação de bancos de dados para combinar todos os três arrays separados, Names( ), Numbers( ) e Comments( ), juntos em um array - Database( ). Depois de definir o tipo do novo registro, Record, e o array desse tipo, Database( ), temos que mudar as referências correspondentes no nosso programa. Por exemplo, Names(TotalRecords) torna-se TheBase(TotalRecords).Name. Existem apenas duas procedures Sub para mudar, a procedure em que armazenamos os dados e a procedure em que os recuperamos. Em Form1, a procedure para incluir um item deverá ser mudada disto: Sub AddAnItem_Click( ) TotalRecords = TotalRecords + 1 Names(TotalRecords) = NameField.Text Numbers(TotalRecords) = NumberField.Text Comments(TotalRecords) = CommentField.Text Form2.NameList.AddItem NameField.Text End Sub para isto: Microsoft Visual Basic 4.0 121 Sub AddAnItem_Click( ) TotalRecords = TotalRecords + 1 TheData(TotalRecords).Name = NameField.Text TheData(TotalRecords).Number = NumberField.Text TheData(TotalRecords).Comment = CommentField.Text Form2.NameList.AddItem NameField.Text End Sub Aqui, apenas mudamos Names(TotalRecords) para TheData(TotalRecords).Name, e assim por diante. Além disso, no nosso módulo, temos que mudar a procedure para pesquisar um item, Getltem( ), disto: Sub GetItem( ) For loop_index = 1 To 100 If (Names(loop_index%) = Form2.NameList.Text) Then Exit For Next loop_index Form1.NameField.Text = Names(loop_index) Form1.NumberField.Text = Numbers(loop_index) Form1.CommentField.Text = Comments(loop_index) Form2.Hide End Sub para isto: Sub GetItem( ) For loop_index = 1 To 100 lf (Rtrim$(TheData(loop_index).Name) = Rtrim$(Form2.NameList.Text)) Then Exit For Next loop_index Form1.NameField.Text = TheData(loop_index).Name Form1.NumberField.Text = TheData(loop_jndex).Number Microsoft Visual Basic 4.0 122 Form1.CommentField.Text = TheData(loop_jndex).Comment Form2.Hide End Sub Observe que estamos usando um string de tamanho fixo para todos os campos. Como o Visual Basic completa esses strings com espaços à direita, tivemos que remover esses espaços com a função Rtrim$( ) do Basic; seu correspondente para retirar espaços à esquerda é Ltrim$( ). A função Rtrim$( ) simplesmente retira quaisquer espaços do lado direito dos strings antes de compará-los com os itens no quadro de lista. 5.3 Criação de Quadros Combo A diferença entre quadros combo e quadros de lista é que os quadros combo combinam um quadro de lista com um quadro de texto (motivo pelo qual eles são chamados quadros combo), de modo que os usuários possam digitar seu próprio texto se não quiserem selecionar urna das escolhas oferecidas. Existem três estilos diferentes de quadros combo. O primeiro deles (estilo 0) é o quadro combo padrão, onde a seta fica separada do quadro de texto. Quando o usuário acionar a seta, a lista de itens a escolher cairá. O segundo estilo (estilo 1) é o mesmo, exceto que o quadro de lista é sempre mostrado. O terceiro estilo (estilo 2), com a seta conectada, não é realmente um quadro combo: é um quadro de lista (chamado quadro de lista suspensa). Esse é o mesmo que o quadro de lista normal (ou seja, o usuário não pode editar as seleções conforme pode em um quadro combo), exceto que a lista fica escondida até que o usuário acione a seta. Como os quadros combo em estilo 2 são realmente quadros de lista, nós os veremos antes de trabalhar com os quadros combo reais. É fácil adaptar nossa aplicação de bancos de dados para usar quadros de lista suspensa em vez de quadros de lista normais. Tudo que precisamos fazer é excluir o quadro de lista chamado NameList em Form2 e substituí-lo por um quadro combo, estilo 2, chamado NameList. Para fazer isso, acione o quadro de lista original e selecione Cut no menu Edit. Em seguida, acione na ferramenta de quadro combo na caixa de ferramentas (em seguida à ferramenta de quadro de lista), selecione o estilo 2 e posicione-o corretamente. Como você pode ver, isso permite que o quadro de diálogo Find Item... seja muito mais compacto. Usar um quadro de lista suspensa é fácil. Microsoft Visual Basic 4.0 123 Agora vejamos os próprios quadros combo. Como o usuário pode mudar ou editar o item no quadro de texto que faz parte do quadro combo, os dois eventos importantes conectados aos quadros combo são Click e Change (o evento Change ocorre quando o texto no quadro é alterado). Além disso, um quadro combo simples (estilo 1, e não um quadro suspenso) reconhece o evento DblClick, mas o outro quadro combo (estilo 0), não. Aqui estão as propriedades associadas aos quadros combo: Text O item atualmente selecionado List Array de String contendo todos os itens Listlndex O índice do item selecionado (base 0; -1 se o usuário entrou com texto em vez de selecionar um item) ListCount Número total de itens na lista Na verdade, as propriedades de um quadro combo são muito parecidas com as propriedades de um quadro de lista, mas com uma diferença: se o usuário digitou a seleção ativa em vez de selecioná-la pela lista disponível (uma opção que não existe com quadros de lista), então a propriedade ListIndex é definida em -1. Quanto ao restante dos detalhes dos quadros combo - manter o texto selecionado, marcar o texto e assim por diante -, o Visual Basic cuida disso para você. Para ver como isso funciona, vamos alterar nosso programa de bancos de dados para mostrar seus nomes de produto em um quadro combo em vez de um quadro de lista. A vantagem é que o usuário poderá simplesmente digitar o nome do produto que está procurando em vez de pesquisar por uma lista que poderia ser muito longa. Infelizmente, há a possibilidade de a entrada selecionada não corresponder a registro algum (isto é, no caso de o usuário ter errado na digitação do nome do produto). Isso é algo que teremos que verificar quando o usuário acionar o botão OK. Enquanto isso, abra a aplicação de bancos de dados no Visual Basic e selecione o quadro de lista suspensa que acabamos de incluir nele. Como o Visual Basic o trata como um quadro combo de estilo 2, podemos mudá-lo para outro tipo de quadro combo sem substituí-lo. Vamos usar o estilo de quadro combo 0. Embora devamos renomeá-lo de NameList para NameCombo, é mais Microsoft Visual Basic 4.0 124 conveniente deixar o nome como NameList, pois o código já se refere a ele dessa forma. Agora temos que nos assegurar de que a seleção realmente corresponde a um dos registros. Para isso, podemos incluir este código em nossa procedure Sub Getltem( ): Sub GetItem( ) Matched = False For loop_index = 1 To 100 lf (Rtrim$(TheData(loop_index).Name) = Rtrim$(Form2.NameList.Text)) Then Matched = True Exit For End If Next loop_index lf (Matched) Then Form1.NameField.Text = TheData(loop_index).Name Form1.NumberField.Text = TheData(loop_index).Number Form1.CommentField.Text = TheData(loop_index).Comment Form2.Hide Else MegBox “Sorry, I cannot find the record.”, 48, “Database” End If End Sub Aqui, se não pudermos achar o registro que foi digitado, geramos um quadro de mensagem de erro e deixamos o usuário começar de novo. Depois dessa mudança, o programa funciona como antes, exceto que agora o usuário pode digitar o nome do registro que está procurando como um atalho. No entanto, se o usuário entrar com o nome de um registro que não combine com um dos registros existentes, aparecerá um quadro de erro. 5.4 Uso de Arquivos Microsoft Visual Basic 4.0 125 Nesta seção você verá como trabalhar com arquivos no Visual Basic. O modo mais comum de manter seus dados após o término de um programa é armazená-los em arquivos. Esta seção discute essa importante habilidade, além dos seguintes tópicos: • Criação, abertura e fechamento de arquivos • Leitura e gravação de arquivos • As funções de fim de arquivo (EOF) e tamanho de arquivo (LOF) • Arquivos seqüenciais • Arquivos de acesso aleatório • Quadros de lista de diretório • Quadros de lista de arquivo • Quadros de lista de unidade • O comando Seek • Os comandos Get e Put • Como cuidar de erros de arquivo Você também incluirá capacidades de manipulação de arquivos a alguns dos programas que já desenvolveu, sobretudo nos programas Editor e Database. A maior parte dos programas do Windows usa arquivos de algum tipo, de modo que a capacidade de uso de arquivos será importante para todos os tipos de programas: programas gráficos, processadores de textos, programas de bancos de dados etc. Você deve se lembrar de que nosso programa Editor tinha duas escolhas de menu que nunca foram usadas: Load File... e Save File.... Até agora, todos os dados que nossos programas usaram foram temporários. Quando a aplicação terminava, eles desapareciam. Os arquivos, é claro, são o meio mais comum de armazenar dados no PC, de modo que são vitalmente importantes à maior parte das aplicações do computador. Microsoft Visual Basic 4.0 126 O sistema de comandos de manipulação de arquivos no Visual Basic é muito semelhante ao que existe em outros Basics; logo, se você estiver acostumado com Open, Close, lnput$ e Seek, já terá um bom ponto de partida. No entanto, como você já deve imaginar, as coisas são muito diferentes quando se trata da interação com o usuário. Por exemplo, o usuário normalmente seleciona nomes de arquivo para carregar ou salvar dados por meio de quadros de diálogo em aplicações do Windows (o que, a propósito, é o motivo para vermos os quadros de diálogo antes dos arquivos), e veremos como fazer isso nesta seção, à medida que prepararmos nosso quadros de diálogo de arquivo. Dois desses quadros de diálogo serão para os itens Save File... e Load File... da nossa aplicação Editor. Além disso, também veremos como trabalhar com arquivos estruturados, onde os dados são divididos em registros específicos, como a nossa aplicação de bancos de dados na seção anterior. De fato, poderemos modificar essa aplicação nesta seção de modo que ele possa salvar seus dados no disco. Com isso e outros tópicos que irão aparecer, por que não começar imediatamente? Gravação de dados em um Arquivo Se quisermos incluir suporte para arquivo à nossa aplicação de editor, poderemos começar com o item Save File... (afinal, temos que criar e salvar arquivos antes de lê-los de volta). Quando você selecionar o item Save File.... poderá gerar um quadro de diálogo na tela com um quadro de lista e dois botões: OK e Cancel. Você poderia então digitar o nome do arquivo em que deseja salvar seu documento, e o seu programa criaria o arquivo com esse nome (se necessário) e depois armazenaria lá o documento. Para colocar isso em prática, inicie o Visual Basic e abra o projeto Editor. Se você der uma olhada no menu File, verá que o item Save File... já existe. Acione-o com o mouse para gerar o seguinte gabarito: Sub SaveItem_Click( ) Microsoft Visual Basic 4.0 127 End Sub Para salvar o documento ativo, você deverá colocar o quadro de diálogo Save File... na tela. Vamos nomear o quadro de diálogo com SaveForm. Para apresentá-lo, tudo o que precisamos fazer é isto: Sub SaveItem_Click ( ) SaveForm.Show End Sub Em seguida, devemos montar esse quadro de diálogo (ainda no projeto Editor), nomeando-lhe SaveForm, dando uma legenda Save File..., e salvar nosso trabalho como, digamos, SaveForm.Frm. Além disso, temos que incluir um quadro de texto a esse novo formulário; colocar um label acima do quadro de texto, com os dizeres Save File As... (de modo que o usuário saiba que deverá entrar com um nome de arquivo), incluir um botão OK com sua propriedade Default em True, e um botão Cancel. Finalmente, como esse é um quadro de diálogo, podemos remover os botões Min e Max. A procedure do botão Cancel é muito fácil, de modo que poderemos fazer isso primeiro. Tudo que precisamos fazer se o usuário decidir cancelar é ocultar novamente o formulário, e, para tanto, colocaremos isto em CancelButton_Click( ): Sub CancelButton-Click ( ) SaveForm.Hide End Sub O serviço real é feito quando você aciona o botão OK. Acione esse botão para abrir a procedure click do botão OK, da seguinte maneira: Microsoft Visual Basic 4.0 128 Sub OKButton_Click ( ) End Sub Quando atingirmos esse ponto no programa, poderemos supor que o texto em FilenameBox contém um nome de arquivo e que deveremos salvar o documento ativo - ou seja, o string chamado Form1.display.Text - a este arquivo. Existem três passos nesse processo: abrir o arquivo (ou criá-lo, se ainda não existir), gravar os dados no arquivo e fechá-lo. Podemos dar uma olhada em cada um desses três passos em ordem enquanto montamos OKButton- Click(); cada passo nos dirá algo sobre o sistema de arquivo do Visual Basic. Abertura de Arquivos no Visual Basic Para abrir ou criar um arquivo no Visual Basic, basta você usar o comando Open. No entanto, temos que considerar algo a respeito do modo como abrimos ou abrimos ou criamos esse arquivo. Tipos de Arquivo no Visual Basic Os três primeiros modos têm a ver com arquivos seqüenciais. Os arquivos seqüenciais normalmente são usados para arquivos de texto, onde você grava o arquivo do início ao fim e o lê da mesma maneira; ou seja, você não salta de um lugar para outro dentro do arquivo. Trabalhar com arquivos seqüenciais é como usar fitas cassete; se você quiser ouvir algo no final da fita, terá que passar primeiro por tudo que esteja na frente. Da mesma forma, se você quiser algo do texto no final de um arquivo aberto com acesso seqüencial, terá primeiro que ler todo o texto que vem antes dele. Se os arquivos de acesso seqüencial são como fitas cassete, os arquivos de acesso aleatório são como discos de pickups. Ao contrário de uma fita, em um disco você pode movimentar à vontade, sem ter que passar por todas as Microsoft Visual Basic 4.0 129 faixas intermediárias. Da mesma forma, você pode movimentar-se à vontade em um arquivo de acesso aleatório, retirando dados de qualquer local onde desejar. O preço a ser pago é que os dados em um arquivo de acesso aleatório devem ser cuidadosamente seccionados em registros, de modo que você saiba exatamente onde estão os dados que deseja obter. Por exemplo, se os registros que desenvolvemos na nossa aplicação de bancos de dados fossem todos do mesmo tamanho, eles funcionariam perfeitamente em um arquivo de acesso aleatório; quando quiséssemos o vigésimo registro, poderíamos simplesmente saltar sobre os 19 primeiros e então começar a leitura. No entanto, o texto - como armazenamos na aplicação Editor - não é seccionado corretamente em registros do mesmo tamanho, e por isso colocaremos o texto que estamos para salvar em um arquivo seqüencial. O terceiro tipo de arquivo são os arquivos binários; aqui o Visual Basic não interpreta o conteúdo do arquivo de forma alguma. Por exemplo, os arquivos executáveis (.Exe) são arquivos binários, e nós os tratamos numa base byte a byte no Visual Basic. Para copiar um arquivo desses, precisamos ler cada byte do arquivo original (o arquivo de origem) e depois enviá-los para um novo arquivo (o arquivo de destino). Embora possamos definir a quantidade de dados que queremos ler sob arquivos seqüenciais ou aleatórios, os arquivos binários são sempre tratados byte a byte. Cada um desses três tipos de acesso ao arquivo possui seu próprio conjunto de comandos no Visual Basic, como veremos neste capítulo. Como podemos nos confundir, você encontrará uma coleção dos comandos mais comuns de manipulação de arquivo do Visual Basic, organizados por tipo de arquivo, na tabela. Comandos de Arquivo do Visual Basic. Acesso Comandos Comuns do Visual Basic Seqüencial Open, Line lnput #, Print #, Write #, Input$, Close Aleatório Type... End Type, Open, Put #, Len, Close, Get # Binário Open, Get #, Put #, Close, Seek, lnput$ Microsoft Visual Basic 4.0 130 Nossa tarefa aqui é salvar o documento ativo do Editor, e faremos isso abrindo um arquivo seqüencial (embora realmente pudesse ser tratado como arquivo binário). Existem três maneiras de abrir arquivos seqüenciais: para entrada (Input), saída (Output) e acréscimo (Append). Abrimos um arquivo para entrada se queremos ler algo dele, para saída se queremos gravar nele, e para acréscimo se queremos incluir algo ao seu final. Esses três modos são coerentes com a idéia de abrir o arquivo e depois trabalhar com os dados do início ao fim. Por exemplo, se abrimos um arquivo para saída seqüencial, gravamos nele um string, e depois o seguimos por um segundo string, este vai diretamente após o primeiro, e assim por diante para strings subseqüentes, um após o outro. Se quiséssemos lê-los novamente teríamos que fechar o arquivo e abri-lo para entrada, e depois poderíamos ler os dados de volta, do início ao fim. Os arquivos aleatórios, onde você poderá movimentar-se à vontade pelo arquivo, não possuem qualquer uma dessas restrições. Quando você abre um arquivo para acesso aleatório, ele está preparado para entrada e saída (por outro lado, lembre-se de que, nos arquivos aleatórios, você precisa seccionar os dados em registros). Nesse caso, quando estivermos gravando nosso documento do Editor no disco, abriremos nosso arquivo para saída seqüencial. Em geral, o comando Open do Visual Basic será este: Open fff$ [For mmm][Access aaa] [111] As [#] nnn% [Len = rrr%] Onde os argumentos possuem este significado: fff$ O nome de arquivo (incluindo um caminho opcional) Microsoft Visual Basic 4.0 131 mmm Modo: pode ser Append, Binary, lnput, Output ou Random aaa Acesso: pode ser Read, Write ou Read Write 111 Lock: restringe o acesso de outras aplicações nnn% Número do arquivo (1-255): o número que usaremos para nos referir a esse arquivo daqui em diante, rrr% Tamanho do registro para arquivos aleatórios, ou tamanho do buffer que você quer que o Visual Basic use para arquivos seqüenciais No nosso caso, o usuário deseja gravar no arquivo agora existente em FilenameBox.Text, de modo que poderemos usar este comando Open para abrir o arquivo: Open FilenameBox.Text For Output As # 1 De fato, esse arquivo poderia nem mesmo existir; o usuário poderia querer que o criemos. Isso é feito automaticamente pelo comando Open: se o arquivo não existir e estivermos tentando abri-lo para algo diferente de lnput, o Visual Basic criará o arquivo para nós. Por outro lado, observe que quando abrimos um arquivo já existente para saída e depois gravamos algo nele, o conteúdo original do arquivo é destruido. (Se quiser incluir algo ao final de um arquivo seqüencial e manter o que já existe antes, abra o arquivo para Append.) Agora podemos iniciar o quadro de diálogo Save File... com esta linha na procedure click do botão OK: Sub OKButton_Click( ) Open FilnameBox.Text For Output As # 1 'Abre arquivo . . End Sub Assim como no Basic normal, poderemos nos referir a esse arquivo como arquivo # 1 quando quisermos gravar nele ou fechá-lo. No entanto, temos que notar que existe a possibilidade de erro quando abrirmos um arquivo dessa maneira: o usuário pode ter especificado um caminho inválido, por exemplo, ou Microsoft Visual Basic 4.0 132 errado na digitação do nome do arquivo. Para cuidar desses erros, podemos incluir um comando On Error GoTo, da seguinte forma: Sub OKButton_Click( ) On Error GoTo FileError Open FilenameBox.Text For Output As # 1 'Abre arquivo . . . Isso funciona da seguinte maneira: se houver um erro, o programa saltará imediatamente para o label FileError, onde poderemos colocar um quadro de mensagem na tela e depois executar um comando Resume, que salta de volta à linha que causou o erro, permitindo que o usuário tente novamente. Sub OKButton-Click( ) On Error GoTo FileError Open FilenameBox.Text For Output As # 1 'Abre arquivo . . Exit Sub ‘ Sai da rotina e pula o tratamento de erro FileError: MsgBox “File Error", 48. "Editor" 'MsgBox para erro de arquivo End Sub Como tratar de erros “acusáveis" Se não tivéssemos colocado esse comando no código, não poderíamos apanhar esses erros - chamados erros "acusáveis". Nesse caso o próprio Visual Basic avisaria sobre o erro diretamente, com um quadro de mensagem, o que não é desejado na maior parte das aplicações. Microsoft Visual Basic 4.0 133 Em outras palavras, se o nome do arquivo for válido e o arquivo correspondente puder ser aberto ou criado, faremos isso. Se houver um problema, indicaremos o fato e permitiremos que o usuário mude a especificação de arquivo para outra tentativa. Nesse ponto, então, o arquivo estará aberto; o próximo passo é gravar nele o nosso documento. Gravação em Arquivos no Visual Basic O modo normal de gravar em um arquivo seqüencial é usar os comandos Print # ou Write #. Veja como podemos usá-los: Print # nnn%, expressionlist Write # =%, expressionlist Aqui, nnn% é o número do arquivo (1 para o nosso caso), e expressionlist é uma lista das variáveis (incluindo strings) que você deseja gravar no arquivo. Os dois comandos, Print # e Write #, são diferentes; Write # insere vírgulas entre os itens separados na expressionlist, à medida que os grava no arquivo, coloca aspas ao redor dos strings e insere uma nova linha (em branco) ao final do arquivo. Como não queremos qualquer um desses caracteres adicionais, usaremos Print # em vez disso. De fato, só desejaremos enviar um único string ao arquivo: Form1.display.Text, de modo que nosso comando Print # estará como neste trecho: Sub OKButton_Click() On Error GoTo FileError Open FilenameBox.Text For Output As # 1 'Abre arquivo Print # 1, Form1.PadText.Text 'Grava documento . . . Exit Sub Microsoft Visual Basic 4.0 134 FileError MsgBox "File Error", 48, "Editor" 'MsgBox para erro de arquivo End Sub E isso é tudo para gravar o texto no arquivo. Fechar o arquivo não é muito mais dificil; use o comando Close, como vemos aqui: Sub OKButton_Click( ) On Error GoTo FileError Open FilenameBox.Text For Output As # 1 'Abre arquivo Print # 1, Form1.PadText.Text 'Grava documento Close #1 'Fecha o arquivo . . . Exit Sub File Error MsgBox "File Error", 48, "Editor" 'MsgBox para erro de arquivo End Sub Close # 1 fecha o arquivo número 1, que é o arquivo em que estamos trabalhando. Depois de fechar o arquivo, teremos terminado, de modo que saímos da procedure Sub com um comando Exit Sub. Nesse ponto, o arquivo foi gravado com sucesso no disco, ou, se não, alertamos o usuário para o fato.(Saltamos para o label FileError e geramos nosso quadro de mensagem na tela, como antes.) Microsoft Visual Basic 4.0 135 Fechando todos os arquivos ao mesmo tempo Se você usar o comando Close sem qualquer número de arquivo, então oVisual Basic fechará de uma só vez, todos os arquivos que a sua aplicação abriu. O passo final, se a manipulação de arquivo tiver sido tranqüila, é esconder o quadro de diálogo Save File... (isto é, SaveForm) da seguinte forma: Sub OKButton-click( ) On Error GoTo FileError Open FilenameBox.Text For Output As # 1 'Abre arquivo Print # 1, Form1.display.Text 'Grava documento Close #1 'Fecha o arquivo SaveForm.Hide Exit Sub FileError: MsgBox "File Error", 48, "Editor" 'MsgBox para erro de arquivo End Sub Microsoft Visual Basic 4.0 136 Para ver isso em ação, faça as mudanças acima e tente digitar algumas linhas de texto no Editor e depois salvá-las. Quando o fizer, verá que o texto é gravado no disco, no arquivo escolhido. Observe que o texto no arquivo é simplesmente armazenado como uma longa cadeia de texto sem carriage returns [ou Enter] - a menos que estejam presentes no documento original -, pois o próprio quadro de texto principal o armazena dessa maneira. E isso termina nosso item Save File.... Pudemos gravar um arquivo de texto seqüencial no disco, e nossa aplicação Editor tornou- se ainda mais sofisticada. No entanto, o próximo passo correspondente é ler os arquivos de volta no item Load File... do Editor. Veremos esse processo em seguida. Uso de Controles de Arquivos no Visual Basic O primeiro passo na leitura do conteúdo de um arquivo é obter o nome desse arquivo. No entanto, isso não é uma simples questão de pedir ao usuário para digitar o nome em um quadro de texto. Temos que ter a capacidade de procurar no disco (assim como outras aplicações semelhantes Windows) e permitir que o usuário selecione a partir do que já existe lá. O Visual Basic oferece três controles especiais para fazer exatamente isso, e estes são quadros de lista de disco, quadros de lista de diretório e quadros de lista de arquivo. As ferramentas para criar esses controles de arquivo aparecem no final da caixa de ferramentas do Visual Basic. Acontece que esses controles farão grande parte do trabalho para nós. A caixa de ferramentas pesquisará automaticamente unidades e diretórios, e poderemos trabalhar com as várias propriedades associadas com eles. Esta caixa de diálogo já foi criada em nosso curso, vamos agora utiliza-la para manipular nossos arquivos! Se você salvou o formulário que corresponde a essa caixa de diálogo, reaproveite-º Caso contrário, crie um novo. Microsoft Visual Basic 4.0 137 Vamos iniciar esse processo projetando um quadro de diálogo para a opção Load File.... que poderemos chamar LoadForm e salvá-lo como Loadform.Frm. Primeiro, vamos conectá-la ao item de menu Load File... acionando esse item no menu File do Editor: Para mostrar o quadro de diálogo Load File... (LoadForm), podemos simplesmente mostrá-lo da seguinte forma: Sub LoadItem LoadForm.Show End Sub Para projetar LoadForm, use o item New Form do menu File do Visual Basic. Para criar o formulário, dê a ele um Name de LoadForm; use, Load File... como legenda; remova os botões Min e Max; mude a propriedade de BorderStyle para dupla fixa; e inclua os botões OK e Cancel. Em seguida, inclua um quadro de lista de unidade com um clique duplo na ferramenta de lista de unidade na caixa de ferramentas, que está próxima à ferramenta do temporizador. Observe que o quadro de lista de unidade é um quadro de lista suspensa, o que nos economizará algum espaço. Também precisamos de um quadro de lista de diretório e um quadro de lista de arquivo, e, portanto, acione com um clique duplo também essas ferramentas (que se encontram no final da caixa de ferramentas), e arrume-as como você desejar no quadro de diálogo. O usuário poderá carregar qualquer arquivo existente dessa maneira, por meio da combinação dos quadros de unidade, diretório e lista de arquivos. Ele pode usar o quadro de lista de unidade para especificar a unidade, o quadro de lista de diretório para especificar o diretório nessa unidade, e o quadro de lista de arquivos para indicar o arquivo real que deseja abrir. Esse arquivo pode ser aberto de duas maneiras: dando um duplo clique no nome do arquivo no quadro de lista de arquivo ou selecionando-o (destacando- o) no quadro de lista de arquivo e acionando o botão OK. E, como sempre, ativar o botão Cancel é muito fácil. Basta esconder o quadro de diálogo quando esse botão for acionado: Microsoft Visual Basic 4.0 138 Sub CancelButton_Click( ) LoadForm.Hide End Sub Agora vamos passar aos controles de arquivo. Nesse ponto, os três quadros de lista (de unidade, diretório e arquivo) não estão se comunicando um com o outro; ou seja, eles estão apenas mostrando informações independentes para o diretório ativo no disco. Se tivéssemos que rodar esse programa e mudar o disco no quadro de lista de disco, os outros dois quadros não responderiam à mudança. Para que possam se comunicar, temos que saber um pouco mais sobre os eventos importantes para cada um deles, e veremos isso em seguida. Quadros de Lista de Unidade O quadro de lista de unidade é um quadro de lista suspensa. A unidade ativa é indicada nela. Quando o usuário aciona a seta conectada, o quadro de lista desce, mostrando que outras unidades estavam disponíveis para escollia. Quando o usuário escolher uma, um evento Change ocorrerá no quadro de lista. Como não definimos o nome para nosso quadro de lista de unidade, ele ainda possui o nome original de Drive1 (a definição básica para os quadros de lista de unidade), de modo que a procedure de evento é Drive1_Change( ). A propriedade do nosso quadro Drive1 que mantém a unidade é simplesmente Drive1.Drive, e nossa próxima tarefa é passar essa nova unidade adiante para o quadro de lista de diretório, que ainda possui o nome original Dir1 (como é normal para quadros de lista de diretório). Para fazer isso, só precisamos passar a propriedade Drive1.Drive para a propriedade Dir1.Path: Podemos fazer isso acionando o quadro de lista de unidade com o mouse, o que faz surgir a procedure Drive1_Change. Basta atribuir a propriedade Drive de Drive1 à propriedade Path de Dir1, da seguinte forma: Sub Drive1_Change( ) Dir1.Path = Drive1.Drive End Sub Microsoft Visual Basic 4.0 139 E isso é tudo que precisamos fazer para conectar os quadros de unidade e diretório. De fato, podemos rodar o programa nesse ponto. Quando o fizermos, poderemos acionar o item Load File... do menu File do Editor. O quadro de diálogo que projetamos, LoadForm, aparece em seguida, mostrando a unidade ativa, diretório e arquivos nesse diretório. Se acionarmos o quadro de unidade, a lista suspensa de todas as unidades no sistema aparecerá. Acionando uma dessas unidades, passaremos para essa unidade, e a mudança também afeta o quadro de lista de diretório, que também muda para listar os diretórios nesse novo disco. O próximo passo no nosso programa é conectar o quadro de lista de diretório ao quadro de lista de arquivo, de modo que, quando o diretório for alterado, os arquivos mostrados sejam os arquivos nesse diretório. Quadros de Lista de Diretório O quadro de lista de diretório mostra os diretórios disponíveis em uma certa unidade. Ele é um quadro de lista simples - ou seja, é sempre mostrado, e não um quadro de lista suspensa. A unidade de trabalho é mostrada na linha superior, e os diretórios dessa unidade aparecem logo abaixo. Se houver mais diretórios do que o espaço permitido, uma barra de paginação vertical aparecerá à direita do quadro. O diretório ativo aparecerá como uma pasta aberta sombreada; seus subdiretórios aparecerão como pastas fechadas (sem sombra) logo abaixo dele. Quando o usuário mudar de diretório, acionando um novo diretório, um evento Dir1_Change será gerado, e o novo caminho será colocado em Dir1.Path. Além disso, pelo modo como preparamos as coisas, quando o usuário mudar de unidade, Drive1.Drive será carregado em Dir1.Path, que também gera um evento Dir1_Change. Em outras palavras, o único evento com que precisamos nos preocupar aqui é Dir1_Change, que agora cuida das mudanças de unidade e diretório. Quando ocorrer esse evento, precisamos dar a notícia ao quadro de lista de arquivo, o que pode ser feito passando adiante a propriedade Dir1.Path à propriedade Path do quadro de lista de arquivo. Como essa lista ainda é chamada File1 (a definição original para quadros de lista de arquivo), podemos fazer isso. Sub Dir1_Change( ) File1.Path = Dir1.Path End Sub Microsoft Visual Basic 4.0 140 Desse modo, toda vez que houver uma mudança no diretório de trabalho - ou unidade de trabalho -, o quadro de lista de arquivo saberá disso. Se fizermos essa mudança e depois iniciarmos o programa, poderemos ver que agora todos os quadros de lista estão conectados. Por exemplo, podemos acionar o quadro de lista de unidade para mudar a unidade, e a mudança automaticamente será comunicada ao quadro de lista de diretório, cuja lista de diretórios é alterada de acordo. Essa mudança, por sua vez, também é comunicada ao quadro de lista de arquivo, que mostra os arquivos no novo diretório de trabalho. Por conseguinte, se mudarmos o diretório de trabalho no quadro de lista de diretório, essa mudança também será comunicada ao quadro de lista de arquivo, que mostrará os arquivos no novo diretório. Em outras palavras, os eventos importantes foram Drive1_Change e Dir1_Change, e as propriedades importantes que tiveram que ser transferidas foram Drive1.Drive → Dir1.Path, e Dir1.Path → File1.Path. Para realmente lermos o nome do arquivo que o usuário deseja carregar, teremos que verificar a propriedade FileName de File1 - ou seja, File1.FileName - da, seguinte forma: Unidade Diretório Arquivo Drive1.Drive Dir.Path Arquivo1.Path Nome do File1.FileName Arquivo Também poderíamos notar que, embora você possa selecionar uma nova unidade com um único clique do mouse, são necessários dois cliques para selecionar um novo diretório no quadro de lista de diretório. Essa diferença tem a ver com a diferença entre os arquivos de lista suspensa e simples. O motivo para precisar de dois cliques no quadro de listas de diretórios é para que os usuários possam se movimentar para cima e para baixo nas listas usando as teclas de direção sem mudar o diretório de trabalho para cada entrada destacada durante o percurso; ou seja, a mudança é feita apenas quando ele chegar ao diretório que deseja. Leitura de Arquivos no Visual Basic Microsoft Visual Basic 4.0 141 Os comandos-padrão de leitura de um arquivo seqüencial no Visual Basic são lnput #, Line lnput # e Input$. Você deverá usá-los da seguinte forma: lnput # nnn%, expressionlist Line lnput # nnn%, stringvariable Input$ (bbb%, [#] nnn%) Aqui, nnn% é o número do arquivo (isto é, 1 para o nosso caso), bbb% é o número de bytes a ser lido, stringvariable é o nome de uma variável de string para colocar os dados, e expressionlist é uma lista de expressões onde os dados serão colocados. Por exemplo, se usarmos lnput # para preencher Form1.display.Text, o comando poderia ser este: lnput # 1 Form1.display.Text. No entanto, o problema com Input # é que ele espera que os itens no arquivo, sejam separados por vírgulas, espaços ou mais de uma linha (isto é, um carriage return). Para números, isso significa que quando lnput # encontrar a primeira vírgula, espaço ou final de linha, ele achará que o número ativo terminou; para strings, lnput # termina o string quando alcançar uma vírgula ou o fim de linha. Isso não pode ser aceito por nós, pois o texto de um documento que estamos lendo poderá conter muitas vírgulas. De fato, o usuário pode ter colocado carriage returns em vários pontos do documento (embora não sejam necessários, pois o quadro de texto multilinha do Editor possui uma quebra de linha automática), ou então podemos estar tentando ler um documento de outra aplicação, que já contenha carriage returns. De maneira semelhante, a função Line lnput# lê strings dos arquivos, até encontrar um carriage return, quando termina. Isso significa que teríamos que alcançar o final de cada linha do arquivo (se for dividido em linhas) separadamente. Uma forma de fazer isso seria a seguinte: Do Until EOF(1) Line Input # 1, Dummy$ Form1.PadText.Text = Form1.PadText.Text + Dummy$ + Chr$(13) + Chr$(1O) Microsoft Visual Basic 4.0 142 Loop Os comandos nesse loop, se houver algum, serão executados repetidamente até que a condição seja verdadeira, quando a execução terminará. (Observe que se a condição for verdadeira no início, os comandos no corpo do loop não são executados uma única vez.) No nosso caso, estamos usando a função EOF( ) para compor a condição do nosso loop. Essa função apanha um número de arquivo como seu argumento (para nós, isso seria EOF(1)) e retorna um valor True quando atingirmos o final do arquivo. No loop do exemplo acima, então, continuaríamos lendo as linhas do arquivo até alcançarmos o final do arquivo. Além disso, toda vez que lemos uma linha, incluímos os caracteres carriage return e avanço de linha ao final da linha, da seguinte forma: Do Until EOF(1) Line Input # I, Dummy$ Form1.display.text = Form1.display.text + Dummy$ + Chr$(13) + Chr$(10) Loop Aqui, estamos usando a função Chr$(), que retoma o caracter ANSI correspondente ao código ANSI passado a ela. Por exemplo, Chr$(13) retorna um carriage return. O motivo para incluirmos um par carriage return/avanço de linha ao final de cada linha é que Line lnput # trata esses dois caracteres simplesmente como delimitadores de string, excluindo-os do texto. Entretanto, como eles fazem realmente parte do arquivo, podemos simplesmente colocá-los de volta. Uma opção melhor para nós do que lnput # ou Line lnput # é a função lnput$, que é feita especialmente para ler strings, e que não suprime carriage returns dos avanços de linha. Para usar essa função, no entanto, temos que indicar o número exato de bytes que queremos ler; quando o fizermos, lnput$ retomará um string (que podemos atribuir a Form1.display.Text). O número de bytes que queremos ler é simplesmente o tamanho do arquivo em bytes; podemos usar outra função de arquivo, LOF(), para obter isso para nós. Assim como EOF(), LOF() apanha um número de arquivo como argumento. LOF(), no entanto, retorna o tamanho do arquivo indicado em bytes (o arquivo deve estar Microsoft Visual Basic 4.0 143 aberto para LOF() funcionar), de modo que podemos ler tudo da seguinte forma, com a função Input$o: Form1.display.Text = Input$(LOF(1), # 1) Limitações de lnput$() A função lnput$() é limitada à leitura de arquivos de 32.767 bytes se você o abrir para acesso seqüencial ou binário. No entanto, se quiser usar arquivos maiores, poderá simplesmente verificar o tamanho do arquivo, LOF(), e depois ler o arquivo várias vezes em sucessão até obter todos os dados de que precisa. De fato, como você especifica o número de bytes a serem lidos, poderá também usar esse comando para ler dados de arquivos binários. Podemos incluir nosso comando lnput$ a OKButton_Click() da seguinte forma, onde colocamos o string lido (isto é, o conteúdo inteiro do arquivo) diretamente no quadro de texto do Editor (Form1.display.Text): Sub OKButton_Click () On Error GoTo FileError If (Right$(Dir1.Path,1) = "\") Then Filename = Dir1.Path + File1.Filename Else Filename = Dir1.Path + "\" + File1.Filename End If Open Filename For Input As # 1 Form1.display.text = lnput$(LOF(1), # 1) close #1 loadform.hide Microsoft Visual Basic 4.0 144 Exit Sub FileError: MsgBox "File Error", 48, "Editor" 'MsgBox para erro de arquivo End Sub Agora o quadro de diálogo Load File... está completo. Para usá-lo, basta iniciar o programa e selecionar o item Load File... no menu File. O quadro de diálogo Load File... é mostrado na tela. Como você pode ver, o quadro de lista de arquivo apresenta os nomes de arquivo em ordem alfabética. Para abrir um deles, basta dar um duplo clique no seu nome ou selecioná-lo e acionar o botão OK. Quando o fizer, a procedure OKButton_Click() será executada, o arquivo será aberto e lido para o Editor. Nesse ponto, você poderá editá-lo e depois gravá-lo no disco novamente com a opção Save File.... Uso de Arquivos de Acesso Aleatório no Visual Basic Estamos prontos para passar de arquivos de acesso seqüêncial para arquivos de acesso aleatório. Esses tipos de arquivos normalmente dividem seus dados em registros, todos eles contendo o mesmo formato, mas (normalmente) com dados diferentes. E, como você deve se lembrar, preparamos os dados no nosso programa de bancos de dados anteriormente exatamente para os tipos de registros, da seguinte forma: Type Record Name As String* 50 Number As String * 20 Comments As String * 200 End Type Microsoft Visual Basic 4.0 145 Global TheData(100) As Record Gravação de Arquivos de Acesso Aleatório Podemos começar gravando o arquivo depois que o usuário selecionar o item Save File... no menu File. O Name desse item é Saveltem. Podemos abrir Saveltem_Click() acionando o item do menu. Quando o usuário acionar esse item, ele poderá salvar o banco de dados em um arquivo particular, de modo que precisamos gerar um quadro de diálogo semelhante àquele que projetamos anteriormente para o nosso Editor. De fato, podemos usar aqui o mesmo quadro de diálogo. Para carregar esse formulário, basta abrir o menu File do Visual Basic, selecionar o item Add File... e dar o nome do formulário Save File... (usamos Saveform.Frm no exemplo anterior). Esse arquivo é automaticamente carregado - dessa forma, você poderá trocar formulários como quadros de diálogo entre projetos, economizando muito tempo durante o projeto, e fazendo com que suas aplicações se tornem mais uniformes. Agora podemos gerar esse quadro de diálogo na tela da seguinte forma em Saveltem_Click(): Sub Saveltem_Click() SaveForm.Show End Sub Em seguida, temos que fazer algumas mudanças no código de SaveForn, pois está preparado para armazenar arquivos seqüenciais. Basta passar para esse formulário usando a janela de projeto, e acionar na procedure OKButton_Cllck(), que atualmente contém o seguinte código: Sub OKButton_Click () On Error GoTo FileError Open Filenamebox.text For Output As#1 Microsoft Visual Basic 4.0 146 Print # 1, Form1.display.text ‘Grava documento Close # 1 'Fecha o arquivo SaveForm.Hide Exit Sub File error: MsgBox “File Error”, 48, “Database” End Sub Como estamos usando um arquivo de acesso aleatório com registros dessa vez, e não um arquivo seqüencial de texto, abrimos o arquivo como Random: Sub OKButton_Click( ) On Error GoTo FileError Open FilenameBox.Text For Random As #1 Len = Len(TheData(1)) Print # 1, Form1.display.Text 'Grava o documento Close # 1 'Fecha o arquivo SaveForm.Hide Exit Sub FileError: MsgBox "File Error", 48. "Database" 'MsgBox para erro no arquivo End Sub Aqui, estamos indicando que o tamanho de registro que iremos usar é Len(TheData(1)), que retorna o tamanho (em bytes) do nosso registro. Em seguida, queremos gravar o array de registros inteiro, Database(), nesse arquivo, de modo que deveremos ver as opções para gravação de arquivos de acesso aleatório. Microsoft Visual Basic 4.0 147 Os comandos comuns de I/0 para arquivos binários e de acesso aleatório são Get# e Put #; esses comandos podem obter ou colocar registros no arquivo. Nesse caso, usaremos Put #, cuja sintaxe é a seguinte: Put [#] nnn%, [rrr%], vvv% Aqui, nnn% é um número de arquivo, rrr% é o número de registro que você quer colocar no arquivo, e vvv% é a variável que queremos colocar lá. Se não especificarmos um número de registro, o Visual Basic simplesmente coloca um registro após o últirno no arquivo. O número total de registros é armazenado no inteiro global TotalRecords, de modo que possamos gravar esse número de registros da seguinte forma (observe que nenhum registro é gravado se TotalRecords for 0): Sub OKButton_Click ( ) On Error GoTo FileError Open FilenameBox.Text For Random As # 1 Len = Len(TheData(1)) For loop_index = 1 To TotalRecords Put # 1, TheData(loop_index) Next loop_index Close # 1 'Fecha o arquivo SaveForm.Hide Exit Sub FileError: MsgBox "File Error", 48, “Database" 'MsgBox para erro no arquivo End Sub E é isso aí. Agora podemos usar a opção Save File... do aplicativo Database. Microsoft Visual Basic 4.0 148 Nesse ponto, o arquivo é gravado no disco. (Observe que também devemos mudar o quadro de mensagem de erro na seção FileError do código, dando-lhe o título "Database" em vez de "Editor".) Se quiséssemos, poderíamos ter gravado qualquer registro no lugar de todos eles especificando um número de registro em particular, da seguinte maneira: Put # 1, 5, TheData(23) Isso grava no registro 5 do arquivo, preenchendo-o com o registro TheData(23). Desse modo, o acesso aleatório é verdadeiramente aleatório, pois ternos acesso a todos os registros do arquivo. Em outras palavras, podemos nos movimentar à vontade no arquivo, gravando registros em qualquer ordem. Isso funciona de forma semelhante com Get #, como veremos em seguida, ao lermos os registros do arquivo. Leitura de Arquivos de Acesso Aleatório Já copiamos o quadro de diálogo Save File da aplicação Editor para o nosso banco de dados, e podemos também copiar o quadro de diálogo Load File. Mais uma vez, selecione o item Add File no menu File do Visual Basic, e depois inclua o arquivo Frm contendo o quadro de diálogo Load File... (nós o chamamos Loadform.Frm anteriormente). Em seguida, ative o item Load File no menu File do Database da seguinte forma: Sub Loadltem -ClickO Loadform.show End Sub Microsoft Visual Basic 4.0 149 Agora acione o botão OK desse novo formulário, LoadForm, para mostrar a procedure mais importante, OKButton_Click(), que atualmente é a seguinte: Sub Okbotton_Click( ) On Error GoTo FileError If (Right$(Dir1.Path,1 ) = " \") Then 'Obtém nome do arquivo Filename = Dir1.Path + File1.FileName Else Filename = Dir1.Path + "\" + File1.Filename End if Open Filename For Input As # 1 Form1.display.Text = Input$(LOF(1), # 1)'Lê o arquivo Close # 1 'Fecha o arquivo 'Abre o arquivo Exit Sub FileError: MsgBox ”File Error",48,”Editor" 'MsgBox para erro End Sub Mais uma vez, abrimos o arquivo como antes, para acesso aleatório: Sub OKButton_Click( ) On Error GoTo FileError . Microsoft Visual Basic 4.0 150 . . Open Filename For Random As # 1 Len = Len(TheData(1)) Form1.display.Text = Input$(LOF(1), # 1)'Lê o arquivo Close # 1 'Fecha o arquivo LoadForm.Hide 'Esconde o quadro de diálogo Exit Sub FileError: MsgBox "File Frror", 48. "DataBase" End Sub Agora temos que obter os registros do arquivo usando Get #, que você usa para ler a partir de arquivos aleatórios e binários, e cuja sintaxe é a seguinte: Get [#] nnn%, [rrr%], vvv% Assim como em Put #, nnn% é o número do arquivo, rrr% é o número do registro que você quer obter do arquivo, e vvv% é a variável queremos colocar os dados. Se não especificarmos um número de registro o Visual Basic simplesmente apanhará o próximo registro da posição ativa no arquivo. Nossa primeira tarefa aqui é descobrir quantos registros existe no arquivo, e podemos fazer isso simplesmente dividindo o tamanho arquivo pelo tamanho de cada registro. Depois disso, podemos ler os dados da seguinte forma, registro por registro: Sub OKButton_Click ( ) On Error GoTo FileError Microsoft Visual Basic 4.0 151 Open Filename For Random As # 1 Len = Len(TheData(1)) NumberFileRecords = LOF(1)/ Len(TheData(1)) For loop_index =1 To NumberFileRecords Get # 1, TheData(loop_index) Next loop_index Close # 1 'Fecha o arquivo LoadForm.hide 'Esconde o quadro de diálogo Exit sub FileError: MsgBox "File Error", 48, "Database" 'MsgBox para erro de arquivo End Sub (Observe que, mais uma vez, mudamos o nome do título do quadro na seção FileError do código de "Editor" para "Database"). No entanto, simplesmente carregar um arquivo não torna o banco de dados ativo. Além disso, temos que carregar os nomes de registro que lemos ao nosso quadro de lista ordenado do banco de dados, onde podem ser selecionados pelo usuário. Esse quadro de lista é mantido no quadro de diálogo Find Item... do banco de dados. Para carregar os nomes de registro para esse quadro de lista, temos primeiro que apagar todas as entradas ativas (usando o método Removeltem do Visual Basic), e depois podemos recarregá-las de TheData(), usando o método Addltem: Sub OKButton_Click ( ) On Error GoTo FileError Microsoft Visual Basic 4.0 152 If (Right$(Dir1.Path, 1) = "\") Then 'Obtém nome do arquivo Filename = Dir1.Path + File1.FileName Else Filename = Dir1.Path + "\" + File1.FileName End If open Filename For Random As # 1 Len = Len(TheData(1)) NumberFileRecords = LOF(1) / Len(TheData(1)) For loop_index = 1 To NumberFileRecords Get # 1, , TheData(loop_index) Next loop_index close # 1 'Fecha arquivo For loop_index = 1 TO TotalRecords Form2.Namelist.Removeitem 0 Next loop_index TotalRecords = NumberFileRecords ‘ Depois de ler o arquivo com segurança For loop_index = 1 To TotalRecords Form2.NameList.AddItem TheData(loop_index).Narne Next loop_index Form1.NameField.Text = TheData(1).Name Form1.NumberField.Text = TheData(1).Number Forml.CommentField.Text = TheData(1).Comment Microsoft Visual Basic 4.0 153 LoadForm.Hide 'Esconde quadro de diálogo Exit sub FileError: MsgBox "File Error", 48, "Database" ‘MsgBox para erro End Sub Uso do Comando Seek Esse comando pode ser extremamente útil, pois nos permite especificar qual o registro que será lido ou gravado em seguida. Sua sintaxe é a seguinte: Seek [#] nnn%, PPP& Aqui, nnn% é o número do arquivo, e ppp& (um inteiro longo) é a nova posição no arquivo; para arquivos seqüenciais, ppp& é medido em bytes; para arquivos aleatórios, em números de registro. Em outras palavras, esta linha: Get # 1, loop_index, TheData(loop_index) é o mesmo que as linhas: Seek # 1, loop_index Get # 1, TheData(loop_index) Microsoft Visual Basic 4.0 154 Crie um pequeno banco de dados para controlar as operações dos clientes de uma suposta Locadora de Vídeo. O registro de cada cliente deverá ser composto por Nome Endereço Fitas alugadas Observações O mini-banco deverá conter um Menu principal com os Itens: Arquivo (Sub-itens Abrir, Salvar e Sair), Clientes (Sub-itens Adicionar e Remover). No canto do formulário principal deverá aparecer o número de clientes cadastrados. Dica: Utilize as caixas de diálogos (Save e Open) criadas nas aplicações anteriores. Prática