# For Schleife in VB 6



## godi (10 Juni 2007)

Hallo!

Ich bin da grad am herumprobieren mit einer For Schleife und einer Zeitverzögerung.
Ich will eine Zahl hochzählen und in einem Textfeld ausgeben.

```
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 
Private Sub cmdZähle_Click()
Dim Zähler
Dim Zahl As Integer
Zahl = 0
 
For Zähler = 1 To 10
Zahl = Zahl + 1
txtZahl.Caption = Zahl
Sleep 1000
Next
 
End Sub
```
 
Nur wird da der Text erst ausgegeben wenn die Schleife 10mal durchlaufen wird.
Wird da nicht gleich bei dem Befehl "txtZahl.Caption = Zahl" der Text geschrieben sondern erst wenn die Schleife durchlaufen ist?
Vielleicht kann mir das wer ein wenig erklären?

godi


----------



## zotos (10 Juni 2007)

Das ist eigentlich ganz einfach. Fällt mir nur gerade schwer das mit den richtigen Worten zu erklären.

Also das Objekt txtZahl (wie alle anderen Objekte auch) wird erst aktualisiert wenn das Unterprogramm cmdZähle_Click beendet wurde. 

Die Aufgabe würde man eher so lösen das man ein Timer einfügt und diesen auf 1000ms stellt.
In diesem Timer kann man dann anstelle der For Schleife nehmen.

Der Sleep Befehl ist eh scheisse weil Dir dann ja das ganze Programm einschläft.


----------



## zotos (10 Juni 2007)

So in etwa:

```
Private Sub cmdZaehlen_Click()
  Timer1.Interval = 1000
  Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
  Static myCount As Integer
  
  If myCount < 10 Then
    myCount = myCount + 1
    txtZahl.Caption = myCount
  Else
    myCount = 0
    Timer1.Enabled = False
  End If
End Sub
```


----------



## godi (10 Juni 2007)

Ok habe jetzt das umgeändert.

```
Option Explicit
 Public Timer1 As Timer
 
Private Sub cmdZähle_Click()
    [B]Timer1.Interval = 1000[/B]    
    Timer1.Enabled = True
End Sub
 
Private Sub Timer1_Timer()
  Static myCount As Integer
  
  If myCount < 10 Then
    myCount = myCount + 1
    txtZahl.Caption = myCount
  Else
    myCount = 0
    Timer1.Enabled = False
  End If
End Sub
```
 
Nur bekomme ich immer bei Timer1.Interval = 1000 eine Fehlermeldung Objektvariable oder with Blokvariable nicht fetgelegt!  
Was mache ich falsch?


----------



## zotos (10 Juni 2007)

Den Timer (Timer1 in meinem Beispiel) bekommst Du im wenn Du aus der Werkzeugliste die Stoppuhr Wählst und auf Deine Form ziehst.

Es gibt eine Reihe von Objekten die man auf die Form malt die aber nur als Objekt im Quellcode zur Verfügung stehen. (Also im Run Modus siehst Du die Uhr dann nicht mehr)

Also das:
Public Timer1 As Timer

muss raus!


----------



## godi (10 Juni 2007)

Danke!
Is ja ganz einfach wenn man es weiß!


----------



## Senator42 (10 Juni 2007)

*DoEvents*



godi schrieb:


> Hallo!
> 
> Ich bin da grad am herumprobieren mit einer For Schleife und einer Zeitverzögerung.
> Ich will eine Zahl hochzählen und in einem Textfeld ausgeben.
> ...


Kann ich.
Du musst nur vor dem Sleep x
ein
  DoEvents
einfügen. Schon wird "Zeit" an windows abgegeben der dann die Controls bearbeitet und damit auch die aktuellen werte anzeigt.
Sleep gibt zwar auch zeit ab, aber die controls werden nicht bearbeitet.


----------



## zotos (11 Juni 2007)

Senator42 schrieb:


> Kann ich.
> Du musst nur vor dem Sleep x
> ein
> DoEvents
> ...



Wenn man die Ursprüngliche Frage betrachtet ist der DoEvents Einwurf schon richtig. So kann Windows die Ereignisse des Programms (einmal je Aufruf) weiter verarbeiten. Aber dann kommt ja immer noch die Sleep Anweisung die zwar "indirekt" Rechenzeit freigibt aber eben nur für die anderen derzeit laufenden Windows Programme. Für Dein Programm gilt sobald der Sleep Befehl an der Reihe ist schläft Deine Anwendung für die Angegebene Zeit.

IMHO sind Sleep und Goto in einem Programm nach Möglichkeit zu vermeiden. Es lohnt sich meistens da Zeit zu investieren um diese Funktionen zu umgehen.


----------



## Oberchefe (14 Juni 2007)

die normale Sleep Funktion läßt soweit ich weiß die Prozessorauslastung hochgehen, ich verwende meistens die folgendes Modul (bas):

```
Attribute VB_Name = "Sleep"
'------------ Anfang Projektdatei SleepLong.vbp  ------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
'Control CommandButton: Command2
'Control CommandButton: Command1
'Control Label: Label2
'Control Label: Label1

Option Explicit
'Autor: O.Neupert
'E-Mail: [EMAIL="o.neupert@paradigma-software.de"]o.neupert@paradigma-software.de[/EMAIL]
'API-Sleep deklarieren
Public Declare Sub Sleep Lib "kernel32" (ByVal lngMilliseconds As Long)

'Diese Sub lässt das Programm pausieren
'ohne die Prozessorleistung hochzujagen.
'Der Parameter "blnBeAwake" ist nur zum besseren Verständnis.
'Setzt man diesen auf False tritt nur die API-Sleep inkraft
'und der Prozessor geht hoch
Public Sub SleepLong(ByVal lngSeconds As Long)
   Dim t As Single, b As Boolean
   t = Timer
   Do
      Sleep 1
      DoEvents
      b = Timer - t > lngSeconds
   Loop Until b
End Sub
```
 
Der Aufruf sieht dann so aus:

```
SleepLong (5)
```
 
Der Code stammt nicht von mir, hab ihn nur mal so im Netz gefunden.


----------

