AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TDate(Time) und mein Kalender

Ein Thema von Delbor · begonnen am 9. Dez 2020 · letzter Beitrag vom 11. Dez 2020
Antwort Antwort
Delbor

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

TDate(Time) und mein Kalender

  Alt 9. Dez 2020, 15:40
Delphi-Version: 10.4 Sydney
Hi zusammen
Ich habe hier ein Uraltprogramm, von dem ich eine einzelne Prozedur zum Erstellen eines Kalenders nutzen will. Das funktioniert soweit; unter Verwendung eines TDatetimepickers kann ich ein beliebiges Datum bestimmen, ab dem der Kalender Daten für einen Monat anzeigen soll.
Nun soll mir mein Kalender aber nicht nur die Daten eines Monats, sondern diejenigen eines ganzen Jahres anzeigen.
Das will ich erreichen, indem ich die Prozedur aus einem Array heraus aufrufe:
Delphi-Quellcode:
procedure TCalenderTestFrame_A.StartMonth;
  var i: integer; LYear, LMonth, LDay : Word;
begin
{ Übergeben des Anfangdatums an FirstMonthDay. Das Anfangsdatum }
{ stammt dabei vom DateTimePicker2. Anscliessend erhält         }
{ FFirstMonthDay sein  Datum jeweils vom Vorgängermonat.        }
   FFirstMonthDay := a.DateTimePicker2.Date;
   System.SysUtils.DecodeDate(FFirstMonthDay, LYear, LMonth, LDay);
   for i := Low(Monate) to High (Monate) do
   begin
      case i of
         1: begin
               FIndex := 1;
               FStartYear := FFirstMonthDay;
               FEndYear := EndOfTheYear(FStartYear);
               FMonthsStart := StartOfTheMonth(FStartYear);
               FMonthsEnd := EndOfTheMonth(FStartYear);
               HorizontalMonths;
            end;
Und weiter:
Delphi-Quellcode:
procedure TCalenderTestFrame_A.HorizontalMonths;
   var LWoStart, LWoStartPlus, LWoEnd, LDatum: TDateTime; LToday : String;
         WoNr, TagNr : Word; i, y, j :integer;
begin
   i := 1; j := 1; y := 1;
      LWoStart := StartOfTheWeek(FMonthsStart);
      LDatum := LWoStart; // => Start der ersten Woche des Jahres 2020
      LWoEnd := EndOfTheWeek(FMonthsStart);
      // WeekofTheYear gibt einen Integer für die Wochennummer(?) zurück, der in 'WoNr' gespeichert wird. => Start der ersten Woche des Jahres 2020
      WoNr := WeekOfTheYear(FMonthsStart);
      TagNr := DayofTheWeek(LDatum);
      LToday := Wochentage[TagNr];

   while LDatum <= FMonthsEnd do
   begin
      while i <= 7 do begin
         if i = 1 then begin
            WoNr := WeekOfTheYear(LDatum);
            StrGCalenderTestFrame.Cells[0,j] := 'Woche '+IntToStr(WoNr);
         end;
         StrGCalenderTestFrame.Cells[y,0]:= LToday;
         StrGCalenderTestFrame.Cells[y,j]:= DateToStr(LDatum);
         Inc(y);
         inc(i);
         LDatum := LDatum +1;
         TagNr := DayofTheWeek(LDatum); //Tagesnummer ermitteln : 1. Wochentag Montag
         LToday := Wochentage[TagNr];
      end;
      i := 1;
      y := 1;
      inc(j);
      StrGCalenderTestFrame.Cells[1,j]:= 'j := ' + inttostr(j);
   end;
end;
Das Problem dabei ist die Wochennummer(WoNr):
calendertestframe_a-horizontalmonths.jpg
Die müsste hier entweder 53 oder 1 sein - soweit ich mich richtig erinnere, lag der 1.1.2020 noch in der Woche53 des letzten Jahres. Wieso die weder das eine noch das andere ist, ist mir ein Rätsel. Zumal sämtliche die meisten TDateTime-Funktionen einen TDateTime zurückliefern.

Ansonsten verliert sich die Prozedur zur Zeit im Nirwana (Was wohl nicht weiter erstaunt)...

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
Rolf Frei

Registriert seit: 19. Jun 2006
647 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TDate(Time) und mein Kalender

  Alt 9. Dez 2020, 16:07
FMonthsStart scheint mir da einen ungültigen Wert zu haben. In deinen Debug Screenshot hat LWoEnd einen seltsamen Wert (30.12.1899) nach der Anweisung. Was hat FMonthsStart wirklich für einen Wert, dass EndOfTheWeek da so einen falschen Wert liefert? Ist das womöglich ein Bug in der besagten Delphi Routine? Welche Delphi Version betrifft das?

Geändert von Rolf Frei ( 9. Dez 2020 um 16:24 Uhr)
  Mit Zitat antworten Zitat
Delbor

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

AW: TDate(Time) und mein Kalender

  Alt 9. Dez 2020, 21:18
Hi Rolf Frei

Ich hab da noch einen Screenshot - danach hat WoNr nun tatsächlich den Wert 1:
calendertestframe_a-horizontalmonths_3.jpg

Und weils so mysteriös schön war, gleich nochmal:
calendertestframe_a-horizontalmonths_4.jpg

Ich hab mal eine Variable geändert, aber das ist nicht das Mysteriöse: das ist viel mehr die Tatsache, dass vor Eintritt in die While-Schleife die Zuweisung an WoNr falsche 82 (Beitrag 1) ergibt, innerhalb der Schleife aber korrekt 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
Rolf Frei

Registriert seit: 19. Jun 2006
647 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TDate(Time) und mein Kalender

  Alt 11. Dez 2020, 15:33
Kannst du da ein kleinse Demo machen, damit ich mir das bei Gelegenheit mal anschauen kann? Wieso EndOfTheWeek(FMonthsStart) bei dir 13.12.1899 retour gibt ist anhand des Codes nicht nachvollziebar.
  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 10:02 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