Tehdään WPF-sovellus - 7 - Laskenta

- 3 mins

Ongelma: Painiketta painaessa ei tapahdu mitään

Haluaisimme kahden asian tapahtuvan, kun painiketta painetaan:

  1. Suoritetaan laskutoimitus
  2. Näytetään laskutoimituksen tulos

Aivan ensimmäiseksi tarvitsemme käsiimme pituuden ja painon arvot ennen kuin voimme tehdä laskutoimituksen. Lisätään syötekentille nimet, jotta voimme viitata niihin taustakoodissa.

            <TextBlock Text="Weight" />
-            <TextBox Grid.Row="1"
+            <TextBox Name="WeightInput"
+                     Grid.Row="1"
                     Background="MintCream"
                     Foreground="DarkSalmon" />
            <TextBlock Text="Height" />
-            <TextBox Grid.Row="1"
+            <TextBox Name="HeightInput"
+                     Grid.Row="1"
                     Background="Cornsilk"
                     Foreground="Chocolate" />
MainWindow.xaml

Nyt voimme viitata elementteihin WeightInput ja HeightInput taustakoodin puolella ja hakea niiltä tarvitsemamme arvot.

Tässä kohtaa on hyvä huomata, että tekstilaatikkoon syötetty sisältö on nimensä mukaisesti tekstiä. Emme voi suorittaa laskutoimituksia tekstillä, joten meidän on myös muunnettava syöte double-tyyppiseksi.

Poimitaan muunnetut syötteet omiin muuttujiinsa, jolloin meidän on helpompi käsitellä niitä:

        private void Button_Click(object sender, RoutedEventArgs e)
        {
+            var isWeightValid = double.TryParse(WeightInput.Text, out var weight);
+            var isHeightValid = double.TryParse(HeightInput.Text, out var height);
        }
MainWindow.xaml.cs

Tässä on mahdutettu paljon koodia samalle riville, joten pidä hatustasi kiinni niin avataan mitä riveillä oikeastaan tapahtuukaan:

Jätämme vielä tässä vaiheessa virheenkäsittelyn erittäin yksinkertaiselle tasolle, jotta saisimme vain tulosta aikaiseksi. Suoritetaan laskutoimitus vain, jos molemmat pituus ja paino ovat ok:

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var isWeightValid = double.TryParse(WeightInput.Text, out var weight);
            var isHeightValid = double.TryParse(HeightInput.Text, out var height);
+
+            if(isWeightValid && isHeightValid)
+            {
+                var bodyMassIndex = weight / Math.Pow(height, 2);
+            }
        }
MainWindow.xaml.cs

Tulosten esittäminen

Tuloksen voimme tuoda näkyviin popup-viestilaatikolla:

            if(isHeightValid && isWeightValid)
            {
                var bodyMassIndex = weight / Math.Pow(height, 2);
+                var resultMessage = $"BMI: {bodyMassIndex}";
+                MessageBox.Show(resultMessage);
            }
MainWindow.xaml.cs

Hmm. Jokin tässä ei nyt täsmää.. Kaava näyttäisi olevan ok ja viestin esittäminenkin näyttäisi olevan ihan kunnossa. No, ei välitetä pienestä “jotain saattaa olla pielessä”-ajatuksesta takaraivossamme ja käynnistetään aivan varmasti 100% täysin toimiva ohjelmamme! Olemmehan sen sentään aivan itse koodanneet. Täysin bugivapaata ja priimaa softaa, eikös?

Anna paino kiloina ja pituus senttimetreinä niin kuin säädylliset ihmisolennot tekevät. Oletko valmis ihailemaan tuloksia?

Paina Calculate-painiketta.

Sain itse tulokseksi 0,0020902.... Mutta mitäs ihmettä! Tämä ei missään määrin voi olla oikea tulos, sillä muutoinhan olisin sairaalloisen alipainoinen. Huhhuh.

Mitäköhän oikein teimme väärin..

Mitäköhän oikein teimme väärin..

Onko sovelluksessamme bugi? Eikai sentään.. Voiko tämä olla?

Korjataan pi(l)kkuvirhe seuraavaksi.

Anssi Kettunen

Anssi Kettunen

Ohjelmistokehittäjä suorittamassa tehtävää 🦊

rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora