Kirjoittaja: Antti Laaksonen
Kirjoitettu: 19.01.2008 – 19.01.2008
Tagit: koodi näytille, vinkki
Tässä on esimerkki tietokilpailusta VB6:lle. Kysymykset ladataan tekstitiedostosta ja näytetään automaattisesti ohjelmassa. Toisin sanoen ohjelmaan ei tarvitse tehdä mitään muutoksia, kun kysymyksiä tulee lisää. Ohjelma kysyy käyttäjältä kaikki tiedoston kysymykset ja näyttää lopuksi oikeiden vastausten lukumäärän.
Ohjelma muodostuu moduulista (kilpa.bas) ja kysymyksen näyttävästä formista (kilpa.frm). Ohjelman suoritus alkaa moduulissa, joten valikosta Project->Properties täytyy merkitä kohtaan Startup Object moduulin aliohjelma Sub Main.
Formin nimeksi täytyy muuttaa fKilpa, ja siinä on oltava otsikko (Label), valintanappi (OptionButton) ja painonappi (CommandButton), joiden nimet ovat vastaavasti lKysymys, oVastaus ja cNappi. Lisäksi valintanapin oVastaus ominaisuuden Index arvon täytyy olla 0.
Tärkeimmät aliohjelmat ovat LataaKysymykset ja NaytaKysymys. Ensimmäinen lataa kysymykset annetusta tiedostosta Kysymykset-taulukkoon. Toinen valmistelee formin uutta kysymystä varten ja lopuksi näyttää sen. Valintanappeja luodaan aina formille niin monta kuin kysymyksessä on vastauksia.
Uuden kysymyksen luonnissa kannattaa huomata, että formi ladataan kysymysten välillä uudestaan (peräkkäin Unload ja Load), jolloin se palautuu aloitustilaansa. Tämän jälkeen tarvittavat valintanapit luodaan oVastaus(0):n perusteella, joka kuitenkin piilotetaan, ja ensimmäinen käyttäjälle näkyvä valintanappi on oVastaus(1).
Ohjelmassa ei ole virheentarkistuksia, joten jos kysymykset sisältävä tiedosto on virheellinen, voi tapahtua kummia. Lisäksi ohjelma olettaa, että kysymyksiä on korkeintaan 100 ja jokaisessa on korkeintaan 10 vastausta. Näitä rajoja voi luonnollisesti kasvattaa moduulin alun määrittelyissä.
kilpa.txt
Mikä on Tanskan pääkaupunki?|Kööpenhamina|Oslo|Reykjavik|Tukholma|1 Mitä on ranskaksi "vesi"?|aeu|aue|eau|eua|uae|uea|3 Kuinka paljon on tusina tusinoita?|136|144|152|156|160|2
kilpa.frm
Option Explicit
Private Sub cNappi_Click()
Dim kohta As Integer
kohta = NykyinenKysymys
' vastasiko käyttäjä oikein?
If oVastaus(Kysymykset(kohta).oikeavastaus).Value = True Then
OikeaMaara = OikeaMaara + 1
End If
' seuraava kysymys
NaytaKysymys NykyinenKysymys + 1
End Subkilpa.bas
Option Explicit
Type TKysymys
kysymys As String
vastaukset(10) As String
vastausmaara As Integer
oikeavastaus As Integer
End Type
Public Kysymykset(100) As TKysymys
Public Kysymysmaara As Integer
Public NykyinenKysymys As Integer
Public OikeaMaara As Integer
Sub LataaKysymykset(tiedosto As String)
Dim rivi As String, tiedot() As String
Dim kohta As Integer
Dim i As Integer
Open tiedosto For Input As #1
' luetaan kaikki tiedoston rivit
While Not EOF(1)
' kasvatetaan kysymysmäärälaskuria
Kysymysmaara = Kysymysmaara + 1
kohta = Kysymysmaara
' luetaan seuraava rivi
Line Input #1, rivi
' jaetaan rivi taulukkoon pystyviivojen kohdalta
tiedot = Split(rivi, "|")
' erotetaan kysymys ja vastaukset
Kysymykset(kohta).kysymys = tiedot(0)
For i = 1 To UBound(tiedot) - 1
Kysymykset(kohta).vastaukset(i) = tiedot(i)
Next
Kysymykset(kohta).vastausmaara = UBound(tiedot) - 1
Kysymykset(kohta).oikeavastaus = tiedot(UBound(tiedot))
Wend
Close #1
End Sub
Sub NaytaKysymys(kysymys As Integer)
Dim i As Integer
' onko kaikki kysymykset jo kysytty?
If kysymys > Kysymysmaara Then
MsgBox "Tietokilpailu päättyi, vastasit oikein " & OikeaMaara & " kertaa!"
End
End If
' poistetaan vanha formi ja aloitetaan uusi
Unload fKilpa
Load fKilpa
' formin otsikko ja keskitys
fKilpa.Caption = "Kysymys " & kysymys
fKilpa.Left = Screen.Width / 2 - fKilpa.Width / 2
fKilpa.Top = Screen.Height / 2 - fKilpa.Height / 2
' kysymysteksti ja napin teksti
fKilpa.lKysymys = Kysymykset(kysymys).kysymys
fKilpa.cNappi.Caption = "Vastaa"
' tästä valintanapista luodaan muut
fKilpa.oVastaus(0).Visible = False
For i = 1 To Kysymykset(kysymys).vastausmaara
' uuden napin luonti
Load fKilpa.oVastaus(i)
' pystysuuntainen sijainti
fKilpa.oVastaus(i).Top = fKilpa.oVastaus(0).Top + (i - 1) * 400
' kysymyksen teksti
fKilpa.oVastaus(i).Caption = Kysymykset(kysymys).vastaukset(i)
' valintanappi näkyväksi
fKilpa.oVastaus(i).Visible = True
Next
NykyinenKysymys = kysymys
' näytetään uusi kysymys
fKilpa.Show
End Sub
Sub Main()
LataaKysymykset App.Path + "\kilpa.txt"
NaytaKysymys 1
End Sub