Einzelnen Beitrag anzeigen

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, 14: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