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

Johdanto ja tavoite

Tässä osiossa tutustutaan Visual Basic:in vuorovaikutusominaisuuksiin. Tämän osion jälkeen opiskelija osaa käyttää erilaisia vuorovaikutusominaisuuksia omissa ohjelmissaan.

Vuorovaikutus

Jos halutaan, että ohjelman käyttäjä pystyy vaikuttamaan ohjelman suoritukseen, on hyvä osata perustekniikat joilla käyttäjän mielipide voidaan kysyä.

MsgBox

Ehkäpä tutuin "väline" käyttäjän informoimiseen ohjelman suorituksen kulusta ja valintamahdollisuuksista on viestilaatikko eli MsgBox. Kuten olet ehkä jo huomannut, voit käyttää viestilaatikkoa usealla eri tavalla, joko pelkästään tiedon esittämiseen tai esittämään käyttäjälle muutaman vaihtoehdon, joista hän voi valita.

Levytila lopussa
Esimerkkikuvassa ohjelma informoi käyttäjälle, että levytila on lopussa.

Yritetäänkö uudestaan
Esimerkkikuvassa ohjelma kysyy käyttäjältä haluaako hän yrittää tallennusta uudestaan.

Kuten kahdesta esimerkistä huomasit, viestilaatikkoa voidaan käyttää hyvin eri tavoilla. Alla on esitelty lyhyesti miten voit käyttää viestilaatikkoa erityyppisten viestien esittämiseen:

MsgBox(viesti[, painikkeet] [, otsikko] [, ohjetiedosto, konteksti])

Viestilaatikolla on yksi pakollinen parameteri: viesti. Loput parametrit ovat vapaaehtoisia. Viesti on teksti, joka näkyy käyttäjälle viestilaatikossa. Esim. yllä olevissa esimerkeissä teksti on "Levytila on lopussa!" ja "Tiedon tallennus epäonnistui, haluatko yrittää uudestaan".

"painikkeet" -parametri määrittää neljä asiaa: näytettävä(n/t) painikkee(n/t), ikonin tyypin, oletuspainikkeen ja viestilaatikon modaalisuuden (eli onko viestilaatikko "muiden päällä"). Painikkeita on useita erilaisia, voit näyttää viestilaatikon pelkästään OK -painikkeella tai useammallakin. Alla on listattu painikevakiot ja niiden selitteet:
PainikevakioSelite
vbOKOnlyNäyttää pelkästään OK -painikkeen
vbOKCancelNäyttää OK ja Cancel -painikkeet
vbAbortRetryIgnoreNäyttää Abort, Retry ja Ignore -painikkeet
vbYesNoCancelNäyttää Yes, No ja Cancel -painikkeet
vbYesNoNäyttää Yes ja No -painikkeet

Painikevakioon voidaan yhdistää ikoni (eli kuvake) joka "kertoo" minkätyyppisestä viestistä on kyse. Jos kerrot yleisen viestin, voit käyttää informaatiokuvaketta, kriittisessä tilanteessa (esim. virhe) voit käyttää kriittistä kuvaketta, jne. Alla listaus erityyppistä ikoneista:

IkonivakioSelite
vbCriticalNäytä "kriittinen tilanne" -ikoni
vbQuestionNäytä "kysymys" -ikoni
vbExclamationNäytä "varoitus" -ikoni
vbInformationNäytä "informaatio" -ikoni

Lisäksi on mahdollista määritellä (samaan painikkeet -parametriin) mikä näytettävistä painikkeista on ns. oletuspainike. Käytännössä se tarkoittaa sitä, että jos painat Enter -näppäintä, tarkoittaa se samaa kuin napsauttaisit hiirellä painiketta joka on määritelty oletuspainikkeeksi.

OletuspainikevakioSelite
vbDefaultButton11. painike on oletuspainike
vbDefaultButton22. painike on oletuspainike
vbDefaultButton33. painike on oletuspainike
vbDefaultButton44. painike on oletuspainike

Ja kaiken tämän päälle voit määritellä vielä modaalisuuden eli kuinka "kauas" viestilaatikko vaikuttaa. Jos valitset esim. ohjelmatason modaalisuuden, käyttäjän tulee painaa viestilaatikkoa jotta ohjelman suoritus jatkuisi. Systeemitason modaalisuus estää järjestelmän muiden ohjelmien toiminnan kunnes käyttäjä painaa painiketta.

Viestilaatikon modaalisuusvakioSelite
vbApplicationModal
vbSystemModal

Muita vakioitaSelite
vbMsgBoxHelpButtonLisää ohjepainikkeen viestilaatikkoon (vaatii kontekstitunnisteen)
vbMsgBoxSetForegroundMäärittää viestilaatikon etualalla olevan ikkunan mukaiseksi
vbMsgBoxRightMäärittää viestilaatikon tekstin tasattavaksi oikeaan reunaan
vbMsgBoxRtlReadingTeksti luetaan oikealta vasemmalle

Miten painikevakio sitten kirjoitetaan? Jokaisesta taulukosta voit ottaa halutessasi yhden vakion jonka summaat yhteen edellisten kanssa. Seuraavassa esimerkissä luomme viestilaatikon, joka jossa on kaksi painiketta (Yes ja No), ikonina kysymysmerkki, oletuspainike on "kakkospainike" eli No -painike, viestilaatikko on järjestelmätason modaalinen ja teksti sijoitetaan oikeaan reunaan:

MsgBox "Levytila on lopussa! Uudestaan?", vbYesNo + vbQuestion + vbDefaultButton2 + vbSystemModal + vbMsgBoxRight, "Testataan viestilaatikkoa"
Testataan viestilaatikkoa
Testataan viestilaatikkoa.

Seuraava parametri on otsikko, tämä on viestilaatikon otsikko, sen tulisi tietysti kertoa lyhyesti ja ytimekkäästi mikä em. viestilaatikon "idea" on.

Ohjetiedosto ja konteksti kuuluvat yhteen, molemmat on oltava. Jos määrität viestilaatikkoon lisättäväksi ohjetiedostopainikkeen, tätä napsauttamalla avautuu määritelty ohjetiedosto. Konteksti määrittää ohjeaiheen joka avautuu ohjepainiketta painettaessa.

Viestilaatikolla on muutama paluuarvo riippuen painikkeesta jota käyttäjä on painanut. Voit selvittää mitä painiketta käyttäjä on painanut vertaamalla paluuarvoa seuraavaksi esiteltäviin vakioihin:

PaluuarvovakioSelite
vbOKKäyttäjä valitsi OK -painikkeen
vbCancelKäyttäjä valitsi Cancel -painikkeen
vbAbortKäyttäjä valitsi Abort -painikkeen
vbRetryKäyttäjä valitsi Retry -painikkeen
vbIgnoreKäyttäjä valitsi Ignore -painikkeen
vbYesKäyttäjä valitsi Yes -painikkeen
vbNoKäyttäjä valitsi No -painikkeen

Alla on esitetty ohjelma, joka esittää käyttäjälle vaihtoehdon jonka mukaan sitten toimitaan:

    Dim Paluuarvo As VbMsgBoxResult

tallennaTiedosto:
    ' Tässä MUKA tallennetaan tiedostoa, toimenpide epäonnistuu
    ' levytilan puutteen vuoksi.
    Paluuarvo = MsgBox("Levytila on lopussa! Uudestaan?", vbYesNo + vbQuestion + vbDefaultButton2 + vbSystemModal + vbMsgBoxRight, "Testataan viestilaatikkoa")

    Select Case Paluuarvo
        Case VbMsgBoxResult.vbYes
            GoTo tallennaTiedosto
        Case VbMsgBoxResult.vbNo
            MsgBox "Tiedoston tallennus epäonnistui!", vbCritical
    End Select
Aluksi määrittelemme muuttujan, johon otamme paluuarvon talteen. Muuttuja voi olla VbMsgBoxResult -tyyppinen tai ihan "normaali" Long -tyyppinen muuttuja, paluuarvo on kuitenkin vain numeroarvo. Seuraavaksi esitämme viestilaatikon, käyttäjän antama vastaus (eli painike jota käyttäjä napsauttaa) tallennetaan Paluuarvo -muuttujaan. Seuraavaksi vertailemme Select Case -lauseella mikä painikkeista on valittu. Toinen tapa verrata olisi tietty vertaaminen suoraan numeroarvoihin mutta tämä on ehkä liian "kryptistä". Vakioiden käyttäminen taasen kommentoi koodia ja helpottaa näin sen lukemista myöhemmin.

InputBox

Joskus ei riitä se, että käyttäjä voi valita (maksimissaan) neljästä painikkeesta yhden vaan haluamme käyttäjältä ihan numeerista tai tekstimuotoista syötettä. Voimme tarvita käyttäjän nimeä, jonkin numeroarvon, jne. emmekä halua käyttää esim. tekstilaatikkoa tähän. Tällöin esiin astuu InputBox käsky jonka syntaksi on seuraavanlainen:

InputBox(viesti[, otsikko][, oletus][, x][, y][, ohjetiedosto, konteksti])

Kuten ehkä huomasit, syntaksi on lähes yksi yhteen viestilaatikon kanssa. Kysymyslaatikossa tarvitsemme myös viestin, joka esitetään käyttäjälle, esim. "Syötä ikäsi". Otsikko taasen kertoo käyttäjälle mikä tämän viestilaatikon tarkoitus onkaan. "oletus" -kenttään voit antaa ns. oletusvastauksen, eli jos käyttäjälle kelpaa oletusvastaus, ei hänen tarvitse muuta kuin painaa OK -painiketta. "x" ja "y" -parametreja käytetään määrittämään kysymyslaatikon sijainti vasemmasta yläkulmait ovat kuten viestilaatikossa. Seuraavassa esimerkissämme on esitelty viestilaatikko, joka kysyy käyttäjän nimen:

InputBox "Syötä nimesi, kiitos", "Nimen syöttäminen", "Teppo Testaaja"
Nimen syöttäminen
Esimerkissä pyydämme käyttäjää syöttämään nimensä, oletusnimenä Teppo Testaaja.

Edellinen esimerkki on selkeä, kysymyslaatikon varsinaisessa viestiosassa on teksti "Syötä nimesi, kiitos". Otsikossa lukee "Nimen syöttäminen" ja oletusvastaus on "Teppo Testaaja". Esimerkissämme on se puutteellisuus, että käyttäjän syöttämää nimeä ei tallenneta mihinkään eli viestilaatikon paluuarvoa ei oteta talteen. Korjaamme virheen seuraavassa esimerkissä:

Dim Paluuarvo As String

Paluuarvo = InputBox("Syötä nimesi, kiitos", "Nimen syöttäminen", "Teppo Testaaja")
MsgBox "Hei '" & Paluuarvo & "'!", vbInformation
Kun tarkastelemme esimerkkiä, huomaamme, että olemme ensin määrittäneet Paluuarvo -nimisen (String -tyyppisen) -muuttujan. Muista, että kysyit mitä tahansa tietoa kysymyslaatikkoa käyttäen (esim. käyttäjän ikää), paluuarvo on aina tekstityyppistä! Seuraavaksi esitämme kysymyslaatikon jonka paluuarvo eli käyttäjän vastaus tallennetaan Paluuarvo -muuttujaan. Lopuksi tulostamme tekstin "Hei 'nnnn'!", missä nnnn on käyttäjän syöttämä nimi.

Huom! Jos käyttäjä painaa OK -painiketta, palautetaan käyttäjän vastaus. Muussa tapauksessa palautetaan tyhjää.

CommonDialog

Joskus kaksi edellä esiteltyä ei riitä vaan vaaditaan muitakin syöttömahdollisuuksia. CommonDialog -kontrolli (voit lisätä kontrollin ohjelmaasi valitsemalla Project -valikosta Components -toiminto ja avautuvasta ikkunasta valitset Microsoft CommonDialog Control 6 (SP6) tai vastaavan. Painettuasi OK -painiketta työkalulaatikkoon tulisi ilmestyä CommonDialog -kuvake. Mitä em. kontrollilla sitten voi tehdä? Voit avata ikkunan, jossa käyttäjä voi valita tallennettavan tiedoston, ladattavan tiedoston, käytettävän fontin tai jonkin värin.

Voit käyttää kontrollia asettamalla sen ensin lomakkeelle ja kutsumalla kontrollin metodeja ShowOpen, ShowSave, ShowColor, ShowFont ja ShowHelp. Lisäksi kontrollilla on muutama tärkeä ominaisuus kuten CancelError, Filter ja FileName. Esittelemme ensin metodit ja sitten ominaisuudet.

MetodiSelite
ShowOpenNäyttää Avaa -ikkunan (eli käyttäjä valitsee ladattavan tiedoston tms.)
ShowSaveNäyttää Tallenna -ikkunan (eli käyttäjä valitsee tallennettavan tiedoston nimen tms.)
ShowColorNäyttää värinvalintaikkunan
ShowFontNäyttää fontinvalintaikkunan
ShowHelpSuorittaa PegHelp -ohjelman ja näyttää käyttäjän määrittämän ohjetiedoston

Ennen ja jälkeen jonkin edellisistä metodikutsuista on hyvä määritellä ja lukea joidenkin ominaisuuksien arvoja. Hyvä esimerkki on tiedoston avaaminen (ShowOpen). Ennen Avaa -ikkunan näyttämistä on ehkä hyvä määritellä näytettävät tiedostopäätteet ja tietysti avaamisen jälkeen on hyvä tutkia mikä tiedosto on valittu tai valittiinko sitä ollenkaan.

OminaisuusSelite
CancelErrorJos em. ominaisuus on asetettu ja käyttäjä painaa Cancel -painiketta, syntyy virhe numerolla 32755. Tällä on kätevä selvittä painoiko käyttäjä Cancel -painiketta.
ColorTällä voit asettaa värin tai lukea käyttäjän valitseman värin numeron
DefaultExtTällä voit asettaa tai lukea vakiotiedostopäätteen. Käytännössä se tarkoittaa sitä, että jos käyttäjä haluaa esim. tallentaa tiedoston eikä syötä tiedostopäätettä, lisää kontrolli tällöin tiedostonimen perään tässä mainitun päätteen (esim. txt)
DialogTitleMäärittää ikkunan otsikon
FileNameAsettaa tai lukee tiedostonimen. Jos haluat antaa jonkun oletustiedostonimen suoraan, käytä tätä ominaisuutta. Kun käyttäjä valitsee haluamansa (tai oletuksena annetun) tiedostonimen, voit lukea sen tästä ominaisuudesta. Huomaa, että käyttäjän valittua tiedoston sisältää tämä ominaisuus myös tiedostopolun! Toki voit asettaa myös oletuspolunkin pelkän tiedostonimen sijasta mutta ole varovainen, entäpä jos em. polkua ei olekaan?
FileTitlePalauttaa valitun tiedostonimen ILMAN polkua.
FilterTämän ominaisuuden asettamalla voit suodattaa näytettäväksi tietyntyyppisiä tiedostoja. Ominaisuus asetetaan seuraavasti: selite|suodatin|selite|suodatin ilman välilyöntejä.
Esimerkissä on tehty suodatin, joka näyttää pelkästään txt, doc ja bmp -tiedostot: Tekstitiedostot (*.txt)|*.txt|Word dokumentit|*.doc|Kuvatiedosto|*.bmp
FilterIndexOminaisuus määrittää mikä edellä määritellyistä suodattimista näytetään oletuksena. Huomaa, että ensimmäisen suodattimen indeksinumero on 1.
Flags"Lippu" -ominaisus määrittää miten avattava ikkuna esitetään, yms. Liput on selitetty tarkemmin VB:n ohjeissa (hakusana CommonDialog Control)
Max, MinMäärittää suurimman ja pienimmän esitettävän fonttikoon
MaxFileSizeMäärittää suurimman tiedostokoon jonka voi valita, alue on 1-32 kilotavua.

Mitä CommonDialog -kontrollilla sitten käytännössä tehdään? Yleisimpiä käytön kohteita on avattavan tiedoston valinta, tallennettavan tiedoston valinta, käytettävän värin valinta ja käytettävän fontin valinta. Seuraavassa esimerkissä pyydämme käyttäjää valitsemaan tallennettavan tiedoston:

On Error GoTo Virhekasittely

    CommonDialog1.CancelError = True
    CommonDialog1.DialogTitle = "Esimerkki"
    CommonDialog1.Filter = "Kaikki tiedostot|*.*|Tekstitiedostot (*.txt)|*.txt|Word dokumentit|*.doc|Kuvatiedosto|*.bmp"
    CommonDialog1.FilterIndex = 3
    CommonDialog1.FileName = "Oletustiedosto"
    CommonDialog1.DefaultExt = "txt"
    CommonDialog1.ShowSave
    MsgBox "Valitsit tallennettavaksi tiedostonimeksi: " & CommonDialog1.FileTitle

Exit Sub
Virhekasittely:
    MsgBox "Tiedostoa ei tallennettu!", vbOKOnly
Ensimmäisellä rivillä asetamme virhekäsittelyn päälle eli jos syntyy virhe, hypätään virhekäsittelyyn. Toisella rivillä asetamme CommonDialog:in CancelError -ominaisuuden, eli jos käyttäjä painaa Cancel -painiketta, hyppää ohjelmakoodin suoritus virhekäsittelyyn. Sitten määritämme ikkunan otsikon, suodattimen, määritämme oletussuodattimen sekä oletustiedostonimen ja päätteen (joka on voimassa jos suodattimeksi on valittu *.* tai suodattimia ei ole ollenkaan käytössä). Lopuksi kutsumme itse Tallenna -ikkunan avaavaa metodia (ShowSave). Jos käyttäjä valitsee tiedostonimen, tulostamme sen, muussa tapauksessa hyppäämme virhekäsittelyyn.
Tehtävä 19
Tehtävä 20