Omat Komponentit - pääteohjaus 3

Voit tutustua komponenttien tekemiseen lukemalla erinomaisen artikkelin: Architecture and Design of Windows Forms Custom Controls

  1. Luodaan uusi yksinkertainen tekstikenttäkomponentti, joka osaa tarkistaa siihen syötetyn luvun kelvollisuuden
    • Luo Visual Studiolla uusi projekti ja Sslution mutta älä valitse tyypiksi Windows Forms vaan Windows Forms Control Library. Keksi kuvaava nimi esim. PositiveTextBox
    • Nimeä Solution Explorerista usercontrol1.cs samalle nimelle kuin projektisi eli esim. PositiveTextBox. Anna Visual Studion uudelleennimetä kaikki muukin tarpeellinen.
    • Peri komponenttisi TextBox-luokasta äläkä valmiina tarjotusta UserControl-luokasta
    • Yritä kääntää komponenttisi (F6). Saat läjän virheilmoituksia. Poista rivit, jotka aiheuttavat virheen. Käännä uudelleen.
    • Lisää solutioniin uusi projekti, jonka tyyppi on nyt Windows Forms Application. Anna nimeksi vaikkapa Testipenkki.
    • Lisää testipenkin lomakkeelle uusi komponenttisi, jonka pitäisi löytyä Toolboxista jos vain sait komponentin käännettyä. Jos komponentti ei ilmesty toolboxiin niin varmista, että komponenttisi on käännetty. Jos vieläkään ei näy niin tarkista, että seuraa asetus on True: Tools|Options|Windows Forms Designer|General|Toolbox|AutoToolboxPopulate
    • Yritä suorittaa testipenkki. Jos sait virheilmoituksen niin varmista, että testipenkki on oletuksena käännettävä projekti (Set as Startup Project)
    • Määrittele komponentissasi Validating-tapahtuma, joka suoritetaan aina, kun tekstikentän tekstikentästä yritetään poistua. Tapahtuma löytyy ihan normaalisti komponenttisi tapahtumalistauksesta. Lisää metodiin tarkistus, joka tutkii onko kenttään syötetty positiivinen numero. Ota käyttöön ErrorProvider-luokka. Aseta ErrorProviderilla komponenttisi viereen virheikoni ja virheteksti aina jos syötetty luku on epäkelpo. Luvun ollessa kelvollinen poista ErrorProvider näkyvistä asettamalla virheteksti tyhjäksi.

      Lisää testipenkkiisi myös painike tai joku muu kontrolli niin voit testata tekstikentästäsi poistumista ja ErrorProvideria, kun aktivoit lomakkeelta jonkun muun kontrollin.

    • Lisää komponenttiisi tapahtuma, joka suoritetaan jos kenttään syötetään ei-positiivisia lukuja. Määrittele sopiva delegaattityyppi ja esittele sellainen esim:
              public delegate void NegativeNumberHandler();
              public event NegativeNumberHandler NegativeNumber;
      
    • Kutsu NegativeNumber()-funktiota silloin kun syötetty luku on negatiivinen. Huom. varmista, että NegativeNumber on määritelty ennen kutsumista.
    • Käännä komponentti uudelleen (rebuild). Kokeile komponenttia testipenkissä. Komponenttisi tapahtumalistasta pitäisi löytyä nyt tapahtuma NegativeNumber. Lisää NegativeNumber-tapahtumaan jotain millä voit testata toimiiko komponenttisi tarkistus- ja tapahtuma esim:
      MessageBox.Show ("Syötit negatiivisen luvun", "Testipenkki", MessageBoxButtons.OK);
      
      Nyt lomake saa aina tiedon kentän virhesyötteestä ja voi sen perusteella reagoida asiaan tai olla reagoimatta.
    • MessageBox ei ole kaikista fiksuin tapa ilmaista virheellisistä syötteistä. Kannattaa miettiä tarkkaan milloin sitä kannattaa käyttää.
    • Kokeile miten saat kaikki lomakkeen sisältämät kontrollit tarkistamaan oikeellisuutensa. vinkki: ValidateChildren.

      Huom. Komponenttisi pitää validating-tapahtumassa asettaa e.Cancel joko true tai false sen mukaan onko kontrollin sisältö kelvollinen vai ei. e.Cancel = true estää kentästä poistumisen jos sisältö on epävalidi

      Tätä tarvitaan monimutkaisemmissa lomakkeissa joiden pitää olla oikein ennen kuin lomakkeen (dialogin) voi sulkea esim. ok-painikkeella.

      Lisää lomakkeellesi OK-painike, joka sulkee lomakkeen vain jos kaikkien kenttien sisältö on kunnossa. Miten saat tämän toteutettua tavalla jossa epäkelvollisesta kontrollista voi kuitenkin poistua?

  2. Luo uusi koostettu komponentti eli komponentti joka sisältää useampia kontrolleja.
    • Lisää solutioniin uusi projekti, jonka tyyppi on taas control library. Anna nimeksi AutoLaskuri
    • Muuta nimet järkeviksi samaan tapaan kuin ensimmäisen komponenttisi yhteydessä.
    • Raahaa kentälle Autolaskuriin vaadittavat komponentit eli painike ja tekstikenttä. Voit käyttää tekstikenttänä edellä tekemääsi omaa komponenttiasi :)
    • Tee autolaskurikomponentistasi startup project ja käynnistä se. Pääset kokeilemaan komponenttisi toimintaa testipenkissä.
    • Lisää komponenttiisi autolaskurin toiminnallisuus
    • Lisää komponenttisi attribuutiksi pLaskuri, joka sisältää laskurin summan. Tee pLaskurin käsittelyä varten property Laskuri ja siihen liittyvät get- ja set-funktiot.
      // propertyn properties-listauksen kustomointia
              [Category("Luokka"),
              Description("Selkeä kuvaus"),
              DefaultValue(0),
              Browsable(true)] // jos on false ei näytetä design-tilassa
              public int Juttu
              {
                  get { ... }
                  set { ... }
              }
      

      Huom: tämmöinen ratkaisu kaataa visual studion:

      public int Juttu
      {
        get { return Juttu; } // ei voi viitata itseensä!
      }
      
    • Kokeile toimiiko komponenttisi. Tarkista löytyykö määrittelemäsi property komponenttisi ominaisuuslistasta testipenkki-ohjelmassasi.
    • Lisää lomakkeellesi useita autolaskureita.
    • Lisää Autolaskuriisi tapahtuma UusiAuto, joka tapahtuu aina kun laskuria kasvatetaan. Käsittele tapahtuma lomakkeellasi ja lisää lomakkeelle kenttä johon lasket yhteen kaikkien laskurien summat. Yksi rivi koodia riittää vaikka laskureita olisi lukematon määrä.
    • Lisää lomakkeelle painike, joka lisää uuden Autolaskurin. Varmista, että myös uuden laskurin summa lisätään summaan. huom. Luodessasi dynaamisesti kontrolleja täytyy ne muistaa lisätä lomakkeelle näin:
      this.Controls.Add(kontrolli); // this on lomake jolle kontrolli lisätään
      
  3. Selvitä miten pääset käsiksi kaikkiin lomakkeelle luotuihin kontrolleihin. vinkki: Controls Tee painike, joka siirtää kaikki autolaskurit siistiin riviin lomakkeen vasempaan reunaan.

Lisätietoa:

Käyttäjien kommentit

Kommentoi tätä sivua Lisää uusi kommentti
Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/gko/ohjaus/ohjaus3/
© Antti Ekonoja (antti.j.ekonoja@jyu.fi) <http://users.jyu.fi/~anjoekon/>
Tommi Lahtonen (tommi.j.lahtonen@jyu.fi) <http://hazor.iki.fi/>
Jukka Mäntylä (jmantyla@iki.fi) <http://www.iki.fi/jmantyla/>
2010-10-04 16:03:55
Informaatioteknologia - Jyväskylän yliopiston informaatioteknologian tiedekunta