Komponentit ja tapahtumat - Viikkotehtävä 2
Tee seuraavista haluamasi tehtävä käyttäen Visual Studiota (tai vastaavaa) ja Windows Formsia. Ohjelma ei saa kaatua esim. virheellisten syötteiden takia.
Tehtävä on palautettava 16.2. klo 10:00 mennessä
Kannattaa lukea tehtävänantoon liittyvä keskustelu postituslistalta.
Taso 1

Kirjoita ohjelma, joka arvio henkilön päivittäisen kalorikulutuksen. Toteutetaan poikkeuksellisesti koko ohjelma tekstikentillä vaikka radiobuttonit olisivat paikotellen parempi valinta.
Luo ohjelma omilla komponenteilla. Tee seuraavat komponentit ja peri jokainen TextBox-luokasta:
- PaivamaaraTextBox - kelpuuttaa päivämääriä ISO-standardimuodossa vuosi-kuukausi-päivä (esim. 2012-02-24). Aiheuttaa Tulevaisuus-tapahtuman jos syötetty päivämäärä on tulevaisuudessa.
- PainoTextBox - kelpuuttaa kokonaisluvun halutulta väliltä. Väli annetaan komponentille propertyjen (min ja max) avulla.
- SukupuoliTextBox - kelpuuttaa merkkijonon Mies tai merkkijonon Nainen
- AktiivisuusTextBox - kelpuuttaa jonkun merkkijonoista: pieni, keskiverto, suuri
Painoksi kelpuutetaan arvot väliltä 20 - 300.
Jokainen komponentti ilmoittaa mahdollisesta väärästä syötteestä ErrorProviderin avulla.
Jos syötetty päivämäärä on tulevaisuudessa niin ohjelma varoittaa tästä messageboksilla eikä suostu laskemaan kalorikulutusta. Toteuta tämä kuuntelemalla PaivamaaraTextBoxin Tulevaisuus-tapahtumaa.
Jos kenttiin on syötetty kelvolliset arvot niin Laske kulutus -painike laskee arvioidun kalorikulutuksen. Tarvittava kaava on dokumentissa: Daily Calorie Needs. Syötetyistä tiedoista pieni, keskiverto ja suuri vastaavat tietoja sedentary, moderately active ja very active.
Ohjelman lomaketta ei voida sulkea jos kentissä on epävalideja syötteitä.
vinkki: c# days elapsed from DateTime, c# datetime examples, C# TimeSpan Examples
Taso 3
Tee keittiöajastinohjelma, joka antaa halutun ajan jälkeen hälytyksen.

Toteuta ohjelma seuraavilla omilla komponenteilla:
- Aikakomponentti, joka on tekstikenttä johon voi syöttää halutun
ajan muodossa h:min:ss (tunnit:minuutit:sekunnit). Peri komponenttisi TextBox-luokasta.
- Komponentti tarkistaa siihen syötetyn ajan oikeellisuuden. Maksimiaika on 24 tuntia. Minimiaika on 1 sekunti. Jos aika on syötetty virheellisessä muodossa antaa komponentti virheilmoituksen ErrorProvider-luokan avulla ja värjää tekstikentän taustavärin punaiseksi avulla.
- Komponentti aiheuttaa virheellisen syötteen yhteydessä Virhe-tapahtuman
- Saatuaan validin ajan komponentti aiheuttaa OK-tapahtuman ja poistaa mahdolliset aiemmat virheilmoitukset
- Ajastinkomponentti, joka ottaa aikaa halutun ajan. Peri komponenttisi
Timer-luokasta.
- Ajastimella on property jolla voidaan asettaa tai lukea ajastusaika muodossa h:min:ss (tunnit:minuutit:sekunnit). Uuden ajan voi asettaa vaikka ajastin olisi jo käynnissä. Uusi aika korvaa vanhan ajan ja jos ajastin oli aikaa asetettaessa käynnissä niin ajastus jatkuu.
- Ajastin käynnistetään Start-metodilla ja pysäytetään Stop-metodilla.
- Ajastin aiheuttaa sekunnin välein Sekunti-tapahtuman aina kun ajastus on päällä
- Ajastimella on myös property, joka kertoo paljonko aikaa on jäljellä. Aika palautetaan merkkijonona h:min:ss-muodossa.
- Ajan loppuessa ajastin aiheuttaa Halytys-tapahtuman
- Ajastimen propertyja pitää pystyä käyttämään Visual Studion properties-listauksen kautta
Varsinaisella lomakkeella on kenttä jossa näkyy pienevä aika, joka päivittyy sekunnin välein. Kentän alapuolella näkyy Stop- tai Start-painike sen mukaan onko ajastus päällä vai ei. Lomakkeella on myös kenttä jolla voidaan asettaa uusi aika. Uuden ajan saa käyttöön lomakkeen Reset-painikkeella. Reset-painikkeella voi asettaa uuden ajan milloin tahansa riippumatta siitä onko ajastus päällä tai ei. Reset-painike ei kuitenkaan toimi jos kenttään syötetty kellonaika on epävalidi.
Ajan loppuessa ohjelma avaa messageboksin, joka ilmoittaa, että aika loppui.
Lomaketta ei voida sulkea jos kentissä on epävalideja syötteitä tai ajastin on käynnissä.
Taso 5
Muuta ja laajenna tason 3 ohjelmaa ja komponentteja seuraavilla ominaisuuksilla:
- Ajastinta voidaan käyttää myös ajanottoon. Salli aloitusajan asettaminen nollaksi (00:00:00). Jos lähtöaika on nolla niin ajastin laskeekin aikaa ylöspäin.
- Ajastimella on myös property, joka kertoo paljonko aikaa on kulunut
- Lisää ajastimeen väliaikojen tallentaminen eli Valiaika-metodi, jolla ajastin tallentaa aina kyseisen hetken ajan. Komponentti aiheuttaa aina väliajan tallentaessaan myös ValiaikaTallennettu-tapahtuman, joka palauttaa tallennetun väliajan.
- Lisää metodi Valiajat, joka palauttaa tallennetut väliajat listana. Väliajat ovat merkkijonoina h:min:ss-muodossa.
- Lisää metodi Nollaa, joka tyhjentää väliajat ja asettaa ajastimen alkuajaksi 00:00:00 eli ajastimen ajanottomoodiin.
- Lisää metodi Tauko, joka pysäyttää ajanoton väliaikaisesti. Aika ei liiku mihinkään suuntaan eikä tapahtumia tule. Ajastin osaa kertoa myöhemmin kokonaisajan (property!) lukien ajastimen käynnistämisestä seuraavaan stop-painallukseen. Kokonaisaika muuttuu siis aina mutta normaali ajanotto pysähtyy Tauko-metodilla ja jatkuu kun kutsutaan Jatka-metodia.
- Ajastinkomponentti lähettää aina käynnistyessään tapahtuman IdleOver ja pysähtyessään tapahtuman TimingOver. Kumpikin tapahtuma sisältää tiedon kauanko on kulunut aikaa edellisestä.
- Ajastin tietää myös montako kertaa se on pysäytetty ja käynnistetty. Nämä tiedot ovat saatavina propertyina. Restart nollaa laskurin.
- Lisää lomakkeelle Väliaika-painike jolla voi tallentaa väliaikoja jos käytössä on ajanotto. Lisää myös Tauko-painike, joka pysäyttää ajanoton väliaikaisesti
- Ohjelma listaa ListBox-kontrollissa väliajat sitä mukaa kuin niitä tallentuu ajastimeen
- Lisää lomakkeen ylälaitaan progressbar, joka havainnollistaa kuinka paljon aikaa on vielä jäljellä. Ajanotossa progressbaria ei tarvitse käyttää.
- Ohjelma soittaa merkkiäänen aina normaalin ajastuksen loppuessa.

Käyttäjien kommentit