Sign in Join
Wiki copytemporary

CalLite: Usage

English · Suomi · Русский

Usage

Simply drop a TCalendarLite component on the form and get a functional month-calendar.

Changing colors

The property Colors of the calendar collects all settings affecting the colors used for the various items:

Using the calendar's Options

The display of the calendar can be modified by changing the calendar's Options, an enumeration of flags:

pascal
type
  TCalOption = (coBoldDayNames, coBoldHolidays, coBoldToday, coBoldTopRow,
                coBoldWeekend, coDayLine, coShowBorder, coShowHolidays,
                coShowTodayFrame, coShowTodayName, coShowTodayRow,
                coShowWeekend, coUseTopRowColors);

Changing the language

The strings used by the component can be easily translated to a variety of languages by changing the value of the property Languages:

pascal
type
  TLanguage = (lgEnglish, lgFrench, lgGerman, lgHebrew, lgSpanish, lgItalian,
               lgPolish, lgFinnish);

Events

In addition to the standard events TCalendarLite fires the following events. Some events get year, month and day numbers of the currently painted cell as a parameter. A set of state flags indicates whether this day is selected, today or belongs to the previous or next month:

pascal
type
  TCalCellState = (csSelectedDay, csToday, csOtherMonth);
  TCalCellStates = set of TCalCellState;

Holidays

The calendar does not "know" any holidays. You must write an event handler to define which days in the current month are holidays. Month and year values of the respective month are passed as parameters. The information that a day is a holiday or not is encoded as set bits in a 32-bit integer. The unit callite simplifies this by providing these general-purpose procedures:

Here is a simple example defining the holidays New Year, Christmas, Easter and Whit Sunday:

pascal
function Easter(year:integer): TDateTime; 
var
  Day, Month    : integer;
  a,b,c,d,e,m,n : integer;
begin
  case Year div 100 of
    17    : begin m := 23; n := 3; end;
    18    : begin m := 23; n := 4; end;
    19,20 : begin m := 24; n := 5; end;
    21    : begin m := 24; n := 6; end;
    else    raise Exception.Create('Only years after 1700 supported.');
  end;
  a := Year mod 19;
  b := Year mod 4;
  c := Year mod 7;
  d := (19*a + m) mod 30;
  e := (2*b + 4*c + 6*d + n) mod 7;
  day := 22 + d + e;
  Month := 3;
  if Day>31 then begin
    Day := d + e - 9;
    Month := 4;
    if (d=28) and (e=6) and (a>10) then begin
      if day=26 then day := 19;
      if day=25 then day := 18;
    end;
  end;
  result := EncodeDate(year, month, day);
end;

procedure TForm1.CalendarLite1GetHolidays(Sender: TObject; AMonth, AYear: Integer;
  var Holidays: THolidays);
var
  d, m, y: Word;
  e: TDate;
begin
  ClearHolidays(Holidays);
  if not FNoHolidays then
  begin
    // Fixed holidays
    case AMonth of
      1: AddHoliday(1, Holidays);          // New Year
     12: AddHoliday(25, Holidays);         // Christmas
    end;
    // Easter
    e := Easter(AYear);
    DecodeDate(e, y,m,d);
    if m = AMonth then
      AddHoliday(d, Holidays);
    // Whit Sunday --> 49 days after easter
    DecodeDate(e+49, y,m,d);
    if m = AMonth then
      AddHoliday(d, Holidays);
  end;
end;

Make sure to have the calendar Option coShowHolidays set in order to highlight the holidays in the calendar.

Hints for holidays

If you want to display the holiday name as a mouse popup hint window then you should set the calendar's ShowHint to true and add this event handler for OnHint:

pascal
procedure TForm1.CalendarLite1Hint(Sender: TObject; AYear, AMonth, ADay: Word;
  var AText: String);
var
  dt, e: TDate;
begin
  AText := '';
  case AMonth of
    1: if ADay = 1 then AText := 'New Year';
   12: if ADay = 25 then AText := 'Christmas';
   else
       e := Easter(AYear);
       dt := EncodeDate(AYear, AMonth, ADay);
       if (dt = e) then
         AText := 'Easter'
       else if (dt = e + 49) then
         AText := 'Whit Sunday';
  end;
end;

Embedded holiday names

In addition, you can also add the holiday name to the calendar grid directly. Add the next event handler for OnGetDayText. Note that the size of the calendar must be large enough to provide space for the additional text:

pascal
procedure TForm1.CalendarLite1GetDayText(Sender: TObject; AYear, AMonth, ADay: Word;
  var AText: String);
var
  s: String;
begin
  GetHintText(Sender, AYear, AMonth, ADay, s);
  if s <> '' then
    AText := IntToStr(ADay) + LineEnding + s;
end;

Holidays in popup menu

If the calendar's PopupMenu property is empty a built-in popup menu is provided which displays all the holidays of the currently selected year. As usual, this popup opens with a right-click onto the component.

Drawing icons for specific days

The next example paints a birthday icon into the Nov 11 cell of each year. The icon is stored in an image list at index 0:

pascal
procedure TForm1.CalendarLite1DrawCell(Sender: TObject; ACanvas: TCanvas;
  AYear,AMonth,ADay: Word; AState: TCalCellStates; var ARect: TRect;
  var AContinueDrawing: Boolean);
var
  bmp: TBitmap;
begin
  if (AMonth = 11) and (ADay = 11) and not (csOtherMonth in AState) then begin
    bmp := TBitmap.Create;
    try
      ImageList1.GetBitmap(0, bmp);
      ACanvas.Draw(ARect.Left, (ARect.Top + ARect.Bottom - bmp.Height) div 2, bmp);
      inc(ARect.Left, bmp.Width + 2);
      // Not changing AContinueDrawing from its default value (true) means
      // that the day text is drawn by the built-in procedure into the reduced rectangle
    finally
      bmp.Free;
    end;
  end;
end;

From the Free Pascal wiki, page "CalLite: Usage", as it stood on 2019-10-24 after a change by Djzepi, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 1, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.