![]() |
Monatswechsel im TMonthCalendar
Hallo zusammen.
Ich beschäftige mich seit neuestem mit Delphi (Version 7). Finde es super. Komme von der VB-Seite. Jetzt bin ich aber bei einem kleinen Progrämmchen auf ein Problem gestoßen. Ich benutze dabei die Komponente TMonthCalendar. Im Gegensatz zum Monthview-Control bei VB gibt es hier keine Möglichkeit zu unterscheiden, ob man auf ein Datum clickt, oder nur einen Monat vor-, bzw. zurückblättert. Wie kann ich die Komponente erweitern um diesen Unterschied feststellen zu können. Danke im Voraus mtm2502 |
Re: Monatswechsel im TMonthCalendar
Herzlich willkommen erstmal in der DelphiPraxis :dp:
Das Control TMonthCalendar kapselt ja nur ein WindowsControl. Da Du dieses Teil aber auch zur Anzeige von mehreren Monaten "missbrauchen" kannst wird das mit dem Monatswechsel direkt etwas schwieriger. Du willst ja wahrscheinlich nur den Klick auf die oberen Pfeile abfangen, oder? Ich würde mir das aktuelle Datum einfach merken und beim OnChange-Event des TMonthCalendar das Datum mit DecodeDateTime zerlegen und schauen ob sich da was geändert hat. Das Jahr mit vergleichen nicht vergessen !! mfg cg |
Re: Monatswechsel im TMonthCalendar
Willst du nur wissen wann der Monat gewechselt wird
oder willst du es verhindern? Wissen: > aktuell eingerstellten Monat merken > im OnChange vergleichen und neuen Monat merken Verhindern: > .MinDate und .MaxDate setzen
Delphi-Quellcode:
// z.B. für diesen Monat
MonthCalendar1.MinDate := EncodeDate(2010, 05, 01); MonthCalendar1.MaxDate := EncodeDate(2010, 05, 30); // aktueller Monat var Y, M, D: Word; DecodeDate(Now, Y, M, D); MonthCalendar1.MinDate := Now - D + 1; MonthCalendar1.MaxDate := Now - D + MonthDays[IsLeapYear(Y), M]; |
Re: Monatswechsel im TMonthCalendar
Danke schon mal.
Da ich nur wissen wollte, ob der Monat gewechselt wird oder ein Datum angeclickt wird habe ich es über den Vergleich von Monat und Jahr hinbekommen. Ich hatte gedacht, dass man die Komponente evtl. um ein Event erweitern könnte und da habe ich nicht so die Erfahrung. Aber so geht's natürlich auch. trotzdem Danke mtm2502 P.S. : @ConstantGardener : Wie Du schon angedeutet hast, funzt das bei Anzeige eines einzelnen Monats ganz gut, wenn aber mehrere Monate angezeigt werden, klappt das nicht. |
Re: Monatswechsel im TMonthCalendar
Erweitern könnte man diese Komponente schon
- neue Komponente von dieser ableiten - intern die Änderungsmeldung abfangen - auswerten/vergleichen und dann das neu eingerichtete Event auslösen - neue Komponente über ein DesignTime-Pakage registrieren, damit man sie über den FormEditor nutzen kann |
Re: Monatswechsel im TMonthCalendar
Soweit war mir das schon klar.
Ich hatte gehofft, dass hier schon mal jemand mit diesem Problem zu tun hatte und vielleicht schon einen Lösungsansatz hat. Ich habe es schon mal so angefangen Das Problem ist die Änderungsmeldung. Ich habe im Internet mal nachgeschaut und bin davon ausgegangen, dass die Komponente auf den 'Month Calender' von MS aufsetzt. Dieser hat auch einen NOTIFICATION CODE namens 'MCN_VIEWCHANGE'. Damit habe ich ein wenig rumprobiert, dieser ist aber nie aufgetreten (Mal ganz davon abgesehen, dass MCN_VIEWCHANGE nicht definiert ist). Hier schon mal mein Versuch :
Delphi-Quellcode:
type
TOnGetMonthInfoExtEvent = procedure(Sender: TObject; Month, Year: LongWord; var MonthBoldInfo: LongWord) of object; TOnChangeView = procedure(Sender:TObject) of Object; TMonthView = class(TMonthCalendar) private FOnGetMonthInfo: TOnGetMonthInfoExtEvent; FOnChangeView:TOnChangeView; procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY; published property OnGetMonthInfo: TOnGetMonthInfoExtEvent read FOnGetMonthInfo write FOnGetMonthInfo; property OnChangeView:TOnChangeView read FOnChangeView write FOnChangeView; end;
Delphi-Quellcode:
Vielleicht kann mir da jemand weiterhelfen. Vielleicht hat sich hier auch ein kleiner Denkfehler meinerseits eingeschlichen.
procedure TMonthView.CNNotify(var Message: TWMNotify);
var I, MonthNo: Integer; CurState: PMonthDayState; YearAdd: integer; begin inherited; with Message, NMHdr^ do begin case code of MCN_GETDAYSTATE: begin with PNmDayState(NMHdr)^ do begin FillChar(prgDayState^, cDayState * SizeOf(TMonthDayState), 0); if Assigned(FOnGetMonthInfo) then begin CurState := prgDayState; for I := 0 to cDayState - 1 do begin MonthNo := stStart.wMonth + I; if MonthNo > 12 then begin MonthNo := MonthNo - 12; YearAdd := 1; end else begin YearAdd := 0; end; FOnGetMonthInfo(Self, MonthNo, stStart.wYear+YearAdd, CurState^); Inc(CurState); end; end; end; end; MCN_VIEWCHANGE: // ist niemals aufgetreten begin if Assinged(FOnChangeView) then begin FOnChangeView(Self); end; end; end; end; end; Danke schon mal mtm2502 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz