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.
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.
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 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.
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).
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.
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.
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ä.
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ä.
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.
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.
Miten kutsun public function tai aliohjelman moduulista jos tarvitsen sitä jonkun Sheet:in ohjelmassa?
jaaa-a, eipä nätytä kukaan tietävän kun ei vatausta kuulu :P
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.