Escolar Documentos
Profissional Documentos
Cultura Documentos
http://www.macoratti.net/vb_aval.htm
1. - 5 ^ 2 e multiplicar o resultado por 3 2. Extrair a raiz quadrada da diferena entre 11 e 2 multiplicar por 0,5 e elevar o resultado ao 3.
quadrado Dividir o resultado obtido em 1 pelo resultado obtido em 2
Parece uma tarefa bem complexa , no mesmo ? Como faremos para resolver isto ? Calma !!! O Visual Basic sempre tem um 's guardado sob a manga' ... Podemos descascar este 'abacaxi' de uma maneira bem mais fcil do que voc esta imaginando... Na verdade uma nica linha de cdigo o suficiente para que o Visual Basic avalie expresses matemticas e nos de o resultado. Basta voc usar o mtodo Eval do objeto ScriptControl . Para ter acesso ao mtodo voc vai precisar referenciar o objeto no menu Project-> Components e selecionando a library : Microsoft Script Control 1.0. O objeto ScriptControl possui alm do mtodo Eval outros mtodos , propriedades e eventos que , por questo de simplicidade eu no vou abordar neste artigo. Vou portanto me ater ao mtodo Eval
1 de 4
26/01/2012 20:38
http://www.macoratti.net/vb_aval.htm
: O mtodo Eval avalia uma expresso e retorna o resultado .Sua sintaxe a seguinte:
object.Eval(expression)
Onde: 1- Object - o objeto ScriptControl. 2- expression - uma string que contm uma expresso a ser avaliada. Obs: O contexto do mtodo Eval method determinado pelo objeto. Se o objeto um mdulo o contexto estar restrito ao mdulo se o objeto for o ScriptControl o contexto global.
Criando o projeto
Vamos agora aplicar esta teoria e mostrar que ela funciona, vamos criar um projeto no VB que resolver expresses matemticas usando o mtodo Eval do objeto ScriptControl. 1 - Crie um novo projeto no Visual Basic e no formulrio padro - que vou chamar de frmavalia.frm - insira os controles : TextBox , CommandButton , frame , label , e o componente ScriptControl , conforme abaixo:
2- Feito isto vamos inserir o cdigo associado aos botes de comando (estou usando um array de controles). O indice 0 refere-se ao boto - Resolver Expresso - que chama o mtodo Eval para resolver a expresso (txtresultado.Text = Resolve_Expressao(txtExpressao.Text) . O ndice 1 refere-se ao boto - Novo Clculo - que limpa os controles do formulrio. (eu estou copiando o resultado para a rea de transferncia) Private Sub Command1_Click(Index As Integer) Select Case Index Case 0 'resolve expressao On Error GoTo trata_erro frmResultado.Visible = True txtresultado.Text = Resolve_Expressao(txtExpressao.Text) Clipboard.SetText txtExpressao.Text & " = " & Trim(txtresultado.Text) Exit Sub trata_erro: If Err.Number = 1002 Then MsgBox "Erro de sintaxe na expresso , verifique a colocao dos parnteses '( )' !", vbCritical,_ "Erro na expresso" ElseIf Err.Number = 5 Then MsgBox "Operao invlida , !", vbCritical, "Erro na expresso"
2 de 4
26/01/2012 20:38
http://www.macoratti.net/vb_aval.htm
Else MsgBox Err.Number & " - " & vbCrLf & Err.Description End If Case 1 ' novo calculo frmResultado.Visible = False txtExpressao.SetFocus txtExpressao.SelStart = 0 txtExpressao.SelLength = Len(txtExpressao.Text) End Select End Sub
3- O cdigo da funo - Resolve_Expresso - o seguinte : A funo avalia a expresso usando Eval. Private Function Resolve_Expressao(expressao As String) Resolve_Expressao = End Function
ScriptControl1.Eval(expressao)
No disse que era apenas uma linha de cdigo !!! Vamos rodar o projeto e ver se funciona. Abaixo o resultado para a expresso : ((( -5 ^ 2) * 3 )/ ( SQR((11 - 2 )) * .5)) ^ 2 Vamos conferir ? 1- 5 ^ 2 * 3 = 75 2- SQR((11-2)) * 0,5 ^2 = 2,25 Dividindo 75(1) por 2,25(2) temos : 33,333333333 confere com o resultado!!! Observe que tivemos que utilizar os parnteses para delinear as precedncias dos operadores. Se no tomarmos este cuidado o resultado no estar correto. Quer outro exemplo !!! Que tal avaliar se uma expresso verdadeira ou falsa ??? Sem problemas... veja..:
3 de 4
26/01/2012 20:38
http://www.macoratti.net/vb_aval.htm
Este artigo encerra a srie - VB e a matemtica - pelos menos por este ano... At o prximo artigo... (o projeto completo
esta no super CD VB)
4 de 4
26/01/2012 20:38