Einzelnen Beitrag anzeigen

Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: FMX - DX10 - Falsche Wochennummer im TCalendar

  Alt 6. Jan 2016, 19:31
Super, erst mal Danke für die Ausweisung der Stelle.

Allerdings reicht es leider nicht, die 3 Zeilen zu löschen, wie von Dir auf QC vorgeschlagen, denn dann zählt die Woche mit 54,55 Woche in Januar 2016 weiter (entscheidend ist die Zeichenroutine, die da unten weiter geht).

Das ist mein aktueller Stand eines Workarounds (muss jetzt runter, haben Besuch), scheint zu funktionieren:

Delphi-Quellcode:
procedure TStyledCalendar.FillWeeksNumbers;
var
  I: Integer;
  CaptionControl: ICaption;
  FirstWeekOfMonth: Byte;
  WeekCorrection, MNr: Integer;
begin
  if FWeeks = nil then
    Exit;

  FWeeks.Visible := Model.WeekNumbers;

  // WeekOfTheYear doesn't consider a current Locale. So for 01.01.2017 returns 52.
   if ((MonthOf(FDateTime) = MonthJanuary)) then begin
     if (Weekoftheyear (FDateTime) <> 53) then begin
       FirstWeekOfMonth := WeekOfTheYear(RecodeDay (FDateTime, 1));
     end else begin
       FirstWeekOfMonth := 1;
     end;
   end else begin
     FirstWeekOfMonth := WeekOfTheYear(RecodeDay (FDateTime,1));
   end;

  // First week in FDay may be a last week of previous month. So we need to keep offset for correct counting of weeks.
  WeekCorrection := (DefineItemIndexOfFirstDayInCurrentMonth - 1) div 7;
  for I := 0 to FWeeks.ControlsCount - 1 do
    if Supports(FWeeks.Controls[I], ICaption, CaptionControl) then begin
      MNr := FirstWeekOfMonth + I - WeekCorrection;
      // Year 2015 has 53 Weeks; If Drawing parts of January in DEC-Calendar, start again with "1" in drawing
      if MNr > 53 then begin
        FirstWeekOfMonth := 0;
        MNr := 1;
      end;

      // eg. Dez. 2016 has 52 Weeks, so start after that again with "1" in drawing
      if ((MonthOf(FDateTime) = MonthDecember)) then begin
        if (MNr = 53) and (WeeksInAYear (YearOf (FDateTime)) =52) then begin
          FirstWeekOfMonth := 0;
          MNr := 1;
        end;
      end;

      // No 53.week in second week-Row in January possible
      if ((MonthOf(FDateTime) = MonthJanuary)) then begin
        if (MNr = 53) and (I = 1) then begin
          FirstWeekOfMonth := 0;
          MNr := 1;
        end;
      end;

      CaptionControl.Text := MNr.ToString;
 end;
end;
Wird erforderlich, um Umbrüche der Wochennummern im Dez/Januar richtig auszugeben.

Edit: Den letzten IF-Block habe ich gerade (22:10) noch ergänzt.

Geändert von Harry Stahl ( 6. Jan 2016 um 22:37 Uhr)
  Mit Zitat antworten Zitat