Instruções, Expressões e Procedimentos no Visual Basic

Este capítulo concentrar-se-á nas instruções simples do Visual Basic. Uma instrução na linguagem Visual Basic é a exposição de um comando completo para o computador, o equivalente a uma frase em português. Dentro das instruções você pode criar expressões combinando valores e operadores. Este capítulo descreve os diferentes tipos de operadores e como usá-los. Fornece também uma explicação mais detalhada sobre procedimentos que você encontrou anteriormente, quando construiu seu primeiro aplicativo.

Instruções de Assinalamento

A instrução mais simples e provavelmente mais comum em programas é a instrução de assinalamento. Ela consiste em um nome de variável seguido pelo operador de assinalamento (=) e por algum tipo de expressão. Em sua forma mais simples, uma expressão contém apenas uma constante; ela pode no entanto conter uma referência a uma variável, ou a variáveis e constantes, sobre a qual certas operações são executadas. Todas as instruções a seguir são instruções de assinalamento válidas:

Tempoinicial = Now

Explorador.Nome = "Capitão Mascarenhas"

ContadordeBits = ContadordeBytes * 8

Energia = Massa * VelocidadeLuz ^ 2

Líquido = Proventos - Descontos

Uma instrução de assinalamento armazena informação. O valor da expressão, que aparece à direita do operador de assinalamento, é calculado e o resultado armazenado na variável à esquerda do operador. O tipo de dado da variável deve ser apropriado para armazenar o resultado da expressão. Por exemplo, uma constante ou expressão do tipo string não pode ser armazenada em uma variável integer ou double. Se os tipos de dados estiverem relacionados, mas não forem iguais - por exemplo, você pode desejar armazenar um valor inteiro em uma variável de ponto flutuante -, o Visual Basic converterá o resultado da expressão para o tipo da variável. Porém, se você armazenar o resultado de uma expressão em uma variável do tipo variant, o tipo da expressão será mantido. Variáveis do tipo variant mantêm tanto o tipo quanto o valor.

Infelizmente, o operador de assinalamento é idêntico ao símbolo matemático usado para representar igualdades (o sinal de igual que une as duas partes de uma equação, como em x ² + 1 = 0). Igualdade no sentido matemático expressa uma condição que é verdadeira. Nas instruções de assinalamento do Visual Basic, o símbolo = é um comando que transfere o resultado da expressão que se segue para a variável que o precede. O sinal de igual em Visual Basic representa uma ação que o sistema deve executar, em vez de estabelecer um fato. A equação 2 + 1 = 1 + 2 não é uma instrução válida em Visual Basic, pois falta uma variável do lado esquerdo do sinal de igual. Caso tente-se introduzir essa linha como uma instrução completa, o Visual Basic gerará uma mensagem de erro.

Todas as instruções que você criou no aplicativo Cronômetro são instruções de assinalamento. Em algumas instruções, como BtnParar.Enabled = True, foram assinalados valores constantes simples. Em outras, tal como TempoDecorrido = TempoFinal - TempoInicial, você usou uma expressão. Em instruções como TxtInicial.Text = Format(TempoInicial, "hh:mm:ss"), você invocou uma função interna. O restante deste capitulo explora a capacidade do Visual Basic nessas áreas.

Expressões e Operadores

Como foi dito, uma expressão pode ser tão simples quanto uma constante, no entanto, usualmente as expressões representam cálculos a serem executados. Via de regra, um operador indica o tipo de operação a ser feita. Certamente, você já deve estar familiarizado com os operadores aritméticos, como o sinal de mais (+), que indica uma soma. A expressão 2 + 1 avisa ao Visual Basic para somar os valores 2 e 1. O 2 e o 1 são os operandos da operação de soma. Além dos operadores aritméticos, o Visual Basic provê um operador de concatenação de strings, operadores de comparação, operadores lógicos e o operador AddressOf, que permite referenciar o endereço de um procedimento na memória (serão discutidos mais adiante neste mesmo capítulo).

Por si só, as expressões não são instruções válidas, pois não estão completas. Introduzir, por exemplo, apenas 2 + 1 no seu programa provocará um erro. Se considerarmos uma instrução na linguagem Visual Basic uma frase, uma expressão deve ser considerada uma frase. E possível usar expressões em todo e qualquer lugar onde se possa colocar uma constante.

É muito difícil definir uma expressão. As melhores definições são sempre referências à própria expressão. Uma definição parcial poderia incluir estas regras:

Conforme essas regras, 3 é uma expressão, tanto quanto 1; além disso, 3 + 1 também é uma expressão. De onde se deduz que 3 * 3 + 1 é uma expressão, como o é 3 * 3 + 1 + 1. Você pode imaginar até onde isso pode continuar: expressões podem ser arbitrariamente complexas.

Tipos de Expressões

O tipo de uma expressão é determinado a partir do tipo de seus operandos. Para um valor constante, o tipo da expressão é o mesmo que o da constante. Para uma expressão que contenha uma operação, o Visual Basic usa o tipo dos dois operandos para determinar o tipo do resultado. Naturalmente, quando você soma dois números inteiros, o resultado é inteiro. Se você soma dois valores de dupla precisão, o resultado será do tipo double (real). Se você misturar tipos diferentes - por exemplo, multiplicar um inteiro por um single, como na expressão 2 * 7,5 -, o Visual Basic geralmente transformará o resultado no tipo que puder acomodar a maior faixa de valores. Neste caso, o resultado seria do tipo single. Para prevenir possíveis ambigüidades, é melhor não usar tipos diferentes em uma expressão.

O uso de caracteres de declaração de tipo para constantes numéricas poderá ajudá-lo a minimizar a quantidade de tipos diferentes de uma expressão. Esses caracteres farão com que a constante seja tratada de acordo com o tipo especificado. Por exemplo, 100 normalmente seria um inteiro. Mas 100! é do tipo single e 100@, do tipo currency. (Os caracteres usados pelo Visual Basic para declaração de tipos encontram-se listados na Figura 3.4 do Capítulo 3.)

Nota: O Visual Basic não permite o uso de caracteres de declaração de tipo para truncar constantes reais em valores inteiros. Por exemplo, você não pode usar 3,14% como se fosse o inteiro 3 (ainda que quisesse). No entanto, se você desejar converter variáveis de ponto flutuante para inteiros, o Visual Basic provê funções de conversão específicas que se encontram documentadas no arquivo de ajuda do Visual Basic.

As expressões não precisam restringir-se a operadores e constantes. Por exemplo, a expressão 17733,50 + (ReceitasAjustadas - 32450) * 23 / 100 inclui uma variável e um conjunto de parênteses, operadores e constantes.

Quando as expressões são mais complexas do que dois operandos e um operador, é possível haver duas ou mais formas distintas de avaliá-las. Por exemplo, a avaliação da expressão 2 + 6 / 2 pode, em primeiro lugar, fazer com que seja feita a soma de 2 com 6 e então dividir o resultado por 2, obtendo 4 como resultado final, ou dividir 6 por 2 e, ao resultado, somar 2, obtendo-se 5 como resultado final. Os parênteses são usados para eliminar esse tipo de ambigüidade. As subexpressões contidas entre parênteses são sempre avaliadas em primeiro lugar. A expressão 2 + (6 / 2) indica claramente que a operação de divisão deve ser efetuada em primeiro lugar. Expressões muito complexas podem requerer o uso de vários conjuntos de parênteses. As expressões mais internas ou contendo maior nível de aninhamento são avaliadas em primeiro lugar.

Na falta dos parênteses direcionadores, o Visual Basic aplica um conjunto de regras, chamado precedência de operadores, para determinar quais operações devem ser executadas em primeiro lugar. Por exemplo, em virtude de a divisão e a multiplicação terem precedência maior que a soma e a subtração, o Visual Basic avaliaria a expressão 2 + 6 / 2 como 2 + (6 / 2). A próxima seção deste capítulo descreve os operadores disponíveis em Visual Basic, agrupados de acordo com a função e seguidos pela tabela de precedência, que ilustra como os operadores se relacionam entre si.

 

Operadores Aritméticos

Os operadores mais familiares são os responsáveis por operações aritméticas simples. A Figura 4.1 lista os operadores aritméticos oferecidos pelo Visual Basic.

Nas operações de adição, subtração e multiplicação, os resultados são números do mesmo tipo que os operandos. (Combinação de tipos foi descrita na Seção precedente.) Via de regra, o uso de números inteiros ou números de ponto fixo é mais eficiente do que o uso de números de ponto flutuante. Porém, a menos que a avaliação envolva muitos cálculos complexos, a diferença não será notada.

Figura 4.1 Operadores aritméticos.

Exponenciação

O operador de exponenciação permite-lhe calcular potências e raízes. Em matemática, a exponenciação é indicada por números sobrescritos. Por exemplo, o valor 28 e 2 elevado à oitava potência, que seria computado pelo Visual Basic pela expressão 2 ^ 8. A raiz quadrada de 2, que é 2 elevado à potência 1/2, poderia ser computado em Visual Basic pela expressão 2 ^ (1 / 2) ou por 2 ^ 0,5. A Figura 4.2 apresenta outros exemplos de exponenciação.

Figura 4.2 Exemplos de exponenciação.

Divisão de Inteiros e de Ponto Flutuante

O operador de divisão de ponto flutuante (/) executa a divisão padrão, porém retorna o resultado num formato de ponto flutuante. Assim, a expressão 3 / 2 é avaliada como 1,5, como seria de se esperar. Contrastando com o operador de divisão de inteiros (\), que retorna um valor inteiro. Se esse operador fosse aplicado à expressão 3 \ 2, produziria 1 como resultado. Era o que faltava, você deve lamentar - uma função que retorna a resposta errada.

Depende do ponto vista. Imagine que você esteja empacotando pimenta malagueta e precise saber quantas pimentas pode colocar em um vidro de 0,5 litro. Como especialista que é na matéria, você sabe que em um vasilhame de 4 litros cabem 150 pimentas e que não se costuma colocar pedaços de pimenta. Uma vez que 0,5 litro é 8 vezes menor do que 4 litros, você sabe que deve colocar 18 pimentas no vasilhame menor, ou seja, 150 \ 8. Se for usado o operador de divisão de ponto flutuante, o resultado seria 18,75, que não pode ser aceito, pelo menos no caso das pimentas.

Como o Visual Basic pode facilmente converter valores de um tipo para outro, você pode achar que chegaria ao mesmo resultado simplesmente usando uma variável inteira para guardar o resultado, como abaixo, onde é usado o operador de divisão de ponto flutuante (/):

Dim PimentasPorVidro As Integer

PimentasPorVidro = 150 / 8

Na realidade, quando a instrução de assinalamento for executada, será armazenado o valor 19 na variável PimentasPorVidro e não 18, como você esperava. Ao avaliar a expressão acima, o Visual Basic obtém como resultado 18,75, porém, como esse resultado deve ser armazenado em uma variável inteira, o Visual Basic promove o arredondamento, do número de ponto flutuante para o próximo inteiro, que é 19. Quando você usar o operador de divisão de inteiros, qualquer parte fracionária existente será truncado em vez de ser arredondada. A Figura 4.3 mostra as diferenças entre truncagem e arredondamento.

Figura 4.3 Truncagem e arredondamento.

Resto

O operador Mod, que está intimamente ligado à divisão inteira, retorna o resto produzido pela divisão inteira do primeiro pelo segundo operando. Por exemplo, se você divide 7 por 4, o resultado é 1, com resto 3. Assim, a expressão 7 Mod 4 é avaliada como 3. Analogamente, a expressão 21 Mod 4 produz 1 como resultado. (21 divido por 4 é igual a 5 e resta 1.)

Usando o exemplo das pimentas novamente, você agora sabe que pode colocar 18 pimentas em um vidro de 0,5 litro. Se você tiver 75 pimentas para embalar, a expressão 75 \ 18 lhe informará quantos vidros poderão ser preenchidos (4), enquanto a expressão 75 Mod 18 indicará quantas pimentas sobrarão.

Precedência de Operadores Aritméticos

A Figura 4.4 indica a ordem de precedência para os operadores aritméticos. A exponenciação tem a maior precedência; as operações de adição e subtração possuem a menor precedência. Operadores colocados na mesma linha são iguais em termos de precedência.

Figura 4.4 Ordem de precedência dos operadores aritméticos.

A Figura 4.5 contém algumas expressões simples em Visual Basic e os valores que resultam quando elas são avaliadas. Se necessário, use a ordem de precedência mostrada na Figura 4.4 para entender como o Visual Basic chegou aos resultados.

Figura 4.5 Usando a ordem de precedência para avaliação de expressões.

O Operador de Concatenação de String

Quando os operandos em uma expressão são do tipo string, o operador (&)

concatena, ou combina, as strings. Você pode usar a concatenação para "colar" duas ou mais strings, para obter uma string maior. O resultado de uma concatenação é uma string inteiramente nova. Nenhum dos operandos originais sofre qualquer alteração. O fragmento de programa a seguir usa a concatenação para reproduzir algumas linhas do livro de Lewis Carroll:

x$ = "morcegos"

y$ = "gatos"

Debug.Print "Os " & x$ & " comem " & y$ & "?"'Os morcegos comem gatos ?

Debug.Print "Os " & y$ & " comem " + x$ & "?"'Os gatos comem morcegos ?

Nota: o operador (+) também pode ser usado para concatenação de strings, mas procure usar sempre o operador próprio para essa função.

Interagindo Diretamente com o Visual Basic

No Capítulo 1, você usou a instrução Debug.Print para escrever na janela Immediate que pode ser exibida quando o seu aplicativo está sendo processado. A janela Immediate é mais do que apenas um local útil para colocar mensagens; nessa janela você pode interagir diretamente com o interpretador.

Crie um projeto novo, selecionando a opção New Project a partir do menu File. Pressione F5 para iniciar o aplicativo. Ainda que você não tenha escrito qualquer instrução, e muito menos colocado qualquer objeto no form, o Visual Basic processará o form, em branco. Agora, selecione a opção Break do menu Run. Isso fará com que o processamento do seu aplicativo seja suspenso, independentemente do que estiver sendo processado (que, neste caso, não deve ser muita coisa). Digite a instrução Debug.Print "Alô" na janela Immediate e pressione a tecla Enter. O interpretador do Visual Basic processá-la-á imediatamente, executando a sua instrução.

Figura 4.6

Como a janela Immediate é o form ativo no momento que o interpretador executa o seu comando, você não precisa incluir o nome do objeto Debug ao chamar o método Print; basta usar a palavra Print. Além disso, o Visual Basic lhe permite abreviar Print como ? para obter os resultados mais rapidamente, como mostrado a seguir:

Figura 4.7

Você pode submeter expressões a serem avaliadas e fazer chamadas a funções na janela Immediate. Você também pode chamar um procedimento e executar normalmente qualquer instrução que possa ser codificada em um programa. Passar para a janela Immediate é um meio rápido e fácil de depurar (testar) uma linha de código. Após terminar, pressione a tecla F5 para continuar o processamento normal de seu aplicativo, ou então selecione End do menu Run para sair do aplicativo.

Caso seja necessário concatenar um número com uma string, você deve usar uma das funções internas do Visual Basic para converter o número em string. A mais simples dessas funções é chamada de Str$. Por exemplo, a expressão "A raiz quadrada de 2 é " + Str$(2 ^ 0,5), converte o número entre parênteses para uma string.

É preciso não se esquecer de incluir espaços em branco nas suas strings quando necessário; do contrário o Visual Basic apenas irá combiná-las, sem incluir espaços.

Operadores de Comparação

Os seis operadores de comparação são mostrados na Figura 4.8. Quando dois valores forem comparados, o resultado será um valor booleano - isto é, será True (verdadeiro) ou False (falso). ( O termo booleano provém do nome do matemático inglês George Boole.) O Visual Basic oferece as constantes internas chamadas de True e False, que representam os valores -1 e 0, respectivamente. A representação binária de 0 é um número em que todos os bits se encontram no estado 0, e a representação de -1 é um número binário em que todos os bits se encontram no estado 1, tornando o estado True oposto ao estado False

Figura 4.8 Operadores de comparação.

A Figura 4.9 explica e avalia algumas expressões típicas de comparação. Os operadores de comparação são também conhecidos como operadores relacionais, porque avaliam o relacionamento entre dois operandos. Ainda que todos os operadores de comparação tenham a mesma ordem de precedência, ela é menor que a ordem de precedência de qualquer operador aritmético.

Provavelmente, você deve ter notado que o operador "igual a" usa o mesmo símbolo (=) que o operador de assinalamento. Entretanto, isso não deve causar nenhuma confusão, pois o operador de assinalamento é válido apenas em um local: imediatamente após o nome de uma variável em uma instrução de assinalamento. Em todos os outros casos, o sinal de igual estará sendo usado como operador de comparação, ou operador relacional. Por exemplo, na instrução Test = a = b, a expressão a = b será avaliada como True ou False. O resultado será então assinalado para a variável Test.

Figura 4.9 Usando operadores de comparação.

Operadores Lógicos

Os operadores lógicos às vezes são chamados de operadores booleanos, porque derivam da álgebra de lógica matemática desenvolvida por George Boole. Esses operadores possuem valores booleanos como operandos e retornam resultados

booleanos. A Figura 4.10 exibe os operadores booleanos organizados segundo sua ordem de precedência. (Todos os operadores lógicos têm ordem de precedência menor do que os operadores de comparação.)

Figura 4.10 Operadores lógicos ou booleanos em ordem de precedência.

O operador lógico mais simples é chamado de Not. Ele sempre precede um operando simples e retorna o seu oposto lógico - isto é, ele nega o operando. Por exemplo, a expressão Not False leva ao resultado True (o oposto de False); enquanto a expressão Not (4 < 3) é avaliada como True, porque a expressão (4 < 3) é falsa. O operador Not tem a maior ordem de precedência entre os operadores lógicos.

O próximo operador na ordem de precedência é And. Ele retorna True como resultado se (e somente se) ambos os operandos forem avaliados como True. Se qualquer um dos operandos for avaliado como False, ele retorna False. Esse operador corresponde ao e usado em português, como na frase "Ficarei impressionado apenas se ele for Ph.D. e (And) tiver mais de 1,90 metro de altura".

Expressão Resultado

False And False False

False And True False

True And False False

True And True True

O operador Or retorna o resultado True se qualquer um dos dois operandos for avaliado como True. Novamente, o significado é similar ao uso da palavra ou em português, como, por exemplo, "Eu comprarei o gato se ele custar menos de 50 dólares ou (Or) for um siamês".

Expressão Resultado

False Or False False

False Or True True

True Or False True

True Or True True

Ainda que os operadores Not, And e Or sejam os mais usados, o Visual Basic ainda oferece três outros operadores: Xor, Eqv e Imp. O operador Xor (Or exclusivo) retorna o resultado True se qualquer um dos operandos, mas não ambos simultaneamente, for avaliado como True. Em outras palavras, ele funciona como o operador Or exceto no caso em que ambos os operandos são True.

Expressão Resultado

False Xor False False

False Xor True True

True Xor False True

True Xor True False

O operador Eqv (equivalência) retorna True como resultado se os dois operandos tiverem o mesmo valor.

Expressão Resultado

False Eqv False True

False Eqv True False

True Eqv False False

True Eqv True True

Quando você usar o operador Imp (Implicação), o resultado será False somente se o primeiro operando for True e o segundo for False. Nos outros casos, o resultado será True. O operador Imp é o único operador booleano onde a ordem dos operandos faz diferença. A implicação é usada algumas vezes com o operador And, como ilustrado pelo famoso silogismo "Sócrates é homem e (And) todo homem é mortal, isso Implica (Imp) que Sócrates é mortal".

Expressão Resultado

False Imp False True

False Imp True True

True Imp False False

True Imp True True

É possível usar mais de um operador lógico em uma expressão. A Figura 4.11 fornece alguns exemplos; tente avaliar cada expressão e verifique se o resultado está de acordo com a ordem de precedência mostrada na Figura 4. 10.

Figura 4.11 Usando múltiplos operadores lógicos em uma expressão.

Precedência

A Figura 4.12 exibe o conjunto completo dos operadores do Visual Basic (menos o operador de concatenação de strings), segundo a ordem decrescente de precedência. Ao encontrar uma expressão complexa, você deve em primeiro lugar determinar qual é o operador que tem a maior precedência e então avaliar a subexpressão que o contém. Em seguida, determine qual o operador com a ordem de precedência imediatamente menor, avaliando a subexpressão, e assim por diante até chegar ao resultado final.

Figura 4.12 Operadores do Visual Basic em ordem de precedência.

Alguns operadores, como adição e subtração ou, ainda, todos os operadores de comparação, têm ordem de precedência igual. Ao encontrar operadores com precedências iguais, você deve avaliar as subexpressões da esquerda para a direita.

Considere, por exemplo, a seguinte expressão:

Temperatura >= 300 And Inflamável True

Como os operadores ( > e = ) têm o mesmo nível de precedência, o Visual Basic avaliará essa expressão da esquerda para a direita. Após avaliar as subexpressões que contêm esses operadores, o Visual Basic executará a operação And. Neste caso, se Temperatura for menor do que 300 ou Inflamável for False, o Visual Basic determinará False como resultado final.

Eis aqui um exemplo mais complexo:

Contador * 2 < 15 Or Cor = "Azul" And Contador * 2 < 21

Seguindo a tabela de precedência, o Visual Basic em primeiro lugar executará as duas operações de multiplicação e em seguida as três comparações, da esquerda para a direita. Depois, trabalhará com a operação And e, finalmente, com a operação Or.

Se isso lhe parece um bom jeito de se perder, você está certo. Mesmo que não seja necessário usar parênteses para modificar a ordem de execução das operações, é uma boa idéia colocá-los para melhorar a legibilidade das expressões que serão avaliadas. Com os parênteses, o exemplo anterior ficaria assim:

((Contador * 2) < 15) Or ((Cor = "Azul") And ((Contador * 2) < 21))

Erros Comuns

Quase todos os programadores iniciantes cometem erros relacionados a expressões. Vamos dar uma olhada em alguns dos erros cometidos com maior freqüência, para que você possa evitá-los ou pelo menos identificá-los.

Um dos erros mais comuns é o engano cometido no uso de operadores relacionais quando se deseja testar se uma variável está dentro de uma certa faixa de valores. Por exemplo, ao trabalhar com a variável Temperatura para determinar se o seu valor é maior do que 10 e menor do que 100 graus, você deveria fazê-lo com a expressão Temperatura > 10 And Temperatura < 100. No entanto, você poderia sentir-se tentado a usar a expressão 10 < Temperatura < 100, que apesar de parecer matematicamente correta não funcionará com o Visual Basic. Apesar de estar sintaticamente correta, essa expressão resultaria em uma resposta errada. Por quê?

Comecemos a avaliação das duas subexpressões da esquerda para a direita. (Os dois operadores têm a mesma ordem de precedência.) Como os operadores relacionais sempre retornam True ou False, que são equivalentes aos inteiros -1 e 0, o resultado da primeira subexpressão 10 < Temperatura será -1 ou 0. Em função disso, a segunda subexpressão poderá ser - 1 < 100 ou 0 < 100, que é True. Assim, a expressão 10 < Temperatura < 100 sempre retornará True como resultado final, independentemente do valor da variável Temperatura. Isso é mostrado graficamente na Figura 4.13.

Figura 4.13 Modo incorreto de testar faixa de valores.

Outro erro típico é a criação de expressões lógicas com a mesma imprecisão que freqüentemente há na língua falada. A expressão no exemplo anterior foi cuidadosamente formulada para encontrar um valor que seja "maior do que 10 graus, mas menor do que 100 graus". Porém, se estivesse conversando com um colega, você poderia ter estabelecido a questão da seguinte forma: "Eu desejo saber quando a temperatura é maior do que 10 graus ou menor do que 100 graus". Essa formulação é menos precisa (e de fato errônea), porém as pessoas são razoavelmente inteligentes para conviver com esta ambigüidade, e provavelmente o seu colega entenderia o que você realmente pretendia falar. A expressão correta correspondente a essa formulação seria Temperatura > 10 Or Temperatura < 100.

Novamente, examinando a expressão sob a ótica do Visual Basic, você pode perceber onde está o problema. Primeiro seriam avaliadas as duas expressões relacionais e depois a operação booleana Or. A subexpressão Temperatura > 10 será True para todos os números maiores do que 10; a outra subexpressão relacional, Temperatura < 100, será True para todos os valores menores do que 100. Veja, agora, o que acontece quando você junta essas duas expressões. Se a variável contiver o valor 5, a primeira subexpressão resultará False ( 5 < 10), enquanto a segunda resultará True, pois 5 é menor do que 100. A operação Or sempre terá True como resultado, pois um operando sempre será True. Analogamente, o valor 200 fará com que a primeira resulte True e a segunda, False, levando a operação Or a ser True. Para o valor 50, ambas as subexpressões resultarão True e a operação Or será True também. Portanto, o uso do operador Or em vez de And fará com que a expressão que você montou resulte sempre True.

Um terceiro engano comum é confundir uma instrução de assinalamento com condições matemáticas. Esse problema pode ser ilustrado pelo seguinte fragmento de código:

A = 10

B = A / 2

A = 20

Após a execução dessas três instruções, A valerá 20 e B, 5. Se você imaginou que B deveria valer 10, caiu na armadilha. A segunda instrução não expressa uma condição que é True a todo instante; em vez disso, é uma expressão que é avaliada uma única vez, com um determinado valor para a variável A. Nesse exemplo, a instrução é processada quando a variável A tem o valor 10. Instruções que se seguem podem alterar o valor de A, porém o valor armazenado na variável B permanecerá intacto até que seja executada outra instrução de assinalamento para essa variável.

Vejamos outro erro comum. Até agora, usamos apenas os valores False e True em operações booleanas, porque é isso que você encontrará com maior freqüência. No entanto, é preciso estar atento para o fato de que os valores True e False são equivalentes aos valores -1 e 0. O Visual Basic não gerará qualquer mensagem de erro se você usar And, Or Imp ou qualquer um dos operadores lógicos com operandos inteiros, tais como 6 ou 237. O Visual Basic realmente executará a operação booleana especificada sobre cada bit dos operandos

Isso pode conduzir a erros estranhos. Por exemplo, digamos que seja necessário saber quando a variável x é igual a 5 ou 6. Você poderia tentar codificar a instrução como Debug.Print x = 5 Or 6. O Visual Basic executará a operação Or sobre os inteiros 5 e 6, um bit de cada vez, resultando 7. Então o valor de x seria comparado com 7, que não é exatamente o que você tinha em mente. Em vez disso, você deveria codificar a instrução como Debug.Print (x = 5) Or (x = 6).

Procedimentos

Muito embora você já tenha escrito alguns procedimentos e saiba o que são e como funcionam, será útil investir algum tempo para formalizar esse conhecimento. Esta seção aborda basicamente os procedimentos internos do Visual Basic; mais adiante enfocaremos o projeto e a criação de novos procedimentos.

Um procedimento e um conjunto de instruções que executa um determinado serviço. Você pode requisitar a execução do serviço pelo nome do procedimento que o contém. Por exemplo, no Capítulo 3, você escreveu um pequeno programa que usava o procedimento MsgBox. Quando aquela parte do seu programa era executada, o Visual Basic exibia em uma caixa de diálogo a mensagem que havia sido fornecida. Quando a caixa de diálogo era fechada, a execução de seu programa prosseguia. O Visual Basic oferece o serviço de desenhar uma caixa de diálogo ao redor de sua mensagem, criando um botão OK, inspecionando o mouse até que seja dado um clique no botão e removendo a caixa de diálogo da tela; tudo o que você tem de fazer é fornecer a mensagem a ser exibida.

Serviços oferecidos pelo Visual Basic podem ser comparados com aqueles serviços corriqueiros, executados todos os dias. Por exemplo, se você acabou de adquirir uma pintura de Van Gogh e está preocupado com uma possível falta de fundo para cobrir o cheque com o qual pagou o quadro, pode chamar o banco e solicitar uma transferência. Você fornece ao banco os números das contas e o valor a ser transferido. Após isso, o banco executará o serviço requisitado, sem qualquer intervenção de sua parte.

Em outros casos, um objeto palpável é retornado pelo provedor do serviço. Por exemplo, você pode visitar uma pizzaria local, entregar a eles o seu pedido de pizza e alguns trocados e obter uma pizza como retorno. Como você deve lembrar-se, os procedimentos do Visual Basic que retornam valores são chamados de funções. No programa de exemplo do Capitulo 3, você chamou a função InputBox, passou-lhe uma frase a ser apresentada e ela exibiu a caixa de diálogo e lhe retornou o texto introduzido na caixa de diálogo.

O Visual Basic oferece muitas funções internas úteis, algumas das quais se encontram descritas na Figura 4.14. Você pode usar o sistema de ajuda on-line do Visual Basic, para explorar em maiores detalhes essas funções internas.

Sintaxe para Procedimentos e Funções

Para chamar um procedimento ou função, é preciso usar o seu nome. Além disso, o Visual Basic tem regras específicas sobre a sintaxe de uma instrução - isto é, sobre como a instrução tem de ser codificada. (Ainda que as funções também possam ser chamadas de procedimentos, na abordagem que se segue, por questões de clareza, será mantida a diferenciação entre funções e procedimentos. Apenas lembrando: funções são procedimentos que retornam valores.)

Figura 4.14 Algumas funções internas do Visual Basic.

Para usar ou chamar um procedimento, deve-se escrever uma instrução Visual Basic em que o nome do procedimento seja o primeiro item. A chamada a um procedimento é uma instrução completa do Visual Basic, e o procedimento pode não requerer qualquer informação adicional. Caso necessário, os valores a serem passados para o procedimento devem ser separados por vírgulas. Os valores a serem passados são chamados de argumentos ou parâmetros do procedimento. No caso do procedimento MsgBox, você usou apenas um argumento, a string de texto a ser exibida. As instruções a seguir são exemplos de chamadas a procedimentos:

MsgBox "Alô, companheiro"

ChDir "\teste\dados"

Beep

SavePicture NoitedeEstrelas, "vincent.bmp"

A sintaxe para a chamada de funções é diferente. Como há o retorno de valor, a chamada pode ser usada em todos os lugares onde uma expressão possa ser colocada. A chamada a uma função será habitualmente encontrada dentro do contexto de alguma outra instrução, mais freqüentemente a instrução de assinalamento.

Quando uma função não requer argumentos, você pode usar o nome de função como se fosse o nome de uma variável, tal como em Tempoinicial = Now. A função Now não requer argumentos e retorna um valor temporal. O Visual Basic chama a função e assinala o valor retornado à variável Tempoinicial.

Quando uma função requer um ou mais argumentos, deve-se colocar um parêntese à esquerda antes do primeiro argumento e um parêntese à direita após o último. Os parênteses só são usados se a função estiver sendo usada numa expressão em que um valor de retorno é esperado da função. Caso o valor de retorno da função não seja esperado no contexto de uso, os parênteses precisam ser omitidos e a função é chamada como um procedimento comum (A exemplo dos procedimentos, os argumentos de uma função também devem ser separados por vírgulas.) As expressões a seguir contêm chamadas válidas para funções, porém não são instruções completas do Visual Basic:

Sin(x) ^ 2 'Obtém o quadrado do seno de x

Chr$(65) Retoma o caractere ASCII correspondente a 65

Format(Now,"hh:mm") Formata a hora atual

Note que, no terceiro exemplo, a expressão contém uma chamada de função dentro de outra. O valor retornado pela função Now é passado como argumento para a função Format.

Métodos

Procedimentos e funções fazem parte de linguagens de programação há muitos anos. Mais recentemente, os projetistas das linguagens de programação orientadas a objetos introduziram um tipo especial de procedimentos e funções, chamado método. O Visual Basic inclui métodos para cada um de seus objetos, tais como forms ou botões de comando. Métodos funcionam da mesma maneira que procedimentos e funções, porém são componentes de objetos específicos, tais como propriedades e nomes de campos.

Para chamar um método, deve-se usar o nome do objeto seguido pelo nome do método (separados por um ponto ".", evidentemente), como, por exemplo, Debug.Print.

Isso é um pouco mais trabalhoso do que apenas usar o nome do procedimento, porém tem a vantagem de permitir que vários métodos tenham o mesmo nome. Em versões antigas do Visual Basic, o procedimento Print escrevia uma string de texto no terminal do usuário. Para enviar a mesma string para uma impressora, era necessário usar um procedimento diferente, LPrint. Ambos os procedimentos operavam similarmente, mas, devido a pequenas diferenças, eram necessários dois comandos distintos.

O Visual Basic não tem um procedimento Print. Em vez disso, todos os objetos para os quais você puder enviar dados que serão registrados têm um método chamado Print. Para escrever o texto "Alô" em um form chamado MeuForm, você poderia criar a instrução:

MeuForm.Print "Alô"

Para enviá-lo para a impressora, que é representada em Visual Basic por um objeto especial chamado Printer, você poderia usar este código

Printer.Print "Alô"

A janela Immediate, representada por um objeto chamado Debug, também possui um método Print. Muito bem, como o Visual Basic oferece método Print para cada um desses objetos, não é necessário que haja diversos comandos com nomes diferentes. Com menos comandos para assimilar, seu aprendizado será facilitado.

Com freqüência, o Visual Basic permite-lhe omitir o nome do objeto ao usar um método. Caso isso seja feito, o Visual Basic assumirá tratar-se do form atual. Se você tivesse escrito apenas Print "Alô" nos exemplos acima, a saída seria direcionada para o form que estava ativo quando essas instruções fossem executadas. Para evitar ambigüidade, você sempre pode especificar o objeto ao qual pertence o método desejado, usando a denominação Objeto.Método.

Métodos podem funcionar como procedimentos ou como funções - isto é, eles podem apenas executar um serviço, tal como o método Print, ou podem retornar um valor. Alguns métodos - tais como Move, que altera o posicionamento de um objeto - encontram-se implementados para quase todos os tipos de objetos. Outros são mais específicos. Por exemplo, o método Print é implementado apenas para alguns objetos, tais como forms e printer. O próximo capítulo explora os objetos do Visual Basic, seus métodos e suas propriedades.

Com RabJump você navega no código como num browser