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):
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