Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - BoldDays nur für einzelne Jahre


Jann1k - So 10.01.16 15:43
Titel: BoldDays nur für einzelne Jahre
Ich habe eine Liste mit Datumsangaben, die ich in einem TMonthcalendar mithilfe des Events MonthCalendarGetMonthInfo und der Methode BoldDays visualisieren möchte. Der Eventhandler sieht im wesentlichen folgendermaßen aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.MonthCalendarGetMonthInfo(Sender: TObject;
  Month: Cardinal; var MonthBoldInfo: Cardinal);
var
 bdays:  array of cardinal;
begin
  for i:=0 to n-1 do
    if months[i] = Month then
    begin
      setLength(bDays, length(bDays) + 1);
      bDays[high(bdays)] := day[i];
    end;

  MonthCalendar.BoldDays(bDays, MonthBoldInfo);
end;


Soweit funktioniert das auch. Das Problem ist, dass ich keine Möglichkeit finde auch das Jahr des Monats zu überprüfen. Habe ich also nur einen Datensatz für den 01.01.2015, so wird der 01.01. in allen Jahren (..., 2014, 2015, 2016, ...) markiert. Wie kann ich auslesen in welchem Jahr der Kalendar sich befindet? Ich habe es schon über die Date Eigenschaft probiert, allerdings hinkt die beim Umschalten immer um einen Monat hinterher.


Mathematiker - So 10.01.16 17:17


Delphi-Quelltext
1:
2:
3:
4:
5:
var year,month,day:word;
begin
   decodedate(MonthCalendar1.Date,year,month,day);
   //year enthält das angezeigt Jahr, z.B. mit
end;


Beste Grüße
Mathematiker


Jann1k - So 10.01.16 17:36

Hallo Mathematiker,

vielen Dank für die Hilfe. Ich hatte das genau so schonmal probiert, jedoch hinkt die Date Eigenschaft immer um einen Tick nach. Habe ich zum Beispiel den Oktober 2015 ausgewählt und gehe einen Monat zurück, so gibt mir Date immer noch den Oktober 2015 zurück. Erst beim nächsten Schritt zurück (dann der August 2015) springt Date auf den September 2015. Wenn ich nur das Jahr von Date auslese führt das zu Komplikationen beim Sprung von Dezember auf Januar.


Mathematiker - So 10.01.16 18:17

Hallo,
sehr merkwürdig. Ich hänge mal ein Minitestprogramm an. Dort werden Monat und Jahr korrekt ausgewertet, so bald du den Tag änderst. Allerdings werte ich die OnClick-Methode aus.

Beste Grüße
Mathematiker


Jann1k - So 10.01.16 18:31

Und hier mal das Testprogramm mit GetMonthInfo. Dort sieht man wies hinterherhinkt. OnClick funktioniert leider nicht, wenn man Jahr/Monat direkt ändert.


Jann1k - Sa 23.01.16 08:53

Also ich habe mittlerweile eine Lösung mit der ich allerdings nicht wirklich zufrieden bin. Die Eigenschaft Date vom MonthCalendar wird augenscheinlich erst aktualisiert, nachdem getMonthInfo() durchgelaufen ist. Im Moment starte ich in getMonthInfo() einen Timer (Interval := 1ms) der dann getMonthInfo() nochmal aufruft und sich selbst disabled. Im zweiten (Timer gestarteten) Durchlauf von getMonthInfo() besitzt Date dann den korrekten Wert.

Falls noch jemand eine schönere Lösung hat, die ohne einen Timer auskommt - bitte melden.


kagb - Di 09.02.16 11:14

Nimm:


Delphi-Quelltext
1:
MonthCalendarGetMonthBoldInfo(Sender: TObject; Month, Year: Cardinal; var MonthBoldInfo: Cardinal)                    

da wird das aktuelle Jahr mit übergeben.

Moderiert von user profile iconNarses: B- durch Delphi-Tags ersetzt


Jann1k - Di 09.02.16 17:27

Zitat:
Nimm:

MonthCalendarGetMonthBoldInfo(Sender: TObject; Month, Year: Cardinal; var MonthBoldInfo: Cardinal)

da wird das aktuelle Jahr mit übergeben.


Woher nehmen, wenn nicht stehlen? Diese Methodensignatur ist bei mir nicht vorhanden.