Oon yrittäny tehdä highscore listaa VB6:lla mutta en saa sitä oikein toimimaan kunnolla. Haluan että siinä näkyy aika ja nimi ja niiten pitää olla järjestyksessä tietysti.
Minulla on tällänen koodi siihen:
Private Sub Command1_Click()
Form3.Label2(0).Caption = GetSetting("Klickaus", "highscore", "Label2(0)pisteet", 0)
Form3.Label2(1).Caption = GetSetting("Klickaus", "highscore", "Label2(1)pisteet", 0)
Form3.Label2(2).Caption = GetSetting("Klickaus", "highscore", "Label2(2)pisteet", 0)
Form3.Label2(3).Caption = GetSetting("Klickaus", "highscore", "Label2(3)pisteet", 0)
Form3.Label2(4).Caption = GetSetting("Klickaus", "highscore", "Label2(4)pisteet", 0)
Form3.Label2(5).Caption = GetSetting("Klickaus", "highscore", "Label2(5)pisteet", 0)
Form3.Label2(6).Caption = GetSetting("Klickaus", "highscore", "Label2(6)pisteet", 0)
Form3.Label2(7).Caption = GetSetting("Klickaus", "highscore", "Label2(7)pisteet", 0)
Form3.Label2(8).Caption = GetSetting("Klickaus", "highscore", "Label2(8)pisteet", 0)
Form3.Label2(9).Caption = GetSetting("Klickaus", "highscore", "Label2(9)pisteet", 0)
If Label3.Caption > Form3.Label2(0).Caption Then
For a = 0 To 9
Form3.Label2(a) = 0
Next a
Form3.Label2(0) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(1).Caption Then
For a = 1 To 9
Form3.Label2(a) = 0
Next a
Form3.Label2(1) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(2).Caption Then
For a = 2 To 9
Form3.Label2(a) = 0
Next a
Form3.Label2(2) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(3).Caption Then
For a = 3 To 9
Form3.Label2(a) = 0
Next a
Form3.Label2(3) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(4).Caption Then
For a = 4 To 9
Form3.Label2(a) = 0
Next a
Form3.Label2(4) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(5).Caption Then
For a = 5 To 9
Form3.Label2(a) = 0
Next a
Form3.Label2(5) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(6).Caption Then
For a = 6 To 9
Form3.Label2(a) = 0
Next a
Form3.Label2(6) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(7).Caption Then
For a = 7 To 9
Form3.Label2(a) = 0
Next a
Form3.Label2(7) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(8).Caption Then
For a = 8 To 9
Form3.Label2(a) = 0
Next a
Form3.Label2(8) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(9).Caption Then
For a = 9 To 9
Form3.Label2(a) = 0
Next a
Form3.Label2(9) = Label3.Caption
End If
SaveSetting "Klickaus", "highscore", "Label2(9)pisteet", Form3.Label2(9).Caption
SaveSetting "Klickaus", "highscore", "Label2(8)pisteet", Form3.Label2(8).Caption
SaveSetting "Klickaus", "highscore", "Label2(7)pisteet", Form3.Label2(7).Caption
SaveSetting "Klickaus", "highscore", "Label2(6)pisteet", Form3.Label2(6).Caption
SaveSetting "Klickaus", "highscore", "Label2(5)pisteet", Form3.Label2(5).Caption
SaveSetting "Klickaus", "highscore", "Label2(4)pisteet", Form3.Label2(4).Caption
SaveSetting "Klickaus", "highscore", "Label2(3)pisteet", Form3.Label2(3).Caption
SaveSetting "Klickaus", "highscore", "Label2(2)pisteet", Form3.Label2(2).Caption
SaveSetting "Klickaus", "highscore", "Label2(1)pisteet", Form3.Label2(1).Caption
SaveSetting "Klickaus", "highscore", "Label2(0)pisteet", Form3.Label2(0).Caption
Form3.Show
Unload Me
End SubOngelmana taitaa olla uuden tuloksen lisäys listalle. Oletan nyt, että Label3 sisältää uuden tuloksen, Label2(0) - Label2(9) sisältävät ennätyslistan tulokset ja mitä enemmän pisteitä, sitä korkeammalle tulos kuuluu listalla. Tarvittava koodi näyttää silloin suurin piirtein tältä:
Private Sub Command1_Click()
Dim i As Integer, j As Integer
' luetaan ennätykset näkyviin
For i = 0 To 9
Form3.Label2(i).Caption = GetSetting("Klickaus", "highscore", "pisteet" & i, 0)
Next
' etsitään paikka uudelle tulokselle
For i = 0 To 9
' jos tulos on suurempi, uusi paikka on löytynyt
If Val(Label3.Caption) > Val(Form3.Label2(i).Caption) Then
' siirretään seuraavia tuloksia alemmas
For j = 9 To i + 1 Step -1
Form3.Label2(j).Caption = Form3.Label2(j - 1).Caption
Next
' lisätään uusi tulos
Form3.Label2(i).Caption = Label3.Caption
' poistutaan silmukasta
Exit For
End If
Next
' tallennetaan ennätykset
For i = 0 To 9
SaveSetting "Klickaus", "highscore", "pisteet" & i, Form3.Label2(i).Caption
Next
End SubEnnätysten lukua ja tallennusta voi lyhentää silmukan avulla, koska jokaisen rivin rakenne on sama. Muutin myös tallennusmuotoa niin, että tunnukset ovat "pisteet0" - "pisteet9" aikaisemman "Label2(0)pisteet" - "Label2(9)pisteet" sijasta. Tulokselle löytyy oikea paikka tutkimalla ennätyksiä parhaimmasta lähtien, kunnes löytyy ennätys, joka on uutta tulosta huonompi. Tällöin siirretään kaikkia alempia ennätyksiä yksi askel alemmas, jolloin saadaan tilaa uudelle ennätykselle. Jos tulos ei olekaan niin hyvä, että se pääsisi ennätysten listalle, silmukka vain käydään läpi, mutta ennätyksiin ei tehdä mitään muutoksia.
Toi toimii, mutta jos tulee aika 0:6 eli alle 1 jäävä niin se ei laita sitä sinne. Ja mitenkäs saan sen nimen mukaan? Form2 on text1 ja sen pitäs mennä Form3 label1(a). Ja jos tossa "If Val(Label3.Caption) > Val(Form3.Label2(i).Caption) Then" on toi < noin päin ja jos se lista on tyhjä niin se ei tallenna niitä.
Tohon pitäs saada vielä että mitä pienempi numero siinä on niin se on ensimmäisenä listassa. Ja sitten nimen lisäys myös.
(mod. poistettu sama koodi kuin ylhäällä)
Voisiko joku ystävällisesti auttaa?
Joudut kyllä itse tekemään. Järjestele vaikka ennätyspistemäärät jollain mieleiselläsi järjestelyalgoritmilla suuruusjärjestykseen. Sitten luo jokin tapa yhdistää nimi ennätykseen. Helppoa.
Missä muodossa aika tarkkaan ottaen ilmoitetaan? Tämä pitää tietää, jotta vertailun saa menemään oikein.
Aika on sekunteja ja kymmenes osia.
Tässä on pari kunnollista aliohjelmaa:
Sub TallennaTulos(aika As Long, nimi As String)
Dim ajat(10) As Long, nimet(10) As String
Dim i As Integer, j As Integer
' luetaan ajat ja nimet
For i = 0 To 9
ajat(i) = GetSetting("Klickaus", "highscore", "aika" & i, -1)
nimet(i) = GetSetting("Klickaus", "highscore", "nimi" & i, "")
Next
' etsitään paikka uudelle tulokselle
For i = 0 To 9
' jos paikka on tyhjä tai aika on suurempi
If ajat(i) = -1 Or ajat(i) > aika Then
' siirretään muita tuloksia alemmas
For j = 9 To i + 1 Step -1
ajat(j) = ajat(j - 1)
nimet(j) = nimet(j - 1)
Next
' lisätään uusi tulos
ajat(i) = aika
nimet(i) = nimi
' poistutaan silmukasta
Exit For
End If
Next
' tallennetaan ajat ja nimet
For i = 0 To 9
SaveSetting "Klickaus", "highscore", "aika" & i, ajat(i)
SaveSetting "Klickaus", "highscore", "nimi" & i, nimet(i)
Next
End Sub
Sub NaytaLista()
Dim aika As Long, nimi As String
Dim i As Integer
' luetaan ajat ja nimet
For i = 0 To 9
aika = GetSetting("Klickaus", "highscore", "aika" & i, -1)
nimi = GetSetting("Klickaus", "highscore", "nimi" & i, "")
' tyhjä paikka
If aika = -1 Then
lAika(i) = "- - -"
lNimi(i) = "- - -"
' todellinen tulos
Else
lAika(i) = aika
lNimi(i) = nimi
End If
Next
End Sub
Sub TyhjennaLista()
Dim i As Integer
' tallennetaan tyhjät ajat
For i = 0 To 9
SaveSetting "Klickaus", "highscore", "aika" & i, -1
Next
End SubTallennaTulos lisää listalle uuden ennätyksen, NaytaLista näyttää tulokset formilla ja TyhjennaLista tyhjentää listan. Tässä formilla täytyy olla Label-kontrollit lAika(0) - lAika(9) sekä lNimi(0) - lNimi(9), joihin tulokset ilmestyvät. Tuloksissa aika on tallennettu kokonaislukuna sekunnin kymmenesosina, ja sen voi muuttaa sopivaan muotoon näyttöhetkellä. Jos aika on -1, tämä tarkoittaa, että siihen listan kohtaan ei ole vielä tallennettu ennätystä.
Esimerkiksi seuraava koodi lisää listalle Pepen tuloksen 1,2 sekuntia ja näyttää listan.
TallennaTulos 12, "Pepe" NaytaLista
Ei toimi. Virhe on If ajat(i) = -1 Or ajat(i) > aika Then <---tosta valittaa
Mitä virheessä lukee? Mitä parametreja olet antanut aliohjelmalle?
Run-time error ´13´:
Type mismatch
Voisitko lähettää koko ohjelman (kaikki frm- ja vbp-tiedostot) minulle sähköpostilla (antti.laaksonen@mbnet.fi), niin voin yrittää korjata ohjelman?
Aihe on jo aika vanha, joten et voi enää vastata siihen.