Johdantoa ohjelmointiin



Samankaltaiset tiedostot
Ohjausjärjestelmien jatkokurssi. Visual Basic vinkkejä ohjelmointiin

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus)

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

ITKP102 Ohjelmointi 1 (6 op)

TAULUKON TEKEMINEN. Sisällysluettelo

Python-ohjelmointi Harjoitus 5

Luento 5. Timo Savola. 28. huhtikuuta 2006

Ohjelmoinnin perusteet Y Python

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Tekstinkäsittelyn jatko Error! Use the Home tab to apply Otsikko 1 to the text that you want to appear here. KSAO Liiketalous 1

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

5. HelloWorld-ohjelma 5.1

Ohjelmoinnin perusteet Y Python

Muuttujien määrittely

ITKP102 Ohjelmointi 1 (6 op)

Java-kielen perusteet

Ohjelmoinnin perusteet Y Python

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Tutoriaaliläsnäoloista

12. Javan toistorakenteet 12.1

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

GeoGebra-harjoituksia malu-opettajille

12. Javan toistorakenteet 12.1

Ohjelmoinnin perusteet Y Python

Python-ohjelmointi Harjoitus 2

OpenOffice.org Base 3.1.0

13. Loogiset operaatiot 13.1

Kielioppia: toisin kuin Javassa

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

TAULUKOINTI. Word Taulukot

Sen jälkeen Microsoft Office ja sen alta löytyy ohjelmat. Ensin käynnistä-valikosta kaikki ohjelmat

Visma Fivaldi -käsikirja Asiakaskohtaiset hinnat

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

KÄYTTÖLIITTYMÄN PIIRTÄMINEN

Scratch ohjeita. Perusteet

Ohjelmoinnin peruskurssi Y1

[Lomake.][Ohjain.]metodi [argumentit] Seuraava aliohjelma, jossa käytetään kuvakehyksen Move-metodia, luo vaikutelman etääntyvästä kuvakehyksestä:

Zeon PDF Driver Trial

Ohjelmoinnin perusteet Y Python

11. Javan toistorakenteet 11.1

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Ohjelmoinnin peruskurssi Y1

KUVAN TUOMINEN, MUOKKAAMINEN, KOON MUUTTAMINEN JA TALLENTAMINEN PAINTISSA

Visma Fivaldi -käsikirja MiniCRM

Pikanäppäin Yhdistelmiä. Luku 6 Pikanäppäimet

Ohjelmointi 1. Kumppanit

FrontPage Näkymät

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Sisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat

Ohjelmoinnin peruskurssi Y1

ITKP102 Ohjelmointi 1 (6 op)

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Käyttöliittymän muokkaus

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Ksenos Prime Käyttäjän opas

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

3. Muuttujat ja operaatiot 3.1

Juha Haataja

Ohjelmoinnin peruskurssi Y1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Sisällys. 16. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. Aritmetiikkaa toisin merkiten

TIETOKONEEN ASETUKSILLA PARANNAT KÄYTETTÄVYYTTÄ

13. Loogiset operaatiot 13.1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

16. Ohjelmoinnin tekniikkaa 16.1

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Avaa ohjelma ja tarvittaessa Tiedosto -> Uusi kilpailutiedosto

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Tekstinkäsittelyn jatko KSAO Liiketalous 1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

NÄIN TEET VIDEO-MAILIN (v-mail)

C# Windows ohjelmointi perusopas

KUVANKÄSITTELY THE GIMP FOR WINDOWS OHJELMASSA

Vesa Ollikainen, päivitys Juha Haataja

16. Ohjelmoinnin tekniikkaa 16.1

ITKP102 Ohjelmointi 1 (6 op)

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Sisältö. 22. Taulukot. Yleistä. Yleistä

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Java-kielen perusteet

Jypelin käyttöohjeet» Miten saan peliin pistelaskurin?

Ohjelmoinnin perusteet Y Python

VERKKOVELHO-YLLÄPITOTYÖKALUN KÄYTTÖOHJE

ASENNUS- JA KÄYTTÖOHJE

Ohjelmoinnin peruskurssi Y1

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

1 Asentaminen. 2 Yleistä ja simuloinnin aloitus 12/

Harjoitus 2 (viikko 45)

5. HelloWorld-ohjelma 5.1

Ajokorttimoduuli Moduuli 2. - Laitteenkäyttö ja tiedonhallinta. Harjoitus 1

Transkriptio:

Johdantoa ohjelmointiin Mikä ensimmäiseksi ohjelmointikieleksi? Ensimmäisestä ohjelmointikielestä on riittänyt juttua Internetin keskusteluryhmissä ja - palstoilla. Kaikenlaisia kannanottoja asiasta on ollutkin, mutta välillä tuntuu siltä, että parhaita aloitusohjelmointikieliä on yhtä monta kuin ehdottajiakin. Monesti jostain kumman syystä se oma lempiohjelmointikieli tuppaa olemaan suosituslistan kärjessä. Mutta vaikeahan eri vaihtoehtoja on punnitakin, kun ohjelmoinnin voi aloittaa vain kerran elämässä. Seuraavat asiat voisi ottaa huomioon ohjelmointikielen valinnassa: Ohjelmointiympäristön asentaminen on helppoa tai mukana on kunnolliset asennusohjeet. Kieli on yksinkertainen mutta opettaa kuitenkin ohjelmoinnin perusasioita. Kielellä saa heti jotain kiinnostavaa aikaan. Motivaatio nopeuttaa oppimista huomattavasti. Kieleen on helposti saatavilla suomenkielistä oppimateriaalia (esim. Internetistä tai kirjastosta). Kieltä osaavaa väkeä löytyy ystäväpiiristä tai Internetin ohjelmointiaiheisilta keskustelualueilta. Edellisin perustein seuraavat ohjelmointikielet ovat sopivia aloittelijalle: Perinteinen ohjelmoinnin aloituskieli on Basic. Tällä hetkellä suosituimmat Basickielet ovat Microsoftin valmistamia: DOSille QBasic ja Windowsille Visual Basic. Ensimmäiset Basicit olivat melko alkeellisia ja ohjelmista tuli helposti sekavia, minkä vuoksi kielellä on edelleen huono maine monien ohjelmoijien keskuudessa. Basic on kuitenkin kehittynyt huimasti vuosien saatossa, ja esimerkiksi Visual Basic riittää paljon pidemmälle kuin alkeisiin. C on yksi suosituimmista ohjelmointikielistä, jolla on tehty kokonaisia käyttöjärjestelmiä. Kieli ei itsessään sisällä mitään järjestelmäriippuvaisia toimintoja; jopa tekstin kirjoittaminen näytölle täytyy toteuttaa erillisen kirjaston avulla. Tämän menettelyn etuna on se, että standardinmukainen C-koodi toimii ilman muutoksia järjestelmällä kuin järjestelmällä. C-kieli saattaa alkuun vaikuttaa hankalalta, mutta hyvästä ohjelmointioppaasta on apua tähän vaivaan. Basicin ja C:n välimaastossa oleva Pascal on myöskin hyvä valinta ensimmäiseksi kieleksi. Ehkä tunnetuin Pascal-kielien valmistaja on Borland, jonka Turbo Pascal (DOS) ja Delphi (Windows) ovat hyväksi havaittuja ohjelmointivälineitä. Delphi ja Visual Basic ovat suurin piirtein samanveroisia, vain niiden käyttämä kieli on eri. Jos Internet-ohjelmointi kiinnostaa vähänkin, kannattaa hetimmiten tutustua PHP:hen, joka on ilmainen, helppo ja tehokas palvelinpohjainen ohjelmointikieli.

PHP:n käyttömahdollisuudet ovat lähes rajattomat: kielellä voi luoda niin yksinkertaisen kävijälaskurin omalle kotisivulle kuin kokonaisen tietokantoja hyödyntävän verkkopalvelun. Jos joku ehdottaa kieltä X ensimmäiseksi ohjelmointikieleksi, koska "siitä on hyötyä myöhemmin", kannattaa sellaisen puheen antaa mennä toisesta korvasta sisään ja toisesta ulos. Ensinnäkään kukaan ei voi tietää, millä kielellä tulevaisuudessa ohjelmoidaan. Lisäksi uusien ohjelmointikielien oppiminen on helppoa, kun yksi kieli on suurinpiirtein hallussa. Kaikissa yleisimmissä ohjelmointikielissä toistuvat nimittäin samat perusasiat. Ja sellaista kieltä ei ole olemassakaan, joka soveltuisi kaikkiin ohjelmointitehtäviin. Ohjelmoija ei ole sidottu yhteen kieleen. Sanastoa Ohjelma täytyy muuntaa mahdollisimman yksinkertaiselle tasolle, konekielelle, jotta tietokone pystyy sen suorittamaan. Kääntäjä (compiler) muuttaa koko ohjelman yhdellä kertaa konekieliseksi, jonka jälkeen alkuperäistä koodia ei enää tarvita ohjelman suorittamiseen. Käytännössä aina lopullinen ohjelma on käännetty, esimerkiksi Windowsin EXE-tiedostot. Tulkki (interpreter) taas muuttaa ohjelmakoodin rivejä konekieliseksi sitä mukaa, kun ohjelman suoritus edistyy. Vakio (constant) on koko ohjelman suorituksen ajan samana pysyvä tieto, jolle on annettu tekstitunnus. Esimerkiksi vakion PII arvo voisi olla 3,14159. Muuttuja (variable) on ohjelman aikana mahdollisesti vaihtuva tieto, esimerkiksi Kajaanin lämpötila. Taulukko (array) sisältää yhdessä paketissa monta muuttujaa, esimerkiksi kaikkien Suomen kaupunkien lämpötilat. Useimmissa ohjelmointikielissä muuttujalla on tyyppi. Merkkijono (string) on tekstiä sisältävä muuttuja, kokonaisluku (integer) lienee ennestään tuttu ja liukuluku (floatingpoint number) vastaa desimaalilukua. Boolean-arvo (Boolean value) on joko tosi tai epätosi. Muuttujan viemä tila muistissa vaikuttaa siihen, kuinka paljon muuttujaan mahtuu tietoa: mikä on merkkijonon maksimipituus tai miten monta numeroa luvussa saa olla. Esimerkiksi kahden tavun kokoisen kokonaislukumuuttujan rajat voivat olla -32768-32767. Aliohjelmia (subprogram) ja funktioita (function) käytetään silloin, kun ohjelmassa toistuu useaan otteeseen samantapainen koodinpätkä. Esimerkiksi TallennaTiedotniminen aliohjelma voisi tallentaa kaikki ohjelman muuttujat tiedostoon. Parametri (parameter) on aliohjelmalle tai funktiolle pääohjelmasta välitettävä tieto. Funktiolla on usein myös palautusarvo (return value). Esimerkiksi MuutaMarkatEuroiksi-funktio voisi parametrin 100 saatuaan palauttaa arvon 16,82. Proseduuri (procedure) on yleisnimitys aliohjelmille ja funktioille. Kirjasto (library) on kokoelma tiettyyn aiheeseen liittyviä aliohjelmia ja funktioita. Esimerkiksi DirectX ja OpenGL ovat grafiikkakirjastoja: niiden ansiosta ohjelmoijalla on käytössään valmiit työkalut grafiikan piirtämiseksi näytölle.

Visual Basic -opas Osa 1 - Johdanto Mikä on Visual Basic? Kun Microsoft julkaisi vuonna 1991 Visual Basicin ensimmäisen version, se oli merkittävä helpotus vaikeana pidettyyn Windows-ohjelmointiin: aloittelijakin pystyi sen avulla luomaan toimivia ja tyylikkäitä ohjelmia. Uusien versioiden mukana Visual Basiciin on tullut monia parannuksia, ja se soveltuu laajojenkin ohjelmien tekemiseen. Enää Basic ei ole pelkästään aloittelijoille tarkoitettu harjoitteluohjelmointikieli, josta täytyy siirtyä pois taitojen kehittyessä. Tässä opassarjassa käytetään Visual Basicin versiota 6.0. Melkein kaikki esimerkit toimivat kuitenkin suoraan tai pienin muutoksin vanhemmilla versioilla. Sen sijaan VB.NETin opetteluun opassarja ei sovellu, koska kieli poikkeaa monilta osin Visual Basicin aiemmista versioista. Mielestäni VB.NETiin siirtymiseen ei ainakaan toistaiseksi ole syytä, vaan tavallinen Visual Basic riittää melkein kaikkiin tarkoituksiin paremmin kuin hyvin. Etuna VB.NETiin verrattuna on ohjelmien toimiminen vanhoissa käyttöjärjestelmissä. Ohjelmointiympäristö Seuraavassa kuvassa on Visual Basicin ohjelmointiympäristö perustilassa: Jokainen ohjelma on erillinen projekti, johon voi liittyä useita tiedostoja. Projektiin kuuluvat tiedostot näkyvät oikeassa yläkulmassa olevassa listassa. Tavallisin projektin osana oleva tiedosto on lomake (form), joka vastaa yhtä ohjelmaan kuuluvaa ikkunaa. Se

sisältää ikkunassa näkyvät painonapit, tekstikentät, vierityspalkit ja muut ohjaimet (controls). Tämän lisäksi lomakkeeseen kuuluu melkein aina ikkunaan liittyvää ohjelmakoodia. Kuvassa keskellä on muokkaustilassa oleva lomake sekä sen alapuolella koodi-ikkuna. Vasemman reunan työkalupalkissa on lomakkeelle lisättävät ohjaimet. Ohjain yksinkertaisesti piirretään lomakkeelle, minkä jälkeen sen sijaintia, kokoa ja ominaisuuksia (properties) pystyy muuttamaan. Ominaisuuksien muuttaminen tapahtuu ikkunan oikeassa laidassa olevan ominaisuuslistan avulla. Esimerkiksi komentopainikkeen ominaisuus Caption määrittää painikkeessa näkyvän tekstin. Myös lomakkeella on ominaisuuksia, joiden muuttaminen tapahtuu samalla tavalla. Ominaisuuksien lisäksi ohjaimiin ja lomakkeeseen liittyy tapahtumia (events) ja toimintoja (methods). Esimerkkinä komentopainikkeessa Click-tapahtumassa oleva koodi suoritetaan silloin, kun käyttäjä painaa nappulasta. Yksi painonappiin liittyvistä toiminnoista taas on SetFocus, joka aiheuttaa nappulan aktivoitumisen. Silloin muun muassa käyttäjän näppäinpainallukset ohjautuvat siihen. Ohjainten tapahtumat ohjaavat koko ohjelman suoritusta; näistä asioista tuleekin lisää tietoa oppassarjan seuraavassa osassa. Tavallinen ohjelma Nyt teemme pari yksinkertaista ohjelmaa. Lisää lomakkeelle ohjeteksti (Label), tekstikenttä (TextBox) ja painonappi (CommandButton). Ohjainten oletusnimet ovat Label1, Text1 ja Command1 ne saavat nyt kelvata. Kirjoita ohjetekstin Captionominaisuudeksi "Kirjoita nimesi:", tyhjennä tekstikentän Text-ominaisuus ja muuta vielä painonapin Caption-arvoksi "Paina!". Lopputuloksen pitäisi olla suurinpiirtein seuraavan kuvan kaltainen: Klikkaa sitten kahdesti lomakkeella olevaa nappia, jolloin koodi-ikkuna tulee esiin. Ikkunassa näkyy valmiiksi kirjoitettu koodi, joka on Command1-ohjaimen Clicktapahtuman pohja. Tämä koodi suoritetaan aina silloin, kun käyttäjä painaa nappia. Muuta koodia seuraavasti: ' tähän tullaan silloin, kun käyttäjä painaa Command1-nappia Private Sub Command1_Click() MsgBox "Terve, " & Text1.Text

Heittomerkillä alkavat rivit ovat ohjelmoijan omia kommentteja, jotka eivät vaikuta ohjelman suoritukseen. Nyt on ohjelman koeajon aika. Paina F5-näppäintä (tai nappularivistä oikealle osoittava nuolta tai Run-valikosta Start-kohtaa), jolloin ohjelma käynnistyy ja äsken tekemäsi ikkuna tulee näytölle. Kirjoita nimesi tekstikenttään ja paina nappia. Silloin näkyviin tulee pieni viesti-ikkuna, jossa on tervehdys ja kirjoittamasi nimi. Kun suljet ohjelman, palataan jälleen ohjelmointitilaan. Näkymätön ohjelma Seuraava ohjelma on hieman toisenlainen, sillä siinä ei ole lainkaan lomaketta eikä siis ikkunaa. Klikkaa lomakkeen nimestä projektilistalla, ja valitse sitten Project-valikosta Remove Form1. Nyt projektissa ei ole yhtään tiedostoa, mikä ei kuitenkaan käy päinsä. Lisää sen vuoksi moduuli (module) saman valikon kohdasta Add Module. Moduulissa voi olla ohjelman yhteisiä osia, joiden käyttäminen on mahdollista kaikista lomakkeista. Lisäksi on mahdollista tehdä näkymätön ohjelma, joka on kokonaan moduulissa. Näin me teemme nyt. Kirjoita moduuliin seuraava koodi: ' tähän tullaan heti ohjelman käynnistyessä Sub Main() MsgBox "Tässä ohjelmassa ei ole lainkaan ikkunaa!" Paina sitten F5, jolloin näkyviin tulee viesti-ikkuna. Heti sen jälkeen ohjelma sulkeutuu. Ohjelman suoritus alkaa automaattisesti moduulissa olevasta Main-osasta, koska projektissa ei ole mitään muita tiedostoja. Jos kuitenkin projektissa on muita tiedostoja, moduulialoitus täytyy erikseen valita Project-valikon alimmasta Properties-kohdasta. Ohjelman aloittava lomake tai moduuli valitaan Startup Object -listasta. Ohjelman kääntäminen Ohjelman kääntäminen tarkoittaa, että siitä tehdään itsenäinen, ajettava exe-tiedosto, jota voi käyttää toisella koneella ilman Visual Basicia. Ohjelma käännetään valitsemalla Filevalikosta kohta Make [nimi].exe. Ennen kääntämistä pääsee vielä vaikuttamaan ohjelman tietoihin ja käännökseen liittyviin asetuksiin painamalla tallennusikkunassa Optionsnappia. Jokainen Visual Basicilla tehty ohjelma vaatii toimiakseen koneelle asennetun ajonaikaisen kirjaston. Tiedoston nimi riippuu Visual Basicin versiosta, esimerkiksi kuutosversiolla tehty ohjelma ei toimi ilman MSVBVM60.DLL-tiedostoa. Ajonaikaisen kirjaston koko on sen verran suuri, ettei sitä yleensä kannata laittaa Internetistä ladattavan ohjelman mukaan. Sen sijaan kannattaa ilmoittaa osoite, josta kirjaston voi kopioida, jos käyttäjällä ei ole sitä valmiiksi koneellaan.

Tiedostojen päätteitä Seuraavassa taulukossa on tavallisia Visual Basicin tiedostopäätteitä: pääte selitys vbp projektitiedosto, joka sisältää kaikkien muiden projektiin kuuluvien tiedostojen nimet frm ikkunaa vastaava lomake, jossa on ohjaimet ja niihin liittyvät ominaisuudet sekä koodi frx sisältää lomakkeeseen liitetyn grafiikan (tästä ei tarvitse huolehtia itse) bas moduuli, jossa on yleisiä ohjelman osia; voi myös olla itsenäinen ohjelma cls luokka, joka vastaa pääosin moduulia, mutta on olio-ohjelmointia Tiedostot tallennetaan tavallisessa tekstimuodossa, minkä ansiosta niitä pystyy muokkaamaan millä tahansa tekstieditorilla. Osa 2 - Käyttöliittymä Melkein jokaiseen Windows-ohjelmaan kuuluu käyttöliittymä: käyttäjälle näkyvät ikkunat ja niiden sisällä olevat ohjaimet ja valikot. Visual Basicissa käyttöliittymän suunnittelu on helppoa, koska se tapahtuu suurimmaksi osaksi piirtämällä ja ikkuna on koko ajan näkyvillä lopullisessa muodossaan. Useimmat eri ohjainten ominaisuuksista ja tapahtumista ovat yhteisiä, ja niiden tarkoitusta ei ole vaikea päätellä. Tässä oppaassa käydään läpi tärkeimmät ohjaimet ja niiden yleisimmät käyttötarkoitukset. Lopuksi tulee vielä neuvoja käyttöliittymän suunnitteluun. Ominaisuudet, tapahtumat ja toiminnot Visual Basicin ohjaimiin liittyy monia ominaisuuksia, tapahtumia ja toimintoja. Eräät niistä ovat samoja melkein joka ohjaimessa, toiset taas erityisesti tiettyyn ohjaimeen kuuluvia. Jokaisella ohjaimella esimerkiksi on Name-ominaisuus, joka ilmoittaa ohjaimen nimen. Suurimman sallitun pituuden määräävä MaxLength sitä vastoin on pelkästään tekstikentän ominaisuus. Ominaisuuksia ovat muiden muassa ohjaimen nimi, sijainti ja koko, siinä näkyvä teksti tai kuva, väri ja fontti. Joitain ominaisuuksia voi muuttaa vain suunnittelutilassa ominaisuuslistan avulla, ja ohjelman suorituksen aikana niitä pystyy pelkästään lukemaan. Toiset ominaisuudet ovat käytössä vain ohjelman ollessa käynnissä, ja niitä ei ole edes näkyvissä ominaisuuslistassa. Seuraavassa on koodinpätkä, joka ensin muuttaa painonapin otsikon (Captionominaisuus) ja sitten näyttää sen viesti-ikkunassa.

Command1.Caption = "testi" MsgBox Command1.Caption Tapahtumia ovat esimerkiksi hiiren napsauttaminen ohjaimen yläpuolella tai näppäimen painaminen silloin, kun ohjain on aktiivinen. Tapahtuman yhteyteen voi kirjoittaa koodinpätkän, joka suoritetaan aina silloin, kun käyttäjä tai käyttöjärjestelmä aiheuttaa kyseisen tapahtuman. Koodi-ikkunassa valitaan yläreunan vasemmasta listasta ohjain ja oikeasta listasta sen tapahtuma. Visual Basic muodostaa automaattisesti tapahtuman pohjan. Seuraavan koodin avulla tulee näkyviin viesti-ikkuna, kun käyttäjä painaa nappia. Tapahtuma on silloin Click. Private Sub Command1_Click() MsgBox "Nyt painettiin nappia!" Toiminnot ovat koodista lähtöisin olevia viestejä ohjaimelle. Ohjaimen tiettyä toimintoa kutsutaan koodissa, jolloin ohjain itse pitää huolen lopusta. Toimintoja ei ole yhtä paljon kuin ominaisuuksia ja tapahtumia, ja ne saattavat esimerkiksi muuttaa ohjaimen paikkaa ja kokoa, asettaa ohjaimen aktiiviseksi tai lisätä vaikkapa listaohjaimeen uuden rivin. Seuraava koodi asettaa Command1-ohjaimen aktiiviseksi (painetut näppäimet ohjautuvat ensin siihen), kun käyttäjä napsauttaa lomaketta. Private Sub Form_Click() Command1.SetFocus Vaikka edellä puhuttiin vain ohjaimista, myös lomakkeella siis on ominaisuuksia, tapahtumia ja toimintoja. Sijainti ja koko Kun ohjain on piirretty lomakkeelle, sen sijaintia ja kokoa pystyy muuttamaan hiirellä. Useampia ohjaimia voi valita ympäröimällä ne hiiren avulla tai napsauttamalla jokaista Control-näppäin pohjassa. Ohjaimia voi myös kopioida näppäinyhdistelmillä Control + C ja Control + V (tai Shift + Insert). Jos ohjaimen piirtää kuvakehyksen tai kehyksen sisään, se liikkuu aina pääohjaimen mukana. Ohjaimen sijainnin ilmoittavat ominaisuudet ovat Left ja Top, etäisyys vasemmasta reunasta ja etäisyys yläreunasta. Koon ilmoittavat ominaisuudet ovat Width ja Height, leveys ja korkeus. Seuraavassa kuvassa on esitelty näitä ominaisuuksia:

Ohjaimen sijaintia ja kokoa voi muuttaa suoraan näiden ominaisuuksien kautta: Command1.Left = 300 Command1.Top = 300 Toinen tapa on käyttää Move-toimintoa: Command1.Move 300, 300 Visual Basicin oletusmittayksikkö on twip, jonka pituus on 1 / 567 senttimetriä. Myöhemmin tutustutaan muihin mittayksiköihin. Yhteisiä asioita Seuraavat ominaisuudet on lähes joka ohjaimella: Jokaisella ohjaimella on nimen ilmoittava Name-ominaisuus. Ohjaimeen viitataan aina nimen avulla, ja sitä ei pysty muuttamaan ohjelman ajon aikana. Jos ohjaimen Visible-ominaisuus on False, se ei näy lomakkeella. Jos taas Enabled-ominaisuus on False, ohjain näkyy harmaana ja sitä ei pysty valitsemaan. Ohjaimen taustaväri valitaan BackColor-ominaisuudella ja piirtoväri ForeColorominaisuudella. Fonttiin vaikuttaa Font-ominaisuus. MousePointer-ominaisuus määrittää hiiren kohdistimen kuvan ohjaimen yläpuolella. Esimerkiksi 0 on oletuskohdistin ja 11 on tiimalasi. Jos ominaisuuden arvo on 99, kuvan saa valita itse MouseIcon-ominaisuuden avulla. ToolTipText-ominaisuus määrittää tekstin, joka tulee näkyviin ohjaimen yläpuolelle vihjelaatikkoon, kun hiiri pysähtyy hetkeksi sen kohdalle. Tavallisia tapahtumia ovat Click ja DblClick, joihin tullaan silloin, kun käyttäjä klikkaa ohjainta kerran tai kahdesti. Myös Enterin tai välilyönnin painaminen ohjaimen ollessa valittuna tulkitaan klikkaukseksi.

Seuraavaksi käydään läpi kaikki tavalliset ohjaimet ja niiden erityispiirteet. Lomake ja MDI-lomake Lomake (Form) on tavallinen ikkuna, MDI-lomake (MDI form) taas on koko ohjelman pääikkuna, jonka sisällä voi olla useampia ali-ikkunoita. Esimerkiksi monissa tekstinkäsittelyohjelmissa auki olevat tekstit ovat tällaisia ali-ikkunoita. Jos lomakkeen MDIChild-ominaisuus on True, se kuuluu MDI-lomakkeeseen. Seuraavassa on lomakkeeseen liittyviä ominaisuuksia: BorderStyle vaikuttaa ikkunan reunukseen ja esimerkiksi siihen, pystyykö ikkunan kokoa muuttamaan. Caption on ikkunan otsikkorivillä näkyvä teksti. Jos ControlBox on False, otsikkorivillä ei ole ohjelman kuvaketta eikä painikkeita. Jos MaxButton tai MinButton on False, suurennus- tai pienennyspainike ei ole käytössä. Icon määrittää ohjelman kuvakkeen, joka näkyy ikkunan vasemmassa ylänurkassa. WindowState ilmoittaa, onko ikkuna tavallinen, pienennetty vai suurennettu. Jos viitataan sen lomakkeen ominaisuuteen tai toimintoon, johon koodi on kirjoitettu, voidaan lomakkeen nimi korvata sanalla Me tai jättää kokonaan pois. Siksi Form1.Caption, Me.Caption ja Caption tarkoittavat kaikki samaa, jos koodi on kirjoitettu Form1:seen. Uusi ikkuna avataan näytölle komennolla OmaFormi.Show ja ikkuna suljetaan komennolla Unload OmaFormi. Komento End sulkee kaikki ikkunat ja poistuu ohjelmasta. Toisen lomakkeen ohjaimiin pääsee käsiksi kirjoittamalla alkuun lomakkeen nimen, esimerkiksi Form2.Command1.Caption. Ennen kuin lomake tulee näkyviin näytölle, siirrytään Load-tapahtumaan, johon kannattaa kirjoittaa kaikki alkutoimenpiteet. Vastaavasti Unload-tapahtuma suoritetaan aina viimeisenä. Activate-tapahtuma on silloin, kun lomake on jo näkyvillä, mutta se muuttuu aktiiviseksi. Kun lomakkeen koko muuttuu, siirrytään Resize-tapahtumaan. Seuraava koodi siirtää ikkunan näytön keskelle heti aluksi. Paikka lasketaan näytön leveyden ja lomakkeen leveyden perusteella. Private Sub Form_Load() Me.Left = Screen.Width / 2 - Me.Width / 2 Me.Top = Screen.Height / 2 - Me.Height / 2 Tämä koodi estää ohjelman lopettamisen Unload-tapahtumassa asettamalla Cancelarvoksi True. Jumittuneen ohjelman sammuttaminen on kuitenkin Visual Basicissa aina mahdollista painamalla Control + Break, ja käännettyyn ohjelmaan tehoaa vanha kunnon Control + Alt + Delete.

Private Sub Form_Unload(Cancel As Integer) MsgBox "Eipäs lopukaan!" Cancel = True Ohjeteksti Ohjeteksti (LabelBox) näyttää tavallista tekstiä lomakkeella. Teksti valitaan Captionominaisuudella. Jos AutoSize on True, ohjaimen koko muuttuu tekstin pituuden mukaan. Jos samaan aikaan WordWrap on True, tekstin leveys pysyy vakiona, mutta rivejä tulee tarvittaessa lisää. Tekstikenttä Tekstikenttä (TextBox) on tekstin kirjoittamiseen tarkoitettu alue, jossa toimivat tavalliset muotoilukomennot. Kirjoitettu teksti on Text-ominaisuudessa. Tekstin maksimipituuden voi määrittää MaxLength-ominaisuudella, ja jos tämä arvo on 0, teksti voi olla kuinka pitkä tahansa. Tekstikenttä voi olla joko yksirivinen tai monirivinen. Jos rivejä tarvitaan enemmän, MultiLine-ominaisuuden arvoksi laitetaan True. Vierityspalkit valitaan silloin ScrollBars-ominaisuuden avulla. Tekstikenttää voi käyttää myös salasanan kysymiseen, jolloin PasswordChar on kirjoitetut merkit korvaava peitemerkki, tavallisesti tähti. Tekstikenttään kirjoittamisen voi lisäksi estää laittamalla Locked-ominaisuuden arvoksi True. Aina, kun tekstikentän teksti muuttuu, tulee Change-tapahtuma. Seuraavassa esimerkissä tekstikenttään kirjoitettu teksti kopioituu välittömästi ikkunan otsikkoriville. Private Sub Text1_Change() Me.Caption = Text1.Text Painonappi Painonapissa (CommandButton) on tavallisesti tekstiä, joka valitaan Captionominaisuuden avulla. Jos kuitenkin Style on 1, siihen voi myös valita kuvan Pictureominaisuuteen. Jos Default-ominaisuus on True, painonappi on tummennettuna ja jatkuvasti aktiivisena. Kun käyttäjä klikkaa nappia, tulee Click-tapahtuma. Kehys Kehykseen (Frame) voi järjestellä toisiinsa liittyviä ohjaimia, ja kun ohjaimet piirtää kehyksen sisään, ne myös liikkuvat sen mukana. Caption-ominaisuus määrää kehyksen vasemmassa yläreunassa olevan otsikon, jota välttämättä ei tarvitse laittaa. Kuvakehys ja kuva

Kuvakehys (PictureBox) on monipuolinen ohjain, joka vastaa monilta osin lomaketta. Kuvakehykseen piirretyt ohjaimet liikkuvat sen mukana. Kuvan voi valita Pictureominaisuudella, ja tuettuja kuvamuotoja ovat muiden muassa bmp, ico, gif, jpg ja wmf. Jos pelkkä kuvan näyttäminen riittää, kannattaa kuitenkin valita kuva-ohjain (Image), joka kuluttaa vähemmän muistia. Silloin myös kuvan läpinäkyvä tausta näkyy oikein, ja jos Stretch-ominaisuus on True, kuvaa pystyy venyttämään ja kutistamaan. Valintalistat Valintalistoja on kahdenlaisia: tavallinen lista (ListBox) ja yhteen riviin mahtuva alasvetolista (ComboBox). Molempiin lisätään rivejä AddItem-toiminnolla ja poistetaan rivejä RemoveItem-toiminnolla, Clear-toiminto tyhjentää listan. Valittu rivi selviää ListIndex-ominaisuudesta, rivin sisältö Text- tai List-ominaisuudesta ja rivien määrä ListCount-ominaisuudesta. Jos Sorted-ominaisuuden arvo on True, lista järjestellään automaattisesti. Tavallisen listan voi toteuttaa niin, että samalla kertaa pystyy valitsemaan useamman rivin. Tämä on mahdollista kahdella tavalla: MultiSelect- tai Style-ominaisuuden avulla. Ensimmäisessä tapauksessa lista näyttää tavalliselta, mutta useamman rivin valitseminen on mahdollista Control-näppäimen avulla. Toisessa tapauksessa jokaisen rivin alussa on valintaruutu. Toteutustavasta riippumatta SelCount-ominaisuus kertoo valittujen rivien määrän ja Selected-ominaisuus ilmoittaa yksittäisen rivin tilan. Alasvetolista tuntee myös Style-ominaisuuden, mutta käyttötapa on eri. Jos Style on 0, alasvetolista toimii tavallisesti. Jos Style on 1, lista ei ole näkyvissä, vaan vaihtoehtoja voi kelata nuolinäppäimillä. Ja jos Style on 2, alasvetolistaan ei voi kirjoittaa itse, vaan valinta on tehtävä valmiista vaihtoehdoista. Toinen tapa estää kirjoittaminen on käyttää Locked-ominaisuutta. Seuraavassa esimerkissä lomakkeella on lista List1 ja painonapit Command1 ja Command2. Aluksi listaan lisätään kolme riviä. Kun käyttäjä painaa ensimmäisestä napista, valittu kohta poistetaan listalta. Kun käyttäjä painaa toisesta napista, kaikki listan rivit näytetään vuorotellen viesti-ikkunassa. Private Sub Form_Load() List1.AddItem "Eka rivi" List1.AddItem "Toka rivi" List1.AddItem "Kolmas rivi" Private Sub Command1_Click() If List1.ListIndex <> -1 Then List1.RemoveItem List1.ListIndex End If Private Sub Command2_Click() Dim i As Integer For i = 0 To List1.ListCount - 1 MsgBox List1.List(i) Next

Jos ListIndex on -1, mitään riviä ei ole valittu. Siksi listalta poistetaan rivi vain, jos ListIndex on joku muu kuin -1. Koska listan rivien numerointi alkaa nollasta, rivien määrä on yhtä suurempi kuin viimeisen rivin tunnus. Tämän takia rivejä näytettäessä käydään läpi rivit nollasta yhtä pienempään kuin ListCount. Valintaruutu ja -nappi Valintaruutuja (CheckBox) voi olla valittuna samaan aikaan useampia; valintanappeja (OptionButton) vain yksi. Jos valintaruudun Value on 1, se on valittu. Saman lomakkeen, kehyksen tai kuvakehyksen sisällä olevat valintanapit kuuluvat samaan sarjaan, jolloin niistä vain yksi voi olla valittuna. Jos valintanapin Value on True, se on valittu. Vierityspalkit Vierityspalkkeja on kahdenlaisia: vaakasuuntaisia (VScrollBar) ja pystysuuntaisia (HScrollBar). Molemmat toimivat samalla tavalla. Min on pienin arvo, Max suurin arvo ja Value senhetkinen arvo. Lisäksi SmallChange on muutoksen suuruus silloin, kun painetaan vierityspalkin päissä olevaa nuolta ja LargeChange on muutoksen suuruus silloin, kun painetaan vierityspalkin taustaa. Change-tapahtuma suoritetaan aina arvon muuttuessa ja Scroll-tapahtuma silloin, kun käyttäjä muuttaa arvoa hiirellä vetämällä. Seuraavassa esimerkissä on pystysuora vierityspalkki VScroll1, jonka Min-ominaisuus on 0 ja Max-ominaisuus on 255. Valittu arvo tulee näkyviin ikkunan otsikkoriville, ja taustaväri myös muuttuu sen mukaan. Kun väri valitaan RGB-muodossa, jokainen värisävy (punainen, vihreä ja sininen) ilmoitetaan väliltä 0 255. Private Sub VScroll1_Change() Me.Caption = VScroll1.Value Me.BackColor = RGB(0, 0, VScroll1.Value) Tiedostolistat Asemalistan (DriveListBox), hakemistolistan (DirListBox) ja tiedostolistan (FileListBox) avulla pystyy toteuttamaan tiedoston valinnan. Asemalistan asema on ominaisuudessa Drive, hakemistolistan ja tiedostolistan hakemisto on ominaisuudessa Path ja valitun tiedoston nimi on ominaisuudessa FileName. Näytettäviä tiedostoja voi rajoittaa Pattern-ominaisuuden avulla: esimerkiksi "*.txt" näyttää tiedostolistassa vain tekstitiedostot. Seuraava esimerkki kytkee asema-, hakemisto- ja tiedostolistan yhteen. Private Sub Drive1_Change() Dir1.Path = Drive1.Drive Private Sub Dir1_Change() File1.Path = Dir1.Path

Seuraava koodi näyttää tiedoston nimen hakemistopolun kanssa, kun käyttäjä napsauttaa tiedostoa listalla. Tässä pitää ottaa huomioon, että jos valittu hakemisto on juurihakemisto, kenoviiva on valmiiksi mukana hakemiston nimessä, mutta muuten se täytyy erikseen lisätä. Private Sub File1_Click() If Right(Dir1.Path, 1) = "\" Then MsgBox Dir1.Path & File1.FileName Else MsgBox Dir1.Path & "\" & File1.FileName End If Ajastin Ajastin (Timer) ei ole näkyvä ohjain. Sen tehtävänä on suorittaa Timer-tapahtumaan kirjoitettu koodi Interval-arvon määrittämin väliajoin. Interval-arvo ilmoitetaan millisekunteina, ja suurin mahdollinen arvo on 65535 millisekuntia eli 65,5 sekuntia. Pienin arvo riippuu käyttöjärjestelmästä: Windows 95, 98 ja ME suorittavat tapahtuman korkeintaan 18 kertaa sekunnissa, jolloin pienin todellinen arvo on noin 55 millisekuntia. Windows NT:llä, 2000:lla ja XP:llä pienin arvo on 10 ja 20 millisekunnin välillä. Seuraavassa esimerkissä lomakkeella on Timer1-ajastin, jonka Interval on 1000. Tuloksena on joka sekunti päivittyvä kello ikkunan otsikkopalkissa. Private Sub Timer1_Timer() Me.Caption = Time Lisää ohjaimista Grafiikan piirtoon tarkoitetut ohjaimet kuvio (Shape) ja viiva (Line) käsitellään opassarjan viidennessä osassa samoin kuin muiden ohjainten grafiikkaan liittyvät ominaisuudet, tapahtumat ja toiminnot. Kahdeksannessa osassa perehdytään tarkasti näppäimistön ja hiiren käsittelyyn. Oletusominaisuudet Kullakin ohjaimella on oletusominaisuus, johon viitataan silloin, kun kirjoitetaan pelkästään ohjaimen nimi. Tekstikentän oletusominaisuus esimerkiksi on Text, jolloin Text1.Text ja Text1 tarkoittavat samaa asiaa. Oletusominaisuuksien käyttö hieman lyhentää koodia, mutta samalla vaikeuttaa sen lukua. Tekstikentän lisäksi Label1.Caption korvataan toisinaan Label1 ja Picture1.Picture korvataan Picture1. Muita oletusominaisuuksia käytetään ani harvoin. Valikot Valikot luodaan erillisellä editorilla, joka käynnistyy valitsemalla Tools-valikosta Menu Editor tai klikkaamalla vastaavaa kuvaketta työkalurivillä. Jokaisella valikkokohdalla on

otsikko ja nimi, ja ne näkyvät peräkkäin listalla. Ensimmäisen tason valikkokohdat näkyvät ikkunan yläreunassa, ja niistä avautuvat alemmat valikkotasot. Valikkokohdalla on Click-tapahtuma. Mahdollinen pikanäppäin valitaan Shortcut-listasta. Jos valikkokohdan Checkedominaisuus on True, tekstin vieressä näkyy valintamerkki. Jos WindowList-ominaisuus on True, valikon lopussa näkyy automaattisesti MDI-ikkunan sisällä olevat ali-ikkunat. Yksinkertainen valikko näyttää seuraavalta valikkoeditorissa: Testi Eka Toka AliEka AliToka Kolmas Ja ohjelmassa se näyttää tältä: Jos valikkokohdan nimenä on pelkkä "-", valikkoon tulee näkyviin erotusviiva. Jos valikossa on valittavia kohtia, niiden Checked-ominaisuuden muuttumisesta täytyy huolehtia itse. Seuraavassa esimerkissä on kolme valikkokohtaa, mhelppo, mtavallinen ja mvaikea, joiden otsikot ovat vastaavasti "Helppo", "Tavallinen" ja "Vaikea". Vain yksi kohta voi kerrallaan olla valittuna. Tämä voisi olla osa pelin asetusvalikkoa. Private Sub Form_Load() mtavallinen.checked = True Private Sub mhelppo_click() mhelppo.checked = True mtavallinen.checked = False mvaikea.checked = False Private Sub mtavallinen_click() mhelppo.checked = False mtavallinen.checked = True mvaikea.checked = False Private Sub mvaikea_click() mhelppo.checked = False mtavallinen.checked = False mvaikea.checked = True

Käyttöliittymän suunnittelu Käyttöliittymän suunnittelussa kannattaa kokeilla erilaisia vaihtoehtoja ja ottaa mallia valmiista ohjelmista. Hyvää ohjelmaa voi myös helposti käyttää näppäimistöllä. Tässä on muutamia vinkkejä suunnitteluun. Vierekkäin olevat ohjaimet kannattaa sijoittaa samalle linjalle, missä auttaa lomakkeella näkyvä piirtokehikko. Lisäksi esimerkiksi vierekkäiset painonapit näyttävät yleensä parhailta samankokoisia. Samaan asiaan liittyvät ohjaimet on hyvä ryhmitellä kehyksiin. Ohjainten väliin kannattaa myös jättää reilusti tyhjää tilaa, jotta ikkuna ei näytä ahtaalta. Kun käyttäjä painaa Tab-näppäintä, ohjaimet aktivoituvat vuorotellen tietyssä järjestyksessä. Oletuksena järjestys on sama kuin ohjainten piirtojärjestys, mutta TabIndex-ominaisuuden avulla sitä voi muuttaa. Ohjainten TabIndexominaisuudet valitaan järjestyksessä nollasta alkaen. Jos TabStop-ominaisuuden arvo on False, ohjainta ei voi lainkaan aktivoida tällä tavalla. Pikanäppäin valitaan kirjoittamalla Caption-tekstiin halutun kirjaimen eteen &- merkki. Tämän seurauksena seuraava kirjain muuttuu alleviivatuksi, ja ohjaimen pystyy aktivoimaan Alt + kirjain näppäinyhdistelmällä. Jos pikanäppäin osoittaa ohjetekstiin tai kehykseen, aktivoituva ohjain on Tab-järjestyksessä seuraava. Jos tekstiin haluaakin todella kirjoittaa &-merkin, niitä täytyy kirjoittaa kaksi. Valikkokohtien pikanäppäimet kannattaa valita samoiksi kuin muissa ohjelmissa, esimerkiksi F1 näyttää ohjeen ja F2 aloittaa uuden pelin. Jos valikkokohdasta aukeaa uusi ikkuna, otsikon perään on tapana kirjoittaa kolme pistettä, esimerkiksi "Asetukset...". Osa 3 - Muuttujat ja taulukot Muuttuja on tietokoneen muistissa oleva varattu paikka, johon voi tallentaa erilaista tietoa. Muuttujalla on tyyppi, joka ilmaisee siihen tallennettavan tiedon laadun: käyttäjän nimi esimerkiksi tallennetaan merkkijonomuuttujaan ja laskutoimituksen tulos lukumuuttujaan. Jos ohjelmassa on paljon samankaltaisia muuttujia, niistä kannattaa yleensä tehdä taulukko. Yhdessä taulukossa voisi vaikkapa olla kaikkien Euroopan maiden nimet ja pääkaupungit. Tässä oppaassa käsitellään muuttujia, taulukoita ja omia muuttujatyyppejä. Muuttujatyypit Visual Basicin tavalliset muuttujatyypit ovat String (merkkijono), Byte, Integer ja Long (kokonaisluku), Single ja Double (liukuluku), Currency (desimaaliluku), Boolean (totuusarvo), Date (päivämäärä) ja Object (objekti). Lisäksi on olemassa muuttujatyyppi

Variant, joka voi edustaa mitä tahansa muuttujatyyppiä. Muuttujan tyyppi muuttuu silloin tilanteen mukaan. Merkkijono eli String ($) on joko muuttuvan tai määrätyn pituinen. Jos pituus määrätään, se kirjoitetaan muuttujatyypin perään tähtimerkin kanssa. Esimerkiksi String * 10 tarkoittaa kymmenen merkin pituista muuttujaa. Merkkijonot kirjoitetaan lainausmerkkien sisään, ja niiden yhdistäminen tapahtuu &-merkin avulla. Jos merkkijonon osana on lainausmerkit, ne täytyy kirjoittaa kahteen kertaan. Esimerkkejä: "esimerkki" "yhdistetty " & "merkkijono" "kokeilu ""lainausmerkkien"" käytöstä" Kokonaislukuja ovat Byte, Integer (%) ja Long (&). Byte-muuttuja on yhden tavun kokoinen, ja siihen voi sijoittaa luvun väliltä 0-255. Integer-muuttuja on kahden tavun kokoinen, ja siihen mahtuu luku väliltä -32768-32767. Long-muuttujan koko taas on neljä tavua, ja arvoalue on välillä -2147483648-2147483647. Lukujen yhteydessä voi käyttää merkintöjä +, -, *, /, \ (kokonaislukujakolasku), Mod (jakojäännös) ja ^ (potenssi) sekä sulkeita. Lukuja voi myös yhdistää merkkijonoon &- merkin avulla. Esimerkkejä: 208 1 + 2 + 3 3 * (7 + 2) 50 & "-vuotias" Liukulukuja ovat Single (!) ja Double (#), ja niiden koot ovat vastaavasti neljä ja kahdeksan tavua. Single-muuttujan pienin arvo on -3,4 * 10 38 ja suurin arvo on 3,4 * 10 38. Double-muuttujan pienin arvo taas on -1,8 * 10 308 ja suurin arvo 1,8 * 10 308. Liukuluku voi sisältää kokonaisosan lisäksi desimaaleja, mutta pyöristysvirheiden vuoksi tuloksen viimeisiin desimaaleihin ei ole luottamista. Desimaalipilkun merkkinä on piste, ja liukulukuja voi yhdistellä samalla tavalla kuin kokonaislukujakin. Esimerkkejä: 1.5 3.14159 Desimaaliluvun tallennusmuoto on Currency (@), jonka koko on kahdeksan tavua. Currency-muuttuja voi sisältää luvun, jonka kokonaisosan pituus on 15 merkkiä ja desimaaliosan pituus neljä merkkiä. Liukuluvuista poiketen desimaalilukujen kanssa ei tapahdu pyöristysvirheitä, koska ne on todellisuudessa tallennettu kokonaislukuina. Yhdistelykeinot ovat jälleen samat edellisten lukumuuttujatyyppien kanssa. Totuusarvo eli Boolean on joko True (tosi) tai False (epätosi). Boolean-tyyppisellä muuttujalla on siis vain kaksi tilaa. Lukumuuttujien lopputunnuksia (%, &,!, #, @) tarvitaan silloin, kun muuttujan tyyppi

täytyy tuoda esille laskutoimituksen keskellä. Esimerkiksi lasku 300 * 300 aiheuttaa virheen, koska tulos ei mahdu oletuksena olevaan Integer-tyyppiin. Siksi pitää kirjoittaa 300& * 300&, jolloin virhettä ei tule. Muuttujan määrittely Ennen kuin muuttujaa voi käyttää ohjelmassa, se täytyy määritellä esimerkiksi Dimlauseella. Muuttujan nimessä voi olla kirjaimia ja numeroita, mutta sen kuitenkin täytyy alkaa kirjaimella. Isoilla ja pienillä kirjaimilla ei ole merkitystä muuttujan nimessä. Tässä on muutamia muuttujamäärittelyitä: Dim nimi As String Dim vuosi As Integer Dim korkeus As Single ' merkkijonomuuttuja ' kokonaislukumuuttuja ' liukulukumuuttuja Kaikki määrittelyt voisi myös yhtä hyvin kirjoittaa samalle riville: Dim nimi As String, vuosi As Integer, korkeus As Single Muuttujan arvo määrittelyn jälkeen on tyhjä tai nolla. Arvon muuttaminen käy näin: nimi = "Antti" vuosi = 2004 pituus = 5 * 3.2 pituus = pituus +.5 ' muuttujan arvoksi tulee merkkijono ' muuttujan arvoksi tulee luku ' muuttujan arvoksi tulee laskun tulos ' muuttujan arvo lasketaan muuttujan perusteella Muuttujan arvon voi sitten näyttää vaikka viesti-ikkunassa: MsgBox "Nyt on vuosi " & vuosi Määrittelypakko Seuraava rivi kannattaa kirjoittaa jokaisen kooditiedoston alkuun: Option Explicit Tämä tarkoittaa sitä, että muuttujat täytyy aina määritellä ennen niiden käyttöä. Tavallisesti nimittäin muuttujia pystyy käyttämään ilman määrittelyä, ja ne ovat automaattisesti Variant- eli muuttuvan tyyppisiä. Näin ei kuitenkaan vaivattomuudesta huolimatta kannata tehdä. Silloin kääntäjältä jäävät näet huomaamatta muuttujien nimien kirjoitusvirheet, jotka saattavat aiheuttaa hankalasti löydettäviä virheitä. Varianttyyppinen muuttuja myös vie enemmän tilaa muistissa kuin yksikään toinen muuttuja. Muuttujan näkyvyysalue Muuttujan näkyvyysalue tarkoittaa sitä ohjelman osaa, jossa muuttujan arvo on näkyvissä ja käytettävissä. Lomakkeella ja moduulissa olevassa koodissa on kaksi osaa: alussa olevat määrittelyt ja proseduurien sisällä oleva koodi. Proseduuri on yleisnimitys tapahtumille, aliohjelmille ja funktioille (kahdesta viimeisestä lisää opassarjan

kuudennessa osassa). Seuraava koodi-ikkunasta otettu kuva selventää asiaa: Proseduurin sisällä muuttuja määritellään komennolla Dim, ja muuttujan arvo ei ole näkyvissä proseduurin ulkopuolella. Muuttujan voi myös määritellä komennolla Static, jolloin sen arvo säilyy muuttumattomana, vaikka proseduurista välillä poistuttaisiinkin. Seuraavassa esimerkissä lomakkeella on Command1-nappi, jonka Click-tapahtumassa on sisäinen laskuri. Napista painettaessa laskurin arvo kasvaa yhdellä ja tulos näkyy viesti-ikkunassa. Private Sub Command1_Click() Static laskuri As Integer laskuri = laskuri + 1 MsgBox laskuri Koodin alussa määrittely Private tai Dim tarkoittaa, että muuttujan arvo on näkyvissä vain kyseisen lomakkeen tai moduulin proseduureissa. Jos taas määrittely on Public tai Global, muuttujan arvo näkyy kaikissa ohjelmaan kuuluvissa lomakkeissa ja moduuleissa. Tällaisia muuttujia kutsutaan yleisiksi muuttujiksi. Moduulissa määriteltyyn yleiseen muuttujaan voi viitata kaikista ohjelman osista suoraan muuttujan nimellä, mutta lomakkeessa määritellyn muuttujan eteen täytyy kirjoittaa lomakkeen nimi ja piste. Seuraavassa esimerkissä Command1 muuttaa muuttujan arvoa ja Command2 näyttää sen. Dim aika As String Private Sub Command1_Click() aika = Time Private Sub Command2_Click() MsgBox aika Luvut ja merkkijonot Luvut voi tavallisen kymmenjärjestelmän lisäksi esittää 16-järjestelmässä, jolloin niiden eteen laitetaan &H-tunnus. Esimerkiksi 16 ja &H10 tarkoittavat samaa lukua. Funktio Val muuttaa merkkijonon luvuksi ja Str vastaavasti luvun merkkijonoksi. Lisäksi funktio Int muuttaa luvun kokonaisluvuksi. Kuitenkaan muutosfunktioita ei tavallisesti tarvitse käyttää, koska Visual Basic huolehtii muutoksista itse. Seuraavassa esimerkissä viestiikkunassa näkyy luvun kokonaisosa.

Dim luku As Single luku = 12.45 MsgBox Int(luku) Luvun muuttaminen kokonaisluvuksi niin, että pyöristys menee oikein, tapahtuu Roundfunktiolla. Funktion toisena parametrina voi olla desimaalien määrä. Esimerkiksi Round(15.7) = 16 ja Round(1.2345, 2) = 1.23. Vakioiden käyttö Esimerkiksi euron ja markan suhde on muuttumaton luku, joka voidaan esittää muuttujan lisäksi myös vakion avulla. Vakion määrittely kirjoitetaan koodin alkuun Constlauseella, ja siihen voi liittyä yleisen muuttujan tavoin näkyvyysalueen rajaus Privatetai Public-alkumäärityksellä. Private Const EUROKERROIN = 5.94573 Nyt koodissa voidaan varsinaisen lukuarvon sijaan kirjoittaa vakion nimi. Dim markat As Currency, eurot As Currency markat = 30 eurot = markat / EUROKERROIN Vakioiden käytön etuna on se, että koodi näyttää selvemmältä. Ja jos vakion arvo myöhemmin vaihtuu, muutos täytyy tehdä vain vakion määrittelyyn. Muuttujaan verrattuna vakio ei kuluta ylimääräistä tilaa muistissa, koska arvot muutetaan lopullisiksi jo ohjelman käännösvaiheessa. Taulukko useampia muuttujia yhdessä Jos ohjelman täytyisi käsitellä vaikkapa kymmenen henkilön nimiä, yksi tapa olisi tallentaa nimet erillisiin merkkijonomuuttujiin. Muuttujien määrittely näyttäisi silloin seuraavalta: Dim nimi1 As String, nimi2 As String, nimi3 As String, nimi4 As String, nimi5 As String Dim nimi6 As String, nimi7 As String, nimi8 As String, nimi9 As String, nimi10 As String Näin monen muuttujan käsittely on kuitenkin ongelmallista. Paljon parempi tapa onkin määritellä yksi taulukko, johon mahtuvat kaikki kymmenen muuttujaa. Taulukon määrittely muistuttaa tavallisen muuttujan määrittelyä, mutta taulukon nimen jälkeen sulkujen sisään tulee tieto siinä olevien muuttujien eli alkioiden määrästä. Dim nimet(1 To 10) As String Nyt taulukon alkioihin voi viitata seuraavalla tavalla: nimet(1) = "Risto" MsgBox nimet(1)

Jos taulukon alkioiden määrän alarajaa ei ilmoiteta, se on oletuksena nolla. Taulukossa voi myös olla useampia ulottuvuuksia, jotka erotetaan sulkujen sisällä pilkuilla. Äsken määritelty nimitaulukko oli yksiulotteinen, ristinollan ruudukon sisältävä taulukko taas olisi kaksiulotteinen. Taulukossa voi olla useita kymmeniä ulottuvuuksia, mutta yleensä tarvitaan korkeintaan kolmea ulottuvuutta. Esimerkkejä erilaisista taulukoista: ' sisältää alkiot 0-8 Dim tiedot(8) As String ' sisältää alkiot 1995-2005 Dim vuodet(1995 To 2005) As Long ' sisältää yhteensä 100 alkiota Dim ruudukko(1 To 10, 1 To 10) As Integer Ulottuvuuksia voi ajatella myös niin, että jokaista ensimmäisen tason alkiota kohden on tietty määrä toisen tason alkioita, joita kohden taas on tietty määrä kolmannen tason alkioita jne. Tämän vuoksi taulukon alkioiden määrä kasvaa nopeasti, kun ulottuvuuksia tulee lisää. Esimerkiksi taulukossa, jonka määritelty koko on (1 To 5, 1 To 8, 1 To 7), on yhteensä 5 * 8 * 7 = 280 alkiota. Muuttuvankokoinen taulukko Toisinaan ei etukäteen tiedetä, kuinka monta alkiota taulukossa täytyy olla. Silloin taulukko määritellään ilmoittamatta sen kokoa. Myöhemmin, kun tarvittava alkioiden määrä on tiedossa, taulukon kokoa voidaan muuttaa ReDim-komennolla. Seuraavassa esimerkissä taulukon alkioiden määrä päätetään maara-muuttujan perusteella. Tavallisessa taulukon määrittelyssä ei olisi mahdollista käyttää muuttujaa. Dim kaupungit() As String maara = 5 ReDim kaupungit(maara) As String kaupungit(3) = "Helsinki" Ohjaintaulukot Lomakkeella olevia ohjaimia voi myös järjestää taulukoihin. Yhdessä taulukossa voi kuitenkin olla vain samanlaisia ohjaimia. Kaikkien taulukkoon kuuluvien ohjainten nimi on sama, mutta Index-arvot poikkeavat toisistaan. Näin määritetään nollasta alkavat ohjainten järjestysnumerot eli indeksit taulukossa. Jos ohjaimet ovat valmiiksi lomakkeella, muutetaan kunkin nimi samaksi, jolloin indeksit järjestyvät automaattisesti. Jos taas ohjaimia ei vielä ole, riittää, että samaa ohjainta kopioidaan lomakkeelle tarvittava määrä. Molemmissa tapauksissa pitää vastata myöntävästi kysymykseen Do you want to create a control array?. Taulukossa oleviin ohjaimiin viitataan samalla tavalla kuin tavallisen taulukon alkioihin: Command1(0).Caption = "Paina!" Saman taulukon ohjaimilla on yhteinen tapahtumakäsittely. Uuden Index-muuttujan avulla selviää, mikä taulukon ohjain on kulloinkin kyseessä.

Private Sub Command1_Click(Index As Integer) MsgBox "Painoit napista " & Index Lisäksi on mahdollista luoda kokonaan uusia ohjaimia, kunhan lomakkeella on valmiiksi ainakin yksi ohjain, jonka Index-arvo on määritelty. Uusi ohjain luodaan Loadkomennolla. Tämän jälkeen muutetaan yleensä ainakin ohjaimen paikkaa ja näkyvyyttä, koska uuden ohjaimen Visible-ominaisuus on False. Tässä esimerkissä lomakkeella on suunnitteluvaiheessa vain painonappi (Command1, jonka Index on 0), mutta heti ohjelman alussa lomakkeelle ilmestyy toinen samanlainen nappi. ' luodaan uusi nappi Load Command1(1) ' määritetään napin paikka Command1(1).Move 1000, 1000 ' muutetaan nappi näkyväksi Command1(1).Visible = True Oma muuttujatyyppi Muuttujatyyppejä voi tehdä myös itse. Oma muuttujatyyppi muodostuu Visual Basicin valmiista muuttujatyypeistä sekä mahdollisesti myös toisista omista muuttujatyypeistä. Muuttujatyypin määrittely kirjoitetaan koodin alkuun, ja sen yhteydessä voi käyttää samalla tavalla Private- ja Public-avainsanoja kuin muuttujien määrittelyssä. Seuraavassa määritellään oma tkirja-tyyppi, joka sisältää kirjan nimen, tekijän, painovuoden ja ISBN-numeron. Private Type tkirja nimi As String tekija As String vuosi As Integer isbn As String End Type Tämän jälkeen koodissa voi määritellä tkirja-tyyppisen muuttujan ja tallentaa siihen kirjan tiedot. Tiedon erotusmerkkinä on piste. Dim kirja As tkirja kirja.nimi = "Sinuhe egyptiläinen" kirja.tekija = "Mika Waltari" kirja.vuosi = 1975 kirja.isbn = "951-643-580-7" MsgBox "Kirjan nimi on " & kirja.nimi Vähemmän kirjoittamista Jos peräjälkeen muutetaan saman muuttujan useita tietoja, voidaan käyttää With-lausetta, jolloin muuttujan nimeä ei tarvitse kirjoittaa aina erikseen. With kirja.nimi = "Sinuhe egyptiläinen".tekija = "Mika Waltari".vuosi = 1975.isbn = "951-643-580-7" End With

Sama tekniikka toimii myös ohjainten kanssa. With Command1.Caption = "Paina!".Move 1000, 1000.Visible = True End With Osa 4 - Ehdot ja silmukat Ehdot aiheuttavat muutoksia ohjelman suoritukseen: niiden kohdalla ohjelma voi haarautua tai myös pysähtyä. Silmukoita käytetään silloin, kun samaa koodia pitää toistaa tietyn ehdon toteutumiseen asti tai kun käydään esimerkiksi läpi kaikki taulukossa olevat tiedot. Sekä ehdot että silmukat perustuvat lausekkeisiin, joiden arvo on tosi tai epätosi. Niiden avulla päätetään, mikä koodiosuus suoritetaan tai milloin silmukasta siirrytään pois. Ehdot ja silmukat eivät ole hankalia, mutta yhdessä käytettynä niistä pystyy muodostamaan monimutkaisen ohjelman. Todet ja epätodet lausekkeet Ohjelmaan kuuluvilla luvuilla, merkkijonoilla ja muuttujilla on kullakin oma arvonsa. Lauseke on yksi tällainen arvo yksinään tai useamman arvon yhdistelmä esimerkiksi laskutoimituksena. Kun lausekkeita vertaillaan keskenään, saadaan tuloksena totuusarvo, joka on joko tosi (True) tai epätosi (False). Vertailut ovat = (yhtä suuri), > (suurempi), >= (suurempi tai yhtä suuri), < (pienempi), <= (pienempi tai yhtä suuri) sekä <> (eri suuri). Lisäksi useampia totuusarvoja voidaan yhdistää merkinnöillä And (ja) ja Or (tai), arvon edessä oleva Not taas tarkoittaa vastakkaisuutta. Seuraavassa listassa on muutamia (ehto)lausekkeita Visual Basicin ymmärtämässä muodossa sekä käännettynä suomen kielelle. x > 3 x on suurempi kuin kolme nimi = "Juhani" nimi on Juhani ika >= 18 And ika <= 65 ikä on lukujen 18 ja 65 välillä "jänis" > "aasi" aakkosjärjestyksen tutkiminen nimi = "Juhani" Or ika < 20 nimi on Juhani tai ikä on alle 20 ika <> 20 tai Not ika = 20 ikä ei ole 20 Myös yksittäinen luku tai laskutoimitus voi toimia ehtolausekkena. Tällöin ehtolauseke on aina tosi, kunhan luku ei ole 0. Moniosaisen ehtolausekkeen esittämisessä on hyvä

käyttää apuna sulkuja. Esimerkki: (ika >= 18 And ika <= 65) Or nimi = "Juhani". Ehtorakenne Ehtorakenne alkaa sanalla If ja päättyy merkintään End If. Tämän lisäksi ehtorakenteeseen voi kuulua ElseIf-osia, jotka määrittävät useampia ehtoja, sekä loppuun tuleva Else-lause, jonka perässä oleva koodi suoritetaan silloin, kun yksikään aiemmista ehdoista ei ole tosi. Seuraava esimerkki tervehtii käyttäjää, jos nimi-muuttujan arvo on "Sakari". If nimi = "Sakari" Then MsgBox "Moikka, Sakke!" End If Tässä tulee pidempi ehtorakenne, joka ilmoittaa kuukaudessa olevien päivien määrän. Yleisin päivien lukumäärä on 31, minkä vuoksi se on laitettu Else-vaihtoehtoon. If kuukausi = 4 Or kuukausi = 6 Or kuukausi = 9 Or kuukausi = 11 Then MsgBox "30 päivää" ElseIf kuukausi = 2 Then MsgBox "28 tai 29 päivää" Else MsgBox "31 päivää" End If Seuraavassa esimerkissä käyttäjä saa painaa napista kaksi kertaa, mutta kolmannella kerralla ohjelma sulkeutuu. Private Sub Command1_Click() Static kerrat As Integer kerrat = kerrat + 1 If kerrat > 2 Then End End If Haarautuminen Jos jokaisessa ehtorakenteen osassa esiintyy sama muuttuja, oikean vaihtoehdon valitsemisen voi toteuttaa paremmin Select Case -rakenteen avulla. Tutkittava muuttuja ilmoitetaan vain kerran, ja sen jälkeen tulee joukko Case-haaroja, joiden perässä olevia arvoja verrataan muuttujan arvoon. Yhteen haaraan voi kuulua useampia arvoja, jotka on erotettu pilkuilla. Tässä on toteutettuna edellä ollut esimerkki lyhyemmällä koodilla: Select Case kuukausi Case 4, 6, 9, 11 MsgBox "30 päivää" Case 2 MsgBox "28 tai 29 päivää" Case Else MsgBox "31 päivää" End Select Seuraavassa esimerkissä lomakkeella on ohjaintaulukko Command1, johon kuuluu kolme painonappia indekseillä 0 2. Tapahtumankäsittelyyn on ilmestynyt Index-parametri,

josta selviää napin indeksi. Jokaisesta nappulasta painettaessa tulee eri ilmoitus Select Case -rakenteen avulla. Private Sub Command1_Click(Index As Integer) Select Case Index Case 0 MsgBox "Eka nappi" Case 1 MsgBox "Toka nappi" Case 2 MsgBox "Kolmas nappi" End Select Silmukka Silmukan sisällä olevaa koodia toistetaan, kunnes silmukkaan liitetty lopetusehto täyttyy tai silmukasta poistutaan muuten. Silmukan aloitussana on Do, ja se loppuu sanaan Loop. Alussa tai lopussa oleva While tarkoittaa, että silmukka jatkuu niin kauan kuin ehtolauseke on tosi. Jos taas käytetään sanaa Until, silmukka jatkuu kunnes ehtolauseke on tosi. Kun ehto laitetaan alkuun, silmukkaan ei välttämättä mennä ollenkaan. Lopussa oleva ehto takaa, että silmukka suoritetaan ainakin kerran. Seuraavassa esimerkissä silmukka toistuu niin kauan kuin i:n arvo on viittä pienempi. Joka kierroksella i kasvaa yhdellä, joten kierroksia tulee yhteensä viisi: niissä i:n arvo on 0, 1, 2, 3 ja 4. Nämä luvut näytetään myös viesti-ikkunassa. Dim i As Integer Do While i < 5 MsgBox i i = i + 1 Loop Saman voi toteuttaa myös Until-ehdon avulla, jolloin toinen rivi on: Do Until i >= 5 Ohjelmassa kannattaa valita While tai Until sen mukaan, kumpi kuulostaa luonnollisemmalta, jos ehtoa ajattelee suomen kielellä. Toista niin kauan kuin i on pienempi kuin viisi tuntuu selvemmältä kuin toista kunnes i on suurempi tai yhtä suuri kuin viisi. Siksi While sopii ehkä tähän silmukkaan paremmin. Ohjelman suoritukseen ei tietenkään vaikuta, kummin päin ehdon muodostaa. Jos silmukassa ei ole ehtoa kummallakaan puolella, lopetuksesta täytyy huolehtia itse Exit Do -komennolla. Muuten ohjelma jumiutuu. Tavallisesti Do...Loop -rakennetta käytetään silloin, kun silmukan kierrosten määrää ei ole valmiiksi tiedossa. Seuraava ohjelma kertoo, kuinka monta kertaa 100 euroa maksavan tavaran hinnasta voidaan vähentää 10 prosenttia, ennen kuin tavaran hinta laskee puoleen. Ensimmäisen vähennyksen jälkeen hinta on siis 90 euroa, toisen jälkeen 81 euroa jne. Muuttujassa hinta on tavaran kulloinenkin hinta, kerrat pitää kirjaa alennuskerroista.

Dim hinta As Integer, kerrat As Integer hinta = 100 Do While hinta > 50 hinta = hinta * 0.9 kerrat = kerrat + 1 Loop MsgBox "Hintaa voidaan alentaa " & kerrat & " kertaa." Jos silmukka kestää kauan, sen sisään on syytä laittaa DoEvents-komento, jotta koko käyttöjärjestelmä ei jumiudu ohjelman suorituksen ajaksi. Seuraavassa esimerkissä koko ohjelman suorituksen ajan taustalla on silmukka, joka jatkuvasti muuttaa otsikkorivin tekstiksi kellonajan. Kellonaika näkyy värisevänä, koska sen päivitys tapahtuu hyvin tiuhaan. Tällaisessa ohjelmassa täytyy muistaa panna lomakkeen Unload-tapahtumaan komento End, jotta silmukka päättyy ja ohjelma sulkeutuu kunnollisesti. Private Sub Form_Activate() Do Caption = Time DoEvents Loop Private Sub Form_Unload(Cancel As Integer) End Lukujen läpikäynti For-silmukan avulla on helppo käydä läpi joukko lukuja, jotka kasvavat tai vähenevät säännöllisesti. Silmukkaan liittyy muuttuja, jonka arvo kullakin silmukan kierroksella on vuorossa oleva luku. Silmukasta voi poistua myös kesken Exit For -lauseella. Tässä on koodinpätkä, joka näyttää luvut 0, 1, 2, 3 ja 4. Ohjelman toiminta on sama kuin edellisen kappaleen esimerkissä, mutta koodi on nyt lyhyempi ja selkeämpi. Dim i As Integer For i = 0 To 4 MsgBox i Next Lukuvälin perään voidaan laittaa askel, jolloin muuttujan arvo kasvaa tai laskee suuremmissa tai pienemmissä erissä. Jos aloitusarvo on lopetusarvoa suurempi, myös askeleen täytyy olla negatiivinen. Seuraavassa on esimerkkinä lukusarjojen (0, 2, 4, 6, 8) ja (4, 3, 2, 1, 0) läpikäynti. For i = 0 To 8 Step 2 MsgBox i Next For i = 4 To 0 Step -1 MsgBox i Next Lukujen listaamisen lisäksi For-silmukan avulla voidaan helposti käsitellä kaikkia taulukkoon kuuluvia alkioita. Seuraavassa esimerkissä luvut on taulukko, jossa on