Private Sub Form_Load()
Randomize
Dim i As Integer
cn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & App.Path & _
"\races.mdb;DefaultDir=;UID=;PWD=;"
Dim rs As New ADODB.Recordset
rs.Open "SELECT * FROM races", cn, adOpenStatic, adLockReadOnly
If Not rs.EOF Then rs.MoveFirst
Do While Not rs.EOF
maara = rs!ID
lstRace.AddItem rs!RaceName
ReDim Races(maara) As Integer
ReDim RaceStr(maara) As Integer
ReDim RaceDex(maara) As Integer
ReDim RaceCon(maara) As Integer
ReDim RaceWis(maara) As Integer
ReDim RaceCha(maara) As Integer
For i = 0 To maara
Races(i) = rs!ID
RaceStr(i) = rs!RaceStr
RaceDex(i) = rs!RaceDex
RaceCon(i) = rs!RaceCon
RaceWis(i) = rs!RaceWis
RaceCha(i) = rs!RaceCha
Next i
rs.MoveNext
Loop
rs.CloseMistä johtuu että toi ylläoleva koodipätkä tallentaa races.mdb-tiedostosta ainoastaan tietokannassa viimeisenä olevan racen tiedot noihin RaceStr, RaceDex jne taulukoihin?
Koittanu järkätä semmosta systeemiä että toi hakis sieltä tietokannasta ne racen tiedot ja sitte listais ne listboxiin ja vois vaan klikkailla siitä listboxista eri racevaihtoehtoja ja se sitte sitä mukaa muuttais playerin str dex jne statteja. Eli miten sais sen for-loopin tallentamaan RaceNamen mukaan noi RaceStr jne tiedot ja niin vielä että ku valitsee listboxista jonkun racen niin se osaa hakee oikeat RaceStr sun muut tiedot sieltä taulukosta?
Prkl ku on vaikeeta :(
(Enpä kyllä koskaan oo ymmärtäny noita for-looppeja, että miten niitä käytetään hyväksi tekemään sitä mitä haluat :( )
-Feltsu
NO MORJENS TAAS feltsu!
jos ylipäätään noin, niin sitten vaikka näinpäin...
'Module1 (globaali moduuli) Public Type RaceDataType RaceName As String Races As Integer RaceStr As Integer 'vaiko As String ??? RaceDex As Integer RaceCon As Integer RaceWis As Integer RaceCha As Integer End Type Global RaceData() As RaceDataType
'Form1
Private Sub Form_Load()
'Randomize '???
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & App.Path & _
"\races.mdb;DefaultDir=;UID=;PWD=;"
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open "SELECT * FROM races", cn, adOpenStatic, adLockReadOnly
If rs.RecordCount > 0 Then
rs.MoveFirst
Else
MsgBox "Taulussa ei ole tietueita"
Goto Jump
End If
ReDim RaceData(0)
Do While Not rs.EOF
RaceData(UBound(RaceData)).RaceName = rs!RaceName
RaceData(UBound(RaceData)).Races = rs!ID '???
RaceData(UBound(RaceData)).RaceStr = rs!RaceStr
RaceData(UBound(RaceData)).RaceDex = rs!RaceDex
RaceData(UBound(RaceData)).RaceCon = rs!RaceWis
RaceData(UBound(RaceData)).RaceWis = rs!RaceWis
RaceData(UBound(RaceData)).RaceCha = rs!RaceCha
rs.MoveNext
ReDim Preserve RaceData(UBound(RaceData) + 1)
Loop
ReDim Preserve RaceData(UBound(RaceData) - 1)
Dim i As Integer
For i = LBound(RaceData) To UBound(RaceData)
lstRace.AddItem RaceData(i).RaceName
Next i
'Testi:
'MsgBox "eka: " & RaceData(LBound(RaceData)).RaceName & _
'vbCrLf & "vika: " & _
'RaceData(UBound(RaceData)).RaceName
Jump:
rs.Close: Set Rs = Nothing
cn.Close: Set cn = Nothing
'...
'...
End SubMORJENS TAAS feltsu!
pari pikku muutosta...
vaihda adOpenStatic -> adOpenKeyset tuossa kohdassa
rs.Open "SELECT * FROM races", cn, adOpenStatic, adLockReadOnly
' ...
rs.MoveNext
If UBound(RaceData) < Rs.RecordCount Then 'lisää tämä rivi
ReDim Preserve RaceData(UBound(RaceData) + 1)
End If 'ja tämä rivi
Loop
ReDim Preserve RaceData(UBound(RaceData) - 1) ' poista tämä rivi
'...Jee!! Kiitos paljon nyt toimii ainakin toi rotujen listaus ihan niinku pitääkin! Ja periaatteessa kaikki muukin paitsi sellain pikku juttu et onko tätä alla olevaa koodia edes mahdollista toteuttaa ilman että laitan 50 kertaa ton If lstRace.Selected(1) then RaceData(1).RaceStr blaablaablaa If lstRace.Selected(2) then RaceData(2).RaceStr blaablaablaa..
Elikkä voiko ton jotenkin automatisoida että if lstRaceSelected(numero) then RaceData(sama numero ku toi selected).Raceblaablaablaa
Private Sub lstRace_Click()
player.race = lstRace.Text
lblRace.Caption = player.race
If lstRace.Selected(1) Then
player.str = player.str + RaceData(1).RaceStr
player.dex = player.dex + RaceData(1).RaceDex
player.con = player.con + RaceData(1).RaceCon
player.wis = player.wis + RaceData(1).RaceWis
player.cha = player.cha + RaceData(1).RaceCha
End If
PUpdate
End SubMut tosiaan kiitoksia miljoonasti tosta rotujen listauksesta! kokeilin tuolla MsgBox tekeleellä niin ihan oikein on eka tietue se mikä pitääki ja vikakin oli oikein :D En ois ikimaailmassa ite onnistunu keksimään!
-Feltsu
No siis ihan
Private Sub lstRace_Click()
Dim Luku as Long
player.race = lstRace.Text
lblRace.Caption = player.race
For Luku = 1 To 50
If lstRace.Selected(Luku) Then
player.str = player.str + RaceData(Luku).RaceStr
player.dex = player.dex + RaceData(Luku).RaceDex
player.con = player.con + RaceData(Luku).RaceCon
player.wis = player.wis + RaceData(Luku).RaceWis
player.cha = player.cha + RaceData(Luku).RaceCha
End If
Next
PUpdate
End SubKiitoksia Grez, mut en kyllä ymmärrä mitä pirua nyt tein väärin, laitoin sun koodin tuohon ja ajoin ohjelman ja klikkasin listalta rotua ja oikein mukava pikku errori: "Invalid property array index"
EDIT: Joo sain toimimaan melkein mutten kuitenkaan ihan, ois kiva että se laskis sieltä tietokannasta ne rotujen määrät eikä tarviis joka kerta ku lisää accessilla rodun niin alkaa tuota sorsaa muuttelemaan ku se on nyt sitte For 0 to 6 (joka on tämän hetkinen rotujen määrä) jos koitan tota lisäillä niin alkaa herjaamaan ylläolevaa erroria..
Ja nyt satuin törmäämään oikein mielenkiintoiseen bugiin, meinaa sellainen että ihan kaikki muu toimii ku rasvattu mutta jostain syystä RaceCon on täysin mielivaltainen numero jonka visual basic luultavasti keksii ihan omasta päästä ja sillä ei siis oo mitään tekemistä sen tietokannan kanssa. (Tai jos on niin en tiedä mitä)
EDIT2: HAHA, siellä oli painovirhepaholainen :D:D Ei mitään hätää, sori turhasta whinestä! (paitsi edelleen toi et miten tohon for looppiin sais haettua sieltä tietokannasta sen rotujen määrän automaagisesti)
-Feltsu
Tuosta varmaankin valitaan vain yksi rotu, joten ota silmukka pois ja korvaa Luku arvolla lstRace.ListIndex (eli korvaa vain aiemmasta koodistasi ykkönen lstRace.ListIndex:lla).
Tämä tieto perustui lyhyeen Googletukseen. Itse en ole koskaan ohjelmoinut VB6:lla.
Hei kiitti! Se meinaa toimi :D Googlea käyttäisin mielelläni jos osaisin käyttää sitä tälläisissä tilanteissa :( Mut koska on itse "koodaus" vielä vähän hakusessa niin en kaikkeen pysty yksikseni löytämään vastausta, jonka takia tietenkin täällä aina itken kaikista asioista ku ei toimi :/ Mutta nyt oon saanu jo paljon aikaan ihan itse (täällä saadun avun seuraksena siis tietenkin), meinaa oon vähän oppinu jo soveltamaan noita juttuja mitä täällä kerrotaan, esim osasin soveltaa tuon neau33:n koodin niin että se hakee myös monsterit erillisestä tietokannasta ja tallentaa niiden arvot muuttujiin :) Nyt oon tässä väsäilemässä sellasta systeemiä että vertaa pelaajan leveliä monsterin leveliin ja hakee vaan oikean tasoisia vihuja sieltä :)
KIITOKSIA SIIS IHAN KAIKILLE!
-Feltsu
Aihe on jo aika vanha, joten et voi enää vastata siihen.