CalLite: Usage/ru
Использование

Просто поместите компонент TCalendarLite на форму и получите функциональный календарь на месяц.
Изменения цвета
Свойство Colors календаря содержит все настройки, влияющие на цвета, используемые для различных элементов:
- ArrowBorderColor: цвет границы стрелки над календарем (по умолчанию: clSilver )
- ArrowColor: цвет заливки стрелок над календарем (по умолчанию: clSilver )
- BackgroundColor: цвет фона всего календаря (по умолчанию: clWhite )
- BorderColor: цвет необязательной границы вокруг календаря (по умолчанию: clSilver ). Добавьте
coShowBorderвOptionsкалендаря, чтобы отобразить границу. - DayLineColor: цвет необязательной разделительной линии между верхней панелью навигации и областью дня календаря (по умолчанию: clSilver ). Добавьте
coDayLineвOptionsкалендаря, чтобы отобразить строку. - HolidayColor: цвет текста, используемый для отображения праздников (по умолчанию: clRed ). Добавьте обработчик событий в
OnGetHolidays, чтобы задать, какие дни являются выходными. - PastMonthColor: цвет текста, используемый для отображения дней предыдущего или следующего месяца (по умолчанию: clSilver )
- SelectedDateColor: цвет заливки текущего выбранного дня (по умолчанию: clMoneyGreen )
- TextColor: цвет текста, используемый для отрисовки обычных календарных дней (по умолчанию: clBlack )
- TodayFrameColor: цвет, используемый для отрисовки прямоугольной линии вокруг ячейки "сегодня" (по умолчанию: clLime )
- TopRowColor: цвет фона, используемый для верхней строке навигации (по умолчанию: clHighlight)
- TopRowTextColor: цвет текста, используемый в верхней строке навигации (по умолчанию: clHighlightText)
- WeekendColor: цвет текста, используемый для отрисовки выходных дней (по умолчанию: clRed )
Использование свойства TCalOption календаря
Отображение календаря можно изменить, модифицируя свойство TCalOption календаря, представленного как перечисление флагов:
type
TCalOption = (coBoldDayNames, coBoldHolidays, coBoldToday, coBoldTopRow,
coBoldWeekend, coDayLine, coShowBorder, coShowHolidays,
coShowTodayFrame, coShowTodayName, coShowTodayRow,
coShowWeekend, coUseTopRowColors);- coBoldDayNames: Рисует строку с названиями дней, используя символы с жирным начертанием.
- coBoldHolidays: Рисует число дней праздников, используя символы с жирным начертанием. Обычно праздничные дни отключены, но вы добавляете обработчик событий в
OnGetHolidaysдля определения выходных. - coBoldToday: Рисует сегодняшнюю ячейку, используя символы с жирным начертанием.
- coBoldTopRow: Рисует название месяца и номер года в верхнем ряду, используя символы с жирным начертанием.
- coBoldWeekend: Рисует ячейки выходных дней, используя символы с жирным начертанием.
- coDayLine: Добавляет разделительную линию между верхней навигационной линией и областью дней календаря.
- coShowBorder: Рисует тонкий прямоугольник вокруг календаря.
- coShowHolidays: Активирует подсветку праздников. Обратите внимание, что для
OnGetHolidaysтакже должен быть задан обработчик событий, который определяет праздники. - coShowTodayFrame: Рисует прямоугольник вокруг ячейки «сегодня».
- coShowTodayName: Добавляет название дня в строку, отображающую сегодняшнюю дату (см. также:
coShowTodayRow). - coShowTodayRow: Показывает строку внизу календаря для отображения сегодняшней даты (см. также:
coShowTodayName). - coShowWeekend: Подсветка выходных дней (см. также:
Colors.WeekendColor). - coUseTopRowColors: Рисует фон и текст верхней строки навигации, используя цвета, заданные в
Colors.TopRowColorиColors.TopRowTextColor.
Смена языка
Строки, используемые компонентом, могут быть легко переведены на множество языков путем изменения значения свойства Languages:
type
TLanguage = (lgEnglish, lgFrench, lgGerman, lgHebrew, lgSpanish, lgItalian,
lgPolish, lgFinnish);События
Помимо стандартных событий TCalendarLite запускает следующие события. Некоторые события получают номер года, месяца и дня окрашенной ячейки в качестве параметра. Набор флагов состояния указывает, является ли день отмеченным, текущим или принадлежит предыдущему или следующему месяцу:
type
TCalCellState = (csSelectedDay, csToday, csOtherMonth);
TCalCellStates = set of TCalCellState;- OnDateChange: Срабатывает всякий раз, когда в календаре выбрана другая дата.
- OnDrawCell: Может использоваться для полного или частичного переопределения процесса окраски ячейки дня. Если для логического параметра
AContinueDrawingустановлено значениеtrue, нормальный процесс рисования продолжается после выхода из обработчика события; если оноfalse, то отрисовка по умолчанию этого дня не выполняется. Это событие можно использовать, например, для добавления значков дня рождения или праздника в ячейки дня. - OnGetDayText: Может использоваться для изменения отображения текста на указанный день. По умолчанию используется строка, показывающая значение дня. Используя это событие, например, можно добавить названия праздников в календарь.
- OnGetHolidays: Задает, какие дни текущего месяца являются выходными. Номер дня выходных кодируется в виде установленных битов в 32-разрядном целом числе.
- OnHint: Определяет подсказку, которая может отображаться во всплывающем окне подсказок для каждого дня. Полезно, например, для отображения названия праздников, если указатель мыши находится над праздником.
- OnMonthChange: Срабатывает всякий раз, когда в календаре отображается другой месяц. Может использоваться для более эффективного расчета отпуска.
- OnPrepareCanvas: Вызывается непосредственно перед окрашиванием ячейки. Может использоваться для переопределения свойств кисти и пера, например, для рисования различных фонов для встреч и важных событий.
Праздники
Календарь не «знает» ни одного праздника. Вы должны написать обработчик событий, чтобы определить, какие дни в текущем месяце являются выходными. Значения месяца и года соответствующего месяца передаются в качестве параметров. Информация о том, что день является выходным или нет, кодируется как установленные биты в 32-разрядном целом числе. Модуль callite упрощает это, предоставляя следующие универсальные процедуры:
- procedure AddHoliday(ADay: Integer; var AHolidays: THolidays): Добавляет указанный день в список бит праздников в параметре
AHolidays. - function IsHoliday(ADay: Integer; AHolidays: THolidays): Boolean: Проверяет, указан ли указанный день в
AHolidays. - procedure ClearHolidays(var AHolidays: THolidays): Очищает список праздников.
Вот простой пример определения праздников Нового Года, Рождества, Пасхи и Троицы:
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:
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. Обратите внимание, что размер календаря должен быть достаточно большим, чтобы обеспечить место для дополнительного текста:
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:
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.