Ga naar inhoud

Visual basic komma telt niet op


ricardog

Aanbevolen berichten

  • Reacties 25
  • Aangemaakt
  • Laatste reactie

Beste reacties in dit topic

Ricardog,

Ik snap echt niet wat er bij jou foutloopt met de Val() functie. Ik heb het hier zelf ook geprobeerd en het werkt perfect.

Ik heb gewoon een Form met 5 labels gemaakt en de volgende code in de Form.Load eventhandler:

 
Label1.Text = "123.45"
Label2.Text = "678.90"
Label3.Text = "987.66"
Label4.Text = ""
Label5.Text = Conversion.Val(Label1.Text) + Conversion.Val(Label2.Text) + Conversion.Val(Label3.Text) + Conversion.Val(Label4.Text)

Het resultaat in Label5 is dan 1790.01, wat volgens mijn rekenmachien moet kloppen... Ik heb ook wat gespeeld met de waarden van de labels en het blijft goed gaan... Misschien kan je aan de hand hiervan vergelijken wat er anders is in jouw programma, en waar de fout zit?

Als je dat graag hebt maak ik ook nog wel een voorbeeldje met CDbl() ofzo, maar dat zal dan iets voor volgende week zijn denk ik, want heb nog massa's werk (ben al sinds vanmorgen 7u30 bezig en 't is weeral 1u30...)

Laat iets weten of 't lukt en of ik nog een ander voorbeeldje moet maken...

EDIT: Als je de oplossing niet vindt mag je me altijd je project doorsturen, dan zoek ik mee als ik tijd heb.

WindowsApplication1.zip

Link naar reactie
Delen op andere sites

Hey, ik veronderstel dat in je configuratiescherm>landinstellingen het decimaalteken staat ingesteld op komma.

Ik heb je procedure licht aangepast, probeer het volgende eens:

 
Private Sub Totaal_prijs_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Label5.Text = groep1.Label1.Text.Replace(","c, "."c)
Label6.Text = groep2.Label1.Text.Replace(","c, "."c)
Label7.Text = groep3.Label1.Text.Replace(","c, "."c)
Label8.Text = groep4.Label1.Text.Replace(","c, "."c)
Label17.Text = groep1.Label9.Text.Replace(","c, "."c)
Label18.Text = groep1.Label11.Text.Replace(","c, "."c)
Label19.Text = groep2.Label11.Text.Replace(","c, "."c)
Label20.Text = groep2.Label9.Text.Replace(","c, "."c)
Label22.Text = groep3.Label9.Text.Replace(","c, "."c)
Label21.Text = groep3.Label11.Text.Replace(","c, "."c)
Label24.Text = groep4.Label9.Text.Replace(","c, "."c)
Label23.Text = groep4.Label11.Text.Replace(","c, "."c)
Label26.Text = bewerkingen.Label8.Text.Replace(","c, "."c)
Label28.Text = uitsparingen.Label8.Text.Replace(","c, "."c)
Label30.Text = Achterwanden_per_m2.Label9.Text.Replace(","c, "."c)
Label32.Text = Extra_bewerkingen_achterwanden.Label3.Text.Replace(","c, "."c)
Label34.Text = Spoelbakken.Label3.Text.Replace(","c, "."c)
Label36.Text = Smetlijsten_tot_8_cm.Label7.Text.Replace(","c, "."c)
Label73.Text = CStr(Conversion.Val(Label5.Text) + Conversion.Val(Label6.Text) + Conversion.Val(Label7.Text) + Conversion.Val(Label8.Text) + Conversion.Val(Label17.Text) + Conversion.Val(Label18.Text) + Conversion.Val(Label19.Text) + Conversion.Val(Label20.Text) + Conversion.Val(Label21.Text) + Conversion.Val(Label22.Text) + Conversion.Val(Label23.Text) + Conversion.Val(Label24.Text) + Conversion.Val(Label26.Text) + Conversion.Val(Label28.Text) + Conversion.Val(Label30.Text) + Conversion.Val(Label32.Text) + Conversion.Val(Label34.Text) + Conversion.Val(Label36.Text)).Replace(","c, "."c)
End Sub

PS Doe voor de zekerheid je oude procedure nog niet weg, maar comment ze out.

Link naar reactie
Delen op andere sites

Ja het werkt hartstikke bedankt maat!!!;-)

nog 1 vraagje misschien:D? de laatste

als ik bij groep1 (zie bron) lengte en hoogte met

komma's invul hoe laat ik daar automatisch van die komma een .

maken als ik op een knop druk?

of moet ik bij de knop gewoon dit doen?

.Replace(","c, "."c)

alvast bedankt!!!! je hebt me echt goed geholpen

Link naar reactie
Delen op andere sites

Geen probleem hoor. Ik werk meestal in c# en vb is nogal lang geleden...

Wat betreft je tweede vraag, je hebt 2 opties:

Ofwel doe je, zoals je zegt textbox.Text = textbox.Text.Replace(","c, "."c), da's het simpelste

Ofwel maak je een eventhandler voor de KeyPress event van de textbox, waarin je op zoek gaat naar de komma en die direct vervangt door een punt. Dan krijg je zoiets:

[size=2][color=#0000ff][size=2][color=#0000ff]Private [/color][/size][/color][/size][size=2][color=#0000ff][size=2][color=#0000ff]Sub[/color][/size][/color][/size][size=2] TextBox1_KeyPress([/size][size=2][color=#0000ff][size=2][color=#0000ff]ByVal[/color][/size][/color][/size][size=2] sender [/size][size=2][color=#0000ff][size=2][color=#0000ff]As [/color][/size][/color][/size][size=2][color=#0000ff][size=2][color=#0000ff]Object[/color][/size][/color][/size][size=2], [/size][size=2][color=#0000ff][size=2][color=#0000ff]ByVal[/color][/size][/color][/size][size=2] e [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] System.Windows.Forms.KeyPressEventArgs) [/size][size=2][color=#0000ff][size=2][color=#0000ff]Handles[/color][/size][/color][/size][size=2] TextBox1.KeyPress[/size]
[size=2][color=#0000ff][size=2][color=#0000ff]If[/color][/size][/color][/size][size=2] e.KeyChar = [/size][size=2][color=#a31515][size=2][color=#a31515]","c [/color][/size][/color][/size][size=2][color=#0000ff][size=2][color=#0000ff]Then[/color][/size][/color][/size][size=2] e.KeyChar = [/size][size=2][color=#a31515][size=2][color=#a31515]"."c[/color][/size]
[/color][/size][size=2][color=#0000ff][size=2][color=#0000ff]If [/color][/size][/color][/size][size=2][color=#0000ff][size=2][color=#0000ff]Not[/color][/size][/color][/size][size=2] ([/size][size=2][color=#0000ff][size=2][color=#0000ff]Char[/color][/size][/color][/size][size=2].IsNumber(e.KeyChar) [/size][size=2][color=#0000ff][size=2][color=#0000ff]Or [/color][/size][/color][/size][size=2][color=#0000ff][size=2][color=#0000ff]Char[/color][/size][/color][/size][size=2].IsControl(e.KeyChar) [/size][size=2][color=#0000ff][size=2][color=#0000ff]Or[/color][/size][/color][/size][size=2] e.KeyChar = [/size][size=2][color=#a31515][size=2][color=#a31515]"."c[/color][/size][/color][/size][size=2]) [/size][size=2][color=#0000ff][size=2][color=#0000ff]Then[/color][/size][/color][/size][size=2] e.Handled = [/size][size=2][color=#0000ff][size=2][color=#0000ff]True[/color][/size]
[/color][/size][size=2][color=#0000ff][size=2][color=#0000ff]End [/color][/size][/color][/size][size=2][color=#0000ff][size=2][color=#0000ff]Sub[/color][/size]
[/color][/size]

De eerste regel vervangt de komma door een punt, onmiddelijk als ze wordt ingetikt en nog voor ze in de textbox komt.

De tweede regel houdt alle toetsaanslagen tegen dat niet voldoet aan één van de volgende voorwaarden: a/ een cijfer; b/ een controlchar (zoals backspace) of c/ die decimale punt.

Dit kan je dan naar wens verder uitbreiden en bijvoorbeeld bij de punt gaan controleren of er al één in de textbox staat en dan selectief tegenhouden, etc...

PS Je mag hieronder op Markeer als opgelost klikken

Link naar reactie
Delen op andere sites

Wel, een probleem dat ik opmerk is dat je programma niet afsluit als het laatste form gesloten is. Dat komt omdat je overal Form.Hide() gebruikt. De forms worden zo onzichtbaar gemaakt, maar blijven wel geladen in het geheugen. Maar op 't eerste zicht moet er wel wat code veranderd worden om tot een goed sluitend programma te komen. Ik ga eens kijken hoe dat het makkelijkste kan zonder al te veel te moeten veranderen.

En dan iets dat het programma niet sneller of trager zal maken. Ieder heeft zijn eigen programmeerstijl, da's OK. Maar probeer je code netjes en overzichtelijk te houden. Als ik je code lees en écht wil begrijpen wat er berekend wordt moet ik nu een lijstje maken op papier met label1 is dit en label2 is dat, ... Geef al je besturingselementen logische namen, da's voor jou ook handiger als je later iets wil veranderen.

Tenslotte is het altijd handiger als je letterlijke waarden zoveel mogelijk buiten je code laat. Zet de prijzen en BTW-tarief bijvoorbeeld in een settings-file. Zo hoef je niet te hercompileren als er iets verandert, maar nog veel belangrijker: blijven die zaken gecentraliseerd. Stel dat je op 5 verschillende formulieren een bepaalde prijs gebruikt, en stel dat die morgen verandert. Als je per ongeluk één vermelding van die prijs in de broncode vergeet te wijzigen kan dat onaangename gevolgen hebben. Staat die in een settings-file, of in de registry of in een variabele, die overal in het programma gebruikt wordt, hoef je dat maar één keer te veranderen.

En natuurlijk is een 'perfect' (bestaat niet) objectgeorienteerd programma netter, maar daar steek je heel wat meer tijd en lijnen code in. En voor een kleine app als deze is dat eigenlijk overbodig vind ik.

Ik ga nog eens kijken naar het afsluitprobleem.

EDIT: Ik zie niet direct een manier om het afsluitprobleem op een "mooie" manier op te lossen zonder de hele code om te gooien. Dus een lapmiddeltje: Het eenvoudigste is om op elk formulier een eventhandler te maken voor de FormClosing event en daar Application.Exit() aan te roepen:

[size=2][/size][size=2][color=#0000ff][size=2][color=#0000ff]Private[/color][/size][/color][/size][size=2] [/size][size=2][color=#0000ff][size=2][color=#0000ff]Sub[/color][/size][/color][/size][size=2] Totaal_prijs_FormClosed([/size][size=2][color=#0000ff][size=2][color=#0000ff]ByVal[/color][/size][/color][/size][size=2] sender [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] [/size][size=2][color=#0000ff][size=2][color=#0000ff]Object[/color][/size][/color][/size][size=2], [/size][size=2][color=#0000ff][size=2][color=#0000ff]ByVal[/color][/size][/color][/size][size=2] e [/size][size=2][color=#0000ff][size=2][color=#0000ff]As[/color][/size][/color][/size][size=2] System.Windows.Forms.FormClosedEventArgs) [/size][size=2][color=#0000ff][size=2][color=#0000ff]Handles[/color][/size][/color][/size][size=2] [/size][size=2][color=#0000ff][size=2][color=#0000ff]Me[/color][/size][/color][/size][size=2].FormClosed
Application.Exit()
[/size][size=2][color=#0000ff][size=2][color=#0000ff]End[/color][/size][/color][/size][size=2] [/size][size=2][color=#0000ff][size=2][color=#0000ff]Sub
[/color][/size][/color][/size]

Link naar reactie
Delen op andere sites


×
×
  • Nieuwe aanmaken...

Belangrijke informatie

We hebben cookies geplaatst op je toestel om deze website voor jou beter te kunnen maken. Je kunt de cookie instellingen aanpassen, anders gaan we er van uit dat het goed is om verder te gaan.