For Schleife in VB 6

godi

Level-1
Beiträge
1.460
Reaktionspunkte
185
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
Code:
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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So in etwa:
Code:
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
 
Ok habe jetzt das umgeändert.
Code:
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! :confused:
Was mache ich falsch?
 
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!
 
DoEvents

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.
Code:
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
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.
 
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.

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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
die normale Sleep Funktion läßt soweit ich weiß die Prozessorauslastung hochgehen, ich verwende meistens die folgendes Modul (bas):
Code:
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:
Code:
SleepLong (5)

Der Code stammt nicht von mir, hab ihn nur mal so im Netz gefunden.
 
Zurück
Oben