Eli, minulla on nyt Type joka tarvisi ensin saada tallennettua ja sitten haettua listboxiin. Tässä on nykyinen ei toimiva koodini:
'Tehdään wrestler type
Type wrestler1
id As Integer
lname As String
sname As String
End Type
'Asetetaan arvot, että olisi jotain sisältöä tallentamiseen.
Dim wres As wrestler1
wres.id = numwrestlers + 1
wres.lname = "Pekka"
wres.sname = "Pekkala"Eli, nyt nämä tiedot tarvisi saada tallennettua tekstitiedostoon ja myöhemmin ladata ne niin, että painijan nimi näkyisi listboxissa ja nimeä painamalla tiedot näkyisivät käyttäjälle.
Asettamalla merkkijonoille pituuden tyyliä As String * 50 saat tehtyä UDT:stä tasapituisen, joka mahdollistaa sen tallentamisen ja lataamisen helpolla tavalla. Mikäli haluat ehdottomasti että merkkijonot ovat minkä tahansa pituisia, niin sitten joudut kirjoittamaan oman lataus- ja kirjoitusrutiinin. Yksinkertaisimmillaan tallentaisit ensin Integerin, sitten kaksi Longia jotka kertoisivat molempien merkkijonojen pituudet ja sitten kirjoittaisit merkkijonot peräkkäin. Ladattaessa sitten lukisit Integer-arvosi ja tallentaisit sen UDT:hen, sitten loisit merkkijonotbufferit kahden Long-arvon perusteella ja lukisit merkkijonot.
Kannattaisi laittaa painijat taulukoihin, eli esimerkiksi:
Dim wres(9) As wrestler1 'kymmenen painijaa
Tämä on aika huono tapa tallennukseen/lataukseen, mutta silti käyttökelpoinen:
Dim i As Integer
Open "tiedosto.txt" For Output As #1
For i = 0 To 9
Print #1, LTrim$(RTrim$(Str$(wres(i).id)))
Print #1, wres(i).lname
Print #1, wres(i).sname
Next i
Close #1ListBox-koodia en rupea nyt vääntämään, mutta lataus:
Dim i As Integer
Dim tmpStr As String 'väliaikainen string
Open "tiedosto.txt" For Input As #1
For i = 0 To 9
Line Input #1, tmpStr
wres(i).id = Val(tmpStr)
Line Input #1, wres(i).lname
Line Input #1, wres(i).sname
'tähän ListBoxin käsittelykoodi
Next i
Close #1Hmm... Mietein juuri, että olisiko tämä tapa käyttökelpoinen?
'tallennus Open App.Path + "\DATA\wrestlers.DAT" For Binary As #1 Put #1, wres.id, wres List1.AddItem (wres.lname) Close #1 'lataus Open App.Path + "\DATA\wrestlers.DAT" For Binary As #1 For id = 1 To numwrestlers Get #1, id, wres List1.AddItem (wres.lname) Next id Close #1
Ei olisi. Record numberit menee sekaisin. Paitsi jos nimen pituus on rajoitettu, ja id:t menevät esim. 1, 50, 101, 151 jne.
Option Explicit
Private Type WrestlerInfo
ID As Integer
fName As String ' etunimi (first name)
lName As String ' sukunimi (last name)
rName As String ' paininimi (ring name)
End Type
Dim Wrestler() As WrestlerInfo
Public Function OpenWrestlers(Filename As String) As Boolean
Dim intFF As Integer, lngA As Long, lngCount As Long
intFF = FreeFile
On Error GoTo ErrorHandler
Open Filename For Binary Access Read As #intFF
' luetaan lukumäärä
Get #intFF, , lngCount
' tarkista lukumäärä
If lngCount > 0 Then
' varaa muisti
ReDim Wrestler(lngCount - 1)
' lue painijat
For lngA = 0 To UBound(Wrestler)
Get #intFF, , Wrestler(lngA).ID
' merkkijonojen pituudet, varaa bufferi
Get #intFF, , lngCount
Wrestler(lngA).fName = Space$(lngCount)
Get #intFF, , lngCount
Wrestler(lngA).lName = Space$(lngCount)
Get #intFF, , lngCount
Wrestler(lngA).rName = Space$(lngCount)
' lue merkkijonot
Get #intFF, , Wrestler(lngA).fName
Get #intFF, , Wrestler(lngA).lName
Get #intFF, , Wrestler(lngA).rName
Next lngA
OpenWrestlers = True
End If
ErrorHandler:
Close #intFF
End Function
Public Function SaveWrestlers(Filename As String) As Boolean
Dim intFF As Integer, lngA As Long
' tuhoa tiedosto jos jo olemassa
If Len(Dir$(Filename)) Then Kill Filename
intFF = FreeFile
On Error GoTo ErrorHandler
Open Filename For Binary Access Write As #intFF
' tallenna lukumäärä
Put #intFF, , UBound(Wrestler) + 1
' tallenna kaikki painijat
For lngA = 0 To UBound(Wrestler)
' tallenna ID
Put #intFF, , Wrestler(lngA).ID
' tallenna merkkijonojen pituudet
Put #intFF, , Len(Wrestler(lngA).fName)
Put #intFF, , Len(Wrestler(lngA).lName)
Put #intFF, , Len(Wrestler(lngA).rName)
' tallenna merkkijonot
Put #intFF, , Wrestler(lngA).fName
Put #intFF, , Wrestler(lngA).lName
Put #intFF, , Wrestler(lngA).rName
Next lngA
SaveWrestlers = True
ErrorHandler:
Close #intFF
End Function
Private Sub Form_Load()
If OpenWrestlers("c:\test.wre") Then MsgBox "Luettiin " & (UBound(Wrestler) + 1) & " painijan tiedot!": Exit Sub
ReDim Wrestler(2)
With Wrestler(0)
.ID = 1
.fName = "Shawn"
.lName = "Michaels"
.rName = "HBK"
End With
With Wrestler(1)
.ID = 2
.fName = "John"
.lName = "Layfield"
.rName = "JBL"
End With
With Wrestler(2)
.ID = 3
.fName = "Kofi"
.lName = "Kingston"
.rName = "Kofi"
End With
If SaveWrestlers("c:\test.wre") Then
MsgBox "Tallennus onnistui!"
Else
MsgBox "Tallennus epäonnistui :/"
End If
End SubKiitos. Kokeilen tuota myöhemmin!
Juu, eli sain tämän viimeinkin toimimaan :) Kiitos Merrille tuosta koodista!
Aihe on jo aika vanha, joten et voi enää vastata siihen.