Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Verbleibene Sekunden in einem Label anzeigen


Daniboy - So 05.10.08 00:39
Titel: Verbleibene Sekunden in einem Label anzeigen
hallo!
mein timer zählt von 60.000 runter (eine minute).
nun möchte ich in einem label die verbleibenden sekunden anzeigen, also 60,59,58...
ist dies möglich?

mfg Daniboy


platzwart - So 05.10.08 00:57

logisch!

stell deinen timer auf 1000. dann zählst du einen counter um 1 hoch (bei 60 soll er dann ja nicht mehr weitermachen) und gib z.b. in einem label 60-counter aus...


Delete - So 05.10.08 17:02

Oder den Counter gleich auf 60 und dann subtrahieren, das ist nicht so umständlich ;)


Yogu - So 05.10.08 17:17

Dann kommst du bei 50 bis 70 Sekunden raus. :?

Besser, du merkst dir die aktuelle Zeit beim Start (GetTickCount), und ziehst sie im Timer-Event immer von der aktuellen Zeit ab. Das ist die verstrichene Zeit, die du noch von 60 subtrahieren musst, um die Restzeit zu bekommen.

In Delphi übersetzt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
// Der Start des Countdowns - musst du noch an dein Programm anpassen 
procedure TForm1.StartButtonClick(Sender: TObject);
begin
  // Startzeit merken
  StartTime := GetTickCount;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var Diff, CountDown: Cardinal;
begin
  // Differenz zwischen aktueller und gemerkter Zeit berechnen
  Diff := GetTickCount - StartTime;

  // Zeit von 60 (dem Startwert) abziehen)
  CountDown := 60 - Diff;

  // Countdown im Label anzeigen
  Label1.Caption := IntToStr(CountDown);
end;

end;


Delete - So 05.10.08 17:42


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
type
  TFormBla = class(TForm)
  ...
  private
    { Private-Deklarationen }
    FCounter: Integer;
  ...
end;

procedure TFormBla.FormCreate(Sender: TObject);
begin
  FCounter := 60;
end;

procedure TFormBla.Timer1Timer(Sender: TObject);
begin
  Dec(FCounter);
  Label1.Caption := IntToStr(FCounter);
  Timer1.Enabled := FCounter > 0;
end;


Wo ist da jetzt das Problem?


platzwart - So 05.10.08 17:52

@DaddyH:

Bei deiner Variante könnten OnTimer-Ereignisse verloren gehen, sollte das System beim Auftreten eines solchen Ereignisses zu stark ausgelastet sein.


Yogu - So 05.10.08 17:53

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Wo ist da jetzt das Problem?

Das Problem ist, dass du jetzt immer nach mindestens einer Sekunde den Counter herunterzählst. Wenn die CPU ausgelastet ist oder etwas anderes passiert, kann sich der Abstand auch mal vergrößern. Außerdem ist der Windows-Timer sehr ungenau.


Delete - So 05.10.08 17:55

Wenn es so auf Genauigkeit ankommt, kann man ja auch einen Multimedia-Timer verwenden. Allerdings glaub ich nicht, dass das hier nötig ist, scheint ja mehr eine Hausaufgabe o.ä. zu sein.


Yogu - So 05.10.08 17:58

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
scheint ja mehr eine Hausaufgabe o.ä. zu sein.

Gerade da sollte ja verlangt werden, dass man einen sauberen Quelltext abliefert. Und da ist nun einmal nicht, Variablen in Timern herunterzuzählen.


Blackheart666 - So 05.10.08 19:31

Es gibt Leute die können sich in alles reinsteigern - Warum ?
Der Fragesteller hat doch noch garnicht reagiert !


Hidden - So 05.10.08 22:41

user profile iconBlackheart666 hat folgendes geschrieben Zum zitierten Posting springen:
Es gibt Leute die können sich in alles reinsteigern - Warum ?
Der Fragesteller hat doch noch garnicht reagiert !

Langsam, langsam ;) 'Was schlimmeres als lernen kann nicht passieren :zwinker:


Delete - Mo 06.10.08 07:17

No further comment [http://www.netzmafia.de/service/h-world.html]


Daniboy - Mo 06.10.08 14:39

hey...erst einmal vielen dank für die vielen Antworten!
ich bin delphi-anfänger und habe deshalb so eine einfache frage gestellt, die ich persönlich doch ziemlich schwierig fand.
aber hab es ja jezt hinbekommen..danke nochma x)

mfg Daniel