Jump to content
luismsoaresmartins

Tratamento de excepções

Recommended Posts

luismsoaresmartins

Boa noite.

Tenho o seguinte problema: tenho uma text box (tbxFb) numa form, onde quero ler valores numéricos para definir a variável Fb (double). No entanto queria que aparecesse uma caixa de texto a alertar quando a caixa é deixada vazia, ou quando são introduzidas letras.

Tentei escrever o código abaixo, a partir de um livro de VB que tenho:

        Try
            Fb = CDbl(tbxFb.Text)
        Catch ValorInválido As FormatException
            MessageBox.Show("O valor introduzido para Fb não é válido!", "Erro", MessageBoxButtons.OK)
        Catch CaixaVazia As NullReferenceException When tbxFb.Text = Nothing
            MessageBox.Show("Preencha o valor de Fb!", "Erro", MessageBoxButtons.OK)
        End Try

No entanto dá-me erro quando tento "provocar" uma excepção, ao deixar a caixa em branco, ou colocar lá letras.

Alguém me pode ajudar?

Share this post


Link to post
Share on other sites
Caça

Tenta assim

        If Double.TryParse(tbxFb.Text, 0) Then
            'É do tipo Double
        Else
            'Não é do tipo Double
        End If


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
luismsoaresmartins

Gostaria de usar algo do tipo Try ... Catch. Como faço o que pretendo usando esse método?

Share this post


Link to post
Share on other sites
Andrepereira9

Boas

Experimenta assim. Aqui funcionou

Dim Fb As Double

Try
   Fb = CDbl(TextBox1.Text)

Catch CaixaVazia As Exception When TextBox1.Text = String.Empty
   MessageBox.Show("Preencha o valor de Fb!", "Erro", MessageBoxButtons.OK)

Catch ValorInválido As Exception When Not IsNumeric(TextBox1.Text)
   MessageBox.Show("O valor introduzido para Fb não é válido!", "Erro", MessageBoxButtons.OK)

End Try


A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Share this post


Link to post
Share on other sites
luismsoaresmartins

Está a funcionar optimamente, muitíssimo obrigado!

Apenas mais uma coisa: o programa apenas funciona se o separador decimal for a virgula, e não o ponto (pelo menos no meu pc).

Como acrescentar uma verificação que não deixe o programa crashar quando o utilizador introduza o ponto ao invés da virgula?

Ou, em alternativa, existe alguma forma de o programa trocar o ponto por virgula automaticamente, se algum ponto estiver presente?

Share this post


Link to post
Share on other sites
herty

Mete assim

Dim Fb As Double

Try
   TextBox1.Text = TextBox1.Text.Replace(".", ",")  ' Substitui o '.' por ','
   Fb = CDbl(TextBox1.Text)

Catch CaixaVazia As Exception When TextBox1.Text = String.Empty
   MessageBox.Show("Preencha o valor de Fb!", "Erro", MessageBoxButtons.OK)

Catch ValorInválido As Exception 'Assim vai dar para todos as excessões restantes
   MessageBox.Show("O valor introduzido para Fb não é válido!", "Erro", MessageBoxButtons.OK)

End Try

Share this post


Link to post
Share on other sites
Andrepereira9

Mete isto antes de leres para a variavel FB

TextBox1.Text = Replace(TextBox1.Text, ".", ",")

EDIT: É o que o @Herty indicou  ;)


A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Share this post


Link to post
Share on other sites
Andrepereira9

Isso não é correcto. 👎

O que é que não é correcto??


A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Share this post


Link to post
Share on other sites
Caça

Substituir o ponto pela virgula.


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
luismsoaresmartins

Porque não é correcto? O que devo fazer então? Devo usar o que o herty indicou??

Share this post


Link to post
Share on other sites
Caça

        If Double.TryParse(tbxFb.Text, 0) Then
            'É do tipo Double
        Else
            'Não é do tipo Double
        End If


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
thoga31

Aliás, o ponto pode ser útil para o utilizador, pois se introduzires 185.276.901,34 vês mais facilmente os milhares e milhões, e no final é gravado o valor decimal sem os pontos. ;)


Knowledge is free!

Share this post


Link to post
Share on other sites
luismsoaresmartins

Aliás, o ponto pode ser útil para o utilizador, pois se introduzires 185.276.901,34 vês mais facilmente os milhares e milhões, e no final é gravado o valor decimal sem os pontos. ;)

Então só para sistematizar: como consigo, caso tenha algo do tipo "185.276.901,34" ou "185 276 901,34" ou ainda "185 276 901.34", que penso ser o mais complicado que pode aparecer (espaços, virgulas e pontos metidos ao barulho), fazer com que obtenha sempre um valor do tipo "185276901,34" (apenas virgula)???

Tem de eliminar os espaços, eliminar todos os pontos à excepção do ultimo, e converter este ultimo ponto em virgula... Estou confuso sobre como fazer isto...

Share this post


Link to post
Share on other sites
thoga31

Tens de criar uma regra para o teu programa, não podes querer tudo, pois não há código que adivinhe o que o utilizador quer dizer com o que escreveu.

Ou defines a divisão com espaço, ou com ponto, ou com plica, ou com vírgula... O que quiseres. Dependendo da tua regra, tens de fazer um ou mais Replace. O exemplo que te dei é aquele que não exige nenhum Replace: é a regra mais simples, e fácil para qualquer utilizador, como outra qualquer. ;)


Knowledge is free!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.