Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Zeitanzeige countdown


chickenfigt1989 - Do 10.03.11 16:45
Titel: Zeitanzeige countdown
Hallo
Habe im Forum folgenden Code gefunden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label4.visible:=true;
if Zeit < StrtoTime('00:00:01'then
  Label4.Caption:='Zeit abgelaufen'
  else
    begin
      Zeit:=Zeit - 1 / SecsPerDay;
     Label4.Caption:=TimeToStr(Zeit);
    end;
    end;

Die zeitanzeige klappt wie ich will allerdings wenn die Zeit 00:00:01 beträgt wird bei Label4.caption Zeit abgelaufen angezeigt. Aber ich will das mehr passiert
Jetzt hab ich folgendes Probiert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label4.visible:=true;
if Zeit < StrtoTime('00:00:01'then
  Label4.Caption:='Zeit abgelaufen'
  Label2.Caption:='Fertig'
  else
    begin
      Zeit:=Zeit - 1 / SecsPerDay;
     Label4.Caption:=TimeToStr(Zeit);
    end;
    end;


Wieso funktioniert das nicht?
lg


Moderiert von user profile iconNarses: Topic aus VCL (Visual Component Library) verschoben am Do 10.03.2011 um 16:19


guinnes - Do 10.03.11 16:53

Begin ... End ?


chickenfigt1989 - Do 10.03.11 16:55

Geht auch nicht da kommt immer
[Error] Unit1.pas(118): Missing operator or semicolon

mein Code sieht nun so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label4.visible:=true;
if Zeit < StrtoTime('00:00:01'then
begin
  Label4.Caption:='Zeit abgelaufen'
  Showmessage('ddd')
  end
  else
    begin
      Zeit:=Zeit - 1 / SecsPerDay;
     Label4.Caption:=TimeToStr(Zeit);
    end;
    end;


Lg


ALF - Do 10.03.11 16:59

kommt von C&P und nicht verstehen


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
if Zeit < StrtoTime('00:00:01'then
begin  
   Label4.Caption:='Zeit abgelaufen';
   Showmessage('ddd');
end
else


guinnes - Do 10.03.11 17:00

user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
Geht auch nicht da kommt immer
[Error] Unit1.pas(118): Missing operator or semicolon

Und warum machst du dann nicht die Semicolons dahin, wo sie hingehören ?


Tankard - Do 10.03.11 17:01

user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
Geht auch nicht da kommt immer
[Error] Unit1.pas(118): Missing operator or semicolon

mein Code sieht nun so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label4.visible:=true;
  if  Zeit < StrtoTime('00:00:01'then
    begin
      Label4.Caption:='Zeit abgelaufen';
      Showmessage('ddd');
    end
  else
    begin
      Zeit:=Zeit - 1 / SecsPerDay;
      Label4.Caption:=TimeToStr(Zeit);
    end;
end;


Lg




MAN. Fang mal endlich an Pascal zu lernen. Tutorials lesen. Sourcecode hab ich mal ausnahmsweise verbessert.


ALF - Do 10.03.11 17:03

oder wenigstens Fehlermeldungen zu verstehen :P


jaenicke - Do 10.03.11 17:34

user profile iconTankard hat folgendes geschrieben Zum zitierten Posting springen:
MAN. Fang mal endlich an Pascal zu lernen. Tutorials lesen.
Das hat nichts mit lernen zu tun. Wenn da steht, dass ein Operator oder Semikolon fehlt und dann deswegen hier gefragt werden muss, was das heißt, dann nenne ich das nicht unwissend, sondern dämlich. Sorry, ich schreib sowas ja sonst eigentlich nicht, ist hier aber so.

Schließlich steht es in der Fehlermeldung direkt da, dass das Semikolon fehlt. Was gibt es da noch zu fragen? :roll:


Gerd Kayser - Do 10.03.11 17:51

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Was gibt es da noch zu fragen? :roll:
Wenigstens steht da "TForm1" und nicht "TForm537". Auch ein kleiner Fortschritt. ;-)


jaenicke - Do 10.03.11 17:53

Wahrscheinlich weil es gerade ein neues Projekt ist. :lol:


chickenfigt1989 - So 13.03.11 01:18

Folgender Fall.
Ich hab eine Combobox wo man 16pflanzen auswählen kann.
Jede Pflanze hat eine eigene Zeit, funktioniert auch Prima.
Allerdings will ich mehrere Comboboxen haben dann brauch ich ja mehrere Timer,
doch dann läuft die zeitanzeige viel zu schnell runter.
Wie mach ich das?
lg


HenryHux - So 13.03.11 01:22

Leider kann ich da nur reinraten, was dein Problem ist.
Setzt du denn jedes mal wenn man einen Eintrag auswählt das Interval auf die Zeit der Pflanze?

Lg


chickenfigt1989 - So 13.03.11 01:27

So sieht es aus wenn man einen Eintrag aus der Combobox wählt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if  ComboBox1.ItemIndex=1 then
begin
Button6.visible:=true;
Label2.visible:=true;
Button2.Visible:=false;
Zeit:= StrtoTime('00:00:10');
Timer2.enabled:=true;
end;


Anzumerken ist, das ich drei Tabsheets hab auf jedem tabsheet sollen mindestens 6comboboxen mit einen eigenen timer.


Edit: Habs selber hinbekommen und zwar hab ich bei der Zweiten combobox folgendes geändert:
Aus

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if ComboBox2.ItemIndex=2 then
      begin
Label8.visible:=true;
Button4.Visible:=false;
Zeit:= StrtoTime('00:00:10');
Timer1.enabled:=true;

end;

wurde

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if  ComboBox1.ItemIndex=1 then
begin
Button6.visible:=true;
Label2.visible:=true;
Button2.Visible:=false;
time:= StrtoTime('00:00:10');
Timer2.enabled:=true;
end;


und oben sieht es so aus:

Delphi-Quelltext
1:
2:
3:
4:
var
  Form1: TForm1;
   Zeit:TDateTime;
   time:TDateTime;


Lg


ALF - So 13.03.11 12:10

Ich hoffe doch nur, das Du nun nicht auch 16 Timer für 16 Pflanzen gesetzt hast :rofl:

Gruss Alf


chickenfigt1989 - So 13.03.11 14:33

Nein hab einen Timer für die sämtlichen pflanzen die in der Combobox stehen.

Brauch halt trotzdem 4timer weils bäume und so auch noch gibt.
lg


ALF - So 13.03.11 14:36

Auch dazu brauch man eigentlich nur einen Timer :wink:
Der rest ist Code 8)

Gruss Alf


beastofchaos - So 13.03.11 15:06

Ich weiß ja nicht, wie du dir das vorstellst mit den Bäumen und Pflanzen - ich vermute, du wilst iwie die Zeit zum wachsen "messen" oder so was. Ich würde da vll schon 2 timer für die beidne fälle nehmen, sofern du nicht das verhältnis zwischen dem einen und anderen Timer weißt

also so wär es leicht zu einem timer zu lösen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Interval := 1000;
  Timer2.Interval := 500;
end;

TForm1.Timer1Timer(Sender: TObject);
begin
  a := a + 20;
end;

TForm1.Timer2Timer(Sender: TObject);
begin
   b := b + 20;
end;



Lösung:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Interval := 1000;
end;

TForm1.Timer1Timer(Sender: TObject);
begin
  a := a + 20;
  b := b + 40;
end;


So, kann man alles in einem Timer unterbringen ;)



Grüße, beast


chickenfigt1989 - Mi 27.04.11 23:03

hallo
habe den timer wie oben gepostet
kann man es irgendwi so machen das wenn die zeiit nur noch 60min beträgt nen warnsound oder so ausgibt?
lg


jaenicke - Mi 27.04.11 23:18

user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
kann man es irgendwi so machen das wenn die zeiit nur noch 60min beträgt nen warnsound oder so ausgibt?
Ja.


chickenfigt1989 - Mi 27.04.11 23:21

und wie?


jaenicke - Mi 27.04.11 23:23

Zum Beispiel mit der [url=http://www.un4seen.com/bass.html]bass.dll[/url] oder PlaySound [http://msdn.microsoft.com/en-us/library/dd743680.aspx] oder...


chickenfigt1989 - Mi 27.04.11 23:42

ja wie ich nen sound abspiele ist mir klar
hab ja nen sound wenn der countdown auf null steht
und der sound ist mittels .res datei in die exe eingebunden.
wollte nur wissen wissen ob ich zwischendrin auh nen soundabspielen kann wenn es nur noch 60min sind wie das geht
lg


beastofchaos - Do 28.04.11 00:11

Also Sound ausgeben... DA gibt es viiele Möglichkeiten. die leichteste, aber schlechteste: mach nen Mediaplayer auf dein Forumlar(Visible := False). Dak annste dann das Lied im Objektinspektor hochladen. Im FormCreate gibtse noch Mediaplayer1.Open oder so an und an der Stelle, wo du das ausgibst steht dann Mediaplayer1.Play ;)

Ob noch 60 Minuten sind, wirst du doch sicher lösen können, da ich keien ahnung habe, in welchen Zusammenhang die Zeit ist und etc.

Gruß, beast


chickenfigt1989 - Do 28.04.11 00:40

dankeschön an vp aber wie ich sounds abpsiele hab cih bereits
lg


Dude566 - Do 28.04.11 00:46

Mal im Ernst, wo ist denn jetzt dein Problem im Timer abzufragen ob noch 60 Minuten verbleiben und dann deinen Sound wiederzugeben?


chickenfigt1989 - Do 28.04.11 01:01

wenn ich ne if abfrage einbaue

Delphi-Quelltext
1:
2:
3:
4:
5:
if sid <StrtoTime('00:60:00'then
    begin

Hier mein sound
end;


der sound erscheint 2sek nachdem die zeit bei 60war allerdings wird er dauernd wiederholt
also er fängt immer von neu an
lg


jaenicke - Do 28.04.11 06:57

Du widersprichst dir:
user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
kann man es irgendwi so machen das wenn die zeiit nur noch 60min beträgt
user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
wenn ich ne if abfrage einbaue

Delphi-Quelltext
1:
2:
if sid <StrtoTime('00:60:00'then
    begin
Eigentlich willst du bei 60 Minuten bereits, dass etwas passiert, andererseits schreibst du im Quelltext hin, dass erst bei weniger als 60 Minuten etwas passieren soll...

Ja, und gegen die Wiederholungen hilft nur, dass du dir in einem privaten Feld speicherst, ob du die Warnung bereits ausgegeben hast. Wie auch sonst?


ALF - Do 28.04.11 09:50

Wenn Du pfiffig bist und Dein Zeitintervall in sec abläuft? dann weist Du auch das 1sec später der Wert nicht mehr stimmt.

Delphi-Quelltext
1:
if sid = strtotime(01:00:00then sound                    

1Sec später ist sid dann 00:59:59 und der sound kommt nicht mehr.
Schon sparst du Dir evtl noch ne Variable ein.

Gruss Alf


jaenicke - Do 28.04.11 09:57

Und was, wenn der PC gerade ausgelastet ist und die Message erst eine Sekunde später verarbeitet wird? Ein Timer ist nicht und schon gar nicht immer präzise, darauf darf man sich nicht verlassen...


ALF - Do 28.04.11 10:07

In diesem Fall dürfte es doch keine rolle spielen :gruebel:
Da 'sid' eh im Timer dec wird(davon geh ich aus) kann auch nur in diesem Timer die Abfrage starten. Selbst wenn der Timer mal nicht kann, kann 'sid' auch nicht Dec werden.
Oder ist da mein Gedanke falsch ?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Procedure Timer
begin
dec(sid)
if sid = strtotime(01:00:00then sound
...
...

end;

Gruss Alf


jaenicke - Do 28.04.11 10:26

Von allem anderen abgesehen: Fließkommazahlen mit = zu vergleichen ist ohnehin keine gute Idee durch die Ungenauigkeiten bei Berechnungen...


ALF - Do 28.04.11 10:40

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
...Fließkommazahlen mit = zu vergleichen ist ohnehin keine gute Idee durch die Ungenauigkeiten bei Berechnungen...
Ich geb mich geschlagen, <= ist da schon richtig und der zusätzlichen Variable .
'Duck und Weg' :mrgreen:

@chickenfigt1989 vergiss meinen Vorschlag ganz schnell, hab da im Moment nicht weiter gedacht :oops:

Dafür geb ich dir ne fertige Lösung :wink:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
private
  canplay: Boolean;
....
....
//im Timer dann
if canplay and (sid <= strtotime(01:00:00)) then
begin
   playsound;
   canplay:= False;
end
....
...

Gruss ALf


beastofchaos - Do 28.04.11 12:03

Richtig so, du prüfst einfach mti einer Boolean, ob du es bereits abgespielt hast ;)

Da komtm mir ne Frage von wegen Fließkomma zahlen... Kann man eine Zeit runden? Also von Minuten auf Stunden oder Sekudnen auf Minuten? :) Dann könntest du die Boolean wieder vergessen xD


HenryHux - Do 28.04.11 12:06

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:

Da komtm mir ne Frage von wegen Fließkomma zahlen... Kann man eine Zeit runden? Also von Minuten auf Stunden oder Sekudnen auf Minuten? :) Dann könntest du die Boolean wieder vergessen xD


Dann hättest du immernoch das Problem, dass der Ton mehr als einmal abgespielt wird.


beastofchaos - Do 28.04.11 13:37

Ne, die eine Variante war ja von euch: imemr mit "<=" / "<" ausprobieren und nach dem ersten mal Boolean auf True/False setzen.
Die andere Variante mit nur einem "=", aber weil die Variable zu genau sein könnte, war meine Frage, ob man die runden könnte :P


HenryHux - Do 28.04.11 13:40

Ja aber wenn du nach 6h den CountDown aktivieren willst ohne eine boolean zu setzen, dann wird 5:30 - 6:29 auf 6 Stunden gerundet =)
Wenn du nur Sekunden rundest, ist es das gleiche in Grün.

lg


beastofchaos - Do 28.04.11 13:50

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Von allem anderen abgesehen: Fließkommazahlen mit = zu vergleichen ist ohnehin keine gute Idee durch die Ungenauigkeiten bei Berechnungen...


Mir fällt grad auf, dass er recht hat. Hier gibts es in der Zeitanzeige sicher keine Millisekunden mit drinnen, deswegen muss das doch auf gehen, und TDate ist doch keine Fließkommzahl. Also braucht man auch nicht runden. Einfach ein "=" und das wars :)


Bergmann89 - Do 28.04.11 14:04

Hey,

[ignore]
guckst du hier [http://tinyurl.com/6xq84ty]
und normalerweiße gilt folgendes:
1. Google fragen
2. Forensuche fragen
3. neue Frage neues Topic

;)
[/irgnore]

€: Mist, es gibt ja noch ne 2. Seite xD

MfG Bergmann


jaenicke - Do 28.04.11 14:26

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
und TDate ist doch keine Fließkommzahl
Irrtum... :roll: