Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Timer-Problem (https://www.delphipraxis.net/117503-timer-problem.html)

Tommy1988 19. Jul 2008 10:08


Timer-Problem
 
Ich habe da ein kleines problem mit einem Timer.

Undzwar läuft eine Zeit herunter, wenn diese "10" sekunden restzeit hat passiert folgendes:
Delphi-Quellcode:

if iMins + iSecs = 10 then // iMins und iSecs enthält bei 00:02:20 z.b. zusammen: 140. (2* 60 Sek + 20)
begin
 S := '00:00:00';
 UpdateList;
end;
end;
iMins + iSecs ist im Format 00:00:00 in einem Label gespeichert, welches sich dann eigentlich "erneuern" sollte.
Manchmal tut es ds aber nicht (das ist nicht das Problem) => das Problem ist eher, dass der Timer dann "hoch-zählt". Wie kann ich das abfangen?

Edit// nurnochmal zur ausführlichen Erklärung:
LabelX wird mit der aktuellen uhrzeit vergleichen und der Zeitraum dazwischen ist das interval des Timers.
"normal" ändert sich das Label mit der Uhrzeit alle Paar Minuten, manchmal jedoch nicht, und dann ist der Zeitraum von 12:00:00 (jetzt) und dem Label 11:55:00 ungleich, deswegen zählt der ja hoch.

Jelly 19. Jul 2008 10:20

Re: Timer-Problem
 
Sorry, ich habe nix verstanden, von dem was du geschrieben hast...

Was willst du eigentlich machen?

DeddyH 19. Jul 2008 10:20

Re: Timer-Problem
 
Ganz verstanden habe ich es zwar nicht, aber Du solltest zum Einen die Logik von der Darstellung trennen ("in einem Label gespeichert"... *brrr*) und zum Zweiten keinen direkten Vergleich machen, sondern nachsehen, ob die Untergrenze unterschritten wurde, d.h. nicht auf Gleichheit, sondern auf kleiner/größer (je nach Logik) oder gleich abfragen.

Tommy1988 19. Jul 2008 11:12

Re: Timer-Problem
 
"d.h. nicht auf Gleichheit, sondern auf kleiner/größer"

Ok, ich habe es jetzt so gelöst.
Die Aktuelle Uhrzeit im Format HH:MM:SS habe ich folgendermaßen in eine Integer-Variable geladen:
HHMMSS.

Die Ziel-Uhrzeit habe ich genau so in eine Integer-Variable gepackt.

Dann vergleiche ich so:
Delphi-Quellcode:
if StrToInt(timeComplNow) > StrToInt(timeComplThen) then // nicht >=
 begin
  UpdateList;
  SetColour;
 end;
Ich kenne die Regeln der Programmierung nicht genau, aber ist das in Ordnung so?

DeddyH 19. Jul 2008 11:14

Re: Timer-Problem
 
Das sieht mir etwas umständlich aus. Kannst Du noch einmal genauer beschreiben, was Du genau machen möchtest?

Tommy1988 19. Jul 2008 11:28

Re: Timer-Problem
 
Ok.

Auf meinem Forumla läuft oben rechts die aktuelle Uhrzeit an.

Etwas weiter unten, in einer Liste, steht eine Zeit in der Zukunft.

Etwa so könnte man es verdeutlichen:
Delphi-Quellcode:
---------------------
|          12:24:00 | // Jetzt
|                   |
|                   |
|                   |
| 12:26:00          | // Später
|Noch 00:02:00 Min | // Restzeit
---------------------
So, ist die Jetztige Zeit größer als die Zeit in der Zukunft, zählte der Timer eben noch hoch.

Was ich aber durch meinen letzten Post gelöst hatte.

Jelly 19. Jul 2008 11:43

Re: Timer-Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Du willst also die Zeit im Sekundentakt oben im formular hochlaufen lassen, bis es 12:26 ist, wie sie unten in der Liste steht. Dann hätt ich jetzt mal dein Problem verstanden, oder?

Zeiten (und Datum) speichert man in Delphi in TDateTime Typen, dazu brauchst du also nicht umständlich irgendwelche Strings auseinande zu pflücken oder Stunden und Minuten zu extrahieren.

Ich würde 2 Properties definieren, welche deine beiden Zeiten beinhalten (Jetzt und BisZeit). In der Setter-Methode kannst du z.B. deine Darstellung aktualiseren. Somit brauchst du nirgends, ausser in der Setter-Methode, deine Labels anzufassen, und arbeitest ausschliesslich mit deinen Eigenschaften.

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    lblJetzt: TLabel;
    lblBisZeit: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    FJetzt: TDateTime;
    FBisZeit: TDateTime;
    procedure SetJetzt(const Value: TDateTime);
    procedure SetBisZeit(const Value: TDateTime);
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    property Jetzt : TDateTime read FJetzt write SetJetzt;
    property BisZeit : TDateTime read FBisZeit write SetBisZeit;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }



procedure TForm1.FormCreate(Sender: TObject);
begin
     Jetzt := Now ;
     BisZeit := Jetzt + EncodeTime(0,0,5,0);
     timer1.Enabled := true;
end;

procedure TForm1.SetBisZeit(const Value: TDateTime);
begin
  FBisZeit := Value;
  lblBisZeit.Caption := TimeToStr(FBisZeit) ;
end;

procedure TForm1.SetJetzt(const Value: TDateTime);
begin
  FJetzt := Value;
  lblJetzt.Caption := TimeToStr(FJetzt) ;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
     Jetzt := Now ;
     if (Jetzt >= BisZeit) then begin
         timer1.Enabled := false;
         ShowMessage ('Countdown abgelaufen') ;
     end;

end;

end.

Tommy1988 19. Jul 2008 12:32

Re: Timer-Problem
 
" Du willst also die Zeit im Sekundentakt oben im formular hochlaufen lassen, bis es 12:26 ist, wie sie unten in der Liste steht. Dann hätt ich jetzt mal dein Problem verstanden, oder? "


Ne :D

Ich will nur die Zeit die OBEN steht mit der unten vergeichen ;) Das klappt ja auch.

Das Problem war halt nur, dass wenn die Zeit oben über der Zeit unten war, der Timer (welcher eigentlich ein Countdown ist hoch statt runtergezähl hat.

Reinhard Kern 19. Jul 2008 15:09

Re: Timer-Problem
 
Zitat:

Zitat von Tommy1988
Ich habe da ein kleines problem mit einem Timer.

Undzwar läuft eine Zeit herunter, wenn diese "10" sekunden restzeit hat passiert folgendes:
Delphi-Quellcode:

if iMins + iSecs = 10 then // iMins und iSecs enthält bei 00:02:20 z.b. zusammen: 140. (2* 60 Sek + 20)

Hallo,

iMins + iSecs = 10 gilt auch für 10 min 0 sec, oder 9 min 1 sec ... = krasser Logikfehler.

Gruss Reinhard

Tommy1988 20. Jul 2008 11:12

Re: Timer-Problem
 
Zitat:

krasser Logikfehler.
Ich habs inzwischen geändert und das problem wurde behoben!


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz