Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zeiten vergleichen (https://www.delphipraxis.net/68558-zeiten-vergleichen.html)

Headi 1. Mai 2006 17:41


Zeiten vergleichen
 
Hi dpler,

Habe leider wieder Mal ein kleines Problem.
Und zwar habe ich einen Button beim klick startet dieser einen von zwei Timern.
Dieser Timer soll jetzt jede sekunde überprüfen ob DateTimePicker1.Time und now gleich sind.
DateTimePicker1.Time = now geht da natürlich nicht, desshalb habe ich mir diesen Code gebastelt:

Delphi-Quellcode:
procedure Tfrme_ausschalten.Timer1Timer(Sender: TObject);
begin
If DateTimePicker1.Time < now then
begin
 If DateTimePicker1.Time+0.00001 > now then
  begin
   //hier der code der ausgeführt wird
  end;
end;
end;
In meinem Testprogramm funktionierte dieser Code auch.
Aber dann im echten Programm funktioniert dieser nicht mehr.

Kann mir vielleicht jemand den richtigen Code geben?

Vielen vielen dank

greez headi

TStringlist 1. Mai 2006 17:58

Re: Zeiten vergleichen
 
Hi, du könntest dafür auch das Gleichheitszeichen nehmen. Und zwar dann, wenn du im NOW die darin enthaltenen Millisekunden jedesmal auf Null zurückstellst:

Delphi-Quellcode:
if DateTimePicker1.Time = RecodeMilliSecond(Now, 0) then ...

himitsu 1. Mai 2006 18:07

Re: Zeiten vergleichen
 
Es wird wohl einfach nur so sein, das die Diverenz größer als 0,00001 ist.

Speicher einfach, ob der Code schon ausgeführt wurde
Delphi-Quellcode:
Var ausgefuehrt: Boolean;

procedure Tfrme_ausschalten.Timer1Timer(Sender: TObject);
begin
  If (DateTimePicker1.Time < now) and not ausgefuehrt then
  begin
    ausgefuehrt := True;
    //hier der code der ausgeführt wird
  end;
end;


// ausgefuehrt muß natürlich vorher FALSE sein
oder schalte einfach den Timer aus
Delphi-Quellcode:
procedure Tfrme_ausschalten.Timer1Timer(Sender: TObject);
begin
  If DateTimePicker1.Time < now then
  begin
    Timer1.Enabled := False;
    //hier der code der ausgeführt wird
  end;
end;

marabu 1. Mai 2006 18:52

Re: Zeiten vergleichen
 
Hallo Pascal,

in Now ist auch der aktuelle Tag enthalten, darum würde ich den Vergleich so ausführen:

Delphi-Quellcode:
if DateTimePicker.Time < Frac(Now) then ...
Grüße vom marabu

ManuMF 1. Mai 2006 19:26

Re: Zeiten vergleichen
 
Hallo,

vielleicht hilft dir Delphi-Referenz durchsuchenCompareDateTime.

Gruß,
ManuMF

Headi 1. Mai 2006 19:26

Re: Zeiten vergleichen
 
Zitat:

Zitat von TStringlist
Hi, du könntest dafür auch das Gleichheitszeichen nehmen. Und zwar dann, wenn du im NOW die darin enthaltenen Millisekunden jedesmal auf Null zurückstellst:

Delphi-Quellcode:
if DateTimePicker1.Time = RecodeMilliSecond(Now, 0) then ...

Dieser Code funktioniert bei mir irgendwie nicht, da er RecodeMilliSecond nicht erkennt.


Zitat:

Zitat von himitsu
Es wird wohl einfach nur so sein, das die Diverenz größer als 0,00001 ist.

Speicher einfach, ob der Code schon ausgeführt wurde
Delphi-Quellcode:
Var ausgefuehrt: Boolean;

procedure Tfrme_ausschalten.Timer1Timer(Sender: TObject);
begin
  If (DateTimePicker1.Time < now) and not ausgefuehrt then
  begin
    ausgefuehrt := True;
    //hier der code der ausgeführt wird
  end;
end;


// ausgefuehrt muß natürlich vorher FALSE sein
oder schalte einfach den Timer aus
Delphi-Quellcode:
procedure Tfrme_ausschalten.Timer1Timer(Sender: TObject);
begin
  If DateTimePicker1.Time &lt; now then
  begin
    Timer1.Enabled := False;
    //hier der code der ausgeführt wird
  end;
end;


Geht leider auch nicht, ausschalten kann ich ja sowieso, aber er vergleicht ja nicht richtig.
Bei diesem code ist immer jenachdem nach oben oder unten offen.
Auch wenn ich die Diverenz grösser mache, funktioniert es nicht.




Zitat:

Zitat von marabu
Hallo Pascal,

in Now ist auch der aktuelle Tag enthalten, darum würde ich den Vergleich so ausführen:

Delphi-Quellcode:
if DateTimePicker.Time < Frac(Now) then ...
Grüße vom marabu

Und bei diesem Code passiert irgendwie auch wieder nichts.

Liegt das wirklich an mir?

Kann mir mal jemand sagen was ich falsch mache?

greez headi

TStringlist 1. Mai 2006 19:35

Re: Zeiten vergleichen
 
Zitat:

Zitat von Headi
Zitat:

Zitat von TStringlist
Delphi-Quellcode:
if DateTimePicker1.Time = RecodeMilliSecond(Now, 0) then ...

Dieser Code funktioniert bei mir irgendwie nicht, da er RecodeMilliSecond nicht erkennt.

Dafür brauchst du die Unit 'DateUtils' in der Uses-Klausel.

marabu 1. Mai 2006 19:42

Re: Zeiten vergleichen
 
Wenn ein Vergleich nicht so funktioniert, wie du es erwartest, dann schaue dir die Werte mal an, welche du miteinander vergleichen willst.

Delphi-Quellcode:
ShowMessage(DateTimeToStr(DateTimePicker.Time));
marabu

Headi 1. Mai 2006 22:06

Re: Zeiten vergleichen
 
Zitat:

Zitat von TStringlist
Zitat:

Zitat von Headi
Zitat:

Zitat von TStringlist
Delphi-Quellcode:
if DateTimePicker1.Time = RecodeMilliSecond(Now, 0) then ...

Dieser Code funktioniert bei mir irgendwie nicht, da er RecodeMilliSecond nicht erkennt.

Dafür brauchst du die Unit 'DateUtils' in der Uses-Klausel.

Ok das habe ich jetzt gemacht, nur funktioniert es immer noch nicht.
Also habe ich recodemillisecond auch mal beim DateTimePicker angewandt aber ging immer noch nicht :cry:


Zitat:

Zitat von marabu
Wenn ein Vergleich nicht so funktioniert, wie du es erwartest, dann schaue dir die Werte mal an, welche du miteinander vergleichen willst.

Delphi-Quellcode:
ShowMessage(DateTimeToStr(DateTimePicker.Time));
marabu

Du wirst es nicht glauben, aber das habe ich schon X Mal gemacht, denn nur so konnte ich den code zusammenbasteln. :mrgreen:
Das komische ist das beim testprogramm alles ging mit meinem code, nur immer wenn ich den Code in mein eigentliches Programm einbaue geht er nicht mehr :cry:

was mache ich nur falsch?

greez headi

TStringlist 2. Mai 2006 08:15

Re: Zeiten vergleichen
 
Zitat:

Zitat von Headi
Zitat:

Zitat von TStringlist
Zitat:

Zitat von Headi
Zitat:

Zitat von TStringlist
Delphi-Quellcode:
if DateTimePicker1.Time = RecodeMilliSecond(Now, 0) then ...

Dieser Code funktioniert bei mir irgendwie nicht, da er RecodeMilliSecond nicht erkennt.

Dafür brauchst du die Unit 'DateUtils' in der Uses-Klausel.

Ok das habe ich jetzt gemacht, nur funktioniert es immer noch nicht.
Also habe ich recodemillisecond auch mal beim DateTimePicker angewandt aber ging immer noch nicht :cry:

Hm, bei meinem kurzen Check klappte das aber. Ich nehme daher an, Du wirst DateTimePicker1.Time vorher nicht mit einer extra für deinen Test auch brauchbaren Uhrzeit geladen haben (siehe 'Time' im OI). Ansonsten, wenn man diese 'Time'-Property vorher im OI eingegeben hat oder das nachher per Maus tut (bei 'Kind' = dtkTime), dann sind in diesem Time-Anteil nämlich keine Millisekunden enthalten, ergo müsste das auch funktionieren.

Wenn du 'Time' (für den Test) allerdings selbst wieder von NOW ableitest (z.B. im Click-Eventhandler eines Buttons):

Delphi-Quellcode:
  DateTimePicker1.Time := frac(RecodeMillisecond(NOW, 0) + 5*oneSecond);
dann ist dafür natürlich auch wieder die RecodeMillisecond-Funktion nötig.

Headi 2. Mai 2006 10:41

Re: Zeiten vergleichen
 
Liste der Anhänge anzeigen (Anzahl: 1)
hmm... versteh jetzt irgendwie nicht so genau was du meinst.

Also im OnCreate der form1 weise ich DateTimePicker den Wert now zu.
Beim Test dann ändere ich die zeit logischerweise weil ich sonst ca. 23stunden 59 minuten warten müsste.

Weist du was, ich lade mal schnell das Frame hier hoch:

TStringlist 2. Mai 2006 13:47

Re: Zeiten vergleichen
 
Höchstwahrscheinlich liegt es daran, wie du das DateTimePicker1.Time im Creater lädst bzw. es danach einstellst (das ist im Frame ja leider nicht mit dabei). Diese Time-Property des DateTimePickers verhält sich nämlich beim Lesen und Schreiben etwas unterschiedlich. Beim Auslesen gibt sie zwar den gesamten DateTime-Wert zurück, beim Beschreiben allerdings kann man nur den 'Time'-Anteil neu laden. Das könnte also heißen, dass du beim Laden von 'Time' im Creater (oder danach) den Date-Anteil dabei gar nicht mit überladen hast und dieser danach also immer noch einen alten Date-Wert (etwa von Gestern) intus hatte. Bei der Initialisierung dieses Wertes im Creater (oder eben kurz bevor du das testen möchtest) solltest du also auch den 'Date'-Anteil nochmal zusätzlich mit laden:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  DateTimePicker1.Date := NOW;
  DateTimePicker1.Time := RecodeMillisecond(NOW, 0) +5*oneSecond;
end;
Durch diese +5*oneSecond müsste das gewünschte Event dann ca. 5 Sekunden nach dem Ausführen dieser Zeilen eintreten.

Übrigens: Diese Timer arbeiten doch nie so absolut exakt wie sie eigentlich sollten. Es könnte also durchaus mal sein, dass eine Sekunde auch gerade mal schieferweise 1001 Millisekunden lang ist und dann könntest du das Pech haben, dass deine gesuchte Sekunde damit gerade übersprungen wird, also gar nicht abgefragt wird. Ergo, den Timer.Interval-Wert auf etwas weniger als 1000 einstellen, wäre hier wahrscheinlich etwas sicherer.

Angel4585 2. Mai 2006 14:28

Re: Zeiten vergleichen
 
Es gibt doch noch "Time()" oder? Ist das in diesem Fall nicht sinnvoller als "Now"?

Mit einem Timer jede Sekunde zu prüfen ob die Zeit gleich ist find ich im Übrigen nich so das große.. denk mal daran was passiert wenn das Programm rechnet und der Timer dadurch verzögert wird. dann wird die Sekunde vllt. übersprungen und du erhälst nie deine Ausgabe. (Korrigiert mich wenn ich mich täusche)

Was genau willst du in deinem Programm denn erreichen? :gruebel: *nur mal so frag*

Headi 2. Mai 2006 15:22

Re: Zeiten vergleichen
 
Zitat:

Zitat von Angel4585
Es gibt doch noch "Time()" oder? Ist das in diesem Fall nicht sinnvoller als "Now"?

Mit einem Timer jede Sekunde zu prüfen ob die Zeit gleich ist find ich im Übrigen nich so das große.. denk mal daran was passiert wenn das Programm rechnet und der Timer dadurch verzögert wird. dann wird die Sekunde vllt. übersprungen und du erhälst nie deine Ausgabe. (Korrigiert mich wenn ich mich täusche)

Was genau willst du in deinem Programm denn erreichen? :gruebel: *nur mal so frag*

Es geht darum, den computer zu einer gewissen Zeit herunterzufahren, neu zu starten, ...
Irgendwie muss ich ja die vom Benuzer eingegebene Zeit mit der jetzigen vergleichen, und das kann ich ja wohl fast nur mit einem Timer machen.

Oder wie würdest du das Problem angehen?

@TStringlist:

Vielen vielen dank, es geht jetzt entlich. Hat wohl wirklich am Datum gelegen, was wohl auch der Grund war, warum es im Testprogramm ging und nachher nicht mehr.

Auch allen anderen nochmals vielen dank! :thumb: :thumb:

greez headi


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:22 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