Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Countdown
chickenfigt1989 - Mo 07.03.11 11:29
Titel: Countdown
Hallo
Ich habe folgenden Code beim Button klick:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| procedure TForm1.Button1Click(Sender: TObject); begin if ComboBox1.ItemIndex=0 then begin Showmessage('Bitte wähle eine Pflanze aus!'); end; if ComboBox1.ItemIndex=1 then begin Timer1.enabled:=true; Label4.visible:=true; Label5.visible:=true; Label3.visible:=true; Button1.Visible:=false; ct:=10; label4.caption:=inttostr(ct); end; if ComboBox1.ItemIndex=2 then begin Timer2.enabled:=true; Label4.visible:=true; Label3.visible:=true; Button1.Visible:=false; ct:=20; label4.caption:=inttostr(ct); end; if ComboBox1.ItemIndex=3 then begin Timer3.enabled:=true; Label4.visible:=true; Label3.visible:=true; Button1.Visible:=false; ct:=30; label4.caption:=inttostr(ct); end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin ct:=ct-1; label4.caption:=inttostr(ct); if ct=0 then timer1.enabled:=false; if ct=0 then Label4.caption:='Fertig'; if ct=0 then Button2.Visible:=true; end; |
Folgenden Code im Timer1:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Timer1Timer(Sender: TObject); begin ct:=ct-1; label4.caption:=inttostr(ct); if ct=0 then timer1.enabled:=false; if ct=0 then Label4.caption:='Fertig'; if ct=0 then Button2.Visible:=true; end; |
Wenn ich nun in der Combobox einen eintrag auswähle und auf Start klicke,
läuft die Zeit ab und es funktioniert bis auf eine Kleinigkeit.
Bei den ersten beiden Einträgen läuft die Zeit zu Schnell ab und Stoppt nicht bei 0,
sondern geht dann ins Minus nur beim letzten eintrag funzt es wie gewollt
wo liegt da der fehler?
lg
KleinesPferd - Mo 07.03.11 12:30
Weil du evtl unterschiedliche Timer hast?
Was steht denn bei den Anderen Timer-Events drin?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| if combobox1.itemindex>0 then begin Label4.visible:=true; Label5.visible:=true; Label3.visible:=true; Button1.Visible:=false; ct:=10* combobox1.itemindex; timer1.enable:=true; end; |
Edith sagt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Timer1Timer(Sender: TObject); begin if ct>0 then begin ct:=ct-1; label4.caption:=inttostr(ct); end else begin timer1.enabled:=false; Label4.caption:='Fertig'; Button2.Visible:=true; end; end; |
ich würd' den quelltext in diese richtung abändern.
Hart auf 0 zu vergleichen ist okay. Aber da muss der Rest wirklich stimmen. Besser ist da ein Unscharfer vergleich (klingt bisl blöd) auf größer oder kleiner Null. Damit deckst du einen größeren Bereich ab. Spätestens bei Zustandsautomaten wirst sehen was ich meine ;)
grüße
chickenfigt1989 - Mo 07.03.11 12:32
Da steht das gleiche drin wie bei den anderen
lg
Narses - Mo 07.03.11 12:35
Moin!
Bei mehreren Timern stellt sich die Frage, was das soll. Normalerweise braucht man nur einen Timer, dann hat man auch keine Synchronisationsprobleme. :nixweiss:
cu
Narses
chickenfigt1989 - Mo 07.03.11 12:37
Oke aber ich hab für jeden Combobox eintrag eine andere zeit
Reicht es dann wen ich nur einen TImer hab?
lg
Narses - Mo 07.03.11 12:41
Moin!
chickenfigt1989 hat folgendes geschrieben : |
ich hab für jeden Combobox eintrag eine andere zeit
Reicht es dann wen ich nur einen TImer hab? |
Ja, klar. Wenn du mehrere unterschiedliche Zeiten verarbeiten willst, brauchst du halt nur mehrere Variablen für die abgelaufene Zeit. Wenn die letzte dieser Zeitkonten "leer" gelaufen ist, dann stoppst du den Timer. :idea:
cu
Narses
KleinesPferd - Mo 07.03.11 12:41
chickenfigt1989 hat folgendes geschrieben : |
Oke aber ich hab für jeden Combobox eintrag eine andere zeit
Reicht es dann wen ich nur einen TImer hab?
lg |
Einer reicht. Ändert sich ja nur der Zählwert.
Zusätzlich kannst du durch If Abfragen in der Timerroutine ja nochin andere Richtungen gehen.
Grüße
chickenfigt1989 - Mo 07.03.11 12:42
Ich habe ja eh folgenden Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| if combobox1.itemindex>0 then begin Label4.visible:=true; Label5.visible:=true; Label3.visible:=true; Button1.Visible:=false; ct:=10* combobox1.itemindex; timer1.enable:=true; end; |
Soweit ich das Richtig Verstanden habe ist ct:=10 die Zeit.
Kann man die Zeit auch Formatiert anzeigen?
Bis jetzt zeigt es mir die Zeit nur in Sekunden an
lg
Narses - Mo 07.03.11 12:46
Moin!
chickenfigt1989 hat folgendes geschrieben : |
| Soweit ich das Richtig Verstanden habe ist ct:=10 die Zeit. |
:gruebel: Wie "soweit ich das richtig verstanden habe"? Ist das nicht dein Code? :nixweiss:
chickenfigt1989 hat folgendes geschrieben : |
| Kann man die Zeit auch Formatiert anzeigen? |
Ja klar, die Frage ist: in welchem "Format" denn? ;)
cu
Narses
chickenfigt1989 - Mo 07.03.11 12:47
Doch klar ist es mein Code ich war momentan nur bisschen Verwirrt.
Ich hau gleich mal die Restlichen Timer raus die ich nicht mehr benötige.
Es sollte in diesen Format sein: 00:00:00
lg
KleinesPferd - Mo 07.03.11 12:56
Mooooooooment ....
Das ist mein Code.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| if combobox1.itemindex>0 then begin Label4.visible:=true; Label5.visible:=true; Label3.visible:=true; Button1.Visible:=false; ct:=10* combobox1.itemindex; timer1.enable:=true; end; |
deiner hingegen schaut noch etwas anders aus ;)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| procedure TForm1.Button1Click(Sender: TObject); begin if ComboBox1.ItemIndex=0 then begin Showmessage('Bitte wähle eine Pflanze aus!'); end; if ComboBox1.ItemIndex=1 then begin Timer1.enabled:=true; Label4.visible:=true; Label5.visible:=true; Label3.visible:=true; Button1.Visible:=false; ct:=10; label4.caption:=inttostr(ct); end; if ComboBox1.ItemIndex=2 then begin Timer2.enabled:=true; Label4.visible:=true; Label3.visible:=true; Button1.Visible:=false; ct:=20; label4.caption:=inttostr(ct); end; if ComboBox1.ItemIndex=3 then begin Timer3.enabled:=true; Label4.visible:=true; Label3.visible:=true; Button1.Visible:=false; ct:=30; label4.caption:=inttostr(ct); end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin ct:=ct-1; label4.caption:=inttostr(ct); if ct=0 then timer1.enabled:=false; if ct=0 then Label4.caption:='Fertig'; if ct=0 then Button2.Visible:=true; end; |
---
Moderiert von
Narses: Beiträge zusammengefasst---
Die Zeitausgabe ist relativ simpel. Für einen Lerneffekt empfehle ich diese mal selber zu schreiben und zu durchdenken ;)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function sekundeninzeit(sekunden:integer):string; var kette, platzhalter:string; sek, min, st: integer; begin sek:=sekunden div 3600; min:=(sekunden mod 3600) div 60; st:= sekunden mod 60;
kette:=inttostr(st); if min <10 then platzhalter:='0' else platzhalter:=''; kette:=kette+':'+platzhalter+inttostr(min); if sek <10 then platzhalter:='0' else platzhalter:='';kette:=kette+':'+platzhalter+inttostr(sek); result:=kette; end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!