代码之家  ›  专栏  ›  技术社区  ›  Marus Gradinaru

在TCalendar中加粗月份天数时,如何获取年份?

  •  0
  • Marus Gradinaru  · 技术社区  · 6 年前

    我有一个使用日历的日志,我想加粗记录信息的日期。我有一个3D阵列 TDiaryLog = array[1900..2399] of array[1..12] of array[1..31] of POneDay; . 但是在 OnGetMonthInfo ,当我必须用大胆的日子建立列表时,它只给了我 Month ,而不是今年。如果我没有这一年,我怎么知道我必须度过哪一个月?当十二月份显示为日历中的当前月份时,将显示从明年一月开始的几天!

    procedure TMainForm.CalendarGetMonthInfo(Sender: TObject; Month: Cardinal;
      var MonthBoldInfo: Cardinal);
    begin
    end;
    
    0 回复  |  直到 6 年前
        1
  •  4
  •   Marus Gradinaru    6 年前

    我在截取 MCN_GETDAYSTATE 消息和我也从消息信息中提取了年份。。。它一直在那里,但德尔福认为那一年没有用。

      TOnGetMonthInfoExEvent = procedure(Sender: TObject; Year, Month: Word;
        var MonthBoldInfo: LongWord) of object;
    
      TNewMonthCalendar = class(TMonthCalendar)
      private
        FOnGetMonthInfoEx: TOnGetMonthInfoExEvent;
        procedure CNNotify(var Msg: TWMNotifyMC); message CN_NOTIFY;
      published
        property OnGetMonthInfoEx: TOnGetMonthInfoExEvent read FOnGetMonthInfoEx write FOnGetMonthInfoEx;
      end;
    
    procedure TNewMonthCalendar.CNNotify(var Msg: TWMNotifyMC);
    var
      I: Integer;
      Month, Year: Word;
      DS: PNMDayState;
      CurState: PMonthDayState;
    begin
     if (Msg.NMHdr.code = MCN_GETDAYSTATE) and Assigned(FOnGetMonthInfoEx) then begin
      DS:= Msg.NMDayState;
      FillChar(DS.prgDayState^, DS.cDayState * SizeOf(TMonthDayState), 0);
      CurState:= DS.prgDayState;
      for I:= 0 to DS.cDayState - 1 do begin
       Year:= DS.stStart.wYear;
       Month:= DS.stStart.wMonth + I;
       if Month > 12 then begin Inc(Year); Dec(Month, 12); end;
       FOnGetMonthInfoEx(Self, Year, Month, CurState^);
       Inc(CurState);
      end;
     end
     else inherited;
    end;
    

    奖金

    而且,作为奖励,您需要此更新您对当前月份视图的粗体信息所做的更改。。。因为它与 Invalidate .

    procedure TNewMonthCalendar.RefreshDayState;
    var N: Cardinal;
        Range: array[0..1] of TSystemTime;
        Year, Month: Word;
        States: array of TMonthDayState;
        I: Integer;
    begin
     if not Assigned(FOnGetMonthInfoEx) then Exit;
     N:= SendMessage(Handle, MCM_GETMONTHRANGE, GMR_DAYSTATE, LPARAM(@Range));
     Year:= Range[0].wYear;
     Month:= Range[0].wMonth;
     SetLength(States, N);
     FillChar(States[0], N * SizeOf(TMonthDayState), 0);
     for I:= 0 to N-1 do begin
      FOnGetMonthInfoEx(Self, Year, Month, States[I]);
      Inc(Month);
      if Month > 12 then
       begin Dec(Month, 12); Inc(Year); end;
     end;
     SendMessage(Handle, MCM_SETDAYSTATE, N, LPARAM(@States[0]));
    end;