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; //erst startbedingung setzen,
  timer1.enable:=true;         //danach erst den timer anschalten
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!

user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
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; //erst startbedingung setzen,
  timer1.enable:=true;         //danach erst den timer anschalten
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!

user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
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:

user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
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; //erst startbedingung setzen,
  timer1.enable:=true;         //danach erst den timer anschalten
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 user profile iconNarses: 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 3600div 60;
st:= sekunden mod 60;

kette:=inttostr(st); //stunden

if min <10 then platzhalter:='0' else platzhalter:=''//falls minuten <10 ist, wird eine führende '0' eingefügt. sonst ''
kette:=kette+':'+platzhalter+inttostr(min);     //minuten

if sek <10 then platzhalter:='0' else platzhalter:='';//falls sekunden <10 ist, wird eine führende '0' eingefügt. sonst ''
kette:=kette+':'+platzhalter+inttostr(sek);    //sekunden

result:=kette;
end;