2016-12-17 1 views
3

En utilisant Delphi XE6, je crée un contrôle de type TdateTimePicker, mais pour plusieurs raisons, j'utilise un TButtonedEdit qui contient un TMonthCalendar "incorporé". Ceux-ci sont définis ainsi:Modification de l'état/format d'un TMonthCalendar dans 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; 

J'ai à peu près obtenu ça va comme on le souhaite avec le calendrier de mois affiché lorsque le bouton droit est cliqué et je CACHER quand une sélection est faite, l'utilisateur quitte, Escapes etc. Ce qui me dérange, c'est ceci: Avec le calendrier "déroulant", si l'utilisateur clique ou double-clique sur le titre, le calendrier change en une grille de mois ou d'années en conséquence. Si l'utilisateur ÉCHAPPE, par exemple, à ce moment-là, lorsque je baisse le calendrier, il retourne à cet état mois/années alors que je voudrais revenir à afficher le mois en cours de sa propriété Date (comme un TDateTimePicker).

Comment puis-je rétablir l'affichage du calendrier Mois à son état mois avant de l'afficher? Edit: Je crois que j'ai trouvé la réponse: Après avoir caché le MonthCalendar, j'appelle simplement RecreateWnd et l'objet d'écran sous-jacent est détruit et recréé à partir de zéro au prochain appel. Et comme cela se présente sous la forme d'un mois, ce que je veux, il n'y a plus rien à faire.

+0

C'est un comportement normal. Mettez un moiscalendar de stock sur un formulaire, cliquez sur le titre (dont le mois sur le titre changera même sa couleur en laissant entendre que quelque chose se produira quand vous cliquez), et il affichera des mois et ainsi de suite ... –

+0

Oui, mais si vous le fermez (en utilisant ESC ou en naviguant vers un autre contrôle), lorsque vous redescendrez le TdateTimePicker, il ne descendra pas dans cet état "grid of months/years" précédent, mais reviendra à son état "par défaut". Je veux savoir comment le forcer à revenir dans cet état "par défaut". – TomB

+0

Ok, écrivez une procédure pour régler la vue, par ex. 'procedure SetCalendarView (Calendrier: TMonthCalendar; ViewType: TViewType);' et appelez-le de manière appropriée. Par exemple. 'SetCalendarView (MyMonthCalendar1, vtMonth);'. –

Répondre

2

Vous pouvez appeler le MonthCal_SetCurrentView pour définir l'affichage d'un mois (ou envoyer un MCM_SETCURRENTVIEW).

uses commctrl; 

MonthCal_SetCurrentView(FMonthCalendar.Handle, MCMV_MONTH); 

Si vous avez besoin pour récupérer la vue actuelle, vous pouvez utiliser MonthCal_GetCurrentView (ou MCM_GETCURRENTVIEW).

+0

Merci pour cela. Cela fait effectivement l'affaire. Je me donne des coups de pied pour ne pas l'avoir trouvé. – TomB