在 Delphi 中更改 TMonthCalendar 的状态/格式
Posted
技术标签:
【中文标题】在 Delphi 中更改 TMonthCalendar 的状态/格式【英文标题】:Changing the state/format of a TMonthCalendar in Delphi 【发布时间】:2016-12-17 23:01:57 【问题描述】:使用 Delphi XE6,我正在创建一个类似 TdateTimePicker 的控件,但出于几个原因,我使用了一个 TButtonedEdit,其中“嵌入”了一个 TMonthCalendar。这些是这样定义的:
TMyMonthCalendar = class(TMonthCalendar)
procedure DoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure DoCloseUp(Sender: TObject);
private
FDroppedDown: boolean;
procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;
protected
end;
TMyDateEdit = class(TButtonedEdit)
private
FMonthCalendar: TMyMonthCalendar;
procedure DoRightButtonClick(Sender: TObject);
protected
procedure CreateWnd; override;
public
constructor Create(AOwner:TComponent); override;
destructor Destroy; override;
end;
当单击右键时显示月历并在进行选择、用户导航离开、ESCapes 等时隐藏它,我几乎可以按照需要进行操作。
让我感到困惑的是:随着日历“下拉”,如果用户单击或双击标题,则日历会相应地更改为月或年的网格。例如,如果用户 ESCapes 在那一点上,当我下一次放下日历时,它会返回到那个月/年状态,而我希望它恢复显示其 Date 属性的当前月份(就像 TDateTimePicker 一样)。
如何在显示月历之前将其恢复为单月状态?
编辑:我相信我已经找到了答案:隐藏 MonthCalendar 后,我只需调用 RecreateWnd,下一次调用时,底层屏幕对象就会被销毁并从头开始重新创建。由于它以单月格式出现,这正是我想要的,因此无需再做任何事情。
【问题讨论】:
这是正常行为。将股票月历放在表格上,单击标题(标题上的月份甚至会改变颜色,暗示单击时会发生某些事情),它将显示月份等等... 是的,但是如果你关闭它(通过转义或导航到另一个控件),当你再次放下 TdateTimePicker 时,它不会在之前的“月/年网格”状态下下降,而是回到其“默认”单月状态。我想知道如何强制它返回到那个“默认”状态。 好的,写一个程序来设置视图,例如procedure SetCalendarView(Calendar: TMonthCalendar; ViewType: TViewType);
并适当地调用它。例如。 SetCalendarView(MyMonthCalendar1, vtMonth);
.
重新创建似乎有点矫枉过正..
【参考方案1】:
您可以致电MonthCal_SetCurrentView
设置月份日历的视图(或发送MCM_SETCURRENTVIEW
)。
uses commctrl;
MonthCal_SetCurrentView(FMonthCalendar.Handle, MCMV_MONTH);
如果您需要检索当前视图,可以使用MonthCal_GetCurrentView
(或MCM_GETCURRENTVIEW
)。
【讨论】:
谢谢。这确实起到了作用。不过,我在为自己没有找到它而自责。以上是关于在 Delphi 中更改 TMonthCalendar 的状态/格式的主要内容,如果未能解决你的问题,请参考以下文章
在 Delphi 中,如何更改 TDBGrid 中网格线的颜色?