Escolar Documentos
Profissional Documentos
Cultura Documentos
25
O VB tambm possui uma funo para converso de expresses numrica ou data em dados tipo String: a funo Str, cuja sintaxe :
Str(<valor>)
Operadores
Depois que o programa recebe dados do usurio, o prximo passo fazer algo com esses dados, normalmente clculos. Qualquer tipo de clculo envolve uma operao; portanto, os comandos especiais para trabalhar com dados so chamados operadores. O VB fornece cinco tipos de operadores:
Operadores Aritmticos
So os operadores matemticos clssicos, que permitem somar, subtrair, multiplicar e dividir nmeros ou variveis que contenham nmeros: Operador Funo = Nesse caso, atribuio de valor + Soma de dois nmeros Subtrao de dois nmeros Inverso de positivo/negativo * Multiplicao de dois nmeros / Diviso de dois nmeros, sendo que o resultado ser um nmero com ponto flutuante (decimal), como 5.8547 \ Diviso de dois nmeros, sendo que o resultado ser um nmero inteiro Mod Resto da diviso inteira de um nmero por outro ^ Exponenciao Exemplo Varivel = 0 vSoma = X + Y vSalLiq = vSalBruto vImposto vNegativo = vPositivo vTotal = vPreo * vQuantidade vTeste = 1910 / 25 (vTeste ser igual a 76.4) vTeste = 1910 \ 25 (vTeste ser igual a 76) vTeste = 1910 Mod 25 (vTeste ser igual a 10) vQuadrado = vNmero ^ 2
Operador de String
O mais simples de todos. o operador &, que realiza a concatenao (unio) de dois ou mais dados tipo String. Veja um exemplo:
vLinguagem = Visual & Basic
O comando acima resulta em Visual Basic, pois o dado aps o operador agrupado por este ao final do primeiro, resultando na unio de ambos: foram concatenados. Tambm pode ser usado para isso o operador +, mas recomenda-se usar & porque este converte dados de outros tipos antes da concatenao, evitando erros de execuo.
Operadores de Datas
So aqueles que permitem efetuar clculos com dados tipo Date. Como as datas so representadas internamente pelo VB como nmeros, podemos obter outras datas somando valores a elas, ou ento determinar o nmero de dias entre uma data e outra atravs de subtrao. Veja a tabela: Operador Funo Exemplo + Obter a partir da soma de uma data inicial e um nmero vVencimento = Date + 30 uma outra data. O nmero ser entendido como (Date retorna a data de hoje, qual quantidade de dias. sero somados trinta dias) Obter a diferena em dias entre duas datas vAtraso = vPagto vVenc (vAtraso receber o nmero de dias entre o vencimento e o pagamento) Um lembrete: como o tipo Date tambm serve para indicar horas, para clculos de horas usamos os mesmos operadores, mas trabalhamos com a parte decimal das variveis ou expresses.
26
Operadores Lgicos
So aqueles que manipulam os valores lgicos True (verdadeiro) e False (falso). O VB tambm representa esses valores como 1 e 0, respectivamente. No entraremos em muitos detalhes com esses operadores agora, pois eles sero mais bem estudados quando abordarmos as estruturas de controle. Operador Funo And E lgico: retorna verdadeiro se todos os valores da expresso forem verdadeiros e falso em qualquer outro caso Or Ou lgico: retorna falso somente se todos os valores da expresso forem falsos e verdadeiros em qualquer outro caso Xor Ou lgico exclusivo: a diferena desse operador para Or que, se todos os valores da expresso forem verdadeiros, ele retorna falso (no h erro, isso mesmo!) Not No lgico: nega , ou melhor, inverte o valor lgico da expresso Exemplo Expresso1 And Expresso2 Expresso1 Or Expresso2 Expresso1 Xor Expresso2 Expresso1 = Not Expresso2
Operadores de Comparao
Servem para a comparao de dados. Assim como os operadores lgicos, estudaremos melhor esse assunto juntamente com as estruturas de controle. Operador < <= > >= = <> Funo Exemplo Expresso1 < Expresso2 Expresso1 <= Expresso2 Expresso1 > Expresso2 Expresso1 >= Expresso2 Expresso1 = Expresso2 Expresso1 <> Expresso2
Menor que Menor ou igual a Maior que Maior ou igual a Nesse caso, igual a Diferente de
Muito cuidado ao comparar strings com os operadores = e <> , pois duas strings so iguais apenas se forem absolutamente idnticas. Isso quer dizer que, se voc fizer a comparao a = A , o resultado ser falso, pois a (minsculo) possui um cdigo ASCII diferente de A (maisculo), e portanto no so iguais.
O Foco
No Windows, apenas uma janela (formulrio) ou controle pode, num dado instante, receber aes (cliques) do mouse ou entradas via teclado. Dizemos que esse objeto possui o foco (focus, em ingls). O foco geralmente indicado por uma legenda ou moldura destacada, ou ento pelo cursor estar posicionado no controle, e pode ser alterado pela ao do usurio ou atravs de cdigo. Quando um objeto recebe o foco, ocorre o evento Got-Focus, e quando ele o perde ocorre o evento LostFocus. Outra caracterstica importante a ser observada que, quando um programa VB executado, o cursor se posiciona no primeiro controle que voc inseriu no formulrio. Por exemplo: se o primeiro controle a ser inserido foi o txtNum1, quando voc iniciar o aplicativo nele que o cursor estar posicionado. Usando a tecla Tab, o cursor vai se alternando entre os campos, sempre seguindo a ordem em que os controles foram colocados no formulrio. Isso chama-se ordem de tabulao e determinada pela propriedade TabIndex dos controles.
Propriedade TabIndex
Como j foi dito, conforme voc insere controles em um formulrio eles recebem uma ordem para recebimento do foco, que o valor da propriedade TabIndex. O primeiro controle receber o valor 0 para TabIndex, o segundo 1, e assim por diante. Essa ordem pode ser mudada pelo programador, bastando alterar o valor de TabIndex de modo a ajust-la. No caso de ser digitado para TabIndex um valor j pertencente a outro controle, o VB vai reorganiz-los automaticamente. TabIndex no pode ser alterada em tempo de execuo.
27
Propriedade TabStop
Essa propriedade impede o acesso ao controle pela tecla Tab se estiver desligada. Isso acontece porque TabStop determina se o controle deve ou no atender ordem de tabulao. Mas importante ressaltar que TabStop no evita que o usurio acesse o controle usando o mouse. Os valores possveis para TabStop so True (TabStop ligada) ou False (TabStop desligada).
Propriedade Default
Existem, nas aplicaes para Windows, botes de comando que podem ser acionados pela tecla Enter, independente da ordem de tabulao, como os botes Ok das caixas de dilogo do Windows. Quem determina o acionamento do boto por Enter a propriedade Default, que pode receber os valores True ou False. O objeto cuja propriedade Default for igual a True aparecer com um contorno mais espesso, dando a indicao que, se Enter for pressionada, ele ser acionado.
Mtodo SetFocus
Para posicionar o foco em um determinado objeto em tempo de execuo usamos o mtodo SetFocus, sendo que somente formulrios ou controles visveis podem receb-lo. A sintaxe a seguinte:
objeto.SetFocus
Modificando a Calculadora
Vamos agora aplicar o que aprendemos: 1. Se ainda no o fez, abra a VB e o projeto da calculadora que iniciamos na lio anterior; 2. Execute o aplicativo e verifique se a ordem de tabulao corresponde seguinte: txtNum1 = 0, txtNum2 = 1, cmdIgual = 2 e cmdLimpar = 3. Se necessrio, altere as propriedades TabIndex dos controles para que fiquem de acordo com a ordem indicada; 3. No formulrio da calculadora, selecione o boto cmdIgual e pressione a tecla Delete. Lembra-se que havia programao associada a ele? E agora que esse objeto apagado, para onde ela foi? 4. Abra a janela Cdigo e procure a seo General do formulrio. Note que a lista Proc agora contm, alm da seo Declarations, a procedure cmdIgual_Click, que est l como uma procedure geral. Uma procedure geral aquela que pode ser chamada por qualquer outra procedure do formulrio, ou seja, funciona como uma subrotina ou funo. Ela no executada por estar associada a um objeto e a partir de um evento, e sim quando chamada. Estudaremos isso melhor na prxima lio; 5. Agora altere o formulrio da calculadora como no exemplo:
28
Objeto Nome Label Label1 Label Label2 Boto de Comando cmdMultiplicar Boto de Comando cmdDividir Boto de Comando cmdSomar Boto de Comando cmdSubtrair
Outras Propriedades = Valor Caption = Primeiro Nmero: Caption = Segundo Nmero: Style = 1 Graphical Picture = Misc\MISC20.ICO Style = 1 Graphical Picture = Misc\MISC21.ICO Style = 1 Graphical Picture = Misc\MISC18.ICO Style = 1 Graphical Picture = Misc\MISC19.ICO
7. Chame a janela Cdigo e procure a procedure cmdIgual_Click (est na seo Declarations, lembra-se?) e altere seu nome para cmdMultiplicar_Click. Ao trmino da alterao, o cdigo do antigo boto cmdIgual ser associado ao boto cmdMultiplicar (veja nas caixas de combinao da janela Cdigo); 8. Altere a procedure cmdMultiplicar para que fique de acordo com a codificao a seguir. Note que foi includa na programao a declarao das variveis como do tipo Single, e a funo de converso usada foi substituda pela CSng, que apropriada a esse tipo:
Private Sub cmdMultiplicar_Click() Dim vValor1 As Single Dim vValor2 As Single vValor1 = CSng(txtNum1.Text) vValor2 = CSng(txtNum2.Text) lblResultado.Caption = Format(vValor1 * vValor2, "###,##0.00") End Sub
9. Selecione todo o texto da procedure, menos o cabealho e End Sub, e copie para a rea de transferncia usando a opo Copy do menu Edit ou teclando Ctrl+C; 10. Abra a janela cdigo no evento Click de outro boto e cole o trecho de programao usando a opo Paste do menu Edit ou ento Ctrl+V; 11. Faa as alteraes necessrias para que o boto funcione corretamente; 12. Repita esse procedimento para os outros operadores; 13. Grave seu trabalho e teste o aplicativo.
29
Estruturas de Deciso
Estruturas de deciso so aquelas que permitem o desvio do fluxo do programa de acordo com uma condio. As estruturas de deciso do VB so similares s encontradas em outras linguagens:
Estrutura If...Then
Executa um comando ou uma srie de comandos de acordo com uma condio. Se a condio no for verdadeira, os comandos sero ignorados e a execuo do programa passa para o prximo comando aps a estrutura. Essa estrutura pode ser escrita de duas maneiras:
If <condio> Then <comando>
ou:
If <condio> Then <comando1> <comando2> ... <comandoN> End If
O que diferencia as duas estruturas o nmero de comandos executados se <condio> for verdadeira. Na primeira somente um comando executado, por isso esse comando pode vir logo aps a palavra reservada Then, e o comando End If no necessrio. Exemplo:
If txtNome.Text = Empty Then MsgBox Um nome deve ser digitado!
Na segunda vrios comandos devem ser executados se a condio for verdadeira, ento cada comando dever ser escrito em uma linha e o comando End If deve ser usado para fechar a estrutura. Veja dois exemplo:
If txtNome.Text = Empty Then MsgBox Um nome deve ser digitado! End If If vSaldoMdio > 1000 Then lblStatus.Caption = Cliente Especial vTaxaJuros = 0.015 End If
Estrutura If...Then...Else
Semelhante ao If...Then, porm contm um ou mais comandos para serem executados no caso da condio ser falsa, indicados pelo Else da sintaxe:
If <condio> Then <comandos para condio verdadeira> Else <comandos para condio falsa> End If
A condio testada, e, se for verdadeira, o primeiro conjunto de comandos ser executado. Se for falsa, o segundo conjunto ser executado. Exemplo:
If vSaldoMdio > 1000 Then lblStatus.Caption = Cliente Especial vTaxaJuros = 0.015 Else lblStatus.Caption = Cliente Comum vTaxaJuros = 0.018 End If
30
Valor1, valor2, valorN so os valores que a expresso pode assumir: se a expresso assumir o valor1 os comandos para o valor1 sero executados, se assumir valor2 os comandos para valor2 sero executados, e assim por diante. Se o valor assumido no for nenhum dos valores indicados, os comandos aps o Case Else sero executados. interessante destacar que Case Else opcional. Exemplo:
Select Case vCodigoCliente Case 1 lblStatus.Caption = vTaxaJuros = 0.012 Case 2 lblStatus.Caption = vTaxaJuros = 0.015 Case 3 lblStatus.Caption = vTaxaJuros = 0.018 Case Else lblStatus.Caption = End Select Cliente Preferencial Cliente Especial Cliente Comum Cdigo Invlido
Estrutura If...ElseIf
Essa uma variao do comando If que possui uma sintaxe muito parecida com o Select Case:
If <expresso1> Then <comandos para expresso1> ElseIf <expresso2> Then <comandos para expresso2> ElseIf <expresso3> Then <comandos para expresso3> ... ElseIf <expressoN> Then <comandos para expressoN> [Else] [<comandos>] End If
Por exemplo: o comando que codificamos com Select Case, se escrito com If...ElseIf, ficaria assim:
If vCodigoCliente = 1 Then lblStatus.Caption = Cliente Preferencial vTaxaJuros = 0.012 ElseIf vCodigoCliente = 2 Then lblStatus.Caption = Cliente Especial vTaxaJuros = 0.015 ElseIf vCodigoCliente = 3 Then lblStatus.Caption = Cliente Comum vTaxaJuros = 0.018 Else lblStatus.Caption = Cdigo Invlido End Select
31
Comando With
Esse um comando muito til quando temos vrias instrues que sero aplicadas a um mesmo objeto. Ele informa ao VB qual objeto deve ser considerado sempre que em um comando qualquer no houver nenhuma indicao da aplicao de uma propriedade, mtodo ou campo. Sua sintaxe :
With <objeto> <comandos a serem aplicado em objeto> End With
mais fcil entender vendo um exemplo prtico: suponhamos que voc precisa aplicar uma srie de comandos a uma caixa de texto:
txtTeste.Visible = True txtOutra.Visible = False txtTeste.FontName = Arial txtTeste.FontSize = 20 txtTeste.FontBold = True txtTeste.Text = Isso um teste.
Com o comando With, voc poderia escrever o mesmo trecho de programao da seguinte maneira:
With txtTeste .Visible = True txtOutra.Visible = False .FontName = Arial .FontSize = 20 .FontBold = True .Text = Isso um teste. End With
Todas as propriedades onde no foi indicada a caixa de texto txtTeste esto sendo aplicadas ela da mesma maneira, devido ao comando With. Note que a instruo aplicada txtOutra no mudou, mesmo estando dentro do conjunto de comandos contidos entre o With e o End With. importante destacar que podem existir um bloco With dentro de outro, sendo que o mais interno ter efeito sobre todos os objetos a ele subordinados enquanto no for encontrado um End With fechando-o. Antes e depois do bloco mais interno, quem tem efeito o With mais externo.
Evento Load
Load o evento que ocorre quando um formulrio lido. Usamos Load normalmente para a inicializao de variveis privadas ou ento para escrever comandos e rotinas que devem ser executadas logo que o formulrio aberto. Ou melhor: no evento Load de um formulrio usamos comandos e rotinas cuja execuo necessria ao seu funcionamento e de seus controles de uma maneira geral.
O Aplicativo TesteCor
Vamos testar o que aprendemos em um novo aplicativo. Ele funcionar assim: quando um boto de comando for clicado, a cor do texto de um label mudar para a prxima cor numa escala pr-definida, e o rtulo desse label dever informar qual a cor atual. Por exemplo: se a cor atual for 2 Verde , passar a ser 3 Ciano . Um outro boto far o processo inverso, ou melhor: a cor passar a ser a anterior na escala. Mas qual a melhor maneira de codificar esse processo todo? Vejamos: Algumas cores sero modificadas a cada vez que um dos botes for clicado. Ento, precisamos guardar o cdigo da cor atual em uma varivel que possa ser acessada por vrias procedures, j que cada evento ligado a uma procedure. Resumindo: precisamos de variveis privadas. Existe tambm uma seqncia de comandos repetida para alguns botes: a mudana de uma das cores do label e a exibio do nome dessa cor. Ento, podemos criar uma subrotina que contenha essa seqncia de comandos e possa ser chamada pela procedure Click de um dos botes, de modo a no haver necessidade de repetio de cdigo.
32
Os cdigos aceitos por QBColor so os seguintes: Cdigo 0 1 2 3 Cor Preto Azul Verde Ciano Cdigo 4 5 6 7 Cor Vermelho Magenta Amarelo Branco Cdigo 8 9 10 11 Cor Cinza Azul Claro Verde Claro Ciano Claro Cdigo 12 13 14 15 Cor Vermelho Claro Magenta Claro Amarelo Claro Branco Brilhante
Na tabela abaixo esto os valores de vermelho, verde e azul necessrios para se conseguir algumas cores com a funo RGB: Cor Desejada Preto Azul Verde Azul Claro Vermelho Magenta Amarelo Branco Vermelho 0 0 0 0 255 255 255 255 Verde 0 0 255 255 0 0 255 255 Azul 0 255 0 255 0 255 0 255
Como voc com certeza j percebeu, em nosso caso a funo QBColor a que melhor se encaixa. Mas vamos comear a trabalhar: crie o formulrio de acordo com o exemplo:
Altere as propriedades dos objetos: Objeto Formulrio Label Label Nome FrmTeste Label1 Label2 Outras Propriedades = Valor Caption = Teste das Cores StartUpPosition = 2 Center Screen Caption = Cor do Texto: Caption = Cor do Fundo:
33
Label
Objeto
Nome LblTeste
Label Label Boto de Comando Boto de Comando Boto de Comando Boto de Comando
Outras Propriedades = Valor Caption = Teste das Cores Alignment = 2 Center BackColor = Branco BorderStyle = 1 Fixed Single Font = Arial, Negrito, tamanho 20 Caption = 0 Preto BorderStyle = 1 Fixed Single Font = Negrito Caption = 15 Branco Brilhante BorderStyle = 1 Fixed Single Font = Negrito Caption = Anterior Caption = Prxima Caption = Anterior Caption = Prxima
Sendo assim, vamos criar nossa codificao: 1. Abra a janela Cdigo na seo Declarations. Vamos declarar as variveis privadas:
Dim vCorTexto As Integer Dim vCorFundo As Integer
2. D agora um duplo click sobre uma rea do formulrio que no contenha nenhum controle. A janela Cdigo aberta no evento Load do objeto Form, aonde vamos inicializar as variveis que declaramos no item anterior:
Private Sub Form_Load() vCorTexto = 0 vCorFundo = 15 End Sub
Note como o comando If...Then foi usado: j que s existe um comando aps Then, End If no foi necessrio. No entanto, poderamos escrever essa estrutura da seguinte maneira, com o mesmo resultado:
If vCorTexto < 0 Then vCorTexto = 15 End If
Voc deve ter percebido tambm que temos algo novo nessa procedure: o comando MudaCorTexto. Na verdade, isso a chamada a uma subrotina, aquela que citamos quando estvamos planejando nosso aplicativo. Podemos criar uma subrotina atravs da opo Add Procedure do menu Tools: o VB abre uma caixa de dilogo onde devemos informar, entre outras coisas, o nome da subrotina que ser criada (veja a figura na prxima pgina), mas existe uma maneira mais simples:
34
3. Note que, quando terminar a declarao, o prprio VB insere o comando End Sub fechando a procedure, que deve estar parecida com a da figura abaixo:
35
5. Execute o aplicativo, teste o funcionamento do boto e verifique se est de acordo com o planejado. 6. Escreva a procedure cmdTextoProx_Click: note que ela quase igual do boto cmdTextoAnt, s que muda para a prxima cor na escala:
Private Sub cmdTextoProx_Click() vCorTexto = vCorTexto + 1 If vCorTexto > 15 Then vCorTexto = 0 'Chamada da subrotina: MudaCorTexto End Sub
7. Escreva agora as procedures para os eventos click dos botes cmdFundoAnt e cmdFundoProx, e a subrotina a ser chamada por elas, que deve ter o nome de MudaCorFundo. A propriedade a ser alterada para exibir a nova cor a BackColor; 8. Teste o funcionamento de todos os botes e verifique se est de acordo com nosso planejamento. 9. Salve o formulrio com o nome de frmTeste e o projeto com o nome de TesteCor.
Estruturas de Repetio
As Estruturas de Repetio permitem que uma ou mais linhas de cdigo sejam executadas um determinado nmero de vezes ou at que uma condio seja verdadeira. Resumindo: criam loops.
Estruturas Do While
A estrutura Do While (faa enquanto) permite que um determinado bloco de comandos seja executado enquanto uma condio for verdadeira. Existem dois tipos de estruturas Do While: Loop com teste a priori: como voc sabe, esse tipo de loop testa sua condio de trmino antes da execuo dos comandos que esto nele contidos, o que implica na possibilidade desses comandos no serem executados, caso a condio de trmino seja satisfeita logo de incio. A sintaxe para a criao de loops com teste a priori em VB usando Do While a seguinte:
Do While <condio> <comandos> Loop
Loop com teste a posteriori: j esse tipo de loop testa sua condio de trmino aps a execuo dos comandos nele contidos, ou seja, os comandos sero executados ao menos uma vez, mesmo que a condio de trmino seja satisfeita logo de incio. A sintaxe de Do While com teste a posteriori a seguinte:
Do <comandos> Loop While <condio>
Veja exemplos da estrutura Do While usando os dois tipos de loop para a mesma operao:
Do While vTotal < 500 vTotal = vTotal + Quantidade Loop Do vTotal = vTotal + Quantidade Loop While vTotal < 500
Estruturas Do Until
Do Until quer dizer faa at que . Essa estrutura difere da anterior por executar os comandos do loop enquanto a condio for falsa. Tambm existem duas sintaxes para Do Until: Loop com teste a priori: Loops com teste a posteriori:
Do Until <condio> <comandos> Loop Do <comandos> Loop Until <condio>
36
Para que a diferena entre as duas estruturas fique mais clara, vamos alterar os exemplos usados em Do While para estruturas Do Until. Note que foi necessria uma mudana na formulao da condio de trmino do loop para obtermos o mesmo efeito:
Do Until vTotal >= 500 vTotal = vTotal + Quantidade Loop Do vTotal = vTotal + Quantidade Loop Until vTotal >= 500
Onde: Contador uma varivel que ser usada para controlar o nmero de vezes que o loop ser executado; Valor Inicial o primeiro valor que a varivel de controle assumir; Valor Final o ltimo valor que o contador assumir na execuo do loop; Valor do Incremento o valor que ser somado ou subtrado (pois podemos usar valores negativos) do contador a cada vez que Next for executado. Ao entrar em um loop For Next o VB faz com que o contador seja igual ao valor de incio. A cada vez que os comandos so executados e a estrutura atinge o Next, o contador incrementado pelo valor indicado em Step (que opcional se no for declarado ser assumido o valor 1) e comparado com o valor final indicado. Se o contador ultrapassar o valor final, o loop ser terminado, caso contrrio a seqncia de comandos ser executada novamente. Exemplo: a estrutura abaixo calcula a soma dos nmeros de 1 a 100:
vSoma = 0 For i = 1 To 100 vSoma = vSoma + i Next i
Com uma pequena mudana na estrutura, somaremos apenas os nmeros mpares entre 1 e 100:
vSoma = 0 For i = 1 To 100 Step 2 vSoma = vSoma + i Next i
Comando Exit
O comando Exit permite que um loop ou uma subrotina sejam abandonados (terminem antes do final normal de sua execuo). A sintaxe do comando Exit exige que indiquemos que estrutura queremos abandonar, assim: Para abandonar um loop Do................................: Exit Para abandonar um loop For...............................: Exit Para abandonar uma subrotina Sub...................: Exit Para abandonar uma subrotina Function..........: Exit
Do For Sub Function
37
Xor semelhante a Or, mas retorna falso se todas as condies forem verdadeiras. Not inverte a condio de verdadeiro para falso e vice-versa. Veja a tabela de resultados: Operador And Condio 1 Verdadeiro Verdadeiro Falso Falso Verdadeiro Verdadeiro Falso Falso Verdadeiro Verdadeiro Falso Falso Condio 2 Verdadeiro Falso Verdadeiro Falso Verdadeiro Falso Verdadeiro Falso Verdadeiro Falso Verdadeiro Falso Resultado Verdadeiro Falso Falso Falso Verdadeiro Verdadeiro Verdadeiro Falso Falso Verdadeiro Verdadeiro Falso Falso Verdadeiro
Or
Xor Not
Verdadeiro Falso
O Aplicativo Fatorial
Para testar o uso das estruturas de repetio, vamos escrever um pequeno aplicativo para calcular o fatorial de um nmero inteiro (n!), que o resultado da multiplicao dos nmeros inteiros de 1 at n. Exemplo: 5! = 1 2 3 4 5 = 120 Veja o modelo e a tabela de propriedades no incio da prxima pgina. A codificao do aplicativo envolve apenas um evento: quando o usurio clicar em cmdCalcular ou teclar Enter o fatorial do nmero digitado em txtNmero ser calculado e exibido em lblFatorial. 1. Inicie um novo projeto; 2. Formate o formulrio e altere as propriedades dos objetos como a seguir:
Outras Propriedades = Valor Caption = Fatorial StartUpPosition = 2 Center Screen Caption = Digite um nmero: Caption = O fatorial desse nmero : Text = Caption = Alignment = 2 Center BackColor = Branco BorderStyle = 1 Fixed Single Caption = Calcular Default = True
38
3. Abra a janela Cdigo no evento Click do boto Calcular e escreva os comandos para o clculo:
Private Sub cmdCalcular_Click() Dim vNmero As Double, vFatorial As Double vNmero = Val(txtNmero.Text) If vNmero < 0 Then Beep lblFatorial.Caption = Empty Else If vNmero = 0 Or vNmero = 1 Then lblFatorial.Caption = 1 Else vFatorial = 1 Do vFatorial = vFatorial * vNmero vNmero = vNmero - 1 Loop Until vNmero <= 1 lblFatorial.Caption = Str(vFatorial) End If End If txtNmero.SetFocus End Sub
Observaes: Por definio, 0! = 1; O comando Beep faz com que o computador emita um sinal sonoro (um apito ). Note o uso do operador Or no segundo If: poderamos escrever a condio vNmero <= 1 ao invs da expresso usada, j que nesse ponto temos a certeza que vNmero no negativo (veja o If anterior), mas fizemos isso para exemplificar o uso de Or; Como exerccio de fixao, reescreva o loop do clculo do fatorial usando as estruturas Do While e For Next. Tente tambm modificar as estruturas de teste a posteriori para teste a priori. 4. Grave o formulrio com o nome de frmFator e o projeto com o nome de Fatorial.
39
Comando On Error
Esse comando a chave para o tratamento de erros no VB: sua funo a de desviar o fluxo da execuo de uma procedure para um pargrafo em caso de erro irrecupervel. Sua sintaxe a seguinte:
On Error GoTo <nome_de_pargrafo>
O pargrafo para o qual o fluxo ser desviado deve obrigatoriamente fazer parte da mesma procedure, e deve estar posicionado no final da mesma, antes do comando End Sub. O nome do pargrafo identificado por ser terminado com dois pontos : .
Comando Resume
O comando Resume indica ao VB que o aplicativo deve continuar a ser executado mesmo em caso de erro irrecupervel. Veja a sintaxe:
Resume <destino>
Sendo que o <destino> da execuo no obrigatrio. Se no for informado, a execuo passa para a prxima instruo na seqncia normal do programa. As opes para <destino> so: Next: produz um desvio para a prxima instruo na seqncia normal da execuo do aplicativo; 0: faz com que o execuo retorne ao incio da procedure atual (parmetro recursivo); Nome_De_Pargrafo: desvia a execuo para um pargrafo da procedure atual.
Objeto Err
O objeto Err indica o cdigo do erro irrecupervel ocorrido, atravs da propriedade Number, de tipo Integer. Pelo cdigo informado por Err.Number podemos identificar o erro e escrever os comandos necessrios para que o aplicativo continue funcionando. Outra propriedade interessante do objeto Err a Description, que contm a descrio do erro ocorrido. Para obter a lista completa com os cdigos dos erros tratveis do VB, acesse o menu Help e escolha a seqncia Contents Trappable Errors Miscellaneous Messages. Vejamos ento um exemplo da utilizao desses recursos:
Public Sub Exemplo_Erro() Dim vQualquer As Integer On Error GoTo Erro_Na_Converso vQualquer = CInt(txtNmero.Text) Erro_Na_Converso: If Err.Number = 13 Then '13 o cdigo de erro para Tipo Incompatvel de Dados: vQualquer = 0 Resume Next End If End Sub
40
Como j citamos anteriormente, a funo CInt gera um erro irrecupervel em caso de tipo incompatvel de dados (Type Mismatch) na tentativa de converso de uma string que no represente um valor. Na procedure Exemplo_Erro estamos dizendo para o VB que, se isso acontecer, a execuo deve ser desviada para o pargrafo Erro_Na_Converso, onde testamos o valor de Err.Number e escrevemos a codificao necessria para que o programa continue normalmente. O comando Resume Next indica ento ao VB que a execuo deve ser desviada para a prxima instruo na seqncia normal da programao.
Caixas de Mensagem
At agora falamos sobre o tratamento de erros mas no informamos ao usurio 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 usurio so as caixas de mensagens padronizadas. Por exemplo: supondo que o campo Nome de um aplicativo qualquer no possa ser deixado em branco pelo operador, se isso acontecer, poderamos 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 funo MsgBox. Veja a sintaxe de ambos:
MsgBox <mensagem>,<tipo>,<ttulo> <varivel> = MsgBox(<mensagem>,<tipo>,<ttulo>)
Onde: Mensagem: uma string com a mensagem a ser exibida pela caixa. Esse o nico parmetro obrigatrio da sintaxe. No nosso exemplo: O campo Nome deve ser preenchido! ; Tipo: um valor obtido a partir da soma dos cdigos que especificam o nmero e o tipo dos botes exibidos pela caixa, o cone a ser utilizado, o boto default e a modalidade de exibio da caixa. No nosso exemplo esse valor 4144. Esse valor tambm pode ser obtido a partir de algumas constantes de sistema. Veja a seguir uma lista com os valores admitidos e seu significado; Ttulo: uma string a ser exibida como ttulo da caixa. No nosso exemplo: Aviso ; Varivel (somente para a funo): nome da varivel que receber o nmero do boto selecionado pelo usurio. Veja a seguir as constantes de sistema usadas para se obter o tipo da caixa com seus respectivos valores: Constante vbOKOnly vbOKCancel vbAbortRetryIgnore vbYesNoCancel vbYesNo vbRetryCancel vbCritical vbQuestion vbExclamation vbInformation vbDefaultButton1 vbDefaultButton2 vbDefaultButton3 Valor 0 1 2 3 4 5 16 32 48 64 0 256 512 Descrio Exibe somente o boto OK. Exibe os botes OK e Cancelar. Exibe os botes Abortar, Repetir e Ignorar. Exibe os botes Sim, No e Cancelar. Exibe os botes Sim e No. Exibe os botes Repetir e Cancelar. Exibe o cone Mensagem Crtica : Exibe o cone Consulta de Aviso: Exibe o cone Mensagem de Aviso: Exibe o cone Mensagem de Informao: O primeiro boto o default. O segundo boto o default. O terceiro boto o default.
41
Valor Descrio 768 O quarto boto o default. 0 Janela restrita do aplicativo: o usurio deve responder caixa de mensagem antes de continuar o trabalho no aplicativo atual. 4096 Janela restrita do sistema: todos os aplicativos so suspensos at que o usurio responda caixa de mensagem.
No nosso exemplo, o valor 4144 pois usamos apenas o boto Ok (0), o cone Exclamao (48), o boto Ok o default por ser o nico (0), e a modalidade sistema (4096). Ento, 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
Ou ento apenas aquelas que tero algum efeito na configurao (so diferentes de zero):
MsgBox O campo Nome deve ser preenchido!, _ vbExclamation + vbSystemModal, Aviso
Por exemplo: suponha um aplicativo qualquer que possua um boto de comando para encerrar sua execuo, mas que antes disso solicite ao usurio uma confirmao. A programao para isso poderia ser a seguinte:
Private Sub cmdFechar_Click() Dim vOk As Integer vOk = MsgBox("Tem certeza que deseja encerrar o programa?", 36, "Sada") If vOk = 6 Then End End If End Sub
Em qualquer dos casos, a caixa de mensagem resultante da funo MsgBox acima a seguinte:
42
Mas qual a vantagem de se usar constantes de sistema se a codificao fica maior? A resposta : documentao! Leia novamente os dois trechos de programao e seja honesto: qual deles ficou mais fcil de entender?
Onde: Mensagem: nico parmetro obrigatrio, um texto a ser exibida dentro da caixa como legenda; Ttulo: uma string a ser exibida como ttulo da caixa; Valor padro: o valor que a varivel deve receber de InputBox caso o usurio no digite nada. Importante: a funo 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 boto de comando que permita a digitao de um desconto para a emisso de uma nota fiscal de compra. A programao desse boto poderia ser a seguinte:
Private Sub cmdDesconto_Click() Dim vDesconto As String vDesconto = InputBox("Digite o valor do desconto:", _ "Digitao de desconto") End Sub
O Aplicativo Carro
Para usar os conceitos vistos nessa lio, vamos criar um aplicativo que calcule o valor da prestao mensal para financiamento de automvel. Antes de comear, vamos estudar um novo controle que ser usado em nosso projeto:
43
As propriedades dos objetos so as seguintes: Objeto Formulrio Caixa de Imagem Nome frmCarro imgCarro Outras Propriedades = Valor Caption = Financiamento de Automvel StartUpPosition = 2 Center Screen Stretch = True BorderStyle = 1 Fixed Single Picture = CARRO.WMF (Procure na pasta ClipArt\Popular do diretrio do MS-Office) Caption = Valor do Financiamento (R$): Caption = Entrada (R$): Caption = Juros / ms (%): Caption = N de meses: Caption = Valor Financiado (R$): Caption = Prestao Mensal (R$): Caption = Alignment = 2 Center BackColor = Branco BorderStyle = 1 Fixed Single Caption = Alignment = 2 Center BackColor = Branco BorderStyle = 1 Fixed Single Text = Text = Text = Text = Caption = &Calcular Enabled = False Caption = &Fechar Enabled = False TabStop = False
Label
lblPrestMensal
Caixa de Texto Caixa de Texto Caixa de Texto Caixa de Texto Boto de Comando
Inicialmente o boto Calcular estar desabilitado pois s aps a digitao de todos os dados necessrios o clculo da prestao mensal poder ser feito. A frmula para esse clculo a seguinte:
44
Antes de comear a programar, vamos conhecer um evento que ser necessrio para nossa codificao:
Evento KeyPress
Sempre que pressionada uma tecla, estando o foco sobre um controle, ocorre o evento KeyPress. Associada a ele est a varivel KeyAscii, que carregada com o cdigo ASCII da tecla pressionada. Dessa maneira podemos identificar quando o usurio usa uma tecla qualquer, e, se for o caso, escrever um cdigo 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 cdigo ASCII da tecla Enter 13, correspondente constante vbKeyReturn, o cdigo 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 formulrios indica se, quando pressionada uma tecla qualquer, ela deve ser ou no identificada pelo formulrio. Os valores possveis so True (habilita a verificao das teclas pelo formulrio) e False (desabilita). Usando esse recurso e a funo SendKeys, podemos fazer o Enter funcionar em qualquer campo, atravs do evento KeyPress do formulrio (as linhas precedidas pelo apstrofo so comentrios):
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
Na procedure acima, a cada vez que o usurio teclar Enter em um controle para o qual no surta efeito, ele ser substitudo por uma tabulao, e o foco passar para o prximo controle na seqncia de TabIndex. Mas vamos codificar o aplicativo: 1. Abra a janela Cdigo e acesse a seo Declarations. Vamos declarar as variveis que recebero os dados digitados como privadas, pois elas sero acessadas por vrias procedures:
Dim Dim Dim Dim vValor As Currency vEntrada As Currency vJuros As Single vMeses As Integer
3. Em tempo de execuo, faremos com que o foco passe de uma caixa de texto para outra quando teclarmos Enter. Para isso vamos alterar o evento KeyPress do formulrio. D um duplo clique sobre uma parte vazia do formulrio e procure o evento KeyPress na lista de procedures; 4. Escreva a procedure como segue:
Private Sub Form_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then SendKeys "{Tab}" KeyAscii = 0 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 formulrio no est habilitada. Saia do aplicativo para fazer a correo; 6. Altere o valor da propriedade KeyPreview do formulrio para True;
45
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. Aps testar em todos os controles, saia do aplicativo para podermos continuar; 8. Agora vamos fazer a codificao necessria para carregar a varivel vValor. Como voc pode observar, como o tipo de vValor Currency, usaremos a funo CCur para converter o texto contido em txtValor para a varivel, o que pode gerar um erro irrecupervel de execuo se txtValor contiver qualquer texto que no represente um valor. Devemos ento 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 invlido. Abra a janela cdigo no evento LostFocus do controle txtValor e escreva a codificao a seguir:
Private Sub txtValor_LostFocus() On Error GoTo Valor_Errado vValor = CCur(txtValor.Text) Valor_Errado: If Err = 13 Then MsgBox "Dado invlido na digitao do valor do financiamento", _ vbExclamation + vbSystemModal, "Aviso" txtValor.Text = InputBox("Informe o valor correto do financiamento:", _ "Valor do Financiamento") Resume 0 End If End Sub
Note que usamos a funo InputBox() para solicitar ao usurio que digite um dado vlido em caso de erro de execuo; Note tambm que o comando Resume seguido do valor 0, o que vai fazer com que o VB retorne ao incio da procedure em caso de erro e refaa a converso do contedo de txtValor. Isso importante pois, caso o usurio insista em escrever um dado invlido 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, aaa . O resultado deve ser o da figura a seguir:
46
11. 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 programao; 12. Usando a procedure txtValor_LostFocus como base, escreva as rotinas para o evento LostFocus das outras caixas de texto. Lembre-se que a varivel vJuros do tipo Single, e portanto voc deve usar a funo CSng para a converso. Alm disso, o valor obtido deve ser dividido por 100, pois um percentual. J para a varivel vMeses, que Integer, voc dever usar a funo CInt; 13. Aps isso, ainda falta escrevermos a rotina de clculo que ser chamada pelo boto cmdCalcular. V at a seo Declarations e adicione uma subrotina de nome Prestao; 14. Na subrotina Prestao escreva a seguinte codificao (note o uso do operador And):
Public Sub Prestao() Dim vValFinanciado As Currency Dim vPrestMensal As Currency If vValor <> 0 And vJuros <> 0 And vMeses <> 0 Then If vEntrada >= vValor Then MsgBox "O valor da Entrada deve ser menor que o do Financiamento", _ vbExclamation + vbSystemModal, "Aviso" lblValFinanciado.Caption = Empty lblPrestMensal.Caption = Empty txtEntrada.SetFocus Exit Sub End If vValFinanciado = vValor - vEntrada vPrestMensal = vValFinanciado * vJuros * (1 + vJuros) ^ vMeses / _ ((1 + vJuros) ^ vMeses - 1) lblValFinanciado.Caption = Format(vValFinanciado, "###,##0.00") lblPrestMensal.Caption = Format(vPrestMensal, "###,##0.00") cmdCalcular.Enabled = True cmdFechar.Enabled = True Else lblValFinanciado.Caption = Empty lblPrestMensal.Caption = Empty End If End Sub
Observaes: O primeiro If verifica se todos os dados necessrios para o clculo esto disponveis; O segundo If verifica se o valor da entrada no maior ou igual ao do financiamento, pois seno o resultado do clculo seria uma prestao negativa (se que isso existe...);
47
A propriedade Enabled dos botes de comando s foi habilitada dentro dessa rotina pois assumimos que o usurio far ao menos um clculo quando acionar o programa. 15. Agora s falta fazer com que o boto cmdCalcular execute a subrotina:
Private Sub cmdCalcular_Click() Prestao End Sub
16. Voc tambm pode fazer que, aps o primeiro clculo, toda vez que um valor for alterado os resultados sejam imediatamente atualizados. Para isso, altere a procedure txtValor_LostFocus como a seguir:
Private Sub txtValor_LostFocus() On Error GoTo Valor_Errado vValor = CCur(txtValor.Text) ' s incluir a linha abaixo: Prestao Valor_Errado: If Err = vbKeyReturn Then MsgBox "Dado invlido na digitao do valor do financiamento", _ vbExclamation + vbSystemModal, "Aviso" txtValor.Text = InputBox("Informe o valor correto do financiamento:", _ "Valor do Financiamento") Resume 0 End If End Sub
17. Faa o mesmo para as outras caixas de texto; 18. Nosso aplicativo est praticamente terminado. S falta a programao do boto cmdFechar. Nesse boto, vamos solicitar ao usurio uma confirmao de que ele realmente deseja sair do programa, usando a funo MsgBox:
Private Sub cmdFechar_Click() Dim vOk As Integer vOk = MsgBox("Tem certeza que deseja encerrar o programa?", _ vbYesNo + vbQuestion, "Sada") If vOk = vbYes Then End End Sub
19. Grave o formulrio com o nome de frmCarro e o projeto com o nome de Carro; 20. Por fim, execute o aplicativo e teste-o bem. Procure usar vrios valores diferentes nas caixas de texto para observar os resultados. Tente tambm entrar com dados invlidos e verifique se o comportamento do projeto o esperado. Se necessrio, faa os ajustes na programao para que seu funcionamento seja perfeito.
48
Se desejar acrescentar um formulrio j existente, clique na aba Existing e indique sua localizao; Se o formulrio ainda no existe (formulrio novo), voc deve escolher um dos tipos da aba New. Para um formulrio padro, escolha a opo Form. Em ambos os casos, o formulrio ser includo na lista Forms da janela Projeto. A partir desse momento, ele poder ser manipulado como outro qualquer. Vejamos alguns recursos necessrios a esse trabalho:
Mtodo Show
Esse mtodo usado para carregar e exibir um formulrio. Sua sintaxe :
<formulrio>.Show <modalidade>
49
Onde <formulrio> o nome do formulrio, e <modalidade> indica se o formulrio ser exibido como modal ou no. Um formulrio modal aquele que deve ser obrigatoriamente encerrado para que o aplicativo continue: enquanto ele estiver ativo, nenhuma outra janela ou aplicativo pode ser acessado. Para indicar se o formulrio deve ser exibido como modal usamos a constante de sistema vbModal:
frmMeuForm.Show vbModal
Mtodo Refresh
Durante a execuo do sistema, s vezes acontece uma situao que impede a exibio correta do formulrio. Normalmente, isso ocorre quando alteramos um objeto de um formulrio que j est sendo exibido em uma procedure externa a ele, ou ento quando estamos executando aes que demandam uma certa quantidade de recursos do sistema, como na abertura de arquivos. O mtodo Refresh corrige esse problema simplesmente provocando a reconstruo imediata do formulrio. Outros objetos, como os controles Data, tambm aceitam o mtodo Refresh.
Comando Unload
O comando Unload fecha um formulrio e devolve o controle do sistema ao formulrio que o chamou. Sua sintaxe muito simples: basta indicar o nome do formulrio. Exemplo:
Unload frmMeuForm
Formulrios MDI
Um formulrio MDI (Multiple-Document Interface) funciona como uma janela que contm outros formulrios a ela subordinadas (chamados de MDIChild), atuando em background para uma aplicao. Para criar um formulrio MDI voc deve escolher a opo Add MDI Form no menu Project do VB. Por suas caractersticas, o formulrio principal de uma aplicao freqentemente criado como MDI. Veja as principais: Uma aplicao pode conter apenas um formulrio MDI, mas pode conter vrios MDI Child Forms; Se o formulrio MDIChild contm uma estrutura de menus, a barra de menu do formulrio MDI automaticamente atualizada e o menu exibido passa a ser o do MDIChild ativo. Falaremos mais sobre menus logo adiante; Se o formulrio MDI minimizado, todos os formulrios MDIChild abertos tambm so; Se um formulrio MDIChild minimizado, aparece como um cone no rodap do MDI; A maioria das propriedades, mtodos e eventos dos formulrios MDI so os mesmos de um formulrio comum, mas um MDI no pode ser aberto como modal; Um formulrio MDI s pode conter menus e o controle PictureBox, ou ento controles customizados preparados para isso. Voc pode usar outros controles no formulrio MDI apenas se criar uma PictureBox e ento inserir esses controles dentro dela, como se fosse uma moldura ; Um formulrio MDIChild no aceita a propriedade StartUpPosition.
Propriedade MDIChild
Essa propriedade indica se um formulrio ser exibido como MDIChild ou no. A propriedade MDIChild s tem efeito quando existe no projeto um formulrio MDI. Nesse caso, qualquer outro formulrio que no o MDI (obviamente) poder ser configurado como MDIChild. Quando o valor de MDIChild True, o formulrio poder ser maximizado, minimizado ou movido dentro do formulrio principal (MDI). Assim como o MDI, um formulrio MDIChild no pode ser aberto como modal. MDIChild no pode ser alterada em modo de execuo, e o valor padro False.