Entwickler-Ecke

Sonstiges (Delphi) - Countdown


Makavelithadon - Mi 27.09.06 14:22
Titel: Countdown
Ne Frage ma wieder:
Ich will folgendes haben:
Einen Countdown, der per buttonklick aktiviert wird und den mann in einem labelfeld runterzählen sieht und eine message, die erscheint wenn der zähler auf null ist!
Irgendwelche vorschläge? :)


Miri - Mi 27.09.06 14:28

guck mal nach Suche in der Entwickler-Ecke TIMER...


ZeitGeist87 - Mi 27.09.06 14:39

Hallo!

Globale Variable deklarieren, der nen Startwert zuweisen und in der OnTimer-Procedure diese Variable dekrementieren und prüfen ob sie 0 ist


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
//Globale Variable
var counter: integer = 10//Startwert 10 (Sekunden)
...

//Im OnTimer-Ereignis
...
 dec(counter);
 if counter <= 0 then
 begin
  Timer deaktivieren;
  Meldung ausgeben
 end;


Noch zu beachten: Zur Designzeit den Timer auf Enabled = false setzen, und das Intervall auf 1000 (Damit immer nach ca. 1 Sekunde das OnTimer-Ereignis ausgelöst wird).

LG
Stefan


Makavelithadon - Mi 27.09.06 18:52

Ich schigg ma quelltext


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:
var
  Form1: TForm1;


implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
If Zeit =0 then
Label1.caption  := 'Boom'
else
Label1.Caption :='noch' +IntToStr(Zeit)+ 'Sekunden';
Timer1.Enabled := (zeit >=0);
Dec(Zeit);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin  
  Timer1.Enabled := False;  
  Button1.Caption := 'Start';
  Zeit:= 10;
end;  
end.


Folgendes Prob: Wenn ich jez den button klick kommt da die message sofort im labelfeld und dann steht da 1-sekunde und das wars schon!!

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt


ZeitGeist87 - Do 05.10.06 11:10

Hi!


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:
 procedure TForm1.Button1Click(Sender: TObject);
 begin
  Timer1.Enabled:=true;
 end;

 procedure TForm1.Timer1Timer(Sender: TObject);
 begin
  If Zeit =0 then
   Label1.caption  := 'Boom'
  else //Sollen mehr als ein Befehl nach einem 'else' ausgeführt werden, musst du diese
  begin //mit 'begin' und 'end' zu einem Block zusammenfassen
   Label1.Caption :='noch' +IntToStr(Zeit)+ 'Sekunden';
   Timer1.Enabled := (zeit >=0);
   Dec(Zeit);
  end;
 end;

 procedure TForm1.FormCreate(Sender: TObject);
 begin  
  Timer1.Enabled := False;  
  Button1.Caption := 'Start';
  Zeit:= 10;
 end;  
end.


LG
Stefan


Makavelithadon - Mi 11.10.06 14:13

Jetzt steht im Labelfeld wenn man den klickt nur die anchricht und dann nix mehr


ZeitGeist87 - Mi 11.10.06 14:18

welchen intervall hat dein timer?
was für ne nachricht?

wir der button auch erst bei onbuttonclick oder so aktiviert oder läuft der schon bei on formcreate munter drauf los?


Xion - Mi 11.10.06 14:20


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Timer1Timer(Sender: TObject);
 begin
  If Zeit =0 then
    Label1.caption  := 'Boom'
  else
    Label1.Caption :='noch' +IntToStr(Zeit)+ 'Sekunden';

  Timer1.Enabled := (zeit >0);
  Dec(Zeit);
end;


so vielleicht?


Makavelithadon - Mi 11.10.06 14:24

Intervall is 1000 und es eght auch so net bei buttonklick kommt immer nur die nachricht
Nachricht= die die er zeigen soll wenn timer auf 0 is die is bei mir 'boom'


Xion - Mi 11.10.06 14:27

user profile iconMakavelithadon hat folgendes geschrieben:
bei buttonklick kommt immer nur die nachricht


was verstehst du unter Nachricht? noch x Sekunden? Boom? oder ne Fehlermeldung? (oder die Tagesschau :mrgreen: )


Makavelithadon - Mi 11.10.06 14:29

Also bei buttonklick soll ersma im label kommen noch 10 sekunden dann soll der sekündlich runterlaufgen und wenn der halt auf null is soll im label stehen booom


Xion - Mi 11.10.06 14:30

setzt du Zeit auch auf irgendwas beim Programmstart?


Makavelithadon - Mi 11.10.06 14:31

So hier nommal quelltext

implementation
var counter :integer=10 ;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=true;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
If Zeit =0 then
Label1.caption := 'Boom'
else
Label1.Caption :='noch' +IntToStr(Zeit)+ 'Sekunden';
Timer1.Enabled := (zeit >0);
Dec(Zeit);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled := False;
Button1.Caption := 'Start';
Zeit:= 10;
end;
end.


Delete - Mi 11.10.06 14:32

Villeicht gehts mit zwei Timern:
Timer1.enabeld:=false;
OnClick des Buttons: Timer1.enabled:=true
Variablen:= Zahl:Integer;

OnTimer1-Ereigniss:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
If Zahl:=0 then 
begin
Label1.caption:='Zeit abgelaufen';
Timer2.enabled:=false;
end
else Zahl:=Zahl-1


OnTimer2-Ereignis:

Delphi-Quelltext
1:
Label1.caption:=Zahl;                    


ZeitGeist87 - Mi 11.10.06 14:32

:lol:

nenn mal oben deinen counter zeit =)

LG
Stefan


Xion - Mi 11.10.06 14:32

ich seh in deinem Code oben gar keine Deklaration von Zeit. Hast du irgendwo Zeit: integer? UND: nicht lokal, sondern global muss Zeit sein.

//EDIT: lol haben da viele zwischendrin geantwortet *g* da kriegt man ja nur die hälfte mit ;)


ZeitGeist87 - Mi 11.10.06 14:37

siehe anhang..hat 3 minuten gedauert!


Makavelithadon - Mi 11.10.06 14:37

procedure TForm1.Timer2Timer(Sender: TObject);
begin
Label1.caption :=Zahl

[Fehler] Countdown.pas(63): Inkompatible Typen: 'String' und 'Integer'


Delete - Mi 11.10.06 14:39

Zahl ist doch die Zahl wovon runtergezählt werden soll, also z.B 10.
Das Intervall vom ersten Timer müsste eine Sekunde betragen. Und das Intervall vom zweiten müsste möglichst kurz sein.


ZeitGeist87 - Mi 11.10.06 14:39

.caption erwartet nen String
Zahl ist aber vom Typ integer

Also einfach

Delphi-Quelltext
1:
label1.caption:= inttostr(zahl);                    


LG
Stefan


Marc. - Mi 11.10.06 14:40

Du musst deinen Integer Typen natürlich zuerst in einen String umwandeln!

Delphi-Quelltext
1:
 label1.caption := IntToStr(Zahl);                    

Am besten ließt du dir aber erstmal den Delphi-Crashkurs [http://dsdt.info/tutorials/crashkurs/?page=3] durch ;)


Xion - Mi 11.10.06 14:41

2 timer ist meinermeinung nach quatsch. Wenn du die eine Zeile vom 2ten Timer in den ersten ans Ende kopierst ist das genau das selbe.


Makavelithadon - Mi 11.10.06 14:44

Kann mir jez plz nochmal einer nen quelltext schiggn ich bin grad verwirrt^^


ZeitGeist87 - Mi 11.10.06 14:45

schau mal auf seite eins da hab ich dir was angehängt...


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:
44:
45:
46:
47:
48:
49:
50:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  zeit: integer = 10;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 zeit:= 10;
 label1.caption:= inttostr(zeit);
 timer1.enabled:= true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 dec(zeit);
 if zeit < 1 then
 begin
  label2.Caption:= 'BOOM';
  timer1.Enabled:= false;
 end
 else
  label2.caption:= inttostr(zeit);
end;

end.


AndyM79 - Mi 18.10.06 08:23

Hallo,
das Thema läuft zwar schon ne Weile, aber ich hatte ein ähnliches Problem und hab mir da einfach mal ein eigenes Formular gebastelt.
Formular in Projekt einbinden und einfach Aufrufen. Es geht dann ein Fenster auf und der Countdown läuft ab, solng ist die Applikation gesperrt.
Ich fand die Lösung recht elegant.

Dateien des Countdown Formulars und Bild des Fensters im Anhang.
und so wird der Countdown gestartet:

**Code**
procedure TForm1.Button1Click(Sender: TObject);
begin
with TCountdown.Create(nil) do
try
StartCountdown(1);//Zeit Countdown in Minunten, läßt sich aber auch in Sekunden umbauen
finally
Free;
end;
end;
****

Vielleicht kann es ja jemand gebrauchen.

Gruß aus dem schönen Westerwald
Andy


Raezor - Mo 12.03.07 18:43

wie kann ich machen, das neben den start button ein feld ist, zum eintragen, ab wo der timer zählt?
Also so, dass man die Zeit, die runterzählt selbst einstellen kann?

ich bezihe mich auf den code:
http://www.delphi-forum.de/download.php?id=4514


Raezor - Di 13.03.07 21:37

seit nicht so, teilt euer wissen mit mir^^


Marc. - Di 13.03.07 21:44

Das sollte nun wirklich nicht zu schwer sein.
Was du brauchst ist ein Editfeld. Aus diesem Editfeld liest du deinen Startwert aus und ersetzt ihn mit der "10", die zur Zeit noch in deinem Quellcode steht.;)

grüße


Raezor - Mi 14.03.07 15:07

und das geht, indem man welchen code benutzt?


ZeitGeist87 - Mi 14.03.07 15:21

Hallo!

Angenommen du hast ein Edit, einen Button und einen Timer auf deinem Formular!

Deklarier eine globale Variable: counter: integer;

Einstellungen: Edit = deine Zahl
Timer = Intervall auf 1000 (1 Sekunde)

Timer ist deaktiviert (enabled = false)

Bei Button-Klick:


Delphi-Quelltext
1:
2:
3:
4:
  //Initialisierung
  counter:= 0;
  //Countdown starten
  Timer.Enabled:= true;


Im Timer-Ereignis deines Timers:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  //Eins raufsetzen
  inc(counter);
  //einfach mal ausgeben
  caption:= inttostr(edit.text - counter);
  //Prüfen ob Countdown erreicht
  if counter >= strtoint(edit.text) then
  begin
   //Countdown ist abgelaufen
  end;


Hoffe es ist verständlich!

LG
Stefan


Raezor - Mi 14.03.07 16:09

Irgendwie nicht.^^

mein quellentext:


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:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Timer2: TTimer;
    Panel1: TPanel;
    Label2: TLabel;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  zeit: integer = 100;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
zeit:= 11;
 timer1.enabled:= true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 dec(zeit);
            windows.Beep(1000,200);
 if zeit < 0 then
 begin
  label2.Caption:= '00';
           windows.Beep(800,200);
  windows.Beep(400,2000);

  close;
 end
 else
  label2.caption:= inttostr(zeit);
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
zeit:= 60;
windows.Beep(2000,2000);
 timer1.enabled:= false;
 timer2.enabled:= false;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

 Form1.Brush.Style:=bsClear;
  Form1.BorderStyle:=bsNone;
end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
inc(zeit);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
zeit:= 31;
 timer1.enabled:= true;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
zeit:= 8;
 timer1.enabled:= true;

end;

end.


Wie also?

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt


Raezor - Do 15.03.07 20:24

bitte helft mir doch.
Ich komme nicht ganz zurecht.
Versuche schon mit

Quelltext
1:
zeit:= (Edit1.Text);                    

, doch es geht nicht


ZeitGeist87 - Do 15.03.07 20:51

Hallo!

1. Wenn Zeit vom Typ Integer ist (was ich annehme) musst du zeit:= strtoint(edit1.text) schreiben, weil Integer und String nicht kompatibel sind.

2. Wenn man sich die vorherigen Beiträge durchliest und die Suchfunktion im Forum benutzt, kommt man irgendwann auch dahinter.

3. Im Anhang!

LG
Stefan


Raezor - Do 15.03.07 22:04

Vielen dank, Geist der Zeit, es funktioniert
mit strtoint