Thema: Delphi Kalender programmieren?

Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#22

AW: Kalender programmieren?

  Alt 20. Jun 2013, 22:51
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).
  1. Wochentag vom 01.06.2013 bestimmen Delphi-Referenz durchsuchenSysUtils.DayOfTheWeek
    (Mo=1, Di=2, ..., So=7)
    Ergebnis = 6
  2. 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: Delphi-Referenz durchsuchenSysUtils.FormatDateTime

PS: Bevor die Frage aufkommt, warum ich 6 Zeilen benutze, dann dieses Blatt mal für Dezember 2013 ausfüllen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (20. Jun 2013 um 22:55 Uhr)
  Mit Zitat antworten Zitat