Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TDate(Time) und mein Kalender (https://www.delphipraxis.net/206321-tdate-time-und-mein-kalender.html)

Delbor 9. Dez 2020 14:40

Delphi-Version: 10.4 Sydney

TDate(Time) und mein Kalender
 
Liste der Anhänge anzeigen (Anzahl: 1)
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):
Anhang 53386
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

Rolf Frei 9. Dez 2020 15:07

AW: TDate(Time) und mein Kalender
 
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?

Delbor 9. Dez 2020 20:18

AW: TDate(Time) und mein Kalender
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi Rolf Frei

Ich hab da noch einen Screenshot - danach hat WoNr nun tatsächlich den Wert 1:
Anhang 53387

Und weils so mysteriös schön war, gleich nochmal:
Anhang 53388

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

Rolf Frei 11. Dez 2020 14:33

AW: TDate(Time) und mein Kalender
 
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.


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