Kolorowanie wybranych dat w MonthCalendar

0

Potrzebne jest mi zaznaczanie wybranych dat w kalendarzu, znalazłem sposób na pogrubianie:

//skopiowana z biblioteki, bo kompilator nie znajduje
procedure BoldDays(Days: array of LongWord; var MonthBoldInfo: LongWord);
var
  I: LongWord;
begin
  MonthBoldInfo := 0;
  for I := Low(Days) to High(Days) do
    if (Days[I] > 0) and (Days[I] < 32) then
      MonthBoldInfo := MonthBoldInfo or ($00000001 shl (Days[I] - 1));
end;

procedure TForm1.MonthCalendar1GetMonthInfo(Sender: TObject; Month: Cardinal;
  var MonthBoldInfo: Cardinal);
begin
//tu obsługa dla wybraniego miesiąca Month
  BoldDays([1,8], MonthBoldInfo);  //przykładowe zaznaczenie 1 i 8 dnia
end; 

Kłopot w tym, że pogrubienie jest słabo widoczne, więc lepiej zmienić kolor tła na różne wybrane sposoby. Czy ktoś wpadł na sposób takiego zaznaczania?
Z góry dziękuję

0

hmmm, czy nikt nie ma potrzeby pokolorowania zakresu dat w kalendarzu?
Jak widać, używanie są różne kolory czcionki, choćby do dni z innego miesiąca, więc musi być sposób na zmianę pojedynczych dni.
Próbuję się przebić przez kod źródłowy ComCtrls.pas

0

Jak widać, używanie są różne kolory czcionki, choćby do dni z innego miesiąca, więc musi być sposób na zmianę pojedynczych dni.
Próbuję się przebić przez kod źródłowy ComCtrls.pas

Niekoniecznie...

LCL/VCL to tylko nakładna na winapi, a z tego co wiem, to kalendarz jest zmontowany na podstawie winapi (przynajmniej w Lazarusie), więc w teorii nic takiego tam nie musi być. Jeżeli zależy ci na łatwości rozwiązania, to zastosuj pogrubianie...

0

Ale pogrubianie jest słabo widoczne :( Poza tym warto mieć zaznaczanie na żółto/czerwono/zielono itp - można efektownie przekazać dużo informacji

0

Widzę, że TMonthCalendar jest nie do ruszenia :(
Próbuję więc wykorzystać TCalendar, który jest wprawdzie mniej urodziwy, ale znalazłem sposób na modyfikacje sposobu rysowania:

 //nowa dodane tło


procedure TCalendar.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);
var
  TheText: string;
begin
  TheText := CellText[ACol, ARow];


//tu trzeba wstawić wybieranie atrybutów w zależności od dnia miesiąca -> wartość w  TheText

  with ARect, Canvas do
  begin // to jest przyklad
    canvas.Brush.Color:=clred;
    canvas.Pen.Color:=clred;
    canvas.Brush.Style:=bsSolid;  //bsdiagcross;
    ellipse(left,top,right,bottom);
    canvas.Brush.Style:=bsclear;
    TextRect(ARect, Left + (Right - Left - TextWidth(TheText)) div 2,
      Top + (Bottom - Top - TextHeight(TheText)) div 2, TheText);

  end;
end;

Zmiana kolorów musi być uzależniona od konkretnej daty wyświetlanej w danej komórce, ale tu mam problem. Dzień miesiąca mogę wydobyć ze zmiennej TheText, jednak jak sprawdzić, która kontrolka Calendar jest akurat obsługiwana, żeby wydobyć Month i Year ?

0

Powinny być właściwości Year, Month, Day

0

Ale w wywołaniu tej procedury nie ma Sender: TObject, więc nie wiem, jak dobrać się do tych właściwości, bo nie wiem, która kontrolka wywołała procedurę rysowania (może być kilka takich kontrolek, a ingeruję w procedurę biblioteczną Calendar.pas)

1 użytkowników online, w tym zalogowanych: 0, gości: 1