Sign in Join
Wiki copytemporary

CalLite: Usage/ru

English · Suomi · Русский

Использование

Просто поместите компонент TCalendarLite на форму и получите функциональный календарь на месяц.

Изменения цвета

Свойство Colors календаря содержит все настройки, влияющие на цвета, используемые для различных элементов:

Использование свойства TCalOption календаря

Отображение календаря можно изменить, модифицируя свойство TCalOption календаря, представленного как перечисление флагов:

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

Смена языка

Строки, используемые компонентом, могут быть легко переведены на множество языков путем изменения значения свойства Languages:

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

События

Помимо стандартных событий TCalendarLite запускает следующие события. Некоторые события получают номер года, месяца и дня окрашенной ячейки в качестве параметра. Набор флагов состояния указывает, является ли день отмеченным, текущим или принадлежит предыдущему или следующему месяцу:

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

Праздники

Календарь не «знает» ни одного праздника. Вы должны написать обработчик событий, чтобы определить, какие дни в текущем месяце являются выходными. Значения месяца и года соответствующего месяца передаются в качестве параметров. Информация о том, что день является выходным или нет, кодируется как установленные биты в 32-разрядном целом числе. Модуль callite упрощает это, предоставляя следующие универсальные процедуры:

Вот простой пример определения праздников Нового Года, Рождества, Пасхи и Троицы:

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('Поддерживается дата только после 1700 года.');
  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
    // Фиксированные праздники
    case AMonth of
      1: AddHoliday(1, Holidays);          // Новый Год
     12: AddHoliday(25, Holidays);         // Рождество
    end;
    // Пасха
    e := Easter(AYear);
    DecodeDate(e, y,m,d);
    if m = AMonth then
      AddHoliday(d, Holidays);
    //Троица --> 49 дней после Пасхи
    DecodeDate(e+49, y,m,d);
    if m = AMonth then
      AddHoliday(d, Holidays);
  end;
end;

Убедитесь, что опция календаря coShowHolidays установлена, чтобы выделять праздники в календаре.

Подсказки для праздников

Если вы хотите отобразить название праздника как всплывающее окно с подсказкой при наведении мыши, установите для ShowHint в календаре значение true и добавьте этот обработчик события для 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 := 'Новый Год';
   12: if ADay = 25 then AText := 'Рождество';
   else
       e := Easter(AYear);
       dt := EncodeDate(AYear, AMonth, ADay);
       if (dt = e) then
         AText := 'Пасха'
       else if (dt = e + 49) then
         AText := 'Троица';
  end;
end;

Вписанные имена праздников

Кроме того, вы также можете напрямую добавить название праздника в сетку календаря. Добавьте следующий обработчик события для OnGetDayText. Обратите внимание, что размер календаря должен быть достаточно большим, чтобы обеспечить место для дополнительного текста:

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;

Праздники в popup-меню

Если свойство календаря PopupMenu пустое, предоставляется встроенное всплывающее меню, в котором отображаются все праздники текущего выбранного года. Как обычно, это всплывающее окно открывается щелчком правой кнопкой мыши на компоненте.

Рисование иконок для определенных дней

Следующий пример рисует значок дня рождения в ячейке 11 ноября каждого года. Значок хранится в списке изображений с индексом 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);
      // свойство AContinueDrawing, оставленное со значением по умолчанию (true), означает, 
      // что текст дня рисуется встроенной процедурой в уменьшенный прямоугольник
    finally
      bmp.Free;
    end;
  end;
end;

From the Free Pascal wiki, page "CalLite: Usage/ru", as it stood on 2020-06-02 after a change by Zoltanleo, 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 .

Edited on wiki.freepascal.org by 1 person, 2020

From the official wiki's backup of 26 May 2024: who edited this page there, and when. Edits made there after that date were not recorded, and the earlier versions are not shown here; the main page says why.

WhenWhoWhat changed
ZoltanleoCreated page
ZoltanleoChanging colors
ZoltanleoUsing the calendar's Options
ZoltanleoИспользование свойства Options календаря
ZoltanleoChanging the language
ZoltanleoEvents
ZoltanleoHolidays
ZoltanleoПраздники
ZoltanleoHints for holidays
ZoltanleoEmbedded holiday names
ZoltanleoHolidays in popup menu
ZoltanleoDrawing icons for specific days
ZoltanleoПраздники

Talk about this page

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