Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Was könnte die Funktion Now: TDateTime; blockieren? (https://www.delphipraxis.net/154292-koennte-die-funktion-now-tdatetime%3B-blockieren.html)

arc 4. Sep 2010 12:27

Was könnte die Funktion Now: TDateTime; blockieren?
 
Ich nutze Delphi 7 unter Windows 7 und habe ein Problem mit dem Code DateTimeToStr(Now) festgestellt.
Prinzipiell möchte ich nur das aktuelle Datum / Zeit ausgeben, wie das gemacht wird ist mir dabei zweitrangig. Wenn es also alternative Wege gibt, würde mir das auch helfen.

In einem neuen Projekt funktioniert die Funktion wie gewünscht, in meinem eigentlichen Projekt jedoch leider nicht. Die Zeit wird einmal beim Start ausgelesen, aktualisiert sich aber nicht mehr. Jeder Folgeaufruf von Now liefert den selben Zeitstempel. Leider habe ich keine Idee, wodurch das hervorgerufen werden könnte.

Wie könnte ich der Ursache auf den Grund gehen? Habt ihr vielleicht eine Idee oder einen anderen Code um die aktuelle Zeit / Datum auszugeben?

Danke!

stahli 4. Sep 2010 12:39

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Hast Du vielleicht eine Variable "Now" definiert, die einmal gesetzt wird und dann immer wieder ausgelesen?
(Könnte auch in einer benutzten Unit so definiert sein.)

arc 4. Sep 2010 15:28

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Habe mir jetzt einfach diese Funktion erstellt. Wird am Ende irgendein Bug mit Windows 7 sein, mein Delphi 7 ist ja auch schon in die Jahre gekommen...

Code:
function API_GetCurrentDate:string;
var SystemTime1: TSystemTime;
begin
  GetLocalTime(SystemTime1);
  result:=Format('%.2d.%.2d.%d %.2d:%.2d:%.2d',[SystemTime1.wDay,SystemTime1.wMonth,SystemTime1.wYear,SystemTime1.wHour,SystemTime1.wMinute,SystemTime1.wSecond])
end;
}

Luckie 4. Sep 2010 15:42

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Die Funktion ignoriert nur leider meine Datumseinstellungen. Wäre es nicht sinnvoller, wenn die Funktion einen Wert vom Typ TDateTime zurückgeben würde, wie es Now auch tut?

DeddyH 4. Sep 2010 18:14

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Das sehe ich auch so. Da müsste eigentlich ein 2-Zeiler genügen.
Delphi-Quellcode:
function GiveMeTheCurrentTime: TDateTime;
var SysTime: TSystemTime;
begin
  GetLocalTime(SysTime);
  Result := SystemTimeToDateTime(SysTime);
end;

Valle 4. Sep 2010 18:18

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
... wäre es nicht sinnvoller die Fehlerursache ausfindig zu machen,
anstatt hier Workarounds zu erstellen? :gruebel:

Liebe Grüße,
Valle :-)

DeddyH 4. Sep 2010 18:22

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Nun, ein Hinweis wurde ja bereits gegeben. Und wenn schon Workaround, dann aber richtig ;)

Luckie 4. Sep 2010 18:58

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Zitat:

Zitat von Valle (Beitrag 1047533)
... wäre es nicht sinnvoller die Fehlerursache ausfindig zu machen,
anstatt hier Workarounds zu erstellen? :gruebel:

Sicher, aber ohne nähere Informationen, können wir da bei kaum helfen.

Uwe Raabe 4. Sep 2010 20:12

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Das ist übrigens der Code von Now in Delphi 7:

Delphi-Quellcode:
var
  SystemTime: TSystemTime;
begin
  GetLocalTime(SystemTime);
  with SystemTime do
    Result := EncodeDate(wYear, wMonth, wDay) +
      EncodeTime(wHour, wMinute, wSecond, wMilliseconds);
end;
Ich tippe da auch auf eine zusätzliche Deklaration von Now im aktuellen Scope. Vielleicht hilft eine Suche über alle Dateien des Projekts? Alternativ geht auch der qualifizierte Aufruf:

Delphi-Quellcode:
DateTimeToStr(Sysutils.Now)

himitsu 4. Sep 2010 20:39

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1047543)
Ich tippe da auch auf eine zusätzliche Deklaration von Now im aktuellen Scope. Vielleicht hilft eine Suche über alle Dateien des Projekts?

Wozu?

Strg+Linksklick auf dieses "Now" und man sieht wohin es geht,
oder einfach mal den Mauszeiger 'nen Sekündchen drüberhalten und in den Hint gucken.

Eigentlich bekommt das Code-Insight dieses noch hin,
aber notfalls kann man auch mal Debuggen und schauen was passiert.


Bevor ich meinen Code mit 'nem Namespace verschandel, schau ich erstmal warum da was vorliegt, welches mich nervt.
Vorallem wenn man nicht weiß daß da wirklich ein "falsches" Now rumliegt, dann kann was nicht stimmen, da man eigentlich wissen sollte was wo in seinem Programm ist.

Uwe Raabe 4. Sep 2010 23:19

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Zitat:

Zitat von himitsu (Beitrag 1047547)
Zitat:

Zitat von Uwe Raabe (Beitrag 1047543)
Ich tippe da auch auf eine zusätzliche Deklaration von Now im aktuellen Scope. Vielleicht hilft eine Suche über alle Dateien des Projekts?

Wozu?

Strg+Linksklick auf dieses "Now" und man sieht wohin es geht,
oder einfach mal den Mauszeiger 'nen Sekündchen drüberhalten und in den Hint gucken.

Stimmt! Das gab es ja unter Delphi 7 auch schon. Bin da halt etwas aus der Übung...

himitsu 8. Sep 2010 15:39

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Da wir nun nocheinen mit diesem Time-Problem haben:
http://www.delphipraxis.net/154370-s...usgegeben.html


Zeigt dieses Progrämmchen denn auch die falsche Zeit an?
Und was ist mit der Systemuhr in der Windows-Startleiste?

BenjaminH 8. Sep 2010 15:46

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Zitat:

Zitat von himitsu (Beitrag 1048237)
Zeigt dieses Progrämmchen denn auch die falsche Zeit an?
Und was ist mit der Systemuhr in der Windows-Startleiste?

Die von dir kompilierte exe zeigt bei mir alles richtig an.
Auch selbst kompiliert(D7) funktionierts.

himitsu 8. Sep 2010 15:59

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Zitat:

Zitat von BenjaminH (Beitrag 1048241)
Auch selbst kompiliert(D7) funktionierts.

Hmmm, ein Gedanke wäre noch gewesen, daß es ein Problem im XP-Subsystem (k.A. wie man jetzt wieder den Kompatibilitätsmodus nennt) von Win7 gibt.

In soeinem Fall hätte man mal versuchen können ein anderes XPManifest einzubinden (nicht das, dem Delphi 7, Beiliegende), in welchem man sein Programm als kompatibel zu Win7 ausweist.
Aber wenn die TestExe läuft, dann wird es wohl doch nicht daran liegen. :gruebel:

p80286 8. Sep 2010 16:51

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1047559)
Zitat:

Zitat von himitsu (Beitrag 1047547)
Zitat:

Zitat von Uwe Raabe (Beitrag 1047543)
Ich tippe da auch auf eine zusätzliche Deklaration von Now im aktuellen Scope. Vielleicht hilft eine Suche über alle Dateien des Projekts?

Wozu?

Strg+Linksklick auf dieses "Now" und man sieht wohin es geht,
oder einfach mal den Mauszeiger 'nen Sekündchen drüberhalten und in den Hint gucken.

Stimmt! Das gab es ja unter Delphi 7 auch schon. Bin da halt etwas aus der Übung...

Stimmt nicht!
Mein D7 verhält sich da ganz still und ruhig.
Ist wohl, wie das meiste, eine Einstellungssache !?

Gruß
K-H

Uwe Raabe 8. Sep 2010 17:00

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Zitat:

Zitat von p80286 (Beitrag 1048248)
Mein D7 verhält sich da ganz still und ruhig.
Ist wohl, wie das meiste, eine Einstellungssache !?

Hilft im Menü Tools - Editor-Optionen - Programmierhilfe mal die vier Häkchen zu setzen?

himitsu 8. Sep 2010 18:57

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Sind bei Delphi 7 Personal überhaupt die entsprechenden Quellcodes vorhanden?
(ohne Quellcode kein Sprungziel)

arc 11. Sep 2010 13:02

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Ich melde mich wieder zurück, Now habe ich nirgends deklariert, wieso sollte man das tun.
Der Fehler scheint in einer der Umwandlungsfunktionen zu liegen. Leider kann ich nicht weiter debuggen, da ich keine SysUtils.pas habe.

Folgender Code erzeugt folgende Resultate:
Code:
function API_GetCurrentDate:string;
var SystemTime: TSystemTime;
begin
  GetLocalTime(SystemTime);
  result:=DateTimeToStr(SystemTimeToDateTime(SystemTime))+' vs '+Format('%.2d.%.2d.%d %.2d:%.2d:%.2d',[SystemTime.wDay,SystemTime.wMonth,SystemTime.wYear,SystemTime.wHour,SystemTime.wMinute,SystemTime.wSecond]);
end;
11.09.2010 13:56:24 vs 11.09.2010 13:59:10
11.09.2010 13:56:24 vs 11.09.2010 13:59:31
11.09.2010 13:56:24 vs 11.09.2010 14:00:13
11.09.2010 13:56:24 vs 11.09.2010 14:00:18
11.09.2010 13:56:24 vs 11.09.2010 14:00:27
11.09.2010 13:56:24 vs 11.09.2010 14:00:30

Ich bin ehrlich gesagt ratlos. Völlig unlogisch der Fehler.

himitsu 11. Sep 2010 13:16

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Delphi-Quellcode:
function API_GetCurrentDate: String;
var SystemTime: TSystemTime;
begin
  GetLocalTime(SystemTime);
  Result := Format('%s (%.10n) vs %.2d.%.2d.%d %.2d:%.2d:%.2d', [
    DateTimeToStr(SystemTimeToDateTime(SystemTime)),
    SystemTimeToDateTime(SystemTime), SystemTime.wDay,
    SystemTime.wMonth, SystemTime.wYear, SystemTime.wHour,
    SystemTime.wMinute, SystemTime.wSecond]);
end;
Was sagt denn diese Funktion?

Mal gucken ob in DateTimeToStr oder SystemTimeToDateTime das Problem liegt.
(auch wenn ich eher auf SystemTimeToDateTime tippe)

Obwohl Beide eigentlich nur "reine" mathematische Berechnungen ausführen und diese sollte unabhängig vom System (Windows) berechenbar sein. :gruebel:

arc 11. Sep 2010 13:20

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
11.09.2010 14:22:37 (40.432,5987862446) vs 11.09.2010 14:18:41
11.09.2010 14:22:37 (40.432,5987862446) vs 11.09.2010 14:18:47
11.09.2010 14:22:37 (40.432,5987862446) vs 11.09.2010 14:18:55
11.09.2010 14:22:37 (40.432,5987862446) vs 11.09.2010 14:18:58
11.09.2010 14:22:37 (40.432,5987862446) vs 11.09.2010 14:19:00

himitsu 11. Sep 2010 13:32

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
SystemTimeToDateTime liefert also schon die falschen Werte.

Was mir eventuell noch einfällt, wäre, daß irgendwo mit Single anstatt mit Double/TDateTime gerechnet wird und dabei wichtige Informationen weggerundet werden,
aber sowas sollte dann auf allen Rechner und Windowssystemen gleich sein. :gruebel:



Wieviele signifikante Stellen hatte denn Single nochmal?
(diese blöde D2010-OH will es mir nicht verraten)

Bei 8 signifikanten Stellen würde das aktuell etwa ein Intervall von (geschätzten) ~1,5 Minuten ergeben.

mkinzler 11. Sep 2010 13:38

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Single hat 7 signifikante Stellen
http://www.delphibasics.co.uk/RTL.asp?Name=Single

Uwe Raabe 11. Sep 2010 15:15

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Also wenn alte Projekte den Fehler zeigen und neue nicht, dann kann das eigentlich nur daran liegen, daß die alten Projekte eine andere Sysutils verwenden (da wo Now und SystemTimeToDateTime deklariert sind). Vielleicht sollte man in diese Richtung (Stichwort: Bibliothekspfade) mal weiter suchen?

Angyrtis 10. Feb 2012 16:13

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Hi,

sry, ich krame den Thread mal wieder vor, da ich das gleiche Problem habe, allerdings Delphi XE2 Update3, Win7 64bit.

Gibt es da irgendwelche neuen Erkenntnisse?

Gruß Angyrtis

Angyrtis 14. Mär 2013 14:39

AW: Was könnte die Funktion Now: TDateTime; blockieren?
 
Auch wenn es schon ewig her ist. Aber mir ist endlich eine Lösung über den Weg gelaufen. Und falls dann noch jemand verzweifelt, hier ein möglicher Grund:

Und zwar hat bei mir DirectX die Berechnunggenauigkeit global auf Single gesetzt. Damit wird Now ungenau und geht kaputt. Lösung ist also bei mir gewesen:

Code:
procedure DoSthWithNow;
var
  Prec: TFPUPrecisionMode;
begin
  Prec := SetPrecisionMode(pmExtended); //Manuelles Setzen der Berechnungsgenauigkeit auf Extended
  Now; //Call von Now
  SetPrecisionMode(Prec); //Zurücksetzen der ursprünglichen Genauigkeit, sofern erwünscht.
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:31 Uhr.

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