Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Prob mit Timer (https://www.delphipraxis.net/78373-prob-mit-timer.html)

Privateer3000 4. Okt 2006 00:26


Prob mit Timer
 
Hi folks,

ich habe hier einen Timer, der von null beginnend, die Zeit
hochzählen sollen.
Die Sekunden laufen richtig und addieren auch die minuten.
Nur die Minuten gehen über die 60 hinaus:
Delphi-Quellcode:
procedure TAuszahlbuch.bil_ti1Timer(Sender: TObject);
var
std,min,sek: String;
entg1,geld: Double;
begin
geld:=4.10;
bil_zeit1:=bil_zeit1+1;
std:=Format('%.2d',[bil_zeit1 div 3600]);
min:=Format('%.2d',[bil_zeit1 div 60]);
sek:=Format('%.2d',[bil_zeit1 mod 60]);
bilz1.Caption:=std+':'+min+':'+sek;
entg1:=(bil_zeit1/3600)*geld;
bilp1.Caption:=FloatToStr(geldrunden(entg1,2));
end;
Hat jemand einen Rat?

Grüße

marabu 4. Okt 2006 03:18

Re: Prob mit Timer
 
Guten Morgen.

Du musst zwischen der Zeit in Minuten (2 Stunden = 120 Minuten) und dem Minutenanteil einer Zeitangabe der Form HH:MM:SS unterscheiden. Du hast das Timer-Interval leider nicht dokumentiert, aber von deinem Code ausgehend scheinst du in der globalen Variable bil_zeit1 die Zeit in Sekunden zu zählen. Natürlich könntest du den Minutenanteil so berechnen:

Delphi-Quellcode:
 min := Format('%.2d', [bil_zeit1 div 60 mod 60]);
Aber es geht auch noch einfacher:

Delphi-Quellcode:
procedure TAuszahlbuch.bil_ti1Timer(Sender: TObject);
var
  entg1, geld: Double;
begin
  geld := 4.10; // besser außerhalb des event handlers festlegen
  bil_zeit1 := bil_zeit1 + 1;
  bilz1.Caption := TimeToStr(bil_zeit1 / SecsPerDay);
  entg1 := (bil_zeit1 / MinsPerHour / SecsPerMin) * geld;
  bilp1.Caption := FloatToStr(geldrunden(entg1, 2));
end;
Besser wäre aber du würdest ausschließlich mit den in Delphi üblichen Datentyp TDateTime arbeiten, da auf den Timer nicht unbedingt Verlass ist und die selbst gezählte Zeit irgendwann von der Systemzeit abweichen wird. Dazu muss bil_zeit1 als TDateTime deklariert werden und der Anfangswert einfach auf Now() gesetzt werden. Das Timer-Event würde dann so aussehen:

Delphi-Quellcode:
uses
  DateUtils;

const
  stdEntgelt = 4.10;

var
  bil_zeit1: TDateTime;

procedure TAuszahlbuch.bil_ti1Timer(Sender: TObject);
var
  dtDiff: TDateTime;
begin
  dtDiff := Now - bil_zeit1;
  bilz1.Caption := TimeToStr(dtDiff);
  bilp1.Caption := Format('%m', [dtDiff / OneHour * stdEntgelt]);
end;
Getippt und nicht getestet.

Grüße vom marabu

Privateer3000 4. Okt 2006 09:40

Re: Prob mit Timer
 
Danke marabu,
aber das ist schon richtig,
es soll von NULL an gezählt werden,
quasi stoppuhr, die dann angehalten werden
kann.
Bei deinem Beispiel blick ich nicht durch,
aber ich probier es aml
Danke

Privateer3000 4. Okt 2006 10:18

Re: Prob mit Timer
 
Also, ich habs probiert
es zeigt mir die aktuelle Zeit an
und zählt nicht von null an.
Wie stell ich das alles auf null,
wenn der Timer startet?

Danke!!!

Klaus01 4. Okt 2006 10:28

Re: Prob mit Timer
 
Delphi-Quellcode:
uses
  DateUtils;

const
  stdEntgelt = 4.10;

var
  bil_zeit1: TDateTime;

procedure TAuszahlbuch.bil_ti1Timer(Sender: TObject);
var
  dtDiff: TDateTime;
begin
  dtDiff := Now - bil_zeit1;
  bilz1.Caption := TimeToStr(dtDiff);
  bilp1
.Caption := Format('%m', [dtDiff / OneHour * stdEntgelt]);
end;

Bevor Du den Timer startest mußt Du
mit
Delphi-Quellcode:
bil_zeit1:=now;
die Startzeit initialisieren.

Grüße
Klaus

Privateer3000 4. Okt 2006 11:05

Re: Prob mit Timer
 
Danke Klaus,
aber würde da es nicht innerhlb des Timer immer
Now-Now rechnen?

Klaus01 4. Okt 2006 11:08

Re: Prob mit Timer
 
Zitat:

Danke Klaus,
aber würde da es nicht innerhlb des Timer immer
Now-Now rechnen?
Nein, den Now ändert sich ja immer.

Now-Now würde 0 sein.

Wenn Du aber die Variable bil_zeit1 vor dem Start des
Timers initialisierst, dann hast Du dort einen fixen Startwert stehen.

dtDiff := Now - bil_zeit1;

die Differenz geht dann bei 0 los, weil bil_zeit1 ja noch
ungefähr den Wert von now hat und erhöht sich bei jedem Aufruf des Timers.

Grüße
Klaus

Privateer3000 4. Okt 2006 11:11

Re: Prob mit Timer
 
Wer lesen kann ist klar im Vorteil
ich Trottel, klar hst recht ;-)

Danke!

Privateer3000 4. Okt 2006 17:35

Re: Prob mit Timer
 
Zitat:

Zitat von marabu
bilp1.Caption := Format('%m', [dtDiff / OneHour * stdEntgelt]);

Noch eine Frage zu obiger Zeile.
Wie wird in obiger Zeile die Zahl so formatiert
das sie nur eine Nachkommastelle anzeigt.
In der OH find ich nichts konkretes
für dieses Beispiel.
Will sagen das es reicht wenn in der Caption
"2.10" statt "2.13" o.ä. steht.

Danke nochmal!

marabu 4. Okt 2006 19:40

Re: Prob mit Timer
 
So geht das:

Delphi-Quellcode:
 bilp1.Caption := Format('%m', [Math.RoundTo(dtDiff / OneHour * stdEntgelt, -1)]);
Wenn dir das dabei verwendete Rundungsverfahren nicht gefällt, dann kannst du es ändern - Stichwort SetRoundMode().

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 Uhr.
Seite 1 von 2  1 2      

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