- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用日历的日志,我想将记录信息的日期加粗。我将它们放在 3D 数组 TDiaryLog = array[1900..2399] of array[1..12] of array[1..31] of POneDay;
中。但在 OnGetMonthInfo
中,当我必须构建包含粗体日期的列表时,它只提供了月份
,而不是年份。如果我没有年份,我怎么知道我必须在哪一个月度过这一天?当日历中显示 12 月为当前月份时,会显示距离明年 1 月还有几天!
procedure TMainForm.CalendarGetMonthInfo(Sender: TObject; Month: Cardinal;
var MonthBoldInfo: Cardinal);
begin
end;
最佳答案
我制作了一个新组件,在其中拦截了 MCN_GETDAYSTATE
消息,并从消息信息中提取了年份...它一直都在那里,但 Delphi 认为该年份没有用。
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;
奖金
而且,作为奖励,您需要它来更新对当前月份 View 的粗体信息所做的更改...因为它不适用于 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;
关于delphi - 如何在 TMonthCalendar 中将月份日期加粗时获取年份?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58884170/
在将我的 Win32 VCL 应用程序从 Delphi 2006 迁移到 Delphi XE6 的过程中,我遇到了以下问题: 我的一个表单有一个 TMonthCalendar(插入 TPanel 进行
默认 TMonthCalendar以 Windows 控制面板中设置的格式显示日期(短日期)。我想覆盖此设置并强制 TMonthCalendar无论 Windows 设置如何,始终显示我的格式。是否可
我有一个使用日历的日志,我想将记录信息的日期加粗。我将它们放在 3D 数组 TDiaryLog = array[1900..2399] of array[1..12] of array[1..31]
有没有办法找出第一个和最后一个可见的TMonthCalendar 中的日期? 谢谢! 最佳答案 使用MonthCal_GetMonthRange : Retrieves date informatio
我用一个名为 TMonthCalendar 的 TMonthCalendar 控件编写了一个 C++ Builder VCL Forms 应用程序。 我想用控件将某些日子设置为粗体。 这是我当前的代码
我正在使用 ScaleBy 方法在运行时放大/缩小应用程序的表单。它适用于几乎所有组件,但不适用于 TMonthCalendar。有没有办法使用 ScaleBy 或任何其他方法来放大 TMonthCa
使用 Delphi XE6,我正在创建一个类似 TdateTimePicker 的控件,但由于几个原因,我使用了 TButtonedEdit,其中“嵌入”了 TMonthCalendar。这些定义如下
TMontCalendar 似乎是一个 Windows 包装器,因此它不会受到新的 VCL 样式的影响,您知道解决方案吗? 最佳答案 TMonthCalendar是 MONTHCAL_CLASS 的包
我是一名优秀的程序员,十分优秀!