Monatsansicht, ...
Unser problem liegt vorerst darin die einzelnen daten richtig in die spalten eines stringgrid oder so zu bekommen.
Das ist aber primär ein mathematisches/logisches Problem und erfordert erst mal Denksport.
Nehmen wir mal an, ihr möchtet die Ansicht (für Juni 2013) wie folgt haben
Code:
Mo Di Mi Do Fr Sa So
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
1 2 3 4 5 6 7
Gesucht wird also das Datum, was als erstes angezeigt werden soll (hier 27.05.2013).
- Wochentag vom 01.06.2013 bestimmen SysUtils.DayOfTheWeek
(Mo=1, Di=2, ..., So=7)
Ergebnis = 6
- Der Montag vor dem 01.06.2013 ist 5 Tage zurück, also ist das gesuchte Datum der 01.06.2013 - ( Wochentag(01.06.2013) - 1 ) => 27.05.2013 und somit das erste Datum, was in diesem Monatskalender angezeigt werden soll
In Delphi sieht das dann so aus
Delphi-Quellcode:
function GetMonthCalenderStartDate( AMonth, AYear : Word ) : TDate;
begin
// Erster Tag im Monat
Result := EncodeDate( AYear, AMonth, 1 );
// Montag vor dem Datum ermitteln => Starttag für die Kalender-Ansicht
Result := Result - ( DayOfTheWeek( Result ) - 1 );
end;
Wenn man jetzt das Grid Zelle für Zelle durchläuft - in der Reihenfolge der Datumsfolge - dann braucht man nur noch das Datum um 1 Tag erhöhen und hat immer das passende Datum zu der Zelle
Delphi-Quellcode:
procedure ShowMonthGrid( AGrid : TStringGrid; AMonth, AYear : Word );
var
LRow, LCol : Integer;
LDate : TDate;
begin
LDate := GetMonthCalenderStartDate( AMonth, AYear );
// 7 Spalten
AGrid.ColCount := 7;
// 7 Zeilen (1x Überschrift, 6x Daten)
AGrid.RowCount := 7;
// 1 Zeile fixiert (wird von oben gezählt)
AGrid.FixedRows := 1;
// in der ersten Zeile stehen die Tagesnamen
for LCol := 0 to 6 do
AGrid.Cells[LCol,0] := FormatDateTime( 'ddd', LDate + LCol );
// Jetzt das eigentliche Kalenderblatt füllen
for LRow := 1 to 6 do
for LCol := 0 to 6 do
begin
// in die Zelle nur den Monatstag schreiben
AGrid.Cells[LCol,LRow] := FormatDateTime( 'dd', LDate );
// 1 Tag weiter
LDate := LDate + 1;
end;
end;
BTW:
SysUtils.FormatDateTime
PS: Bevor die Frage aufkommt, warum ich 6 Zeilen benutze, dann dieses Blatt mal für Dezember 2013 ausfüllen