![]() |
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! |
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.) |
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; |
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?
|
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; |
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 :-) |
AW: Was könnte die Funktion Now: TDateTime; blockieren?
Nun, ein Hinweis wurde ja bereits gegeben. Und wenn schon Workaround, dann aber richtig ;)
|
AW: Was könnte die Funktion Now: TDateTime; blockieren?
Zitat:
|
AW: Was könnte die Funktion Now: TDateTime; blockieren?
Das ist übrigens der Code von Now in Delphi 7:
Delphi-Quellcode:
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:
var
SystemTime: TSystemTime; begin GetLocalTime(SystemTime); with SystemTime do Result := EncodeDate(wYear, wMonth, wDay) + EncodeTime(wHour, wMinute, wSecond, wMilliseconds); end;
Delphi-Quellcode:
DateTimeToStr(Sysutils.Now)
|
AW: Was könnte die Funktion Now: TDateTime; blockieren?
Zitat:
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. |
AW: Was könnte die Funktion Now: TDateTime; blockieren?
Zitat:
|
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:
![]() Zeigt dieses Progrämmchen denn auch die falsche Zeit an? Und was ist mit der Systemuhr in der Windows-Startleiste? |
AW: Was könnte die Funktion Now: TDateTime; blockieren?
Zitat:
Auch selbst kompiliert(D7) funktionierts. |
AW: Was könnte die Funktion Now: TDateTime; blockieren?
Zitat:
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: |
AW: Was könnte die Funktion Now: TDateTime; blockieren?
Zitat:
Mein D7 verhält sich da ganz still und ruhig. Ist wohl, wie das meiste, eine Einstellungssache !? Gruß K-H |
AW: Was könnte die Funktion Now: TDateTime; blockieren?
Zitat:
|
AW: Was könnte die Funktion Now: TDateTime; blockieren?
Sind bei Delphi 7 Personal überhaupt die entsprechenden Quellcodes vorhanden?
(ohne Quellcode kein Sprungziel) |
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:
11.09.2010 13:56:24 vs 11.09.2010 13:59:10
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: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. |
AW: Was könnte die Funktion Now: TDateTime; blockieren?
Delphi-Quellcode:
Was sagt denn diese Funktion?
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; 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: |
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 |
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. |
AW: Was könnte die Funktion Now: TDateTime; blockieren?
|
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?
|
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 |
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 21:24 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