2016-12-17 2 views
3

Mit Delphi XE6 erstelle ich ein TdateTimePicker-ähnliches Steuerelement, aber aus verschiedenen Gründen verwende ich ein TButtonedEdit, in das ein TMonthCalendar "eingebettet" ist. Diese sind so definiert:Ändern des Status/Formats eines TMonthCalendar in 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; 

Ich habe ziemlich viel bekam es gehen wie mit dem Monatskalender gewünschten gezeigt wird, wenn die rechte Schaltfläche geklickt wird und ich verstecke es, wenn eine Auswahl getroffen wird, navigiert der Benutzer entfernt, entkommt usw. .

Was mich verwirren ist, ist dies: Wenn der Benutzer mit dem Kalender "heruntergefallen" klickt oder Doppelklicks auf den Titel, ändert sich der Kalender in ein Raster von Monaten oder Jahren entsprechend. Wenn der Benutzer zum Beispiel an diesem Punkt ESCapes, wenn ich den Kalender zum nächsten Mal ablege, kehrt er zu diesem Monat/Jahr-Zustand zurück, während ich möchte, dass er den aktuellen Monat seiner Date-Eigenschaft anzeigt (wie es ein TDateTimePicker tut).

Wie kann ich die Anzeige des Monatskalenders auf den Einzelmonatszustand zurücksetzen, bevor er angezeigt wird?

Bearbeiten: Ich glaube, ich habe die Antwort gefunden: Nach dem Ausblenden des MonthCalendar, ich einfach RecreateWnd aufrufen und das zugrunde liegende Bildschirmobjekt wird zerstört und neu erstellt, wenn als nächstes aufgerufen. Und da es im Format eines Monats erscheint, was ich möchte, muss nichts weiter getan werden.

+0

Das ist normales Verhalten. Setzen Sie einen Bestandsmonatskalender auf ein Formular, klicken Sie auf den Titel (der Monat auf dem Titel wird sogar seine Farbe ändern, was darauf hindeutet, dass etwas passiert, wenn Sie klicken), und es wird Monate angezeigt usw. –

+0

Ja, aber wenn Wenn Sie den TdateTimePicker wieder ablegen, wird er nicht mehr in den vorherigen Zustand "Gitter von Monaten/Jahren" fallen, sondern zurück in seinen "Standard" -Monatszustand. Ich möchte wissen, wie ich es in diesen "Standard" -Zustand zurückdrängen kann. – TomB

+0

Ok, schreibe eine Prozedur zum Einstellen der Ansicht, z. 'Prozedur SetCalendarView (Kalender: TMonthCalendar; ViewType: TViewType);' und nennen Sie es entsprechend. Z.B. 'SetCalendarView (MyMonthCalendar1, vtMonth);'. –

Antwort

2

Sie können MonthCal_SetCurrentView aufrufen, um die Ansicht für einen Monatskalender festzulegen (oder senden Sie eine MCM_SETCURRENTVIEW).

uses commctrl; 

MonthCal_SetCurrentView(FMonthCalendar.Handle, MCMV_MONTH); 

Wenn Sie jemals die aktuelle Ansicht abrufen müssen, können Sie MonthCal_GetCurrentView (oder MCM_GETCURRENTVIEW) verwenden.

+0

Danke dafür. Dies ist tatsächlich der Trick. Ich trete mich selbst dafür, dass ich es nicht gefunden habe. – TomB

Verwandte Themen