Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Vb6 Laufzeitfehler 380

torsten40 / 6 Antworten / Baumansicht Nickles

hallo ich habe folgendes Problem
Ich habe ein kleinen code und bin da halt am testen und komme nicht weiter.
1 Command Button
1 Listbox Controll

Privat Sub Command1_click()
List1.ListIndex = List1.ListIndex +1
end sub

Halt das der selectierte Eintrag immer einen Eintrag herunter geht.

So wenn ich nun in der Listbox einige Werte habe, zb

1
2
3
4
5
6

so wenn der nun bei 6 angekommen ist, kommt ein Fehler "Laufzeitfehler 380"

ich habe es bisher immer so gehalten das ich immer ein "--End--" dazugebackt habe und dann gesagt habe

If List1.text = "--End--" then
list1.selected(0) +1
end if

also das es dann wieder oben beginnt. Doch wenn ich nun zb einige Werte in die Listbox drunter eintrage dann steht diese --End-- in der Mitte und fängt ab da halt wieder oben an. zb

1
2
3
--End--
4
5

So meine Frage ist nun wie kann man das ändern?
Oder kann man auch sagen das "--End--" immer unten in der Listbox ist, egal ob man noch einen Eintrag dazuschreibt oder nicht?

So gesehen soll die Listbox wieder oben anfangen wenn der Untern angekommen ist.
Und nicht schmunzeln ich bin da noch Anfänger :D
Danke

Freigeist
bei Antwort benachrichtigen
PaoloP torsten40 „Vb6 Laufzeitfehler 380“
Optionen

Kein Schimmer wo dein Problem liegt aber um rauszukriegen ob das selektierte Item das letzte in der Liste ist würde ich in etwa so vorgehen:

If (List1.ListIndex > -1) And (List1.ListIndex + 1 = List1.ListCount) Then

MsgBox "Ich bin das letzte (Item!)" & List1.List(List1.ListIndex)

End If

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
Borlander torsten40 „Vb6 Laufzeitfehler 380“
Optionen
soll die Listbox wieder oben anfangen wenn der Untern angekommen ist.
Dazu brauchst Du keine Verrenkungen wie ein spezielles Ende-Item. Du kannst einfach Modulo (liefert den Rest einer Ganzzahldivision zurück; in den meisten Sprachen ist das der Operator %, in VB und Basic könnte es auch MOD sein) der Listenlänge rechnen, dann erhälst Du nur Indizes im Intervall 0 bis List1.ListCount-1 (heißt vermutlich anderes als ListCount, ich hatte mit VB noch nie intensiver zu tun)...

Gruß
Borlander
bei Antwort benachrichtigen
torsten40 Borlander „ Dazu brauchst Du keine Verrenkungen wie ein spezielles Ende-Item. Du kannst...“
Optionen

Danke erstmal für beide Hilfen.
Vom Prinzip hab ich es.

Private Sub Command1_Click()

If (List1.ListIndex > -1) And (List1.ListIndex + 1 = List1.ListCount) Then
List1.Selected(0) = True
Else: List1.ListIndex = List1.ListIndex + 1
End If

End Sub

So ist die Funktion die ich habe wollte.

Das mit dem End-Item hab ich bisher nur immer so gemacht, weil ich halt keine Lösung dafür hatte, und das war der einzig Weg, wie ich es Lösen konnte.
Nun hab ich aber einer Besser, ich habe vorher auch schon gegooglt, aber bin nie wirklich zu einem Erfolg gekommen.

Danke euch beiden.

Dann will ich mal nach einer Erklärung für den Code googlen, warum der da wieder oben anfängt

Freigeist
bei Antwort benachrichtigen
Borlander torsten40 „Danke erstmal für beide Hilfen. Vom Prinzip hab ich es. Private Sub...“
Optionen

Heißt also tatsächlich ListCount.
Warum machst Du es nicht mit Modulo. Das ist deutlich einfacher und übersichtlicher:

List1.ListIndex = (List1.ListIndex + 1) % List1.ListCount;
oder
List1.ListIndex = (List1.ListIndex + 1) MOD List1.ListCount;

Mehr braucht es nicht für die gewünschte Funktionalität!

bei Antwort benachrichtigen
torsten40 Borlander „Heißt also tatsächlich ListCount. Warum machst Du es nicht mit Modulo. Das ist...“
Optionen

Danke Bordlander
List1.ListIndex = (List1.ListIndex + 1) Mod List1.ListCount
das geht auch. Dieses "MOD" kannte ich überhaupt noch nicht. Naja daher bin ich auch Anfänger. Wäre nur gut wenn du noch eine kleine Erklärung abgibst was da überhaupt passiert. Weil wie man sieht kann man aus einem 4 Zeilen Code auch ganz leicht eine Zeile machen. Kein Plan.

Freigeist
bei Antwort benachrichtigen
Borlander torsten40 „Danke Bordlander List1.ListIndex List1.ListIndex 1 Mod List1.ListCount das geht...“
Optionen

Wie schon oben geschrieben heißt diese Operation Modulo. n mod m liefert den ganzzahligen Rest der Ganzzahldivison n/m zurück. Also z.B.
1 mod 6 = 1 (1 = 1 + 0*6)
3 mod 6 = 3 (3 = 3 + 0*6)
6 mod 6 = 0 (6 = 0 + 1*6)
7 mod 6 = 1 (7 = 1 + 1*6)

Ist immer mal wieder praktisch um Werte auf ein Interval [0;n[ ab zu bilden :-)

Für Details verweise ich einfach mal auf http://de.wikipedia.org/wiki/Modulo

Gruß
Borlander

bei Antwort benachrichtigen