Kirjautuminen

Haku

Tehtävät

Opasarkisto: Visual Basic -opas: Osa 5 - Aliohjelmat ja funktiot

  1. Osa 1 - Johdanto
  2. Osa 2 - Käyttöliittymä
  3. Osa 3 - Muuttujat ja taulukot
  4. Osa 4 - Ehdot ja silmukat
  5. Osa 5 - Aliohjelmat ja funktiot
  6. Osa 6 - Hiiri ja näppäimistö
  7. Osa 7 - VB:n grafiikkakomennot
  8. Osa 8 - Tiedostot
  9. Osa 9 - WinAPIn käyttö

Kirjoittaja: Antti Laaksonen

⚠ Huomio! Tämä opas on vanhentunut. Oppaan sisältöön ei voi enää luottaa. Opas on säilytetty vain sen historiallisen arvon vuoksi. ⚠


Tässä osassa käydään läpi kolme aihetta: aliohjelmat ja funktiot, valikot ja hyvän koodin tekeminen. Aliohjelmia ja funktioita tarvitaan jokaisessa vähänkin suuremmassa ohjelmassa, ja niiden käyttäminen kannattaa opetella kerralla hyvin. Ikkunan yläreunassa sijaitsevat valikot luodaan Visual Basicissa täysin graafisesti, ja se on varsin helppoa ja loogista. Lopuksi hyvän koodin tekeminen opastaa oikeaoppisen ja selkeän koodin tekemiseen, mikä osoittautuu myöhemmin tärkeäksi.

Aliohjelmat ja funktiot

Aliohjelmia ja funktioita käytetään, kun ohjelmassa toistuu jokin kohta useita kertoja. Aliohjelmat suorittavat tietyn koodipätkän saamiensa parametrien perusteella, funktiot voivat lisäksi palauttaa jonkin arvon. Toisin kuin monissa muissa kielissä, Visual Basicissa aliohjelmat ja funktiot määritetään eri käskyillä, aliohjelmat määritetään käskyllä Sub ja funktiot käskyllä Function.

Aliohjelmat

Otetaan heti alkuun esimerkki yksinkertaisesta aliohjelmasta:

Sub NaytaKertoTaulu (luku As Integer)
    Dim i As Integer, teksti As String
    For i = 1 To 10
        teksti = teksti & luku & "*" & i & "=" & (luku * i) & vbCrLf
    Next
    MsgBox teksti
End Sub

Aliohjelma näyttää MsgBoxissa halutun luvun kertotaulun 1-10. Aliohjelmaa voitaisiin kutsua vaikkapa seuraavasti:

Private Sub Form_Load ()
    NaytaKertoTaulu 2
    NaytaKertoTaulu 5
    NaytaKertoTaulu 10
    NaytaKertoTaulu 20
End Sub

Nyt ohjelma näyttää lukujen 2, 5, 10 ja 20 kertotaulut MsgBoxeissa. Aliohjelmat paitsi lyhentävät koodia myös selkeyttävät sitä. Lisäksi kun kerran kirjoittaa hyvin toimivan aliohjelman, sitä voidaan käyttää uudestaan toisissa ohjelmissa.

Aliohjelmat kirjoitetaan siis Sub...End Sub-lauseiden väliin. Aliohjelman nimen jälkeen annetaan sen parametrit tyyppeineen suluissa. Suluissa olevat muuttujat toimivat saman nimisinä aliohjelman sisällä ilman eri määrittelyjä. Parametreja voi olla useita pilkulla erotettuina.

Funktiot

Funktiot ovat hyvin samantapaisia kuin aliohjelmat, ero on, että niillä on muuttujatyyppi ja ne palauttavat jonkin arvon. Otetaan taas esimerkki:

Function LaskeIka (syntymavuosi As Integer) As Integer
    Dim nykvuosi As Integer
    nykvuosi = Val(Format(Now, "yyyy"))
    LaskeIka = nykvuosi - syntymavuosi
End Function

Tämä funktio laskee henkilön tämänhetkisen iän syntymävuoden perusteella. Vuosi haetaan Format-aliohjelman avulla Now-erikoismuuttujasta, joka sisältää tämänhetkisen tarkan ajan. Funktiota voitaisiin käyttää vaikka seuraavasti:

Private Sub Form_Load ()
    Dim svuosi As Integer
    svuosi = InputBox("Anna syntymävuotesi:")
    MsgBox "Ikäsi on siis " & LaskeIka(svuosi) & " vuotta"
End Sub

Ohjelma kysyy ensin InputBoxilla käyttäjän syntymävuoden. Sen jälkeen funktio laskee tämänhetkisen iän ja ilmoittaa sen MsgBoxissa.

Funktion määrittelyn perään lisätään siis se muuttujatyyppi, jonka funktio palauttaa, tässä tapauksessa Integer. Funktion palautusarvo määritetään yhtäsuuruusmerkillä esimerkin viimeisen rivin mukaisesti, aivan kuten muuttujien kanssa.

Lisää aliohjelmista ja funktioista

Aliohjelmien ja funktioiden määrittelyjen eteen voidaan laittaa avainsana Private tai Public aivan kuten muuttujissa. Private-avainsana tarkoittaa, että aliohjelma tai funktio on voimassa vain sen formin, moduulin tai luokan sisällä, jossa se on. Public-avainsanalla (oletus) aliohjelmia ja funktioita voidaan kutsua mistä tahansa ohjelman osista.

Parametrit ovat oletuksena pakollisia, mutta niistä voidaan tehdä tarvittaessa myös vapaaehtoisia. Tämä onnistuu Optional-avainsanalla joka laitetaan parametrin nimen eteen, esimerkiksi seuraavasti:

Sub Testi (Eka As Integer, Optional Toka As Integer)

Tällöin muuttuja Eka on annettava aina, Toka taas voidaan antaa tai olla antamatta tilanteen mukaan. Jos muuttujaa ei ilmoiteta, sen arvo on 0 (luvut) tai "" (merkkijonot).

Valikot

Melkein jokaisessa ohjelmassa käytetään valikoita eli englanniksi menuja. Yleisimpiä valikkoja ovat mm. Tiedosto, Muokkaa ja Ohje (File, Edit ja Help). Kun teet ohjelmaasi valikkoja, yritä tehdä niistä yhtenäisiä valmiiden Windows-ohjelmien kanssa.

Visual Basicissa valikot luodaan täysin graafisesti Tools-valikon Menu Editorin avulla, ja niiden tekeminen on varsin helppoa ja nopeaa. Jokaista valikkokohtaa vastaa yksi rivi editorin alaosassa olevassa listassa. Oikealle- ja vasemmalle-nuolinäppäimillä määritetään, millä tasolla kyseinen valikkokohta on. Valikkokohtien taso näkyy listassa pisteinä.

Kaikkein vasemmanpuolisimmat valikkokohdat näkyvät ylhäällä. Yksi pykälä oikealle tarkoittaa, että valikkokohta kuuluu suoraan ylävalikkoon. Jokaisesta valikkokohdasta voi lisäksi lähteä alivalikkoja aina viiteen tasoon asti. Kullakin valikkokohdalla on otsikko (Caption) ja nimi (Name). Jos Captioniksi kirjoittaa -, valikkoon tulee väliviiva.

Valikkokohdille voidaan antaa komponenttien tapaan indeksi (Index) ja niille voidaan valita pikanäppäin (Shortcut). Lisäksi niillä on Enabled- ja Visible-arvot sekä Checked-arvo, jolloin valintoja voidaan merkitä. Jos WindowList on valittu, valikon perään lisätään lista MDI-ikkunan aukiolevista ikkunoista.

Hyvän koodin tekeminen

Visual Basicissa, kuten kaikissa muissakin ohjelmointikielissä, on monia yleisiä tapoja ja käytäntöjä, jotka tekevät ohjelmasta selkeämmän, ja tekevät siitä helpommin tutkittavan myöhemmin, niin itselle kuin muillekin ohjelmille. Tässä on esitetty niistä tärkeimmät.

Kommentointi

Jos vain suinkin viitsii, ohjelmat kannattaa kommentoida hyvin ja huolellisesti. Kommentointi tarkoittaa oman tekstin lisäämistä ohjelmaan, jolloin ohjelman eri osien toiminta ja merkitys selvenee. Visual Basicissa kommentointi tapahtuu heittomerkeillä esimerkiksi seuraavaan tapaan:

'näyttää tervehdyksen
MsgBox "Tsaukki!"

Vaikka runsas kommentointi onkin hyvä asia, jokin raja siinäkin on. Kaikkia yksittäisiä käskyjä ja itsestäänselvyyksiä ei kannata kommentoida. Hyvien kommenttien tekeminen on taitolaji, siinä kyllä harjaantuu ajan myötä.

Sisentäminen

Tästä monen aloittelijan mielestä turhasta asiasta on melkein mahdotonta luopua sitten kun sen on kerran ottanut tavaksi: niin paljon sisentäminen selkeyttää ohjelman rakennetta. Periaate on se, että aina aliohjelma- ja funktiomäärittelyiden (Sub, Function), ehtolauseiden (If...Then, Select Case) ja silmukoiden (Do...Loop, For...Next) alussa painetaan Tab-näppäintä, jolloin rivin alku siirtyy muutaman merkin oikealle ja lopussa Shift+Tab jolloin rivin alku palautuu ennalleen.

Tällöin ohjelmasta nähdään helpommin ja nopeammin kaikkien lauserakenteiden alat, ja koodi näyttää paljon siistimmältä. Vaikka sisentäminen tuntuisi nyt turhalta, aloita se silti: ennemmin tai myöhemmin ymmärrät sen merkityksen. Voit katsoa esimerkkiä myös valmiista koodinpätkistä, kuten Visual Basicin esimerkkiohjelmista ja Ohjelmointiputkan koodivinkeistä.

GoTo-käskyt unholaan

Visual Basic sisältää yhteensopivuussyistä monia vanhojen Basicin käskyistä, joita kannattaa välttää nykyaikaisissa ohjelmissa. Yleisimpiä näistä ovat GoTo ja GoSub -hyppykäskyt. Jotta näkisit, millaista Basic voi pahimmillaan olla, tässä näyte eräästä vanhasta rivinumeroin toteutetusta QBasic-ohjelmasta:

1132 IF S <> V THEN 1138
     IF Z = 1 THEN 1144
     Q = 1: GOTO 1140
1138 IF W(R, S + 1) <> 0 THEN 1144
1140 X = INT(RND * 2) + 1: ON X GOTO 1184, 1206
1144 GOTO 1184
1146 IF R = H THEN 1164
     IF W(R + 1, S) <> 0 THEN 1164
     IF S <> V THEN 1156
     IF Z = 1 THEN 1162
     Q = 1: GOTO 1186

Kuten varmaan huomaat, vähänkin enemmän käytettynä GoTo-käskyt sekoittavat koodia niin paljon, ettei siitä pian ymmärrä kukaan mitään. Vältä siis näitä käskyjä niin pitkälle kuin mahdollista, ne voidaan melkein aina korvata sopivilla ehtolausekkeilla.

Lopuksi

Viides osa alkaa olla lopussa, mutta ei hätää: jatkoa on luvassa. Miten nopeasti, se riippuu oppaasta saamastani palautteesta, jota voi lähetellä keskustelualueelle tai sähköpostilla.

Seuraavien osien teemoja ovat mm. hiiren ja näppäimistön käsittely sekä grafiikka.


Kommentit

jlofman [12.04.2006 09:09:17]

#

Miten kutsun public function tai aliohjelman moduulista jos tarvitsen sitä jonkun Sheet:in ohjelmassa?

JAMSUO93 [08.01.2009 23:46:28]

#

jaaa-a, eipä nätytä kukaan tietävän kun ei vatausta kuulu :P

Kirjoita kommentti

Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta