Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme mit Now() (https://www.delphipraxis.net/134089-probleme-mit-now.html)

Sphinx2k 15. Mai 2009 10:41


Probleme mit Now()
 
Ich hab gerade ein sehr sehr merkwürdiges Problem.
In meinem Programm wird ein Datei umbenannt nach Datum+Zeit. Nachdem ich jetzt dem fehler nachgespührt habe der vorhanden ist bin ich bei Now angekommen.
Das ganze hat auch schon ganz zu Anfang funktioniert...gehe ich in eine Version die ein paar Tage älter ist funktionert es dort mit dem gleichen Code und was ich geändert habe dürfte an sich keinen einflüss darauf haben was mir Now() liefert.
Now liefert mir immer die selbe Zeit zurück, selbst wenn ich das Programm beende und neu Starte, es neu Compiliere,.... Nach einigen Minuten wird dann eine neue Zeit ausgelesen und diese bleibt für X Minuten immer die selbe.

Hat jemand eine Idee woran das liegen konnte?

Delphi-Quellcode:
procedure TForm1.SpeedButton3Click(Sender: TObject);
var
  DName: String;
  Jahr,Monat,Tag, Stunde, Minute, Sekunde, MSekunde: Word;
  Jetzt: TDateTime;
begin
  Jetzt:=Now();
  if OpenPictureDialog1.Execute() then begin
    DecodeDate(Jetzt,JAhr,Monat,Tag);
    DecodeTime(Jetzt,Stunde,Minute,Sekunde,MSekunde);
    DName:='temp\'+IntToStr(Jahr)+IntToStr(Monat)+IntToStr(Tag)+IntToStr(Stunde)+
           IntToStr(Minute)+IntToStr(Sekunde)+IntToStr(MSekunde)+'.jpg';
    DateiNeuPfad:=ExtractFilePath(Application.ExeName)+DName;
    Copyfile(PCHAR(OpenPictureDialog1.FileName), PCHAR(DateiNeuPfad), false);
  end;
end;
[edit=mkinzler]Zeilenumbruch in Quelltext eingefügt Mfg, mkinzler[/edit]

Bernhard Geyer 15. Mai 2009 10:52

Re: Probleme mit Now()
 
Was sagt deine Windows-Zeitangabe? Now verwendet die WinAPI-Funktion GetLocalTime. Es müsste also in Windows was "kaputt" sein.
Außer du hast irgendwo eine eigene Now-Funktion definiert die verwendet wird.

DeddyH 15. Mai 2009 11:10

Re: Probleme mit Now()
 
Außerdem kann man die Namensvergabe noch kürzen.
Delphi-Quellcode:
DName := Format('%s%s%s',['temp\',FormatDateTime('yyyymmddhhnnsszzz',Now),'.jpg']);

Sphinx2k 15. Mai 2009 11:43

Re: Probleme mit Now()
 
Eine andere Now Funktion gibt es nicht wie evtl. Probleme verursachen könnte.
Das Windows ein Problem hat glaube ich auch nicht da die 2 Tage alte Version noch funktioniert und seit dem habe ich nur die Zeichenfunktionen von Paintbox.canvas auf Andorra 2D umgestellt.
Es bleibt weiterhin Rätselhaft warum es nicht funktioniert. Hab jetzt noch mal einen Random Wert in den Dateinamen mit reingepackt der umschifft das Problem etwas, aber es bleibt trotzdem eine Fehlerquelle die ich gerne ausmerzen möchte.

Die Format Funktion war mir noch nicht bekannt damit sieht es doch gleich ordenlticher aus. Danke.

ToFaceTeKilla 15. Mai 2009 11:57

Re: Probleme mit Now()
 
Mit welcher Delphiversion arbeitest du denn?
Bin zwar kein Experte, aber ich kann dir sagen, dass zb Delphi 6 öfters zu unerklärlichem Verhalten neigt.
Im Zweifelsfall hat ein Reboot bei mir bis jetzt immer geholfen...

Bernhard Geyer 15. Mai 2009 12:05

Re: Probleme mit Now()
 
Häng mal FastMM und andere Checktools rein. Ich denke das deine Umstellungsarbeit einige wild gewordene Zeiger hinterlassen hat.

sx2008 15. Mai 2009 14:53

Re: Probleme mit Now()
 
Zitat:

Zitat von Sphinx2k
Eine andere Now Funktion gibt es nicht wie evtl. Probleme verursachen könnte.

Nun, als Programmierer hat man manchmal Tomaten auf den Augen.
Du musst dir also erst einmal selbst beweisen,
dass du mit der Aussage "Eine andere Now Funktion gibt es nicht" Recht hast.
Zwei Möglichkeiten:
1.) Bei gedrückter Strg-Taste im Sourcecode auf das Wort Now klicken.
Nun müsste sich die Unit SysUtils öffnen und zur Deklaration der Funktion springen.
Das klappt nur ab Delphi Prof. und höher; also wenn der VCL Sourcecode vorhanden ist
2.) angeben, dass die Unit SysUtils verwendet werden soll:
Delphi-Quellcode:
var Jetzt: TDateTime;
begin
  Jetzt:=SysUtils.Now();
Du kannst dich darauf verlassen, dass SysUtils.Now fehlerfrei funktioniert.

Im nächsten Schritt beweisst du dir selbst, dass sich die Uhrzeit ändert:
Delphi-Quellcode:
var Jetzt: TDateTime;
begin
  Jetzt:=SysUtils.Now();
  ShowMessage(DateTimeToStr(Jetzt));
Du wirst sehen, dass die Uhrzeit richtig ist.
Dann nimmst du die Verbesserung aus Beitrag #3 und lässt dir den Dateinamen vorher anzeigen:
Delphi-Quellcode:
procedure TForm1.SpeedButton3Click(Sender: TObject);
var
  DName: String;
  Jetzt: TDateTime;
begin
  if OpenPictureDialog1.Execute() then
  begin
    Jetzt:=SysUtils.Now();
    DName := Format('%s%s%s',['temp\',FormatDateTime('yyyymmddhhnnsszzz', Jetzt),'.jpg']);
    DateiNeuPfad:=ExtractFilePath(Application.ExeName)+DName;
    ShowMessage(DateiNeuPfad);  // <====== zum Testen anzeigen
    Copyfile(PCHAR(OpenPictureDialog1.FileName), PCHAR(DateiNeuPfad), false);
  end;
end;

DeddyH 15. Mai 2009 15:02

Re: Probleme mit Now()
 
Und auf die Variable Jetzt kann man ganz verzichten.
Delphi-Quellcode:
procedure TForm1.SpeedButton3Click(Sender: TObject);
var
  DName: String;
begin
  if OpenPictureDialog1.Execute() then
  begin
    DName := Format('%s%s%s',['temp\',FormatDateTime('yyyymmddhhnnsszzz', SysUtils.Now),'.jpg']);
    DateiNeuPfad:=ExtractFilePath(Application.ExeName)+DName;
    ShowMessage(DateiNeuPfad);  // <====== zum Testen anzeigen
    Copyfile(PCHAR(OpenPictureDialog1.FileName), PCHAR(DateiNeuPfad), false);
  end;
end;

Mikescher 15. Mai 2009 15:21

Re: Probleme mit Now()
 
Klopft mal einer auf'n Server bei mir spinnt die Seite :mrgreen:

MfG Mikescher

igel457 15. Mai 2009 15:53

Re: Probleme mit Now()
 
Schau dir mal die "SimpleText" Demo von Andorra an. Dort hatte ich (glaube ich) genau das gleiche Problem. Ich glaube, dass Now nicht Funktioniert hat, sondern nur Date und Time (Now = Date + Time) und das eventuell nicht in OnIdle, sondern nur in einem Timer-Event.

Sphinx2k 16. Mai 2009 11:05

Re: Probleme mit Now()
 
Das die Richtige Funktion genutzt wird hatte ich schon über die auch hier vorgeschlagenen Wege überprüft.

Zitat:

Zitat von igel457
Schau dir mal die "SimpleText" Demo von Andorra an. Dort hatte ich (glaube ich) genau das gleiche Problem. Ich glaube, dass Now nicht Funktioniert hat, sondern nur Date und Time (Now = Date + Time) und das eventuell nicht in OnIdle, sondern nur in einem Timer-Event.

Das war die "Lösung" des Problems.
Diese Varianten Funktionieren nicht
Delphi-Quellcode:
DName := Format('%s%s%s',['temp\',FormatDateTime('yyyymmddhhnnsszzz',Date()+Time()),'.jpg']);
DName := Format('%s%s%s',['temp\',FormatDateTime('yyyymmddhhnnsszzz',Now()),'.jpg']);
DName := Format('%s%s%s%s',['temp\',FormatDateTime('yyyymmdd',Date()),FormatDateTime('hhnnsszzz',Time()),'.jpg']);
Nehme ich aber den Code
Delphi-Quellcode:
DecodeDate(Date(),JAhr,Monat,Tag);
DName := Format('%s%s%s%s',['temp\',IntToStr(Jahr)+IntToStr(Monat)+IntToStr(Tag),FormatDateTime('hhnnsszzz',Time),'.jpg']);
Funktioniert es.

Ich verstehe zwar nicht wie und was dazwischen Funkt aber immerhin Funktioniert es so jetzt wie gewollt. Habe im übrigen Andorra nicht über OnIdle laufen sondern das ganze steht bei mir in einer Draw Funktion die bei Bedarf aufgerufen wird.

Thanatos81 14. Mär 2011 10:08

AW: Probleme mit Now()
 
Liste der Anhänge anzeigen (Anzahl: 1)
Der Thread ist zwar fast zwei Jahre alt, aber mir hat er bei der Fehlersuche geholfen, deswegen wollte ich mich schnell bei Sphinx2k bedanken und außerdem bestätigen, dass es ein Problem des Andorra2D Frameworks ist, auch in der aktuellen Releaseversion. Wer das überprüfen möchte, kann einfach mal in der Simple3D-Demo die Main.pas (angehängt) ersetzen.


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