PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [F:] Warum Funktioniert meine Timer funktion in VB 6 PE nicht ?


Indikator
2003-04-07, 14:43:56
Private Sub End_Click()


End


End Sub

Private Sub Form_Load()

For i = 0 To 16
Label1(i).Visible = False
Next
i = 0

End Sub



Private Sub Timer1_Timer()


If Label1(i).Visible = False Then
Label1(i).Visible = True
Else
i = i + 1

End If

End Sub


Dies ist mein Quelltext
in VB 6 PE
Er soll alle 500ms den Code Ausführen und jeden Balken (Label1(i))
sichtbar machen. Nur macht er nur den balken mit i = 0 also den ersten Balken sichtbar =(

Gruss Indikator

stabilo_boss13
2003-04-07, 15:58:58
Originally posted by Indikator
Private Sub End_Click()


End


End Sub

Private Sub Form_Load()

For i = 0 To 16
Label1(i).Visible = False
Next
i = 0

End Sub



Private Sub Timer1_Timer()


If Label1(i).Visible = False Then
Label1(i).Visible = True
Else
i = i + 1

End If

End Sub


Dies ist mein Quelltext
in VB 6 PE
Er soll alle 500ms den Code Ausführen und jeden Balken (Label1(i))
sichtbar machen. Nur macht er nur den balken mit i = 0 also den ersten Balken sichtbar =(

Gruss Indikator Hallo,

da steckt nur ein kleiner Fehler drin!
Vorab möchte ich dir aber empfehlen, in den Optionen (Extras-Optionen) von VB6 unter Editor 'Variablendeklaration erforderlich' anzukreuzen.
Schliesst viele solcher Fehler aus, da du gezwungen wirst, deine Variablen vor der Benutzung zu deklarieren. Das aber nur so nebenbei.

Alle Variablen haben nur einen bestimmten Gültigkeitsbereich. Standard bei VB ist innerhalb des Blocks, in denen sie benutzt werden. Deine Variable i in Form_Load() weiss also nichts von i in Timer1_Timer() und umgekehrt!

Das Problem steckt in der Funktion Timer1_Timer(). Beim ersten Aufruf wird die Variable i erzeugt und auf 0 gesetzt. Diese Variable i hat ja wie gesagt, nichts mit i in der Funktion Form_Load() zu tun. Du kannst das leicht prüfen, in dem du die Variable in Timer1_Timer() in x umbenennst. Das Programmverhalten bleibt gleich.

Beim zweiten Aufruf von Timer1_Timer() ist i wieder vergessen. Also wird die Variable neu erzeugt und mit 0 vorbelegt. Das erklärt das Verhalten des Steuerelements. Es machst also genau das, was du ihm sagst!

Du hast zwei Möglichkeiten, das Problem zu lösen. Die erste ist, i als globale Variable zu deklarieren.
Die erste Zeile deines Codes (noch vor allen anderen!) muss dann lauten:

Dim i as Integer

Damit kennt jede Zeile deines Programms diese Variable. Allerdings musst du in deinem ganzen Programm darauf achten, was du mit i machst. Bei ein paar Zeilen ist das noch machbar, aber wenn dein Programm mal ein paar Hundert Zeilen hat, wird die Fehlersuche sehr mühsam.

Die richtige Lösung ist eine statische Variable. Deren Wert gilt nur im Bereich der Funktion, bleibt aber beim Verlassen erhalten.

Der Code für deine Funktion heisst also:

Private Sub Timer1_Timer()

Static k As Integer

If Label1(k).Visible = False Then
Label1(k).Visible = True
Else
k = k + 1
If k > 16 Then
k = 0
Timer1.Enabled = False ' wenn alle sichtbar sind, Timer aus!
End If
End If

End Sub


stabilo

Indikator
2003-04-08, 16:17:31
Vielen Dank
muss mich damit mal rumspielen ^^