Constantes e Variáveis no Visual Basic

Anteriormente vimos o problema da interpretação contextual das informações contidas em bits, isto é, saber quando se trata de números, caracteres ou algo completamente diferente. O Visual Basic ajuda-o a resolver essa questão, permitindo que seja especificado o tipo de informação a ser armazenada.

Especificando Tipos de Dados do Visual Basic

Como você já viu, os bits 01000001 podem representar a letra A, se o contexto for o código ASCII, ou o valor 65, quando o contexto for o sistema numérico decimal. Você poderia resolver essa ambigüidade, desenvolvendo codificações especiais de bits para cada tipo de informação, porém, felizmente você não precisará envolver-se com essa questão, pois o Visual Basic define um conjunto padronizado para representações de dados chamado de tipos de dados. A Figura 3.1 lista os nomes e características dos vários tipos de dados suportados pelo Visual Basic.

Figura 3.1 Tipos de dados do Visual Basic.

O tipo byte é útil para conter dados binários. Seus valores são numéricos e podem variar de 0 a 255 sem sinal. Ocupam oito bits na memória.

O tipo boolean é um tipo numérico especial, pois pode conter apenas dois valores: 0 (False) ou -1 (True). Na memória, ocupam 16 bits (2 bytes).

Os tipos Integer e Long são inteiros simples de 16 e 32 bits, representados por valores binários, semelhantes aos que foram discutidos no Capitulo 2. Ambos os tipos devem ser usados apenas para representar números que não contenham parte fracionária. O tipo Integer requer apenas 16 bits de memória, porém possui uma faixa de valores mais restrita do que o tipo Long (Voltaremos a falar sobre a faixa de valores mais adiante.)

O tipo string é uma seqüência de caracteres, cada uma das quais representada pelo esquema ASCII. A seqüência que não contém qualquer caractere é chamada de string vazia. As strings podem ser de tamanho fixo ou variável.

Strings de tamanho fixo podem possuir de 1 a aproximadamente 65.400 caracteres, enquanto as strings de tamanho variável podem chegar a aproximadamente 2 bilhões de caracteres. Vale lembrar que as strings em Visual Basic ocupam 2 bytes de memória por caractere e as strings de tamanho variável possuem 10 bytes iniciais de informação sobre a string.

O tipo de dado currency foi especialmente projetado para representar valores monetários. Um valor monetário tem sempre quatro casas decimais após a vírgula - isto é, você pode armazenar um valor como 11,1625, mas não um valor como 21,00003. (Este último valor seria arredondado para 21,0000)

Os tipos de dados single e double permitem-lhe expressar números de ponto flutuante. Números de ponto flutuante (também chamados de números reais ou apenas reais) representam valores que possuem partes fracionárias. O nome ponto flutuante provém de ponto decimal flutuante, que pode aparecer em qualquer posição, como em 0,000001, 356,555 ou, ainda, 10000,0; ao contrário do tipo currency, que é um exemplo de tipo de dado com ponto decimal fixo.

Decimal é um tipo de dados para números gigantescos. Ocupa 14 bytes de memória e pode representar valores no intervalo +/-79.228.162.514.264.337.593.543.950.335 sem a vírgula; ou valores no intervalo +/-7,9228162514264337593543950335 com 28 posições à direita da vírgula; o menor número diferente de zero pode ser +/-0,0000000000000000000000000001

O tipo de dados Date é usado para representar datas que variam de 1 de janeiro de 100 até 31 de dezembro de 9999 e a hora de 0:00:00 a 23:59:59. Ocupam 64 bits (8 bytes) de memória.

O tipo de dados Object ocupa 4 bytes na memória e é usado para guardar referências a objetos. Falaremos mais sobre este tipo de dados quando tratarmos do uso de objetos no Visual Basic.

Finalmente, o Visual Basic inclui o tipo variant, uma espécie de tipo de dado mutável que pode assumir qualquer um dos tipos de dados já apresentados. O tipo variant na realidade contém duas partes de informação: um valor, que poderá ser qualquer um dos tipos mencionados, e um código indicando o tipo de dado que está sendo representado. (Por exemplo, currency ou string.)

Faixa de Valores

Uma das características mais importante dos tipos de dados é a sua faixa de valores, que limita os valores que o tipo de dado pode armazenar. Esses limites se baseiam na quantidade de bits que será usada para armazenar os valores. Por exemplo, considere a Figura 3.2, que ilustra o que acontece quando você tenta contar de 0 a 9 usando um número binário de 3 bits. Com 3 bits, você pode apenas definir oito valores. Em conseqüência disso, alguma informação será perdida, um problema conhecido como estouro de campo, pois a quantidade de bits necessários para armazenar a informação é maior do que a quantidade de bits disponíveis.

Figura 3.2 Perda de informação em função de estouro.

Como um programador, você deve decidir qual tipo de dado usar para um certo valor. Se você estiver escrevendo programas simples, esta questão pode muito bem ser evitada usando sempre o tipo de dado variant, que pode representar qualquer valor. Entretanto, quando se tratar de programas mais complexos, você provavelmente estará preocupado em escolher o tipo de dado mais adequado, por questões de espaço em memória e velocidade de execução. (O tipo de dado variant é menos eficiente do que os outros, pois, antes de tratar o dado propriamente dito, o Visual Basic tem de verificar de que forma ele deverá ser tratado.)

Uma Cartilha sobre Ponto Flutuante

Quando você trabalhar com números de ponto flutuante, perceberá que a precisão é quase tão importante quanto a sua faixa de valores. Números de ponto flutuante têm uma faixa de valores que define o maior e menor valor que eles podem representar e uma precisão que estabelece a quantidade de algarismos significativos que o valor pode conter.

O Visual Basic armazena números de ponto flutuante em uma versão binária da notação científica, onde os valores são expressos pelo produto de dois números: uma fração e um expoente. Em notação científica, por exemplo, você pode representar a distância entre o Sol e a Terra por 5,84 x 10 ^ 12 polegadas.

A parte fracionária do tipo single é um valor binário que expressa um pouco mais do que 6 dígitos decimais de precisão. O expoente permite que sejam representados valores que vão desde números muito pequenos (10 ^ -45) até números muito grandes (10 ^ 38). O tipo double, por sua vez, permite a representação de valores com uma faixa de variação ainda maior (de 10 ^ -324 a 10 ^ 308), com aproximadamente 13 dígitos decimais de precisão.

Se a idéia de um número contendo apenas 13 dígitos de precisão lhe parece estranha, considere o seguinte: o número 0,00000000017 parece bem preciso. Repare que ele contém apenas dois dígitos de precisão. Isso fica mais fácil de visualizar quando se adota a notação científica: 1,7 x 10 ^ -10. A parte fracionária é apenas 1,7; o resto da informação (o expoente) lhe indica onde colocar a vírgula decimal. Como outro exemplo, considere o valor 5,84 x 10 ^ 12 polegadas. Embora ele esteja representando um número de 13 dígitos, a sua precisão é de apenas 3 dígitos. Ainda que essa medida possa apresentar um erro de alguns milhares de polegadas, isso não é importante, pois em comparação a um número da ordem de trilhões de polegadas esse desvio é desprezível.

A distinção entre precisão e faixa de valores é sutil, porém importante. Suponhamos que você seja contratado pela Imensamente Grande MegaCorp para escrever um programa que controle a contabilidade da corporação. Essa empresa fatura todos os anos centenas de bilhões de dólares. Você pode concluir que o tipo single seja perfeitamente adequado para o tratamento de valores, afinal ele pode representar valores até 10 ^ 38, quando centenas de bilhões de dólares significa algo parecido com 10 ^ 11. Entretanto, quando se fala em contabilidade, é necessária extrema exatidão de valores, e o tipo single não tem a precisão desejável para tal. Por exemplo, se o balanço fosse iniciado com um saldo de $121.734.240.722, seriam necessários 12 dígitos de precisão para representá-lo, pois cada um dos 12 dígitos nesse valor é significativo. Repare então que, apesar de o tipo single poder armazenar valores bem maiores do que esse, se esse valor fosse armazenado nesse tipo, ocorreria um estouro de campo, pois esse tipo permite até 6 dígitos de precisão, isto é, seria armazenado um valor de 1,217342 x 10 ^ 11, ou seja, 121.734.200.000. Em seu primeiro dia no emprego, você já teria provocado o desaparecimento de 40.722!

Nota: O tipo de dado currency do Visual Basic é perfeito para tratamento monetário. Ele providencia até 18 dígitos de precisão e sempre mantém 4 desses dígitos como posições decimais. Uma variável do tipo double também admite a mesma quantidade de dígitos significativos, porém o tipo currency tem ponto decimal fixo e não está sujeito a arredondamentos.

Naturalmente, isso não quer dizer que o tipo single deva ser desprezado. Se, por exemplo, você estiver trabalhando com equações físicas e medindo a quantidade de átomos em 31 gramas de silício (aproximadamente 6,02 x 10 ^ 23), um número real servirá aos seus propósitos - a menos que você planeje calcular a quantidade exata de átomos.

Criando Variáveis e Constantes

Deixando de lado o tipo de dado a ser armazenado, o próprio armazenamento não tem qualquer sentido quando não se pode referenciar as informações armazenadas, isto é, se não for possível recuperar essas informações. O Visual Basic permite-lhe nomear localizações de memória de forma a acessar as informações lá armazenadas. Uma posição de memória nomeada é chamada de variável. A instrução Dim, que informa o Visual Basic a respeito de sua intenção de reservar uma área de memória, tem o seguinte formato:

Dim variável [As Tipo]

Quando você usa essa instrução, precisa colocar a palavra-chave Dim e seguí-Ia com o nome da variável que deseja usar. A frase mostrada entre colchetes é opcional; se você usá-la, precisa colocar a palavra-chave As e, em seguida, especificar o tipo, sem incluir os próprios colchetes. (Será visto mais sobre notação em outro capítulo.) Por exemplo, a instrução a seguir avisa ao Visual Basic para reservar memória suficiente para um dado do tipo currency (8 bytes) e usar como referência a essa localização de memória o nome SaldoDaConta:

Dim SaldoDaConta As Currency

Usando o nome da variável, você poderá posteriormente instruir o Visual Basic para armazenar novas informações nessa localização, recuperá-las, modificá-las e assim por diante. Caso a cláusula As seja omitida, o Visual Basic assumirá que a variável é do tipo Variant.

Você pode imaginar as variáveis como sendo caixas. A instrução Dim cria uma nova caixa de um certo tamanho e lhe atribui um nome, como ilustrado na Figura 3.3. Quando você usa o nome de uma variável em um programa, o Visual Basic lhe fornece o conteúdo atual da caixa (o valor atualmente lá armazenado).

Figura 3.3 Reservando memória com declarações de variáveis.

Quando uma área de memória é reservada para uma variável numérica, o Visual Basic assinala a essa variável o valor inicial 0 (zero). Entretanto, não é boa idéia confiar nessa inicialização automática. Se você desejar que uma variável assuma um certo valor, é melhor atribuir esse valor à variável em seu programa. A atribuição explícita de valores às variáveis torna o seu programa mais fácil de entender, evitando pressuposições dúbias. Além disso, você deve lembrar-se de que a inicialização automática é uma característica particular do Visual Basic. Se você converter seu programa para outro ambiente de programação, o novo sistema pode não suportar a inicialização automática, e seu programa não funcionará mais.

Às vezes, você pode ter de usar valores que não se alterem - o valor de pi, o número de Avogadro, o número de centímetros em uma polegada. Ainda que seja possível usar esses valores numéricos diretamente na instrução em que são necessários, é mais simples usar um nome como PI, do que repetir o número 3,1415926 toda vez.

Para fixar tais valores, o Visual Basic permite que você declare constantes, ou seja, localizações de memória cujo conteúdo não se modifica (ao contrário do conteúdo de variáveis). Se você tentar modificar uma constante, o Visual Basic gerará uma mensagem de erro. A instrução Const declara um valor constante e tem a seguinte forma:

Const nome [As tipo]= expressão

Não é necessário declarar o tipo de uma constante, pois o Visual Basic determina-o automaticamente usando a verificação do valor da expressão. Se você escrever Const RESPOSTA = 42, o Visual Basic usará o tipo Integer; se você introduzir Const NOMEINICIAL = "Paulo", ele criará uma constante do tipo string. (Normalmente, costuma-se usar letras maiúsculas para criação de nomes de constantes.)

Com freqüência, pode haver alguma ambigüidade quanto ao tipo de constante que o Visual Basic deveria criar. Por exemplo, o valor 3,01 poderia ser single, double ou currency. Por default, o Visual Basic selecionará o tipo que demandar menor espaço de memória para seu armazenamento. No entanto, você pode forçá-lo a assumir um certo tipo, colocando As tipo após o nome da constante ou um caractere de declaração de tipo. Os caracteres para declaração de tipo estão listados na Figura 3.4.

Figura 3.4 Caracteres para declaração de tipos do Visual Basic.

Assim, a declaração Const ONE& = 1 reserva 4 bytes de memória para uma constante do tipo long, e a declaração Const ONE# = 1 reserva 8 bytes e armazena o valor em uma representação de ponto flutuante. Em qualquer um dos casos, você deveria usar o nome ONE (sem o caractere de declaração de tipo) em seu programa para se referir a esse valor. Você deveria adquirir o hábito de definir constantes para valores padrões; essa prática tornará seus programas mais inteligíveis.

Dica: Ocasionalmente, você poderá ter de definir uma constante muito grande - um valor como o número de Avogadro, por exemplo, que, como você deve se lembrar, é 6.02 x 10 ^ 23. Felizmente, não é necessário digitar algo como 602000000000000000000000. O Visual Basic permite que você introduza uma constante simples, especificando apenas a parte fracionária do número (mantissa), seguida pela letra E, e em seguida o expoente (6.02E23 no exemplo). Para constantes do tipo double, use a letra D no lugar da letra E (6.02D23).

Regras para Nomes

Para nomear variáveis e constantes em Visual Basic, você deve seguir alguma regras:

Estas instruções usam nomes ilegais:

Dim 1Tempo As Long ' Inicia com um número

Const PRINT = 2 ' Print é uma palavra-chave

Dim Isto*aqui As Currency 'Asterisco não é aceito

Comentários

Um apóstrofo (') inicia o comentário do programador em Visual Basic. O apóstrofo ou caractere de comentário permite-lhe inserir observações sobre seu programa em qualquer lugar da codificação. Uma vez que o Visual Basic ignora todos os caracteres à direita de um apóstrofo, o texto que se segue deveria conter apenas informação ou descrição que seja útil a alguém que esteja lendo o programa. Quando um apóstrofo é o primeiro caractere de uma linha, a linha inteira é considerada como comentário. Observe que, se o seu comentário precisar de mais de uma linha, você deve preceder cada linha com um apóstrofo.

Eis como o procedimento de evento BtnIniciar - Click do aplicativo Cronômetro,

desenvolvido no Capitulo 1, ficaria se fossem adicionados comentários:

Figura 3.5

As instruções a seguir são declarações válidas para o Visual Basic:

Dim NomedeVariáveIMuitoLonto As Integer

Dim RX7 As String

Const CENT_POR_INCH = 2,54

O Visual Basic não diferencia letras maiúsculas de minúsculas usadas em nomes de variáveis; CONTADOR, CONTador e Contador são idênticos. Quando você define o nome de uma variável, o Visual Basic providencia para que todas as referências feitas à variável em questão sigam a mesma utilização de letras maiúsculas e minúsculas adotada na declaração. Os programas tornam-se mais legíveis quando se usam letras maiúsculas e minúsculas alternadamente, por exemplo, iniciando o nome com maiúscula e deixando as outras letras em minúscula. Para constantes, é interessante que todas as letras sejam maiúsculas.

Criando Tipos Definidos pelo Usuário

Os tipos de dados mencionados até agora, ditos inerentes ao Visual Basic, normalmente atendem a todos os requisitos para informações, que podem facilmente ser desdobradas em componentes individuais, tais como textos, números e assim por diante. No entanto, apenas esses tipos de dados podem revelar-se insuficientes para tratamento de informações que deveriam permanecer agrupadas. Vejamos um exemplo específico.

Suponha que seu passatempo seja a criação de animais raros e que você tenha adquirido duas doninhas de topete da Floresta da Baviera chamadas Siegmund e Sieglinda. Ansioso por testar as suas novas aptidões de programação, você decide manter dados descritivos sobre seus animais no computador, incluindo informações como cor, peso, tamanho e data de nascimento deles, bem como cor e tamanho de seus topetes. Você pode começar escrevendo declarações como estas:

Dim Siegmund_Cor as String

Dim Siegrnund_Peso As Integer

Dim Siegmund_Tamanho As Integer

Dim Siegmund_Data_nascimento As Double

Dim Siegmund_Compr_topete As Integer

Dim Siegmund_Cor_topete As String

Após haver feito isto para Siegmund, há a Sieglinda:

Dim Sieglinda_Cor as String

Dim Sieglinda_Peso As Integer

Dim Sieglinda_Tamanho As Integer

Dim Sieglinda_Data_nascimento As Double

Dim Sieglinda_Compr_topete As Integer

Dim Sieglinda_Cor_topete As String

Sem dúvida, teria sido mais simples se fosse possível declarar as informações relevantes uma única vez. O Visual Basic oferece uma solução ideal: criar seus próprios tipos de dados.

Um tipo de dado definido pelo usuário é um agrupamento de tipos de dados inerentes ao Visual Basic: integers, strings, doubles e assim por diante. A palavra-chave Type indica o início de uma declaração de tipo feita pelo usuário, como mostrado abaixo:

Type DoninhaTFB

Cor As String

Peso As Integer

Tamanho As Integer

Data_nascimento As Double

Compr_topete As Integer

Cor_topete As String

End Type

A declaração de tipo agrupa todas as informações que você acredita ser importantes sobre seus novos amiguinhos. Observe que você ainda não reservou qualquer área de memória para os dados, simplesmente descreveu para o Visual Basic a estrutura ou layout dos dados. Você pode imaginar essa declaração como sendo a planta de uma área de memória. Após a definição do novo tipo, é possível criar as variáveis como usualmente:

Dim Siegmund As DoninhaTFB

Dim Sieglinda As DoninhaTFB

Essas duas instruções criam as variáveis Siegmund e Sieglinda - isto é, reserva-se uma área de memória com um nome associado a ela. Cada variável contém todos os componentes de dados que foram definidos. Na maioria das linguagens de programação, as variáveis que podem conter múltiplos componentes são chamadas de registros, e cada componente separado é chamado de elemento dentro do registro. Quando você usa a variável Siegmund, está-se referindo a todos os dados (cor, tamanho, peso etc.) simultaneamente. Quando é necessário fazer referência a um componente individual, você pode usar o nome da variável seguido por um ponto (.) e pelo nome do componente. Assim, Siegmund.Peso é um componente de dados integer que armazena o peso do macho, enquanto Sieglinda.Cor é uma string de texto que descreve a cor da fêmea.

Vantagens Práticas

Os tipos definidos pelo usuário facilitam a leitura e a atualização de seu programa. Considere o exemplo das doninhas. A primeira forma envolveria 12 instruções Dim, cada uma definindo um atributo para cada doninha. Neste primeiro caso, é preciso ler todas as 12 instruções para poder determinar quais atributos do Siegmund e da Sieglinda estão sendo declarados. Ainda assim, não está claro se existem ou não outros atributos declarados em algum outro ponto do programa e muito menos se pode afirmar que Siegmund e Sieglinda sejam itens de dados relacionados.

Contrastando com essa confusão, observe a clareza que há na declaração de tipo feita pelo usuário. Os atributos contidos na instrução Type claramente pertencem a DoninhaTFB. Num piscar de olhos, pode-se dizer que as variáveis Siegmund e Sieglinda são do mesmo tipo e quais as informações específicas que ambas contêm. Além disso, se você desejar modificar o seu programa mais tarde, acrescentando, por exemplo, a cor dos olhos ao conjunto de informações sobre os animais, bastará alterar a instrução Type. Isso fará com que todas as variáveis passem a conter esse novo elemento de dados. Finalmente, se as doninhas. tiverem um relacionamento amoroso e lhe presentearem com um nova doninha. você poderá incluir uma variável nova para o pequeno Siegfried no programa, com uma instrução bem simples do tipo Dim Siegfried As DoninhaTFB.

Déjà Vu

O modo como se acessam os campos de tipos definidos pelo usuário se parece com o que você usou para configurar as propriedades da caixa de texto no aplicativo Cronômetro (Capítulo 1). No programa Cronômetro, você usou a instrução TxtDecorrido.Text = Format(TempoDecorrido, "hh:mm:ss") para configurar a propriedade Text do objeto de exibição TxtDecorrido.

Observe a similaridade entre a referência a TxtDecorrido.Text (que tem o formato Objeto. Propriedade) na instrução mostrada e a referência a componentes de variáveis, tais como Siegmund.Cor (que tem o formato Variável. Elemento). Como as variáveis, os objetos também são representados em memória; quando modifica uma propriedade, você está alterando um dos componentes daquele objeto.

Determinando o Escopo

Vamos tentar um experimento:

1. Inicie o Visual Basic e selecione a opção New Project: do menu File para criar um novo projeto.

2. Crie dois botões de comando no form, um abaixo do outro. Você pode dar um clique duplo na ferramenta Botão de Comando na caixa de ferramentas, ou selecionar a ferramenta e desenhar os botões no form.

3. Selecione o primeiro botão de comando (Command1) e a seguir selecione a propriedade Caption da lista de propriedades na janela de propriedades. Configure o Caption desse botão para AssinalarEMostrar, digitando esse novo título no campo de valor da propriedade. Então, selecione o segundo botão de comando e configure o seu título (Caption) para Mostrar, como apresentado a seguir:

Figura 3.6

4. Dê um clique duplo no botão AssinalarEMostar para exibir a janela de código. Na janela de código, defina o procedimento Click da seguinte forma:

Private Sub Command1_Click ()

Dim SeuNome As String

SeuNome = lnputBox("Qual é o seu nome ?")

MsgBox "O seu nome é " & SeuNome

End Sub

Examinemos esse conjunto de instruções. A primeira linha é a declaração do procedimento. A segunda reserva memória para uma variável string chamada SeuNome. A terceira linha chama a função InputBox, uma função interna do Visual Basic que exibe uma caixa de diálogo na tela. O usuário digita um texto na caixa de diálogo e a função InputBox retorna o texto digitado. Esse texto é armazenado na variável SeuNome. A quarta linha usa o procedimento interno MsgBox para exibir urna caixa de diálogo contendo o texto "O seu nome é" seguido pelo conteúdo da variável SeuNome. O operador (&) concatena ou "Junta" duas strings; por exemplo, a expressão "Al" & "ô companheiro" é equivalente a "Alô companheiro". Finalmente, a última linha marca o final do procedimento.

5. Selecione agora o botão Command2 a partir da caixa Object na janela de código e insira o seguinte código para o procedimento Click:

Private Sub Command2_Click ()

Dim SeuNome As String

MsgBox "Alô " & SeuNome

End Sub

Esse procedimento apenas exibirá a palavra Alô e o conteúdo de SeuNome. Você pode usar o procedimento MsgBox e o operador de concatenação (&), como foi feito no procedimento anterior.

6. Feche a janela de código e pressione F5 para executar este aplicativo.

7. Dê um clique no botão AssinalarEMostrar. Digite um nome na caixa de diálogo e pressione Enter ou dê um clique no botão OK. Se, por exemplo, você tiver digitado Mariana, o resultado será semelhante ao seguinte:

Figura 3.7

8. Dê um clique no botão OK para fechar a caixa de diálogo. Em seguida, dê um clique no botão Mostrar. A caixa de diálogo exibirá apenas a palavra Alô.

Por que o Visual Basic não preservou o conteúdo da variável SeuNome? Por que será que esse aplicativo se comporta de forma diferente do Cronômetro no Capitulo 1? Há uma explicação bem simples: o aplicativo Cronômetro continha apenas uma instrução Dim, e ela não estava dentro de um procedimento. Tentemos novamente, usando o esquema adotado com sucesso no aplicativo Cronômetro:

1 . Pressione Alt-F4 para deixar o aplicativo.

2. Dê um clique duplo no botão AssinalarEMostrar na janela de form, para mover-se para a janela de código, e remova a instrução Dim do procedimento Click.

3. Remova também a instrução Dim contida no procedimento Click do botão Mostrar.

4. Selecione (General) a partir da caixa Object da janela de código. Nesta seção de declarações gerais, digite a instrução Dim SeuNome As String.

5. Feche a janela de código e processe o seu aplicativo novamente.

Desta vez, o botão Mostrar funcionará da maneira esperada. Isso serviu para você constatar os efeitos do escopo de uma variável.

Variáveis Locais e em Nível de Módulo

O escopo de uma variável determina quais procedimentos terão acesso à variável. Na primeira vez que você processou o exemplo precedente, haviam sido criadas duas cópias da variável SeuNome, cada qual acessível apenas dentro de um procedimento. Elas são chamadas de variáveis locais. Na segunda vez, você declarou uma única variável na seção de declarações gerais do form, tornando-a uma variável em nível de módulo. Variáveis declaradas dessa forma são acessíveis a todos os procedimentos contidos no form, (O termo módulo. neste contexto, refere-se essencialmente a arquivo; lembre-se de que o código de todos os procedimentos associados a um form, ou a objetos contidos nesse form, são gravados num único arquivo.) Essa diferença entre as duas versões do programa encontra-se ilustrada na Figura 3.8.

Restringir o escopo de variáveis é útil, pois permite-lhe reutilizar os nomes de variáveis. Por exemplo, ao somar alguns números em um procedimento, você poderia armazenar o resultado em uma variável local chamada Soma. Se, mais tarde, for necessário escrever nesse mesmo programa um outro procedimento semelhante que também efetue uma soma, você poderia usar o nome Soma novamente, sem afetar o resultado do procedimento anterior. Escopo local permite que cada procedimento seja uma unidade autocontida - isto é, modificações em outras porções do programa não interferem na operação de um procedimento em particular.

Figura 3.8 Variáveis locais versus variáveis em nível de módulo

Variáveis Globais

As variáveis em nível de módulo são acessíveis apenas pelos procedimentos definidos dentro do módulo. Caso venha a ser criado um programa com múltiplos forms, você terá de arranjar algum modo para poder compartilhar as informações entre os vários forms, Para atender a esse requisito, o Visual Basic provê um terceiro nível de escopo, as variáveis públicas. Variáveis públicas são declaradas em módulos de código e de classes. São acessíveis a partir de qualquer parte de um programa. (Discutiremos os módulos de código na próxima seção.) A Figura 3.9 ilustra os três níveis de escopo de variáveis.

Figura 3.9 Variáveis locais, em nível de módulo e públicas.

Para criar variáveis públicas, deve-se usar a palavra-chave Public em lugar de Dim. A sintaxe, afora isto, é idêntica à da instrução Dim.

Public variável [As tipo]

As regras de escopo aplicam-se igualmente para o tratamento de constantes. Às constantes declaradas com a instrução Const é associado o escopo local ou em nível de módulo dependendo de sua colocação em um procedimento ou em um módulo Para criar constantes públicas, deve-se colocar a sua declaração na seção de declarações gerais de um módulo e usar a palavra-chave Public para iniciar a instrução, como mostrado a seguir:

Public Const VELOCIDADELUZ! = 300000

Public Const PRIMEIROIMPERADOR = "D. Pedro I"

O ponto de exclamação na constante VelocidadeLuz avisa ao Visual Basic para armazenar a constante como um número real de precisão simples (Single). Lembre-se, entretanto, de que constantes publicas não podem ser declaradas dentro de procedimentos de um form.

Módulos de Código

Como você viu, a definição de um form e a codificação associada a ele, procedimentos e seção de declarações gerais, são armazenadas em um único arquivo com o sufixo FRM. É possível criar aplicativos que contenham múltiplos forms e, consequentemente, múltiplos arquivos de forms É possível também haver arquivos de aplicativos que contenham apenas codificações. Esses módulos de código, cujos arquivos têm o sufixo BAS, são criados quando você seleciona a opção Add Module do menu Project do Visual Basic.

Módulos de código separados, a princípio, são úteis para armazenar códigos a serem compartilhados e para ajudar a organizar o seu programa. Declarações públicas em um módulo de código podem ser compartilhadas por todas as instruções do programa. Quando você estiver construindo programas maiores e mais complexos, talvez seja útil agrupar a codificação relacionada a certo aspecto do programa num módulo separado.

Declarações Default

É possível declarar uma variável local sem usar a instrução Dim: basta usar o nome da variável quando necessário. Pode-se usar um dos caracteres (%, &, !, # ou $) para especificar o tipo de dado da variável; do contrário, o Visual Basic assinalará o tipo variant como default. A título de exemplo, abra um novo projeto e coloque um único botão de comando no Form. Defina o procedimento de evento Click para esse botão de comando, como mostrado a seguir:

Sub Command1_Click ()

Resposta$ = lnputBox("Você me ama ?")

If Resposta$ = "Sim" Then

MsgBox "Ele me ama"

Else

MsgBox "Ele não me ama"

End If

End Sub

Esse fragmento de código não contém uma declaração explícita para a variável Resposta$. No entanto, o sinal $ indica que ela é uma variável do tipo string. Por default, o Visual Basic cria essa variável com escopo local.

Ainda que as declarações default possam ser consideradas convenientes, é recomendável evitá-las. Em vez disso, procure declarar explicitamente toda e qualquer variável que o seu programa for usar. O uso de declarações default pode gerar erros em seus programas. Assim, no exemplo anterior, você poderia declarar uma variável em nível de módulo chamada Resposta como parte de uma modificação posterior. Quando o procedimento viesse a ser executado, o Visual Basic: assumiria que a variável Resposta contida no procedimento Command1_Click faz referência à variável em nível de módulo pois não há uma declaração explícita. Consequentemente, após esse procedimento ser executado, o conteúdo armazenado na variável em nível de módulo seria sobreposto.

Declarações default sempre dão origem a variáveis locais. Variáveis em nível de módulo ou públicas têm de ser declaradas usando-se a instrução Dim, Private ou a instrução Public na seção de declarações gerais da janela de código. A instrução Dim usada dentro de um procedimento cria uma variável local.

O Visual Basic pode ajudá-lo a evitar declarações default. Selecione a opção Options do menu Tools. Na caixa de diálogo, marque a opção Require Variable Declarations, conforme mostrado na Figura 3.10.

Figura 3.10 A caixa de diálogo Options.

Assim, toda vez que você criar um novo arquivo, o Visual Basic incluirá a instrução Option Explicit à seção de declarações gerais de seu código. (Você também pode introduzir essa instrução diretamente na seção de declarações gerais.) Com isso, quando você tentar executar um programa que contenha variáveis não declaradas, o Visual Basic colocará o nome dessas variáveis em destaque, exibindo a mensagem Variable not defined.

Outras Opções de Ambiente

A caixa de diálogo Options ainda permite-lhe modificar outras configurações. Tab Width (comprimento de parada para a tecla Tab), normalmente configurada para 4, pode ser modificada, alterando as posições de tabulação da janela de código. Repare, no entanto, que o Visual Basic não insere no seu código o caracter correspondente à tecla TAB. Em vez disso, são colocados tantos espaços em branco quantos forem necessários para atingir a próxima posição de tabulação.

A opção Auto Syntax Checking (verificação sintática automática), quando marcada, habilita a verificação de cada linha de código à medida que você a introduz. (Quando a tecla Enter é pressionada.)

Na ficha Environment, configure a opção When a Program Starts para Save Changes (salva o projeto antes de executar). O Visual Basic automaticamente salvará a versão atual de seus arquivos de forms e de projeto antes de processar o seu aplicativo. Isso assegura que você não perderá qualquer trabalho realizado, no caso de uma queda do sistema. Você pode preferir deixar essa opção desabilitada enquanto estiver fazendo algumas modificações que não deseja salvar.

Outras opções na caixa de diálogo Options - em Editor Format - permitem-lhe configurar as cores de exibição de texto nas janelas de código. Por meio da configuração dessas cores, é possível reconhecer rapidamente comentários, variáveis, palavras-chave e assim por diante, diferenciando dessa forma as várias partes de seu programa.

Crie procedimentos já documentados e com tratamento de erros usando RabJump