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
VB:ssä meidän ei tarvitse käyttää assemblerissa käytettyä tiedon tallennustapaa vaan voimme määrittää ohjelmakoodissa suoraan muuttujan. Tällöin VB varaa muistista tietystä paikasta tilaa em. muuttujalle valitsemallamme nimellä. Alla on esitelty LONG -tyyppisen muuttujan määrittely:
Dim Luku1 As Long
Muuttuja | Muistimäärä | Muuttujan arvoalue | Käyttötarkoitus | Nimeäminen |
---|---|---|---|---|
Integer | 2 tavua | -32768 to 32767 | Pienten lukujen säilyttämiseen Huom! Ei desimaalilukuja! |
iMuuttuja |
Long | 4 tavua | -2147483648 to 2147483647 | Isojen lukujen säilyttämiseen! Huom! Ei desimaalilukuja |
lMuuttuja |
Single | 4 tavua | -3.402823E38 to 3.402823E38 | Pienten desimaalukujen säilyttämiseen | sMuuttuja |
Double | 8 tavua | -1.79769313486232E308 to 1.79769313486232E308 | Suurten desimaalilukujen säilyttämiseen | dMuuttuja |
Currency | 8 tavua | -922337203685477.5808 to 922337203685477.5808 | Rahamäärän säilyttämiseen | curMuuttuja |
String | 1 tavu per yksi merkki | 0-65535 merkkiä | Tekstin säilyttämiseen | strMuuttuja |
Boolean | 2 tavua | True tai False | Kyllä/Ei -arvojen säilyttämiseen | bMuuttuja |
Date | 8 tavua | 1.1.100 to 31.12.9999 | Päivämäärän säilyttämiseen | dateMuuttuja |
Variant | 16/22 tavua | Muiden muuttujatyyppien arvoalueet | Minkä tahansa tietotyypin tiedon säilyttämiseen | varMuuttuja |
Dim M1 As Long Private M2 As Long Public M3 As Long 'Global M4 as longEm. muuttujat on määritelty lomakkeen ohjelmakoodiin. Muuttuja M1 "näkyy" (eli on käytettävissä) vain lomakkeen sisällä kuten myös yksityinen muuttuja M2. Muuttuja M3 näkyy myös lomakkeen ulkopuolelle koska se on määritelty julkiseksi. Kuten ehkä huomasit, neljäs vaihtoehto eli Global -määrittely EI onnistu lomakkeella. Voit määritellä jonkin muuttujan globaaliksi kirjoittamalla määrittelyn moduuliin.
Kuten ehkä huomasit, emme ole käsitelleet vielä staattista muuttujaa. Staattinen muuttuja (kuten nimikin jo sanoo) "muistaa" muuttujan arvonsa. Tämä tarkoittaa sitä, että jos määrittelemme muuttujan esim. metodissa Static -määritteellä, "muistaa" muuttuja arvonsa vaikka poistuisimme välillä metodista. Alla esimerkki "normaalin" muuttujan määrittelystä ja käytöstä ja staattisen muuttujan määrittelystä ja käytöstä:
Private Sub Command1_Click() ' Kutsutaan aliohjelmaa viisi kertaa kaynnit kaynnit kaynnit kaynnit kaynnit End Sub Private Sub kaynnit() Static lStaattinenMuuttuja As Long Dim lNormaaliMuuuttuja As Long lStaattinenMuuttuja = lStaattinenMuuttuja + 1 lNormaaliMuuuttuja = lNormaaliMuuuttuja + 1 MsgBox "lStaattinenMuuttuja=" & lStaattinenMuuttuja & ", lNormaaliMuuuttuja=" & lNormaaliMuuuttuja End SubOhjelmakoodissamme kutsumme kaynnit -aliohjelmaa viisi kertaa peräkkäin. Aliohjelmassa on määritelty kaksi muuttujaa, staattinen muuttuja lStaattinenMuuttuja ja "normaali" muuttuja lNormaaliMuuttuja, molemmat Long -tyyppisiä. Jokaisella kerralla kun menemme aliohjelmaan, muuttuja lNormaaliMuuttuja alustetaan uudestaan arvolla nolla. Kun nollaan lisätään arvo 1, saadaan muuttujan arvoksi jokaisella kierroksella 1. Staattinen muuttuja alustetaan arvolla 0 kun menemme aliohjelmaan ensimmäisen kerran. Ensimmäisellä kierroksella staattisen muuttujan arvo on siis 1. Kun menemme toisen kerran aliohjelmaan, staattista muuttujaa ei alusteta koska se on jo alustettu ja siinä on tallessa edellisen kierroksena arvo 1 jota kasvatamme ykkösen verran.
Huom! Muista, että kahta samannimistä muuttujaa EI saa määritellä jos niiden voimassaoloalueet "risteävät"! Käytännössä tämä tarkoittaa sitä, että jos meillä on kaksi aliohjelmaa, jossa kussakin määrittelemme samannimiset muuttujat, ei siitä aiheudu ongelmia koska muuttujat eivät ole voimassa metodinsa ulkopuolella. Toisaalta jos määrittelemme kaksi globaalia, samannimistä muuttujaa, tulee siitä ongelmia koska muuttujien voimassaoloalueet menevät "ristiin", eli molemmat ovat voimassa.
Muuttujan määrittely metoditasolla:
Dim lMetodiTasonMuuttuja As LongMuuttujan määrittely lomaketasolla:
Private lYksityinenLomakeMuuttuja As Long Public lJulkinenLomakeMuuttuja As LongMuuttujan määrittely moduulitasolla:
' Määritellään globaali muuttuja Global glKayttajaTunnus As LongKun käytät edellä esitettyjä muuttujan määrittelytapoja, voit olla varma, että muuttujat on määritelty oikeassa paikassa ja oikealla tavalla ja tiedät vielä niiden voimassaoloalueen.
Dim lTaulukko(10) As Long ' Asetetaan taulukon ensimmäiseen alkioon arvo 1 lTaulukko(0) = 1 ' Asetetaan taulukon viimeiseen alkioon arvo 10 lTaulukko(9) = 10 ' Tulostamme taulukon molempien alkioiden arvot MsgBox "Taulukon 1. alkion arvo on " & lTaulukko(0) & ", taulukon viimeisen alkion arvo on " & lTaulukko(9)Ensimmäisellä rivillä määrittelemme Long -tyyppisen taulukon nimeltä lTaulukko jonka koko on kymmenen alkiota. Sitten asetamme taulukon ensimmäisen alkion arvoksi luvun 1. Muista, että taulukko alkaa aina indeksistä 0. Eli jos taulukon koko on kymmenen alkiota, viimeisen alkion indeksi on 9.
' Määritellään taulukko ilman kokoa Dim lTaulukko() As Long ' Määritellään taulukon kooksi 5 ReDim lTaulukko(10) As Long ' Asetetaan taulukon ensimmäiseen alkioon arvo 1 lTaulukko(0) = 1 ' Asetetaan taulukon viimeiseen alkioon arvo 10 lTaulukko(9) = 10 ' Tulostamme taulukon molempien alkioiden arvot MsgBox "Taulukon 1. alkion arvo on " & lTaulukko(0) & ", taulukon viimeisen alkion arvo on " & lTaulukko(9) ' Määritellään taulukon kooksi 5, vanhat arvot tuhoutuvat ReDim lTaulukko(10) As Long ' Tulostamme taulukon molempien alkioiden arvot MsgBox "Taulukon 1. alkion arvo on " & lTaulukko(0) & ", taulukon viimeisen alkion arvo on " & lTaulukko(9) ' Asetetaan taulukon ensimmäiseen alkioon arvo 1 lTaulukko(0) = 1 ' Asetetaan taulukon viimeiseen alkioon arvo 10 lTaulukko(9) = 10 ' Määritellään taulukon kooksi 5, säilytetään vanhat arvot ReDim Preserve lTaulukko(10) As Long ' Tulostamme taulukon molempien alkioiden arvot MsgBox "Taulukon 1. alkion arvo on " & lTaulukko(0) & ", taulukon viimeisen alkion arvo on " & lTaulukko(9)Aluksi määrittelemme siis taulukon ilman kokoa. Tämän jälkeen määrittelemme taulukon jonka koko on viisi alkiota. Huom! Voit määritellä joka kerta taulukon eri kokoiseksi jos se on tarpeen! Päivitämme taulukon ensimmäistä ja viimeistä alkiota ja tulostamme ne. Tämän jälkeen määrittelemme taulukon koon uudestaan ja tulostamme taulukon muuttujien arvot. Nyt huomaamme, että ReDim -määrite oli "hukannut" taulukon alkioiden arvot. Lisäämme arvot taulukkoon ja määrittelemme taulukon koon taas uusiksi, nyt käytämme kuitenkin Preserve -määritettä jonka edun huomaamme taulukon alkioiden tietoja tulostettaessa: taulukon alkioiden tiedot ovat säilyneet taulukon koon uudelleenmäärittelystä huolimatta.
Huom! Taulukon läpikäymiseen kannattaa käyttää silmukoita!
Option Explicit ' Määritetään vakiomuuttuja arvolla 3.147 Private Const dPii = 3.147 Private Sub Form_Load() ' Tulostetaan vakiomuuttujan arvo MsgBox "dPii=" & dPii ' Yritetään muuttaa vakiomuuttujan arvoa 'dPii = 4.4343 End SubIhan ensimmäisenä huomaatkin Option Explicit -lausekkeen. Tämä ei sinällään liity mitenkään vakiomuuttujan määrittellyyn vaan se tarkoittaa sitä, että jos tämä lause löytyy ohjelmasta, täytyy kaikki muuttujat määritellä. Lause Private Const dPii = 3.147 -määrittelee vakiomuuttujan nimeltä dPii jonka arvo on 3,147. Kuten ehkä huomasit, VB:ssä desimaalit tulee kirjoittaa piste-erotinta käyttäen. Lomakkeen lataustapahtumassa tulostamme vakiomuuttujan arvon. Seuraava kohta onkin kommentoitu ('dPii = 4.4343) koska vakiomuuttujan arvoa EI voida muuttaa.
Ohjelma vaatii toimiakseen yhden CommandButton -tyyppisen painikkeen lisäämistä lomakkeelle.
Private Type KayttajaTiedot Etunimi As String Sukunimi As String * 50 Ika As Integer Lahiosoite As String Postinumero As String * 5 Postitoimipaikka As String * 30 End Type Private Sub Command1_Click() Dim TeppoTestaaja As KayttajaTiedot TeppoTestaaja.Etunimi = "Teppo" TeppoTestaaja.Sukunimi = "Testaaja" TeppoTestaaja.Lahiosoite = "Teponkuja 3 A 4" TeppoTestaaja.Postinumero = 93939 TeppoTestaaja.Postitoimipaikka = "Teppola" MsgBox "Hei " & TeppoTestaaja.Etunimi & " " & TeppoTestaaja.Sukunimi & "!" End SubKoska määrittelimme KayttajaTiedot -tyyppimäärittelyn lomakkeella, tulee tyyppimäärittelyn olla yksityinen. Jos määrittelisimme tyyppimäärittelyn moduulissa, voisi tyyppimäärittely olla julkinen ja käytettävissä koko projektin alueella, nyt käyttöalue on rajoittunut lomakkeelle missä ohjelmakoodi sijaitsee.
Tyyppimäärittely kirjoitetaan siis Type ja End Type -rivien väliin. Type -sanan edessä oleva Public/Private määrittää näkyvyysalueen ja Type -sanan perässä oleva teksti on tehtävän tyyppimäärittelyn nimi, tässä tapauksessa KayttajaTiedot.
Määrittelemme oman muuttujatyyppimme koostumaan kuudesta erillisestä muuttujasta (Etunimi, Sukunimi, Ika, Lahiosoite, Postinumero ja Postitoimipaikka). Kuten ehkä huomasit, muuttuja Etunimi on määritelty "normaalisti" mutta esim. muuttuja Sukunimi on määritelty siten, että muuttujan tyypin (tässä tapauksessa String) jälkeen on * 50. Käytännössä tämä tarkoittaa sitä, että jos meillä on merkki * ja jokin numero sen perässä (meidän tapauksessamme numero 5), määritämme tällöin String -muuttujan pituudeksi 50 merkkiä. Etunimessä em. merkintää ei ole käytössä joten etunimi voi olla maksimissaan 65535 merkkiä pitkä teksti.
Jotta määrittelemäämme "omaa muuttujaa" (tyyppimäärittely) voisi käyttää, tulee meidän luoda uusi muuttuja jonka tyyppi on em. KayttajaTiedot. Tämän jälkeen voimme asettaa muuttujamme (tässä tapauksessa TeppoTestaaja) arvoja, eli etunimen, sukunimen, iän, lähiosoitteen, postinumeron ja postitoimipaikan.
Lopuksi tulostamme muuttujan sisältämiä tietoja. Etunimi tulostuu normaalisti, sitten tulostamme välilyönnin ja lopuksi sukunimen ja perään huutomerkin. Kuten alla olevasta kuvasta voi huomata, sukunimi sisältää tyhjiä merkkejä 42 kpl (sukunimi -kentän pituus 50 merkkiä, tiedon pituus 8 merkkiä eli loput merkit ovat tyhjiä).
Esimerkkiohjelmamme tuloste.
Tilanteesta riippuen kannattaa käyttää tyyppimäärittelyssä vakiomittaisia kenttiä (eli laittaa * ja numero perään) tai sitten käyttää normaalimäärittelyä. Tällainen tilanne voisi olla esimerkiksi silloin kun tallennamme tiedostoon tietoa binäärisenä, tällöin tiedon on oltava vakiopituista.