2016-12-17 3 views
3

Использование Delphi XE6, я создаю TdateTimePicker-подобный элемент управления, но по нескольким причинам я использую TButtonedEdit, в котором есть встроенный TMonthCalendar. Они определяются следующим образом:Изменение состояния/формата TMonthCalendar в Delphi

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, например, в тот момент, когда я опускаю календарь вниз, он возвращается к состоянию месяцев/лет, тогда как я хотел бы, чтобы он возвращался к показу текущего месяца его свойства Date (как это делает TDateTimePicker).

Как я могу вернуть отображение календаря месяца в его состояние на один месяц, прежде чем показывать его?

Редактирование: Я считаю, что нашел ответ: после скрытия MonthCalendar я просто вызываю RecreateWnd, а основной экранный объект уничтожается и воссоздается с нуля, когда следующий вызываемый. И поскольку он появляется в формате одного месяца, чего я хочу, больше ничего не нужно делать.

+0

Это нормальное поведение. Поместите календарь месяца в форму, нажмите на заголовок (который в месяц на заголовке даже изменит свой цвет, намекая, что что-то произойдет, когда вы нажмете), и на нем будут отображаться месяцы и т. Д. –

+0

Да, но если вы закрываете его (с помощью ESCaping или перехода к другому элементу управления), когда вы снова понижаете TdateTimePicker, он не будет выпадать в предыдущем состоянии «сетка месяцев/лет», а вернется к состоянию «по умолчанию» одного месяца. Я хочу знать, как заставить его backj в это состояние «default». – TomB

+0

Итак, напишите процедуру для установки вида, например. 'procedure SetCalendarView (Календарь: TMonthCalendar; ViewType: TViewType);' и назовите его соответствующим образом. Например. 'SetCalendarView (MyMonthCalendar1, vtMonth);'. –

ответ

2

Вы можете позвонить по телефону MonthCal_SetCurrentView, чтобы установить представление для календаря месяца (или отправить MCM_SETCURRENTVIEW).

uses commctrl; 

MonthCal_SetCurrentView(FMonthCalendar.Handle, MCMV_MONTH); 

Если вы когда-нибудь понадобится, чтобы получить текущий вид, вы можете использовать MonthCal_GetCurrentView (или MCM_GETCURRENTVIEW).

+0

Спасибо за это. Это действительно делает трюк. Я пинаю себя за то, что не нашел его. – TomB

Смежные вопросы