Programmieren - alles kontrollieren 4.938 Themen, 20.667 Beiträge

VB6: Timer im Zeitformat (hh:mm:ss) anzeigen... Wie?

Mic2004 / 16 Antworten / Flachansicht Nickles

Hallo Leute!

Ich habe mir mit Visual Basic 6 einen Art kleine Stoppuhr gebastelt. Man gibt eine Startzeit ein und sie zählt dann auf null runter, um danach ein ereignis zu starten.

Das blöde daran ist nur, dass sie nur Sekunden zählt. Gibt man also als Startzeit 2 min 10 s ein, dann zählt die Stoppuhr von 130 s an rückwärts. Nun wäre es mir aber lieber, wenn sie im Format 02:10 rückwärts zählen würde. Der mir dafür bekannte Befehal Format(CStr(nSek), "mm:ss") funktioniert da leider aber nicht. Verwendet man ihn, zeigt die Stoppuhr eine völlig falsche Startzeit an und zählt auch nicht mit.

Hier mal ein Auszug aus meinem Quelltext:
Private Sub Command1_Click()
Dim Startzeit As Integer
Timer1.Enabled = True
If Text1.Text = "" And Text2.Text = "" Then
MsgBox ("Keine Startzeit eingegeben!")
GoTo Ende
Else
If Text1.Text = "" Then Text1.Text = 0
If Text2.Text = "" Then Text2.Text = 0
Startzeit = (Text1.Text * 60) + Text2.Text
nSek = Startzeit ' Timer initialisieren
Timer1.Interval = 1000 ' entspricht einer Sekunde
Label1.Caption = CStr(nSek) & " s" ' Countdown
End If
Ende:
End Sub

Private Sub Timer1_Timer()
nSek = nSek - 1 ' und wieder eine Sekunde vorbei
Label1.Caption = CStr(nSek) & " s"

If nSek Timer1.Enabled = False
[...........]
Else
End If
End Sub


Weiterhin such ich noch eine Möglichkeit, wie man am Ende des Timers evtl. einen roten Kreis (Shape) blinken lassen könnte, damit der Nutzer schneller sieht, dass die Zeit um ist.

Ich hoffe, ihr könnt mir mit guten Ideen helfen.

Grüße,
Mic2004.


bei Antwort benachrichtigen
Sovereign Sylvia Mic2004 „Hallo! Da bin ich wieder. Wo genau müsste ich denn diesen Quelltext einfügen,...“
Optionen

Hi,
also, auf welche Variable sich die Fehlermeldung "Variable nicht definiert" bezieht, weisz ich natürlich nicht. Deshalb mal ganz allgemein:
Eigentlich müsste klar sein, dass Variablen auf Modulebene deklariert werden müssen, wenn man deren Werte procedure-übergreifend am Leben erhalten will. Und da die Anfangswerte der von mir verwendeten Variablen nicht im Timer gesetzt werden, geschieht das logischerweise in einer anderen Prozedur, wozu aber die Variablen eben auf Modulebene deklariert werden müssen, sonst funktioniert es nicht.
Alle von mir genannten Variablen, die mit "mInt_" beginnen, werden auf der Form ganz oben, also auf Modulebene deklariert, deshalb beginnen sie auch mit "mInt_" - m für Modulebene und Int für Typ Integer:

Private mInt_seconds As Integer
Private mInt_minutes As Integer
Private mInt_hours As Integer

Die Werte für die Variablen setzt du dort, wo der Benutzer die Anfangswerte setzt. Wenn das eine Textbox ist, wäre das z.B. der Change-Event:

Private Sub TextHours_Change()
    mInt_hours = 0 'Auf einen Wert voreinstellen, falls die folgenden Bedingungen nicht zutreffen

    With Me.TextHours
        If .Text "" Then
            If IsNumeric(.Text) = True Then
                mInt_hours = CInt(.Text)
            End If
        End If
    End With
End Sub

Das gleiche dann für die Textboxen für Minuten und Sekunden anlegen.
Irgendwo kannst du noch einen Check einbauen, dass z.B. Minuten und Sekunden keinen Wert über 59 haben.


Alternativ kannst du die Übergabe der Textbox-Inhalte nach dem selben Schema (exakt derselbe Code) mit dem Button verbinden, der den Timer startet, dann brauchst du zumindest hierfür den Change-Event nicht. Der Change-Event ist aber hilfreich um festzustellen, dass der User gültige Angaben gemacht hat, und davon abhängig kann man den Start-Button aktivieren/deaktivieren. Dann allerdings würde ich den Überprüfungscode in eine extra Sub auslagern und die Sub von den Change-Events aufrufen:

Private Sub StartEnable()
'Start-Button deaktivieren
'Prüfung für Stunden (siehe Code oben)
'Prüfung für Minuten (Code analog zu Stunden)
'Prüfung für Sekunden (Code analog zu Stunden)
'Start-Button aktivieren, falls alle drei Prüfungen erfolgreich sind.
End Sub

Wenn nach dem Countdown Timer1 stoppt, musst du einen zweiten Timer nehmen, um die Kreise blinken zu lassen. Diesen zweiten Timer kannst du z.B. nach Ablauf der Zeit durch den ersten Timer starten und diesen zweiten Timer dann irgendwo wieder ausschalten. Für die von mir genannten Objekte Shape1 und Shape2 musst du dann natürlich die Namen für deine Kreise einsetzen.
Nun weisz ich ja nicht, was sonst noch alles in deinem Timer1 passiert, aber das kann man ja abschalten, wenn die Zeit abgelaufen ist und der Timer weiterhin aktiv bleiben soll, damit die Kreise blinken. Du schreibst dann einfach: "If mInt_seconds + mInt_minutes + mInt_hours > 0 Then" heiszt: solange die Zeit noch nicht abgelaufen ist, mache dies und das, auch z.B., dass die Kreise Visible = False sind - End If. Und danach eben: "If mInt_seconds + mInt_minutes + mInt_hours = 0 Then" - heiszt: Erst wenn die Zeit abgelaufen ist, dann lasse die Kreise blinken - End If. Und irgendwo auszerhalb des Timers eine Abschaltmöglichkeit desselben vorsehen.
Ich schalte jetzt auch ab.

HAND
Sylvia

Mein sz streikt heute wieder ------ Nobody is perfect, and we prove it every day.
bei Antwort benachrichtigen