Tervehdys kaikille!
Olen vasta viikon verran opiskellut Visual Basic 6:tta ja saanut jotain aikaiseksi, elikkäs yksinkertaisen polttoaine laskurin. Ongelma on se että jos lukuun pistää pilkun paikalle pisteen, niin ohjelma kaatuu. Milläs koodin pätkällä tuon ongelman voisi korjata?
Muutenkin voisitte hieman kyseenalaistaa meikäläisen koodia noin niinkuin opetustarkoituksessa, eli miten itse olisit tuon ohjelman koodannut. Tuntuu siltä, että tuon olisi voinut tehdä helpommoinkin.
Käytetty koodi
Option Explicit Private Sub cmdLaske_Click() Dim Kulutus As Variant Dim Kilometrit As Variant Dim Hinta As Variant Kulutus = txtKulutus.Text Kilometrit = txtKilometrit.Text Hinta = txtLitrahinta.Text If Kulutus = "" Or Kilometrit = "" Or Hinta = "" Then MsgBox "Anna luvut kaikkiin laatikoihin", vbCritical ElseIf Kulutus <= 0 Or Kilometrit <= 0 Or Hinta <= 0 Then MsgBox "Anna positiivinen luku", vbCritical, "Anna positiivinen luku" Else lblKustannukset = Kulutus * Kilometrit / 100 * Hinta End If End Sub
No ensinnäkin kaikki muuttujat kannattaisi määritellä integer, long, single tai double tyyppiseksi. Variant kun voi sisältää lukuarvojen lisäksi mm. merkkijonoja. Variant käyttää myös muistia kaikista muuttujatyypeistä suurimman määrän (ei välttämättä tälläisessä pätkässä niinkään tärkeää, mutta jos sinulla olisi nyt ollut vaikka muutaman sadan tai tuhannen solun taulukko..)
Tekstilootissa arvot ovat merkkijonoina jotka kannattaa val():lla muuttaa oikeanlaiseen muuttujatyyppiin.
Kustannuksia laskettaessa kannattaa myös tarkistaa, ettei yritetä koskaan jakaa nollalla.
Dim kulutus As Double, kilometrit As Double, hinta As Double, kustannukset As Double kulutus = Val(txtkulutus.Text) 'tekstilaatikossa oleva luku on tyyppiä merkkijono, muutetaan val():lla luvuksi. kilometrit = Val(txtkilometrit.Text) hinta = Val(txtlitrahinta.Text) 'kannattaa myös tarkistaa ettei yritä jakaa lukua nollalla. If (kilometrit * hinta) <> 0 Then kustannukset = (kulutus * 100) / (kilometrit * hinta) MsgBox "Kustannukset olivat : " & kustannukset & " euroa." End If
Aaah, on se helppoa kun sen osaa. Kiitoksia Tuomas, tässä selvisi paljon asioita aloittelijan päänupissa. Jatkan harjoituksia. Täältä tähän.
tuomas kirjoitti:
No ensinnäkin kaikki muuttujat kannattaisi määritellä integer, long, single tai double tyyppiseksi.
Ehdottomasti. Varianttien käsittely on hitaampaa kuin OpenOfficen kääntäminen.
Koska sinulla nakke oli ongelmaa desimaalipisteen kanssa niin taas kerran palaan tuon Val-funktion erikoisuuksiin. Jos tekstiruudussa on desimaalipilkku, Val-funktio ei ota desimaaleja mukaan lainkaan eikä tule mitään virheilmoitusta. Eli jossain vaiheessa ihmetellään miksi ohjelma laskee väärin. Tällasessa ohjelmassa voit laskea suoraan tekstiruuduilla muuttamatta lukuja miksikään. varmistat vain sen, ettei tekstiruutuun tule kiellettyjä merkkejä kuten piste. Tämän voi varmistaa suodatuksella tekstiruudun KeyPress-tapahtumassa:
If InStr("0123456789,." & Chr$(8), Chr$(KeyAscii)) = 0 Then KeyAscii = 0 If KeyAscii = 46 Then KeyAscii = 44
Eka lause nollaa kaikki muut kuin sallitut merkit (Chr$(8) = BackSpace). Toka lause muuttaa desimaalipisteen pilkuksi. Sitten erikseen tietenkin on tarkistettava, ettei yritä jakaa nollalla. Jos tarvitset yhteenlaskua niin käytä plusmerkin sijasta kahta peräkkäistä miinusmerkkiä. (muutoin luvut tulostuvat vain peräkkäin toistensa jatkoksi eli yhdistetään merkkijonoina kuten &-operaattorilla)
Kiitoksia setä! Tuota ihmettelinkin, että jos pilkun paikalle laittaa pisteen niin väärin laskee. Nyt kun lisäsin tuon laittamasi koodin, niin ohjelma tuntuisi toimivan niin kun halusinkin. Tarkkana saa näköjään ohjelmoinnissa olla, eikä voi olettaa että loppukäyttäjä tietäisi mitä saa ja mitä ei saa tehdä ohjelmaa käyttäessään. Kaikkeen on näköjään varauduttava.
Aihe on jo aika vanha, joten et voi enää vastata siihen.