Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

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

AW: FMX - DX10 - Falsche Wochennummer im TCalendar

  Alt 6. Jan 2016, 23:00
Nun ja, es ist eigentlich kein Hexenwerk, sondern nur logisches Vorgehen.
Delphi-Quellcode:
procedure TStyledCalendar.FillWeeksNumbers;
var
  I: Integer;
  CaptionControl: ICaption;
  LMonday : TDate;
begin
  if FWeeks = nil then
    Exit;

  FWeeks.Visible := Model.WeekNumbers;
  
  // Vom Monatsanfang den Wochenanfang ermitteln
  LMonday := StartOfTheWeek( StartOfTheMonth( FDateTime ) );
  // für jede Zeile
  for I := 0 to FWeeks.ControlsCount-1 do
  begin
    // die Wochennummer ermitteln
    if Supports(FWeeks.Controls[I], ICaption, CaptionControl) then
      CaptionControl.Text := WeekOfTheYear(lMonday).ToString;
    // Tag eine Woche weiterzählen
    lMonday := IncWeek( lMonday );
  end;
end;
Sorry for being short

Für die Überprüfung kann man auch gerne dieses kleine Konsolen-Programm starten (zeigt das Kalandar-Blatt) für den aktuellen Monat an.
Delphi-Quellcode:
program MonthCalendar;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.DateUtils,
  System.SysUtils;

procedure OutputMonthCalendarFor( const aDate: TDate; aRows: Integer = 6; aWeekNumbers: Boolean = true );
var
  lFirstMonday: TDate;
  lDay : TDate;
  row, day : Integer;
begin
  lFirstMonday := StartOfTheWeek( StartOfTheMonth( aDate ) );

  if aWeekNumbers
  then
    write( ' ' );
  WriteLn( FormatDateTime( 'mmmm yyyy', aDate ):26 );
  WriteLn;

  lDay := lFirstMonday;
  if aWeekNumbers
  then
    write( ' ' );
  for day := 1 to 7 do
    begin
      write( FormatDateTime( '" "ddd" "', lDay ) );
      lDay := IncDay( lDay, 1 );
    end;
  WriteLn;

  lDay := lFirstMonday;
  for row := 0 to aRows - 1 do
    begin
      if aWeekNumbers
      then
        write( WeekOfTheYear( lDay ):2, ' ' );
      for day := 0 to 6 do
        begin
          if lDay = DateOf( aDate )
          then
            write( '<', DayOf( lDay ):2, '>' )
          else
            write( ' ', DayOf( lDay ):2, ' ' );
          lDay := IncDay( lDay, 1 );
        end;
      WriteLn;
    end;
end;

begin
  try
    OutputMonthCalendarFor( Date );
  except
    on E: Exception do
      WriteLn( E.ClassName, ': ', E.Message );
  end;
  ReadLn;

end.
Sieht dann so aus
Code:
                   Januar 2016

    Mo  Di  Mi  Do  Fr  Sa  So
53  28  29  30  31   1   2   3
 1   4   5 < 6>  7   8   9  10
 2  11  12  13  14  15  16  17
 3  18  19  20  21  22  23  24
 4  25  26  27  28  29  30  31
 5   1   2   3   4   5   6   7
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 ( 6. Jan 2016 um 23:08 Uhr)
  Mit Zitat antworten Zitat