# nach 20sec. aktion ausführen -> countdown anzeigen



## anakari (17. Januar 2002)

Also ich will folgendes machen:

nach 20 Sekunden soll z.b. ein "Hallo" Fenster erscheinen.
Und in einem "Lable1" soll die verbleibende Zeit angezeigt werden.
Also immer aktuell: "20","19","18",..."1","0" -> AKTION AUSFÜHREN


----------



## Dario Linsky (17. Januar 2002)

also, da es soweit ich weiss keine funktion wie wait, delay, sleep oder sowas gibt, wuerd ich sagen, nimm nen timer. im onTimer-event zaehlst du dann einfach irgendeine globale variable von 20 auf 0 runter und baust eine fallunterscheidung ein, die irgendwas macht, sobal dein zaehler kleiner/gleich 0 ist. und natuerlich noch den timer deaktivieren, sonst wird das irgendwann nervig...
eigentlich reicht es auch, wenn man abfragt, ob der wert gleich 0 ist, aber kleiner/gleich ist besser, weil man nie weiss, was benutzer alles hinkriegen


----------



## Leukos (18. Januar 2002)

du kannst natürlich auch die funktion getickcount von der winapi benutzen mit der tu ich mir halt leichter

mfg

leukos


----------



## anakari (18. Januar 2002)

und jetz bitte so das ich auch was versteh!...


.... .... ....


----------



## Daniel Toplak (18. Januar 2002)

Also, das ist gar net so schwer.
Du hast ein Formular auf dem ein Label-Feld ist, in dem der Countdown läuft und dann setzt du ein Timer-Objekt rein. Die Interval-Zeit stellst du auf 1000 (1000ms = 1 Sekunde).

So und jetzt dimensionierst du eine Variable i, die du auf 20 setzt. In der Sub für den Timer sagst du i=i-1 und lässt i auf dein Labelfeld ausgeben.
So jetzt brauchst du noch eine Schleife, die solange läuft, bis i<=0.
Vor der Schleife setzt du i auf 20 (s.o.) und lässt i in deinem Labelfeld ausgeben (damit er auch bei 20 zum zählen anfängt).
Ist die Schleife durchlaufen (wenn i <=0), dann dann setzt du die Eigenschaft Enabled des Timer auf False um den Timer zu deaktivieren und führst deine Aktionen aus, die nach 20 Sekunden erfolgen sollen.
Ich hoffe das war verständlich, wenn du denoch Fragen haben solltest, meld dich einfach nochmal.
Zum Schluss noch ein Code-Beispiel:

Option Explicit
Dim i As Integer

Private Sub Form_Activate()
    i = 20
    Label2.Caption = i
    Do
        'DoEvents
    Loop Until i <= 0
    Label1.ForeColor = vbRed
    Timer1.Enabled = False    
End Sub



Private Sub Timer1_Timer()
    i = i - 1
    Label2.Caption = i
End Sub


Gruss Homer


----------



## Dario Linsky (19. Januar 2002)

nimms mir nicht uebel, aber dein code macht bei mir nicht das was er soll. probier mal das hier:

Option Explicit
Dim i As Integer

Private Sub Form_Load()
  i = 20
End Sub

Private Sub Timer1_Timer()
  If i <= 0 Then
    Timer1.Enabled = False
  End If
  Label1.Caption = Str(i)
  i = i - 1
End Sub


----------



## Daniel Toplak (19. Januar 2002)

Och sorry, das DoEvents war auskommentiert. Mach das "'" vor DoEvents weg, dann gehts. Denn das DoEvents steht dafür, das dein programm auch wärend einer Schleife noch auf Aktionen reagiert. Und sag net es geht nicht, ich habs selbst versucht. 

Gruss Homer


----------



## Dario Linsky (19. Januar 2002)

*doch*

genau das sag ich  

habs ja auch ausprobiert und es gibt eine endlosschleife. da bringts auch nix, wenn das doevents wieder einkommentiert wird.
ausserdem braeuchte eine endliche schleife auf verschiedenen rechnern unterschiedlich lange, deswegen gibt es ja auch einen timer


----------



## Daniel Toplak (20. Januar 2002)

Also ich weiss echt net welches problem du dabei hast. Erstens ist das schon mal keine Enlosschleife, nämlich die geht solange bis i <=0 und i wird vom timer mit einem Interval von 1000ms (was 100% genau 1 Sekunde entspricht) zurück gezählt. Und das DoEvents brauchst du in der Schleife, sonst hast du wirklich eine Endlosschleife und es Passiert gar nix. Denn dein Programm hängt sich nämlich auf und der Timer wird nicht angesprochen.
Ich hoffe du bekommst das hin. Denn es geht so ich hab das versucht. Ich werde bestimmt hier keinen Quellcode reinposten, der nicht funktioniert und den ich nicht selbst vorher getestet habe. Und für den kleinen Fehler mit dem Kommentar vor dem DoEvents habe ich mich bereits entschuldigt.

Gruss Homer


----------



## Dario Linsky (20. Januar 2002)

hey, calm down...

war mein fehler, sorry. hatte vergessen, dem timer ein interval zu geben


----------



## Nanaki (2. Januar 2003)

also ist glaub ich mal net schlecht wenn ich hier dazuposte.

Ich hab ja den timer mal schön nachgeschrieben. Nur wenn er jetzt auf 0 ist soll er wieder von vorne anfangen, ohne dass ich was drücken muss und es soll ein sound gespielt werden (egal - nur akustisches signal) und dieses so lange bis ich einen Button drücke. Kann mir da bitte jemand den code schicken und ne minierklärung basteln.

code von dem timer:

Option Explicit
Dim i As Integer

Private Sub Command1_Click()
Unload Me
End Sub

Private Sub Form_Activate()
i = 720
Label2.Caption = i
Do
DoEvents
Loop Until i <= 0
Label1.ForeColor = vbRed
Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
i = i - 1
Label2.Caption = i
End Sub


mfg
Lord


----------



## Dario Linsky (2. Januar 2003)

```
Dim i As Integer

Private Sub Form_Create()
  i = 20
End Sub

Private Sub Timer1_Timer()
  i = i - 1
  If i <= 0 Then
    Beep 'oder wie die Funktion für Pieptöne sonst heisst...
    i = 20
  End If
End Sub
```

Eigentlich ist ja nur das Timer-Ereignis vom Timer interessant, vorher musst du nur noch die Zählervariable auf 20 setzen.
Zum Abbrechen nimmst Du noch einen CommandButton und deaktivierst den Timer in dessen Click-Ereignis:

```
Private Sub Command1_Click()
  Timer1.Enabled = False
End Sub
```


----------



## Nanaki (3. Januar 2003)

THX für deine Hilfe erst mal. Soweit klappt alles so wie ich es will. Jetzt hab ich noch eine letzte frage. Gibt es auch eine Möglichkeit eine Sounddatei abspielen zu lassen oder ein dauerhaftes Beep zu erzeugen, dass nur per klick auf einen Button abzustellen ist.

Der Timer sollte aber weiterlaufen. Und bei 0 Soll diese Sound wieder beginnen. So wie ein Kochtimer oder so.

mfg
Lord




der code des jetzigen programmes:

_________________________________

Dim i As Integer

Private Sub Form_Create()
  i = 7
End Sub

Private Sub Timer1_Timer()
  i = i - 1
  Label2.Caption = i
  If i <= 0 Then
    Label1.ForeColor = vbRed
    Beep
    i = 7
  End If
  If i = 5 Then
    Label1.ForeColor = vbBlack
  End If
End Sub

Private Sub ende_Click()
  Timer1.Enabled = False
End Sub

Private Sub start_Click()
  Timer1.Enabled = True
End Sub

Private Sub Command1_Click()
Unload Me
End Sub
_________________________________


----------



## Johannes Postler (3. Januar 2003)

mach einfach einen zweiten timer, der erst gestartet wird wenn der andere bis null heruntergezählt hat. setze den intervall des zweiten timers auf 1000 und schreib in den code beep(so wie oben). jetzt machst du einen button, der den intervall des zweiten timers auf null setzt.

tirolausserfern


----------

