在 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 7 中更改字符

在 Delphi 中,如何更改 TDBGrid 中网格线的颜色?

在 Tedit Delphi 中更改字符

如何在 Delphi 中更改 orderBy firebase 数据库参数?

在 Delphi IDE 中,我可以更改默认控件属性吗

如何使用Delphi更改Android应用程序中的标题栏颜色