Tehdään WPF-sovellus - 7 - Laskenta
- 3 minsOngelma: Painiketta painaessa ei tapahdu mitään
Haluaisimme kahden asian tapahtuvan, kun painiketta painetaan:
- Suoritetaan laskutoimitus
- 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.
Elementeille voi antaa nimen Name
-attribuutilla (tai x:Name
), mutta tässä on pari hyvää nyrkkisääntöä:
- Nimi kannattaa antaa oman harkinnan mukaan ainakin interaktiivisille elementeille, eli niille joita käyttäjä voi jollain tavoin käsitellä:
- Esim.
<TextBox>
ja<Button>
- Esim.
- Nimeä ei välttämättä kannata antaa vain ulkoasuun vaikuttaville elementeille:
- Esim.
<Grid>
ja<Border>
- Esim.
<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" />
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);
}
Tässä on mahdutettu paljon koodia samalle riville, joten pidä hatustasi kiinni niin avataan mitä riveillä oikeastaan tapahtuukaan:
double.TryParse
-funktio yrittää parsia tekstisyötteestä (WeightInput.Text
)double
-tyyppisen tuloksen.- Jos hoveroit
TryParse
-sanan päällä, niin näet, että funktio palauttaabool
-tyyppisen paluaarvon:isWeightValid
saa arvontrue
, jos parsinta onnistuu, muutoinfalse
- Tulos sijoitetaan uuteen
weight
-muuttujaan käyttämälläout
-avainsanaan- Tässä lisää tietoa avainsanan
out
käytöstä
- Tässä lisää tietoa avainsanan
- Rivin voisi kirjoittaa auki myös näin halutessaan:
double weight; bool isWeightValid = double.TryParse(WeightInput.Text, out weight);
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);
+ }
}
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);
}
$"Teksti {arvo}"
. Lisää aiheesta: $ - string interpolation. 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.
Onko sovelluksessamme bugi? Eikai sentään.. Voiko tämä olla?
Korjataan pi(l)kkuvirhe seuraavaksi.