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. ⚠
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.
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 (Caption
-ominaisuus) 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!" End Sub
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 End Sub
Vaikka edellä puhuttiin vain ohjaimista, myös lomakkeella siis on ominaisuuksia, tapahtumia ja toimintoja.
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.
Seuraavat ominaisuudet on lähes joka ohjaimella:
Name
-ominaisuus. Ohjaimeen viitataan aina nimen avulla, ja sitä ei pysty muuttamaan ohjelman ajon aikana.Visible
-ominaisuus on False
, se ei näy lomakkeella. Jos taas Enabled
-ominaisuus on False
, ohjain näkyy harmaana ja sitä ei pysty valitsemaan.BackColor
-ominaisuudella ja piirtoväri ForeColor
-ominaisuudella. 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 Enter
in tai välilyönnin painaminen ohjaimen ollessa valittuna tulkitaan klikkaukseksi.
Seuraavaksi käydään läpi kaikki tavalliset ohjaimet ja niiden erityispiirteet.
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.ControlBox
on False
, otsikkorivillä ei ole ohjelman kuvaketta eikä painikkeita.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 End Sub
Tämä koodi estää ohjelman lopettamisen Unload
-tapahtumassa asettamalla Cancel
-arvoksi 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 End Sub
Ohjeteksti (LabelBox
) näyttää tavallista tekstiä lomakkeella. Teksti valitaan Caption
-ominaisuudella. 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ä (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 End Sub
Painonapissa (CommandButton
) on tavallisesti tekstiä, joka valitaan Caption
-ominaisuuden avulla. Jos kuitenkin Style
on 1, siihen voi myös valita kuvan Picture
-ominaisuuteen. Jos Default
-ominaisuus on True
, painonappi on tummennettuna ja jatkuvasti aktiivisena. Kun käyttäjä klikkaa nappia, tulee Click
-tapahtuma.
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 (PictureBox
) on monipuolinen ohjain, joka vastaa monilta osin lomaketta. Kuvakehykseen piirretyt ohjaimet liikkuvat sen mukana. Kuvan voi valita Picture
-ominaisuudella, 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.
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" End Sub Private Sub Command1_Click() If List1.ListIndex <> -1 Then List1.RemoveItem List1.ListIndex End If End Sub Private Sub Command2_Click() Dim i As Integer For i = 0 To List1.ListCount - 1 MsgBox List1.List(i) Next End Sub
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
.
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.
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) End Sub
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 End Sub Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub
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 End Sub
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 End Sub
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.
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 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 Checked
-ominaisuus 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 End Sub Private Sub mHelppo_Click() mHelppo.Checked = True mTavallinen.Checked = False mVaikea.Checked = False End Sub Private Sub mTavallinen_Click() mHelppo.Checked = False mTavallinen.Checked = True mVaikea.Checked = False End Sub Private Sub mVaikea_Click() mHelppo.Checked = False mTavallinen.Checked = False mVaikea.Checked = True End Sub
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.
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 TabIndex
-ominaisuudet valitaan järjestyksessä nollasta alkaen. Jos TabStop
-ominaisuuden arvo on False
, ohjainta ei voi lainkaan aktivoida tällä tavalla.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.F1
näyttää ohjeen ja F2
aloittaa uuden pelin. Jos valikkokohdasta aukeaa uusi ikkuna, otsikon perään on tapana kirjoittaa kolme pistettä, esimerkiksi "Asetukset..."
.Tuota, yhden virheen huomasin. Tuohon VBssä kelvolliseen muuttujannimeen voi sisältyä a-z ja numeroiden lisäksi myös ääkkösiä ja erikoismerkkejä (ainakin _ muuttujan keskellä)
siis tarkoitin että merkki "_" voi olla muuttujan keskellä, esim kahvi_on_hyvää
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.