Tudo sobre Visual Basic

Tudo sobre Visual Basic

(Parte 6 de 7)

Comando Resume

O comando Resume indica ao VB que o aplicativo deve continuar a ser executado mesmo em caso de erro irrecuperável. Veja a sintaxe:

Resume <destino>

Sendo que o <destino> da execução não é obrigatório. Se não for informado, a execução passa para a próxima instrução na seqüência normal do programa. As opções para <destino> são:

Next: produz um desvio para a próxima instrução na seqüência normal da execução do aplicativo; 0: faz com que o execução retorne ao início da procedure atual (parâmetro recursivo); Nome_De_Parágrafo: desvia a execução para um parágrafo da procedure atual.

Objeto Err

O objeto Err indica o código do erro irrecuperável ocorrido, através da propriedade Number, de tipo Integer. Pelo código informado por Err.Number podemos identificar o erro e escrever os comandos necessários para que o aplicativo continue funcionando. Outra propriedade interessante do objeto Err é a Description, que contém a descrição do erro ocorrido.

Para obter a lista completa com os códigos dos erros tratáveis do VB, acesse o menu Help e escolha a seqüência Contents – Trappable Errors – Miscellaneous Messages.

Vejamos então um exemplo da utilização desses recursos:

Dim vQualquer As Integer
On Error GoTo Erro_Na_Conversão

Public Sub Exemplo_Erro() vQualquer = CInt(txtNúmero.Text)

Erro_Na_Conversão:
'13 é o código de erro para Tipo Incompatível de Dados:
vQualquer = 0
Resume Next

If Err.Number = 13 Then

End If End Sub

Microsoft Visual Basic 640

Como já citamos anteriormente, a função CInt gera um erro irrecuperável em caso de tipo incompatível de dados (Type Mismatch) na tentativa de conversão de uma string que não represente um valor. Na procedure Exemplo_Erro estamos dizendo para o VB que, se isso acontecer, a execução deve ser desviada para o parágrafo Erro_Na_Conversão, onde testamos o valor de Err.Number e escrevemos a codificação necessária para que o programa continue normalmente. O comando Resume Next indica então ao VB que a execução deve ser desviada para a próxima instrução na seqüência normal da programação.

Caixas de Mensagem

Até agora falamos sobre o tratamento de erros mas não informamos ao usuário o que exatamente aconteceu, o que é muito importante em qualquer aplicativo que se preze. Uma das formas que o VB nos oferece para fornecer mensagens ao usuário são as caixas de mensagens padronizadas. Por exemplo: supondo que o campo Nome de um aplicativo qualquer não possa ser deixado em branco pelo operador, se isso acontecer, poderíamos exibir na tela uma caixa de mensagem como a da figura:

Caixas de mensagem padronizadas como essa podem ser obtidas com o comando MsgBox e a função MsgBox. Veja a sintaxe de ambos:

MsgBox <mensagem>,<tipo>,<título> <variável> = MsgBox(<mensagem>,<tipo>,<título>)

Onde:

Mensagem: é uma string com a mensagem a ser exibida pela caixa. Esse é o único parâmetro obrigatório da sintaxe. No nosso exemplo: “O campo Nome deve ser preenchido!”;

Tipo: é um valor obtido a partir da soma dos códigos que especificam o número e o tipo dos botões exibidos pela caixa, o ícone a ser utilizado, o botão default e a modalidade de exibição da caixa. No nosso exemplo esse valor é 4144. Esse valor também pode ser obtido a partir de algumas constantes de sistema. Veja a seguir uma lista com os valores admitidos e seu significado;

Título: é uma string a ser exibida como título da caixa. No nosso exemplo: “Aviso”;

Variável (somente para a função): nome da variável que receberá o número do botão selecionado pelo usuário.

Veja a seguir as constantes de sistema usadas para se obter o tipo da caixa com seus respectivos valores:

Constante Valor Descrição vbOKOnly0Exibe somente o botão OK. vbOKCancel1Exibe os botões OK e Cancelar. vbAbortRetryIgnore2Exibe os botões Abortar, Repetir e Ignorar. vbYesNoCancel3Exibe os botões Sim, Não e Cancelar. vbYesNo4Exibe os botões Sim e Não. vbRetryCancel5Exibe os botões Repetir e Cancelar. vbCritical16Exibe o ícone Mensagem Crítica :

vbQuestion32Exibe o ícone Consulta de Aviso: vbExclamation48Exibe o ícone Mensagem de Aviso: vbInformation64Exibe o ícone Mensagem de Informação:

vbDefaultButton10O primeiro botão é o default. vbDefaultButton2256O segundo botão é o default. vbDefaultButton3512O terceiro botão é o default.

Microsoft Visual Basic 641

Constante Valor Descrição vbDefaultButton4768O quarto botão é o default. vbApplicationModal 0 Janela restrita do aplicativo: o usuário deve responder à caixa de mensagem antes de continuar o trabalho no aplicativo atual. vbSystemModal 4096 Janela restrita do sistema: todos os aplicativos são suspensos até que o usuário responda à caixa de mensagem.

No nosso exemplo, o valor é 4144 pois usamos apenas o botão Ok (0), o ícone Exclamação (48), o botão Ok é o default por ser o único (0), e a modalidade é sistema (4096). Então, 0 + 48 + 0 + 4096 = 4144. O comando completo para se obter a caixa de mensagem do exemplo é a seguinte:

MsgBox “O campo Nome deve ser preenchido!”, 4144, “Aviso”

Podemos também usar as constantes correspondentes à configuração desejada:

MsgBox “O campo Nome deve ser preenchido!”, _ vbOk + vbExclamation + vbDefaultButton1 + vbSystemModal, “Aviso”

Ou então apenas aquelas que terão algum efeito na configuração (são diferentes de zero):

MsgBox “O campo Nome deve ser preenchido!”, _ vbExclamation + vbSystemModal, “Aviso”

Ou ainda uma variável:

vConf = vbExclamation + vbSystemModal MsgBox “Nome deve ser preenchido!”, vConf, “Aviso”

Obs.: o símbolo “_” (subscrito) indica continuação da codificação na próxima linha.

Identificando o botão selecionado

A diferença entre o comando MsgBox e a função MsgBox é que a função retorna um número inteiro representando o botão selecionado pelo usuário na caixa de mensagem. Assim, podemos identificar esse botão e executar a ação correspondente a ele. Veja os valores retornados por MsgBox:

Constante Valor Descrição vbOK1Selecionado o botão Ok. vbCancel2Selecionado o botão Cancelar. vbAbort3Selecionado o botão Abortar. vbRetry4Selecionado o botão Repetir. vbIgnore5Selecionado o botão Ignorar. vbYes6Selecionado o botão Sim. vbNo7Selecionado o botão Não.

Por exemplo: suponha um aplicativo qualquer que possua um botão de comando para encerrar sua execução, mas que antes disso solicite ao usuário uma confirmação. A programação para isso poderia ser a seguinte:

Private Sub cmdFechar_Click() Dim vOk As Integer vOk = MsgBox("Tem certeza que deseja encerrar o programa?", 36, "Saída") If vOk = 6 Then

End

End If End Sub

Ou então, se usarmos as constantes de sistema:

Private Sub cmdFechar_Click() Dim vOk As Integer vOk = MsgBox("Tem certeza que deseja encerrar o programa?", _ vbYesNo + vbQuestion, "Saída")

If vOk = vbYes Then

End

End If End Sub

Em qualquer dos casos, a caixa de mensagem resultante da função MsgBox acima é a seguinte:

Microsoft Visual Basic 642

Mas qual é a vantagem de se usar constantes de sistema se a codificação fica maior? A resposta é: documentação! Leia novamente os dois trechos de programação e seja honesto: qual deles ficou mais fácil de entender?

Caixas de Entrada de Dados

Além das caixas de mensagem o VB dispõe de outro tipo de caixa de diálogo padronizada: as caixas de entrada de dados, que são obtidas com a função InputBox. A sintaxe dessa função é a seguinte:

<variável> = InputBox(<mensagem>,<título>,<valor padrão>)

Onde:

Mensagem: único parâmetro obrigatório, é um texto a ser exibida dentro da caixa como legenda; Título: é uma string a ser exibida como título da caixa; Valor padrão: é o valor que a variável deve receber de InputBox caso o usuário não digite nada.

Importante: a função InputBox sempre retorna um dado tipo string, portanto se você precisar de um dado de qualquer outro tipo deverá convertê-lo.

Por exemplo: suponha um botão de comando que permita a digitação de um desconto para a emissão de uma nota fiscal de compra. A programação desse botão poderia ser a seguinte:

Private Sub cmdDesconto_Click()

Dim vDesconto As String vDesconto = InputBox("Digite o valor do desconto:", _

"Digitação de desconto") End Sub

A InputBox resultante dessa programação é a da figura abaixo:

O Aplicativo Carro

Para usar os conceitos vistos nessa lição, vamos criar um aplicativo que calcule o valor da prestação mensal para financiamento de automóvel. Antes de começar, vamos estudar um novo controle que será usado em nosso projeto:

Caixa de Imagem (ImageBox)

Esse controle é muito semelhante a uma PictureBox, pois também exibe figuras ou ícones nos formulários. A principal diferença é que responde ao evento Click, funcionando como um botão de comando quando clicado. Outra diferença importante é a propriedade Stretch, que pode aceitar os valores True e False: quando Stretch = True, o tamanho da imagem será ajustado ao tamanho da caixa de imagem, permitindo a exibição de figuras que devido ao seu tamanho não caberiam em um formulário. Se Stretch = False, então o tamanho da ImageBox é que será ajustado ao da figura.

Bem, vamos começar: inicie um novo projeto e formate o formulário de acordo com o modelo:

Microsoft Visual Basic 643

As propriedades dos objetos são as seguintes:

ObjetoNomeOutras Propriedades = Valor

FormuláriofrmCarroCaption = Financiamento de Automóvel

StartUpPosition = 2 – Center Screen

Caixa de ImagemimgCarroStretch = True

BorderStyle = 1 – Fixed Single Picture = CARRO.WMF (Procure na pasta ClipArt\Popular do diretório do MS-Office)

LabelLabel1Caption = Valor do Financiamento (R$): LabelLabel2Caption = Entrada (R$): LabelLabel3Caption = Juros / mês (%): LabelLabel4Caption = Nº de meses: LabelLabel5Caption = Valor Financiado (R$): LabelLabel6Caption = Prestação Mensal (R$): LabellblValFinanciadoCaption = “”

Alignment = 2 – Center BackColor = Branco BorderStyle = 1 – Fixed Single

LabellblPrestMensalCaption = “”

Alignment = 2 – Center BackColor = Branco BorderStyle = 1 – Fixed Single

Caixa de TextotxtValorText = “” Caixa de TextotxtEntradaText = “” Caixa de TextotxtJurosText = “” Caixa de TextotxtMesesText = “” Botão de ComandocmdCalcularCaption = &Calcular

Enabled = False

Botão de ComandocmdFecharCaption = &Fechar

Enabled = False TabStop = False

Inicialmente o botão Calcular estará desabilitado pois só após a digitação de todos os dados necessários o cálculo da prestação mensal poderá ser feito. A fórmula para esse cálculo é a seguinte:

Prestação Mensal = Valor Financiado *Juros * (1 + Juros) Meses

Meses - 1

Microsoft Visual Basic 644

Antes de começar a programar, vamos conhecer um evento que será necessário para nossa codificação:

Evento KeyPress

Sempre que é pressionada uma tecla, estando o foco sobre um controle, ocorre o evento KeyPress. Associada a ele está a variável KeyAscii, que é carregada com o código ASCII da tecla pressionada. Dessa maneira podemos identificar quando o usuário usa uma tecla qualquer, e, se for o caso, escrever um código a ser executado quando essa tecla for utilizada. Por exemplo: podemos fazer com que o foco passe para outro controle quando a tecla Enter for pressionada numa caixa de texto. Sabendo-se que o código ASCII da tecla Enter é 13, correspondente à constante vbKeyReturn, o código para isso poderia ser o seguinte:

Private Sub Text1_KeyPress(KeyAscii As Integer)

If KeyAscii = vbKeyReturn Then Text2.SetFocus End Sub

Propriedade KeyPreview

Essa propriedade dos formulários indica se, quando pressionada uma tecla qualquer, ela deve ser ou não identificada pelo formulário. Os valores possíveis são True (habilita a verificação das teclas pelo formulário) e False (desabilita). Usando esse recurso e a função SendKeys, podemos fazer o Enter funcionar em qualquer campo, através do evento KeyPress do formulário (as linhas precedidas pelo apóstrofo – ‘ – são comentários):

Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then'Identifica o Enter
SendKeys "{Tab}"'Grava no buffer do teclado um Tab
KeyAscii = 0'Zera KeyAscii para eliminar o Enter

End If End Sub

Naprocedureacima,acadavezqueousuárioteclarEnteremumcontrolepara o qual não surta efeito,ele será substituído por uma tabulação, e o foco passará para o próximo controle na seqüência de TabIndex.

Mas vamos codificar o aplicativo:

1. Abra a janela Código e acesse a seção Declarations. Vamos declarar as variáveis que receberão os dados digitados como privadas, pois elas serão acessadas por várias procedures:

Dim vValor As Currency Dim vEntrada As Currency Dim vJuros As Single Dim vMeses As Integer

Private Sub Form_Load()
vValor = 0
vEntrada = 0
vJuros = 0

2.Vá agora ao evento Form_Load. Vamos inicializar as variáveis: vMeses = 0 End Sub

3. Em tempo de execução, faremos com que o foco passe de uma caixa de texto para outra quando teclarmos Enter. Para isso vamos alterar o evento KeyPress do formulário. Dê um duplo clique sobre uma parte vazia do formulário e procure o evento KeyPress na lista de procedures;

Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
SendKeys "{Tab}"
KeyAscii = 0

4.Escreva a procedure como segue:

End If End Sub

5. Vamos testar o evento KeyPress: execute o aplicativo e dê um Enter na caixa de texto txtValor. Nada aconteceu? É porque a propriedade KeyPreview do formulário não está habilitada. Saia do aplicativo para fazer a correção;

6.Altere o valor da propriedade KeyPreview do formulário para True;

Microsoft Visual Basic 645

7. Teste o aplicativo novamente: se tudo correu bem, o foco passou para a caixa txtEntrada. Desta, o foco vai para txtJuros, e assim por diante. Após testar em todos os controles, saia do aplicativo para podermos continuar;

8. Agora vamos fazer a codificação necessária para carregar a variável vValor. Como você pode observar, como o tipo de vValor é Currency, usaremos a função CCur para converter o texto contido em txtValor para a variável, o que pode gerar um erro irrecuperável de execução se txtValor contiver qualquer texto que não represente um valor. Devemos então usar uma rotina de tratamento de erro para evitar problemas. Mas, onde escrever essa rotina? Podemos fazer isso no evento LostFocus do controle, pois assim uma mensagem de erro será exibida assim que txtValor perder o foco, se esta contiver um dado inválido. Abra a janela código no evento LostFocus do controle txtValor e escreva a codificação a seguir:

Private Sub txtValor_LostFocus()
On Error GoTo Valor_Errado

vValor = CCur(txtValor.Text)

Valor_Errado:
If Err = 13 Then
vbExclamation + vbSystemModal, "Aviso"
"Valor do Financiamento")
Resume 0

MsgBox "Dado inválido na digitação do valor do financiamento", _ txtValor.Text = InputBox("Informe o valor correto do financiamento:", _

End If End Sub

Note que usamos a função InputBox() para solicitar ao usuário que digite um dado válido em caso de erro de execução;

Note também que o comando Resume é seguido do valor 0, o que vai fazer com que o VB retorne ao início da procedure em caso de erro e refaça a conversão do conteúdo de txtValor. Isso é importante pois, caso o usuário insista em escrever um dado inválido na caixa de entrada, o processo todo será repetido.

9. Vamos testar nossa procedure. Execute o aplicativo e escreva um texto qualquer na caixa txtValor. Digamos, “a”. O resultado deve ser o da figura a seguir:

10.Clicando no botão Ok, deverá aparecer a caixa de entrada:

Microsoft Visual Basic 646

1. Agora digite um valor correto, como 12000. O texto aparecerá na caixa txtValor e o foco passará para txtEntrada. Saia do aplicativo para continuarmos a programação;

12. Usando a procedure txtValor_LostFocus como base, escreva as rotinas para o evento LostFocus das outras caixas de texto. Lembre-se que a variável vJuros é do tipo Single, e portanto você deve usar a função CSng para a conversão. Além disso, o valor obtido deve ser dividido por 100, pois é um percentual. Já para a variável vMeses, que é Integer, você deverá usar a função CInt;

(Parte 6 de 7)

Comentários