Etusivu Aloitus Kontrollit Metodit Muuttujat Ohjausrakenteet Silmukat Matematiikka Debuggaus Virheenkäsittely Vuorovaikutus Valikot Tiedostonkäsittely Ikkunat Leikepöytä Drag and Drop Tiedostopäätteet Linkkejä Harjoitukset

Johdanto ja tavoite

Tässä osiossa tutustutaan metodeihin. Tämän osion jälkeen opiskelija tietää mitä metodit ovat ja osaa tehdä omia metodeita.

Mikä on metodi

Eri ohjelmointikielissä ja eri tilanteissa saatamme käyttää samasta asiasta eri nimeä. VB:ssä metodi (eli funktio eli aliohjelma, jopa proseduuri) on pala ohjelmakoodia jolla on seuraavat ominaisuudet: VB:ssä ei ole pelkästään metodia vaan siinä metodit on erotelty toisistaan, puhutaan funktioista ja ja aliohjelmista. Käytännössä se tarkoittaa sitä, että funktiolla tarkoitetaan metodia jolla ON paluuarvo. Aliohjelmalla taas tarkoitetaan metodia jolla EI ole paluuarvo.

Funktio

Alla on laskeYhteen -funktio:
Private Function laskeYhteen(ByVal luku1 As Double, luku2 As Double) As Double
    laskeYhteen = luku1 + luku2
End Function
Kuten huomaat, funktiolla on aina paluuarvo. Funktion paluuarvo palautetaan siten, että ohjelmakoodiin kirjoitetaan funktion nimi (laskeYhteen) ja sille annetaan jokin arvo (laskeYhteen = luku1 + luku 2), esimerkissämme funktion paluuarvoksi tulee siis parametrinä annettujen lukujen summa.

Aliohjelma

Alla on tulosta -aliohjelma:
Private Sub tulosta(ByRef luku As Double)
    msgobx "Luku on " & luku
End Sub
Kuten huomaat, erona funktioon aliohjelmassa EI ole paluuarvoa, muuten aliohjelma ja funktio ovat yhteneväisiä.

Funktion/aliohjelman kutsuminen

Funktiota ja aliohjelmaa voidaan parilla eri tavalla. Jos kutsumme funktiota, täytyy meidän (yleensä) ottaa funktion paluuarvo talteen:
Dim Vastaus As Double

Vastaus = laskeYhteen(1, 2)
Eli kutsumme esimerkissämme funktiota laskeYhteen arvoilla 1 ja 2, laitamme paluuarvon talteen muuttujaan Vastaus, joka on Double -tyyppinen (eli samantyyppinen kuin funktion paluuarvo). Toki voimme kutsua funktiota myös seuraavasti:
laskeYhteen 1, 2
Ainoa ongelma tässä on se, että emme tiedä mikä on funktion paluuarvo!

Aliohjelmaa voidaan kutsua kahdella eri tavalla. Alla olevassa ohjelmakoodissa on esitelty molemmat tavat:

' Tapa yksi
Call tulosta(Vastaus)

' Tapa kaksi
tulosta Vastaus
Ensimmäisessä tavassa kirjoitamme komennon Call ja sen jälkeen aliohjelman nimen ja loppuun mahdolliset parametrit sulkujen sisään. Parametrinä meillä on edellisen esimerkin funktiokutsun paluuarvo. Toisessa tavassa "unohdamme" Call -sanan ja kirjoitamme aliohjelman nimen ja sen perään mahdolliset parametrit ilman sulkuja. Huom! Jos parametrejä olisi enemmän kuin yksi, tulisivat ne aliohjelma/funktio -kutsun perään pilkulla eroteltuina.

Yksityinen vai julkinen

Esimerkissämme sekä funktio, että aliohjelma olivat yksityisiä (Private). Käytännössä tämä tarkoittaa sitä, että em. funktiota/aliohjelmaa voidaan käyttää (eli kutsua) vain sen lomakkeen/moduulin/luokan/yms. sisällä mihin se on kirjoitettu. Eli jos olemme kirjoittaneet yksityisen aliohjelman lomakkeelle frmTesti, voimme kutsua aliohjelmaa vain frmTesti -lomakkeen sisältä.

Vastaavasti jos määrittelemme funktion/aliohjelman julkiseksi (Public), voimme kutsua em. funktiota/aliohjelmaa mistäpäin projektia tahansa.

Byval, ByRef

Metodeilla voi olla kahdentyyppisiä parametreja, ByVal (ns. kopioparametri) ja ByRef (ns. viittausparametri). Käytännössä ByVal -parametriä käytettäessä metodille annettu parametritieto kopioidaan, ByRef:iä käytettäessä parametritieto viedään viittauksena. Mitä etuja/haittoja em. tavoissa sitten on? Kopiossa parametritieto kopioidaan, tämän hyvä puoli on se, että parametriä voidaan vapaasti muuttaa metodissa eikä se vaikuta parametrin alkuperäiseen arvoon. Huonona puolena on muistin kulutus. Viittauksessa metodille viedään parametritiedon osoite, hyvänä puolena on se, että nyt ei kuluteta turhaan muistia tiedon kopioinnissa kahteen kertaan. Huonona puolena on se, että jos metodissa muutetaan parametritiedon arvoa, muuttuu myös alkuperäinen arvo! Alla esimerkki metodista, jolla toinen parametri on kopiotyyppinen ja toinen viittaustyyppinen. Toimiakseen esimerkki vaatii yhden CommandButton -kontrollin lisäämistä lomakkeelle.
Private Sub Command1_Click()

    Dim x1 As Long
    Dim x2 As Long

    x1 = 100
    x2 = 100

    muutaArvoja x1, x2
    MsgBox "x1=" & x1 & ", x2=" & x2

End Sub

Private Sub muutaArvoja(ByVal Parametri1 As Long, ByRef Parametri2 As Long)

    ' Vähennetään parametrinä tulleen kopioparametrin tiedon arvosta 1
    Parametri1 = Parametri1 - 1

    ' Vähennetään parametrinä tulleen kopioparametrin tiedon arvosta 1
    Parametri2 = Parametri2 - 1

    MsgBox "Parametri1=" & Parametri1 & ", Parametri2=" & Parametri2

End Sub
Käydäänpäs esimerkkiä läpi niin ymmärrämme eron kopio- ja viittausparametrien välillä. Painikkeen Click -tapahtumassa meillä on ohjelmakoodi, joka määrittelee ensin kaksi
muuttujaa, x1 ja x2. Muuttujat alustetaan arvolla 100. Tämän jälkeen kutsutaan muutaArvoja -aliohjelmaa kahdella parametrillä, x1 ja x2. Ensimmäinen parametri on kopioparametri, toinen viittausparametri. Aliohjelmassa muutamme kummankin parametrin arvoa (vähennämme parametrin arvoa yhdellä). Tulostamme parametrien arvon aliohjelmassa. Tämän jälkeen ohjelmakoodin suoritus palaa takaisin aliohjelmakutsua edeltäneeseen paikkaan, jossa tulostamme parametriksi antamiemme muuttujien arvot. Nyt huomaamme, että kopioparametrin arvo pysyi samana, koska aliohjelma muutti kopion arvoa. Viittausparametriksi annetun muuttujan arvo muuttui, koska aliohjelma muutti parametrin alkuperäisen muuttujan arvoa.
Tehtävä 8
Tehtävä 9