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 Sub
Ongelmana 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 Sub
Ennä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 Sub
TallennaTulos 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.