Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 9 von 9

Thema: For Schleife in VB 6

  1. #1
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 183 Danke für 168 Beiträge

    Standard


    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
    Zitieren Zitieren For Schleife in VB 6  

  2. #2
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    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.
    If you open your Mind too much, your Brain will fall out.

  3. Folgender Benutzer sagt Danke zu zotos für den nützlichen Beitrag:

    godi (10.06.2007)

  4. #3
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    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
    If you open your Mind too much, your Brain will fall out.

  5. Folgender Benutzer sagt Danke zu zotos für den nützlichen Beitrag:

    godi (10.06.2007)

  6. #4
    Avatar von godi
    godi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 183 Danke für 168 Beiträge

    Standard

    Ok habe jetzt das umgeändert.
    Code:
    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!
    Was mache ich falsch?

  7. #5
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    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!
    If you open your Mind too much, your Brain will fall out.

  8. Folgender Benutzer sagt Danke zu zotos für den nützlichen Beitrag:

    godi (10.06.2007)

  9. #6
    Avatar von godi
    godi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 183 Danke für 168 Beiträge

    Standard

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

  10. #7
    Registriert seit
    13.03.2007
    Ort
    Nürnberg
    Beiträge
    563
    Danke
    56
    Erhielt 51 Danke für 46 Beiträge

    Standard

    Zitat Zitat von godi Beitrag anzeigen
    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.
    Zitieren Zitieren DoEvents  

  11. Folgende 2 Benutzer sagen Danke zu Senator42 für den nützlichen Beitrag:

    godi (10.06.2007),zotos (11.06.2007)

  12. #8
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Zitat Zitat von Senator42 Beitrag anzeigen
    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.
    If you open your Mind too much, your Brain will fall out.

  13. #9
    Registriert seit
    11.07.2004
    Beiträge
    1.597
    Danke
    10
    Erhielt 213 Danke für 183 Beiträge

    Standard


    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: 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:
    Code:
    SleepLong (5)
    Der Code stammt nicht von mir, hab ihn nur mal so im Netz gefunden.

Ähnliche Themen

  1. While Schleife in ST
    Von Snooky im Forum CODESYS und IEC61131
    Antworten: 6
    Letzter Beitrag: 30.11.2010, 21:50
  2. IF oder FOR Schleife in AWL?
    Von motamas im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 21.07.2010, 14:19
  3. for-Schleife
    Von fai004 im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 26.04.2009, 19:14
  4. FOR Schleife
    Von dietere im Forum Sonstige Steuerungen
    Antworten: 1
    Letzter Beitrag: 19.01.2008, 02:36
  5. AWL Schleife
    Von Anonymous im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 31.07.2003, 07:05

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •