Gå til innhold

Nybegynner får ikke til desimaltall i VB


Anbefalte innlegg

Hei

 

Jeg prøvde meg for første gang på visual basic idag, som jeg lastet ned gratis.

 

Etter mye om og men klarte jeg endelig å få til en applikasjon som gjør en enkel utregning.

 

Det jeg lurer på er ganske enkelt(?) hvorfor jeg ikke får desimaltall i svaret som kommer i "Label1"?

 

Public Class Form1

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim dim1 As Integer

dim1 = 100 / Text1.Text

Label1.Text = (dim1)

End Sub

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

 

End Sub

 

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

 

End Sub

Endret av randomguy111
Lenke til kommentar
Videoannonse
Annonse
Det jeg lurer på er ganske enkelt(?) hvorfor jeg ikke får desimaltall i svaret som kommer i "Label1"?
Da må du bruke en annen datatype enn Integer. I VB.NET (og .NET-rammeverket for øvrig) er det kun Single, Double og Decimal som er flyttall - altså, at de kan bestå av desimaltall/komma. Du bør også på et tidspunkt (eller forby det fullstendig) forsikre deg om at tekstboksen er et gyldig tall:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 

   Dim Value As Double ' Du bør gi variablene dine meningsfulle navn. Endre dette til noe annet.

 

   ' Koden innimellom IF og End IF kjøres KUN dersom TryParse returnerer True (1), hvilket er når den gitte tekst (i tekstboksen)

   ' er et gyldig tall. I så tilfelle lagres tallet i den andre variabel (Value).

   If Double.TryParse(Text1.Text, Value) Then

       Label1.Text = 100 /  Value ' Likeså med kontroller

   End If

 

End Sub

 

Bruk Decimal om du har behov for nøyaktig presisjon (med Single og Double vil store tall rundes av til nærmeste tier- hundreposisjon pga. måten de lagres i minnet), samt å unngå ulempen med binære verdier, eksempelvis når en har å gjøre med valutta. Single tar mindre plass og ressurser, men er den datatypen som besitter minst presisjon og høyde av de tre. I de fleste tilfeller bør Double være tilstrekkelig.

Endret av aadnk
Lenke til kommentar

Takk igjen, fiksa det :)

 

Men når jeg debugger så fryser hele applikasjonen, hvis jeg trykker på button1 uten å ha skrevet noe i text1 eller text2.

Det funker imidlertid helt fint hvis jeg taster inn tall i begge boksene..

 

Koden ser forøvrig slik ut:

 

Public Class Form1

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim dim1 As Single

dim1 = Text1.Text * Text2.Text

Label4.Text = Math.Round(100 / Text2.Text, 2)

Label8.Text = Text1.Text

Label10.Text = Math.Round(Label8.Text - Label4.Text, 2)

Label12.Text = Math.Round(100 / Text1.Text, 2)

Label3.Text = Math.Round(Text2.Text / Label12.Text - 1, 2)

Label14.Text = Text2.Text

Label16.Text = Label3.Text * 100

 

End Sub

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

 

End Sub

 

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

 

End Sub

 

 

Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Text1.Text = ""

Text2.Text = ""

End Sub

End Class

 

Hvordan kan jeg gjøre så dette ikke skjer?

Lenke til kommentar

Hva med..

 

Dim fail as Boolean
If Textbox1.text or Textbox2.text = "" then
messagebox.show("Skriv noe i tekstboksene")
fail = false
while fail = false
application.doevents
end while

 

Hvis du har denne koden i button1, må du huske å ha fail = true som den første koden i knappen.

Endret av InjB
Lenke til kommentar

nå henger den seg ikke opp lenger, men messageboks "Skriv noe i tekstboksene" kommer opp uansett når jeg trykker button1 i debug.

 

vet dog ikke om jeg plasserte koden riktig:

 

Public Class Form1

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim dim1 As Single

 

Dim fail As Boolean

If Text1.Text Or Text2.Text = "" Then

MessageBox.Show("Skriv noe i tekstboksene")

fail = False

While fail = False

Application.DoEvents()

End While

End If

 

fail = True

dim1 = Text1.Text * Text2.Text

Label4.Text = Math.Round(100 / Text2.Text, 2)

Label8.Text = Text1.Text

Label10.Text = Math.Round(Label8.Text - Label4.Text, 2)

Label12.Text = Math.Round(100 / Text1.Text, 2)

Label3.Text = Math.Round(Text2.Text / Label12.Text - 1, 2)

Label14.Text = Text2.Text

Label16.Text = Label3.Text * 100

 

End Sub

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

 

End Sub

 

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

 

End Sub

 

 

Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Text1.Text = ""

Text2.Text = ""

End Sub

End Class

Lenke til kommentar

Prøv med:

 

Dim fail as Boolean
If Textbox1.text = "" then
messagebox.show("Skriv noe i tekstboksen(e)")
fail = false
while fail = false
application.doevents
end while

elseIf Textbox2.text = "" then
messagebox.show("Skriv noe i tekstboksen(e)")
fail = false
while fail = false
application.doevents
end while

Endret av InjB
Lenke til kommentar
Prøv med:

 

Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim dim1 As Single

     [b]  Dim fail As Boolean
       If Text1.Text = "" Then
           MessageBox.Show("Skriv noe i tekstboksen(e)")
           fail = False
           While fail = False
               Application.DoEvents()
           End While

       ElseIf Text2.Text = "" Then
           MessageBox.Show("Skriv noe i tekstboksen(e)")
           fail = False
           While fail = False
               Application.DoEvents()
           End While
       End If
[/b]
       dim1 = Text1.Text * Text2.Text
       Label4.Text = Math.Round(100 / Text2.Text, 2)
       Label8.Text = Text1.Text
       Label10.Text = Math.Round(Label8.Text - Label4.Text, 2)
       Label12.Text = Math.Round(100 / Text1.Text, 2)
       Label3.Text = Math.Round(Text2.Text / Label12.Text - 1, 2)
       Label14.Text = Text2.Text
       Label16.Text = Label3.Text * 100

   End Sub

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

   End Sub

   Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

   End Sub


   Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
       Text1.Text = " "
       Text2.Text = " "
   End Sub
End Class

Lenke til kommentar
Slik som det ser ut for meg har du det ja, så skjønner ikke hva som er galt. Hva er error meldingen som kommer?

 

nå fungerer det, dersom jeg trykker på button1 før jeg har skrevet noe i boksene for første gang.

deretter trykker jeg på "clear" button, deretter på button1 igjen.

da fryser hele greia.

 

feilmeldinga som kommer i koden er:

 

"Konvertering fra strengen 45| til typen Double er ikke gyldig."

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...