AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi 'Ungültiges Argument zum Codieren des Datums'
Thema durchsuchen
Ansicht
Themen-Optionen

'Ungültiges Argument zum Codieren des Datums'

Ein Thema von Delbor · begonnen am 5. Nov 2020 · letzter Beitrag vom 5. Nov 2020
Antwort Antwort
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

'Ungültiges Argument zum Codieren des Datums'

  Alt 5. Nov 2020, 16:44
Delphi-Version: 10.4 Sydney
Hi zusammen
Der Titel nimmt schon mal die Fehlermeldung vorweg. Besonders erstaunt bin ich allerdings nicht. Sinnbildlich kann man sich einen Spiegel vorstellen, indem man den Spiegel hinter sich erblickt, indem man... und so fort.Debuggen bringt folgendes:
Zitat:
Im Projekt TerminkalenderProject.exe ist eine Exception der Klasse EConvertError mit der Meldung 'Ungültiges Argument zum Codieren des Datums' aufgetreten.
Klicke ich auf Anhalten, ergibt sich folgendes Bild:
debug-16_48_55-window.jpg
Von interesse ist hier der Einsprung in die Scheife:

Delphi-Quellcode:
   LmD := DaysInMonth(ADate); // while i <=6 do IntToStr(Dies schreibt 7 Wochenblöcke ins Stringgrid)
   while DayOfTheMonth(Datum) < LmD +1 do
ursprünglich hiess das:

while i <=6 do
Das erstellte mir im Stringggrid 7 'Wochenblöcke':

wochenkalender-2.jpg

Wenn ich das <= durch < ersetzte, erhalte ich statt 7 "Wochenblöcke" noch deren vier, und der 31. januar wird mit den folgenden Wochen verscluckt.

Den Ausdruck '<=6' durch '<=5' zu ersetzen, ist auch keine Lösung - das würde wohl manche überzählige Woche nicht darstellen - ausser im Februar. Wie verlässlich-korrekt die Darstelllung sonstwo ist, hängt wohl von den entsprechenden Wochen ab.

Wie erreiche ich am zuverlässigsten, dass die Woche, in welche der Monatsletzte fällt, ausgegeben wird, aber dann wirklich Schluss ist?

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: 'Ungültiges Argument zum Codieren des Datums'

  Alt 5. Nov 2020, 16:52
Datum = 03.01.10000 ist das so gewollt?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: 'Ungültiges Argument zum Codieren des Datums'

  Alt 5. Nov 2020, 16:58
Ich vermute mal nicht. Und falls doch, dann muss könnte ich mir vorstellen, dass die Einschränkung von DaysInAMonth da der Verursacher ist. Habe gerade kein Delphi zur Hand um mich durch die Sourcen zu wühlen. Aber die genannte Funktion kann bspw. nur mit Jahren bis 9999 umgehen.

Zitat von DocWiki:
AYear is a year from 1 through 9999 (inclusive).
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: 'Ungültiges Argument zum Codieren des Datums'

  Alt 5. Nov 2020, 17:04
Hi Klaus01

Nein - ich wusste gar nicht, dass ein solcher Wert in einen TDateTime-Wert passt. Die Ursache ist das kleine Symbol '<='. Offenbar fängt "er" dann wieder zu zählen an; im Code geschieht dies immer mit 'Datum :=Datum + 1' Nachdem der/ein Monatsende erreicht ist, fängt der Datumsvergleich wieder von vorne an - und dies eben so lange, wie der Datenyp das Datum noch darstellen kann.


Gruss
Delbor

Ps: Ja, Aviator, jetzt, wo du's sagst: Ich hab das auch gelesen
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor ( 5. Nov 2020 um 17:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#5

AW: 'Ungültiges Argument zum Codieren des Datums'

  Alt 5. Nov 2020, 17:55
Diese Schleife ist meistens "endlos".

DayOfTheMonth (1-31) ist bei 50% der Monate immer kleiner als als DaysInTheMonth+1 (32) des Start-Monats und somit gibt es keinen Abbruch und läuft ewig.
Februar als Start ist das Einzige, wo es immer zum Ende des nachfolgenden Monats abbrechen wird.

endlos/ewig ... OK, zumindestens so lange wie das Datum gültig ist, also nach dem 31.12.9999 knallt es dann doch.

Im Debugger hätte dir aber schnell auffallen sollen, dass diese Schleife zu viele Durchläufe hat ... spätestens als es nach etwa 416376 Runden dann knallte.



Vielleicht solltest du für deine Schleifen das Ende eher mit EndOfAMonth/EndOfTheMonth bzw. EndOfAWeek/EndOfTheWeek und IncMonth bzw. IncWeek bestimmen.
Und den Anfang mit StartOfAMonth/StartOfTheMonth bzw. StartOfAWeek/StartOfTheWeek.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Nov 2020 um 18:14 Uhr)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.017 Beiträge
 
Delphi 2009 Professional
 
#6

AW: 'Ungültiges Argument zum Codieren des Datums'

  Alt 5. Nov 2020, 19:03
Hi Klaus01

Nein - ich wusste gar nicht, dass ein solcher Wert in einen TDateTime-Wert passt.
In ein Double passt sehr viel rein, die Genauigkeit nimmt aber ab, je weiter du vom minus-ersten Januar des Normaljahres 1900 um 0 Uhr entfernt bist. Der letzte Tag, den TDateTime sekundengenau darstellen kann, ist der 12. November 188149436. Der letzte Wert ist in ca. 5*10^305 Jahren, also eine Jahreszahl mit 306 Stellen.

Die allermeisten Programme beschränken die Gültigkeit künstlich auf die Jahre 1 bis 9999. Excel kann hingegen nicht auf einen geringeren Wert als den 0. Januar des Schaltjahres 1900 (was kein Schaltjahr war) rechnen.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:23 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