Försöker att köra en array så här: Såhär får du nog dimentionera arrayen: Hej Tack Sven, du har så rätt. Det är en gammal ful ovan att köra med Integer. Skall försöka att tänka på Long. Det hjälper inte att du sätter intervallet i din loop. Kommer inte påverka. Skriv I så fall: Problem... Privat, Public är det ordentliga sätten att deklarera variabler på modulnivå. Klistra in deklarationen överst i din modul.<br> Hej igen Saw DoreSal Hej Sven. I så fall är en timer att rekomendera: Nu börjar det att bli bra. <code> Tack Andreas, det fungerade helt kanon.Array-problem
<code>
Dim MinArray() As String
MinArray(0, 0) = Rst(0)
MinArray(1, 0) = Rst(1)
MinArray(2, 0) = Rst(2)
MinArray(3, 0) = Rst(3)
MinArray(4, 0) = Rst(4)
MinArray(5, 0) = Rst(5)
MinArray(6, 0) = Rst(6)
Dim i As Integer
For i = 0 To 9
Timer1 = (10 - 5) * 25 * 40
LCD1.Caption = MinArray(0, i)
Timer1 = (10 - 5) * 10 * 40
Next
</code>
Mitt problem, just nu:
Error:
Run-time error '91'
Object variable or With block variable not set.
Och så pekar han på denna rad:
MinArray(0, 0) = Rst(0)
PS
Jag skrev om lite:
<code>
Dim i As Integer
For i = 0 To 6
MinArray(i, 0) = Rst(i)
Next
</code>
Men inte hjälpte det
Vad missar jag?Sv: Array-problem
Dim minArray(6, 0) As String
Men varför har du en 2-dimentionell array?
Felmeddelandet beror nog på att att Rst inte är instanserad (stavning?).
/JohanSv: Array-problem
Min lilla käpphäst SLUTA deklarera som Integer.
Det skall vara Long.
Har iofs inte med ditt problem att göra.
mvh
SvenSv: Array-problem
Att jag försökte med 2 dim arr, berode på ett ex jag hittade.
Nu är dom problemen lösta, så raskt till nästa.
Jag laddar alltså in 6 st posteri arrayen, som jag vill visa i en LCD-display(jag jag har hittat det).
Men jag gör något tokigt med timern, för jag får det inte att fungera. Den visar bara den sossta posten.
<code>
Set Rst = Con.Execute(SQL)
If Not Rst.EOF Then
Dim i As Long
Dim arr(6, 0) As String
For i = 0 To 6
If Not IsNull(Rst(i)) Then
arr(i, 0) = Rst(i)
End If
Next
For i = 0 To 6
Timer1 = (10 - 5) * 25 * 40
LCD1.Caption = arr(i, 0)
Timer1 = (10 - 5) * 10 * 40
Next
</code>
Är det inte bra att ha en timer?
Något annat?Sv: Array-problem
<code>
Private Index As Long
Private arr(6) As String
Private Sub Command1_Click
Dim i As Long
Dim Con As ADODB.Connection
Dim Rst As ADODB.Recordset
Set Con = New ADODB.Connection
Con.Open "<<<connection string>>>"
Set Rst = Con.Execute(SQL)
If Not Rst.EOF Then
For i = 0 To 6
If Not IsNull(Rst(i)) Then
arr(i) = Rst(i)
End If
Next
Index = 0
Timer1.Interval = (10 - 5) * 25 * 40
Timer1.Enable = True
End If
End Sub
Private Sub Timer1_Timer()
If Index > 6 Then
Timer1.Enable = False
Else
LCD1.Caption = arr(Index)
Index = Index + 1
End If
End Sub
</code>
Eller så använder duSleep() istället:
<code>
Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
Private Sub Command1_Click
Dim i As Long
Dim Con As ADODB.Connection
Dim Rst As ADODB.Recordset
Set Con = New ADODB.Connection
Con.Open "<<<connection string>>>"
Set Rst = Con.Execute(SQL)
If Not Rst.EOF Then
For i = 0 To 6
If Not IsNull(Rst(i)) Then
arr(i) = Rst(i)
End If
Next
For i = 0 To 6
LCD1.Caption = arr(i)
Sleep 500
Next
End If
End Sub
</code>Sv: Array-problem
Du hade skrivit
Private Index As Long
Private arr(6) As String
men skall det inte vara
Dim Index As Long
Dim arr(6) As String
Där fick jag nämeligen fel.
Sen kopierade jag din kod, ing problem föränn:
<code>
Private Sub Timer1_Timer()
Dim Index As Long
If Index > 6 Then
Timer1.Enabled = False
Else
LCD1.Caption = arr(Index)
Index = Index + 1
End If
End Sub
</code>
Ha ville att jag skulle dimma index igen.
Sen får jag fel här
LCD1.Caption = arr(Index)
Jag försökte åxå att köra med sleep, men det kommandot kände han inte till.
<code>
If Not Rst.EOF Then
For i = 0 To 6
If Not IsNull(Rst(i)) Then
arr(i) = Rst(i)
End If
Next
For i = 0 To 6
LCD1.Caption = arr(i)
Sleep 500
Next
</code>
Vad tror du?Sv: Array-problem
<br>
Sleep är ett api anrop. du måste dklarerar det oxå överst i modulen:
<code>
Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
</code>Sv: Array-problem
Du skall egentligen tänka Integer. I framtiden .net
och alla andra språk så kommer Integer att betyda 32 bit.
Nu snackar dom om 64 bit slöseri med minne tiil max
Vi behöver ett annat OS som kan hantera precis det som behövs.
det är ju ganska löjligt att Ett(1) skall behöva ta upp 64 bitar (8 bytes)
Tycker
SvenSv: Array-problem
>Detta var ju lite intressant, varför ska man inte använda sig av integer?
Därför att du belastar processorn med en onödig arbetsuppgift.
När du skriver Integer och menar <= ca 32000 så kommer
processorn i allafall behandla det som Long. (massor av högre siffror).
Det här budskapet är tveeggat Det kommer att heta Integer
och man menar det Vi kallar Long.
Du skall inte tänka i Long och Integer. Du skall tänka i termer
Word = Integer DWord = Long osv.
mvh
SvenSv: Array-problem
Jag håller med dig i allt.
Vi har ju ett OS, som fortfarande behandlar minnen som man gjorde i början av 80-talet(ordenarie minnet 0 till 649 kb,övre minnet 640 - 1024 och det expanderande minnet över 1024).
Ingen tvekan om det, men jag skall försöka att tänka LONG.
Tillbaka till mitt problem:
Vad jag vill är att i Lcd1, kunna växla information (tänk på MediaPlayer).
Jag har fått igång SLEEP, men den springer iväg så att jag får bara den sista informationen.
Så här ser koden ut nu:
<code>
Dim arr(6) As String
Dim i As Long
For i = 0 To 6
If Not IsNull(Rst(i)) Then
arr(i) = Rst(i)
End If
Next
If Err.Number <> 0 Then
MsgBox Err.Description
End If
For i = 0 To 6
Sleep 500
LCD1.Caption = arr(i)
Sleep 100
Next i
</code>
Vad tror ni?Sv: Array-problem
<code>
Private Index As Long
Private arr() As String
Private Sub Command1_Click
Dim i As Long
Dim id As Long
Dim Con As ADODB.Connection
Dim Rst As ADODB.Recordset
Set Con = New ADODB.Connection
Con.Open "<<<connection string>>>"
id = 5
SQL = "SELECT * FROM TabellNamn WHERE ID=" & id
Set Rst = Con.Execute(SQL)
If Not Rst.EOF Then
Redim arr(6)
For i = 0 To 6
arr(i) = "" & Rst(i)
Next
Index = 0
Timer1.Interval = 1000
Timer1.Enable = True
End If
End Sub
Private Sub Timer1_Timer()
LCD1.Caption = arr(Index)
Index = (Index + 1) Mod 7
End Sub
</code>Sv: Array-problem
Men....
Precis som i SQL:en som jag fick hjälp med, så är det inte alltid som det finns flera författare.
Jag löste det så här:
<code>
LCD1.Caption = "Ny sång laddas"
ReDim arr(6)
arr(0) = "ArrNo: " & (Rst(0))
arr(1) = "Titel: " & (Rst(1))
arr(2) = "Författare: " & (Rst(2))
If Not IsNull(Rst(3)) Then
arr(3) = "Författare 2: " & (Rst(3))
End If
If Not IsNull(Rst(4)) Then
arr(4) = "Författare 3: " & (Rst(4))
End If
arr(5) = "Album: " & (Rst(5))
arr(6) = "Kategori: " & (Rst(6))
id = 5
</code>
Men detta innebär att det blir tomt å LCD1, när den arrayen körs.
Kan man hoppa över tomma arrayer?Sv: Array-problem
Private Sub Timer1_Timer()
LCD1.Caption = arr(Index)
Do
Index = (Index + 1) Mod 7
Loop Until Len(arr(Index))
End Sub
</code>Sv: Array-problem
Nu är det bara den sista ögongodisen.
Om jag mellan varje ny caption vill visa det tomt i t ex 2 sec, hur ändrar jag det då?