PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : For Schleife in VB 6



godi
10.06.2007, 16:22
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.06.2007, 17:08
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.06.2007, 17:22
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.06.2007, 18:18
Ok habe jetzt das umgeändert.


Option Explicit
Public Timer1 As Timer

Private Sub cmdZähle_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

Nur bekomme ich immer bei Timer1.Interval = 1000 eine Fehlermeldung Objektvariable oder with Blokvariable nicht fetgelegt! :confused:
Was mache ich falsch?

zotos
10.06.2007, 18:59
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.06.2007, 19:31
Danke!
Is ja ganz einfach wenn man es weiß! ;)

Senator42
10.06.2007, 22:46
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
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.06.2007, 13:00
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.

Oberchefe
14.06.2007, 10:03
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: o.neupert@paradigma-software.de
'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.