CalLite: Usage/ru: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: CalLite: Usage/ru
| Old | New | Line | |
|---|---|---|---|
| 1 | + | # Использование | |
| 2 | + | ||
| 3 | + |  | |
| 4 | + | ||
| 5 | + | Просто поместите компонент [[CalLite/ru|TCalendarLite]] на форму и получите функциональный календарь на месяц. | |
| 6 | + | ||
| 7 | + | ## Изменения цвета | |
| 8 | + | ||
| 9 | + | Свойство `Colors` календаря содержит все настройки, влияющие на цвета, используемые для различных элементов: | |
| 10 | + | ||
| 11 | + | - **ArrowBorderColor**: цвет границы стрелки над календарем (по умолчанию: clSilver ) | |
| 12 | + | - **ArrowColor**: цвет заливки стрелок над календарем (по умолчанию: clSilver ) | |
| 13 | + | - **BackgroundColor**: цвет фона всего календаря (по умолчанию: clWhite ) | |
| 14 | + | - **BorderColor**: цвет необязательной границы вокруг календаря (по умолчанию: clSilver ). Добавьте `coShowBorder` в `Options` календаря, чтобы отобразить границу. | |
| 15 | + | - **DayLineColor**: цвет необязательной разделительной линии между верхней панелью навигации и областью дня календаря (по умолчанию: clSilver ). Добавьте `coDayLine` в `Options` календаря, чтобы отобразить строку. | |
| 16 | + | - **HolidayColor**: цвет текста, используемый для отображения праздников (по умолчанию: clRed ). Добавьте обработчик событий в `OnGetHolidays`, чтобы задать, какие дни являются выходными. | |
| 17 | + | - **PastMonthColor**: цвет текста, используемый для отображения дней предыдущего или следующего месяца (по умолчанию: clSilver ) | |
| 18 | + | - **SelectedDateColor**: цвет заливки текущего выбранного дня (по умолчанию: clMoneyGreen ) | |
| 19 | + | - **TextColor**: цвет текста, используемый для отрисовки обычных календарных дней (по умолчанию: clBlack ) | |
| 20 | + | - **TodayFrameColor**: цвет, используемый для отрисовки прямоугольной линии вокруг ячейки "сегодня" (по умолчанию: clLime ) | |
| 21 | + | - **TopRowColor**: цвет фона, используемый для верхней строке навигации (по умолчанию: clHighlight) | |
| 22 | + | - **TopRowTextColor**: цвет текста, используемый в верхней строке навигации (по умолчанию: clHighlightText) | |
| 23 | + | - **WeekendColor**: цвет текста, используемый для отрисовки выходных дней (по умолчанию: clRed ) | |
| 24 | + | ||
| 25 | + | ## Использование свойства TCalOption календаря | |
| 26 | + | ||
| 27 | + | Отображение календаря можно изменить, модифицируя свойство `TCalOption` календаря, представленного как перечисление флагов: | |
| 28 | + | ||
| 29 | + | ``` pascal | |
| 30 | + | type | |
| 31 | + | TCalOption = (coBoldDayNames, coBoldHolidays, coBoldToday, coBoldTopRow, | |
| 32 | + | coBoldWeekend, coDayLine, coShowBorder, coShowHolidays, | |
| 33 | + | coShowTodayFrame, coShowTodayName, coShowTodayRow, | |
| 34 | + | coShowWeekend, coUseTopRowColors); | |
| 35 | + | ``` | |
| 36 | + | ||
| 37 | + | - **coBoldDayNames**: Рисует строку с названиями дней, используя символы с жирным начертанием. | |
| 38 | + | - **coBoldHolidays**: Рисует число дней праздников, используя символы с жирным начертанием. Обычно праздничные дни отключены, но вы добавляете обработчик событий в `OnGetHolidays` для определения выходных. | |
| 39 | + | - **coBoldToday**: Рисует сегодняшнюю ячейку, используя символы с жирным начертанием. | |
| 40 | + | - **coBoldTopRow**: Рисует название месяца и номер года в верхнем ряду, используя символы с жирным начертанием. | |
| 41 | + | - **coBoldWeekend**: Рисует ячейки выходных дней, используя символы с жирным начертанием. | |
| 42 | + | - **coDayLine**: Добавляет разделительную линию между верхней навигационной линией и областью дней календаря. | |
| 43 | + | - **coShowBorder**: Рисует тонкий прямоугольник вокруг календаря. | |
| 44 | + | - **coShowHolidays**: Активирует подсветку праздников. Обратите внимание, что для `OnGetHolidays` также должен быть задан обработчик событий, который определяет праздники. | |
| 45 | + | - **coShowTodayFrame**: Рисует прямоугольник вокруг ячейки «сегодня». | |
| 46 | + | - **coShowTodayName**: Добавляет название дня в строку, отображающую сегодняшнюю дату (см. также: `coShowTodayRow`). | |
| 47 | + | - **coShowTodayRow**: Показывает строку внизу календаря для отображения сегодняшней даты (см. также: `coShowTodayName`). | |
| 48 | + | - **coShowWeekend**: Подсветка выходных дней (см. также: `Colors.WeekendColor`). | |
| 49 | + | - **coUseTopRowColors**: Рисует фон и текст верхней строки навигации, используя цвета, заданные в `Colors.TopRowColor` и `Colors.TopRowTextColor`. | |
| 50 | + | ||
| 51 | + | ## Смена языка | |
| 52 | + | ||
| 53 | + | Строки, используемые компонентом, могут быть легко переведены на множество языков путем изменения значения свойства `Languages`: | |
| 54 | + | ||
| 55 | + | ``` pascal | |
| 56 | + | type | |
| 57 | + | TLanguage = (lgEnglish, lgFrench, lgGerman, lgHebrew, lgSpanish, lgItalian, | |
| 58 | + | lgPolish, lgFinnish); | |
| 59 | + | ``` | |
| 60 | + | ||
| 61 | + | ## События | |
| 62 | + | ||
| 63 | + | Помимо стандартных событий TCalendarLite запускает следующие события. Некоторые события получают номер года, месяца и дня окрашенной ячейки в качестве параметра. Набор флагов состояния указывает, является ли день отмеченным, текущим или принадлежит предыдущему или следующему месяцу: | |
| 64 | + | ||
| 65 | + | ``` pascal | |
| 66 | + | type | |
| 67 | + | TCalCellState = (csSelectedDay, csToday, csOtherMonth); | |
| 68 | + | TCalCellStates = set of TCalCellState; | |
| 69 | + | ``` | |
| 70 | + | ||
| 71 | + | - **OnDateChange**: Срабатывает всякий раз, когда в календаре выбрана другая дата. | |
| 72 | + | - **OnDrawCell**: Может использоваться для полного или частичного переопределения процесса окраски ячейки дня. Если для логического параметра `AContinueDrawing` установлено значение `true`, нормальный процесс рисования продолжается после выхода из обработчика события; если оно `false`, то отрисовка по умолчанию этого дня не выполняется. Это событие можно использовать, например, для добавления значков дня рождения или праздника в ячейки дня. | |
| 73 | + | - **OnGetDayText**: Может использоваться для изменения отображения текста на указанный день. По умолчанию используется строка, показывающая значение дня. Используя это событие, например, можно добавить названия праздников в календарь. | |
| 74 | + | - **OnGetHolidays**: Задает, какие дни текущего месяца являются выходными. Номер дня выходных кодируется в виде установленных битов в 32-разрядном целом числе. | |
| 75 | + | - **OnHint**: Определяет подсказку, которая может отображаться во всплывающем окне подсказок для каждого дня. Полезно, например, для отображения названия праздников, если указатель мыши находится над праздником. | |
| 76 | + | - **OnMonthChange**: Срабатывает всякий раз, когда в календаре отображается другой месяц. Может использоваться для более эффективного расчета отпуска. | |
| 77 | + | - **OnPrepareCanvas**: Вызывается непосредственно перед окрашиванием ячейки. Может использоваться для переопределения свойств кисти и пера, например, для рисования различных фонов для встреч и важных событий. | |
| 78 | + | ||
| 79 | + | ## Праздники | |
| 80 | + | ||
| 81 | + | Календарь не «знает» ни одного праздника. Вы должны написать обработчик событий, чтобы определить, какие дни в текущем месяце являются выходными. Значения месяца и года соответствующего месяца передаются в качестве параметров. Информация о том, что день является выходным или нет, кодируется как установленные биты в 32-разрядном целом числе. Модуль *callite* упрощает это, предоставляя следующие универсальные процедуры: | |
| 82 | + | ||
| 83 | + | - procedure **AddHoliday**(ADay: Integer; var AHolidays: THolidays): Добавляет указанный день в список бит праздников в параметре `AHolidays`. | |
| 84 | + | - function **IsHoliday**(ADay: Integer; AHolidays: THolidays): Boolean: Проверяет, указан ли указанный день в `AHolidays`. | |
| 85 | + | - procedure **ClearHolidays**(var AHolidays: THolidays): Очищает список праздников. | |
| 86 | + | ||
| 87 | + | Вот простой пример определения праздников Нового Года, Рождества, Пасхи и Троицы: | |
| 88 | + | ||
| 89 | + | ``` pascal | |
| 90 | + | function Easter(year:integer): TDateTime; | |
| 91 | + | var | |
| 92 | + | Day, Month : integer; | |
| 93 | + | a,b,c,d,e,m,n : integer; | |
| 94 | + | begin | |
| 95 | + | case Year div 100 of | |
| 96 | + | 17 : begin m := 23; n := 3; end; | |
| 97 | + | 18 : begin m := 23; n := 4; end; | |
| 98 | + | 19,20 : begin m := 24; n := 5; end; | |
| 99 | + | 21 : begin m := 24; n := 6; end; | |
| 100 | + | else raise Exception.Create('Поддерживается дата только после 1700 года.'); | |
| 101 | + | end; | |
| 102 | + | a := Year mod 19; | |
| 103 | + | b := Year mod 4; | |
| 104 | + | c := Year mod 7; | |
| 105 | + | d := (19*a + m) mod 30; | |
| 106 | + | e := (2*b + 4*c + 6*d + n) mod 7; | |
| 107 | + | day := 22 + d + e; | |
| 108 | + | Month := 3; | |
| 109 | + | if Day>31 then begin | |
| 110 | + | Day := d + e - 9; | |
| 111 | + | Month := 4; | |
| 112 | + | if (d=28) and (e=6) and (a>10) then begin | |
| 113 | + | if day=26 then day := 19; | |
| 114 | + | if day=25 then day := 18; | |
| 115 | + | end; | |
| 116 | + | end; | |
| 117 | + | result := EncodeDate(year, month, day); | |
| 118 | + | end; | |
| 119 | + | ||
| 120 | + | procedure TForm1.CalendarLite1GetHolidays(Sender: TObject; AMonth, AYear: Integer; | |
| 121 | + | var Holidays: THolidays); | |
| 122 | + | var | |
| 123 | + | d, m, y: Word; | |
| 124 | + | e: TDate; | |
| 125 | + | begin | |
| 126 | + | ClearHolidays(Holidays); | |
| 127 | + | if not FNoHolidays then | |
| 128 | + | begin | |
| 129 | + | // Фиксированные праздники | |
| 130 | + | case AMonth of | |
| 131 | + | 1: AddHoliday(1, Holidays); // Новый Год | |
| 132 | + | 12: AddHoliday(25, Holidays); // Рождество | |
| 133 | + | end; | |
| 134 | + | // Пасха | |
| 135 | + | e := Easter(AYear); | |
| 136 | + | DecodeDate(e, y,m,d); | |
| 137 | + | if m = AMonth then | |
| 138 | + | AddHoliday(d, Holidays); | |
| 139 | + | //Троица --> 49 дней после Пасхи | |
| 140 | + | DecodeDate(e+49, y,m,d); | |
| 141 | + | if m = AMonth then | |
| 142 | + | AddHoliday(d, Holidays); | |
| 143 | + | end; | |
| 144 | + | end; | |
| 145 | + | ``` | |
| 146 | + | ||
| 147 | + | Убедитесь, что опция календаря `coShowHolidays` установлена, чтобы выделять праздники в календаре. | |
| 148 | + | ||
| 149 | + | ### Подсказки для праздников | |
| 150 | + | ||
| 151 | + | Если вы хотите отобразить название праздника как всплывающее окно с подсказкой при наведении мыши, установите для `ShowHint` в календаре значение `true` и добавьте этот обработчик события для `OnHint`: | |
| 152 | + | ||
| 153 | + | ``` pascal | |
| 154 | + | procedure TForm1.CalendarLite1Hint(Sender: TObject; AYear, AMonth, ADay: Word; | |
| 155 | + | var AText: String); | |
| 156 | + | var | |
| 157 | + | dt, e: TDate; | |
| 158 | + | begin | |
| 159 | + | AText := ''; | |
| 160 | + | case AMonth of | |
| 161 | + | 1: if ADay = 1 then AText := 'Новый Год'; | |
| 162 | + | 12: if ADay = 25 then AText := 'Рождество'; | |
| 163 | + | else | |
| 164 | + | e := Easter(AYear); | |
| 165 | + | dt := EncodeDate(AYear, AMonth, ADay); | |
| 166 | + | if (dt = e) then | |
| 167 | + | AText := 'Пасха' | |
| 168 | + | else if (dt = e + 49) then | |
| 169 | + | AText := 'Троица'; | |
| 170 | + | end; | |
| 171 | + | end; | |
| 172 | + | ``` | |
| 173 | + | ||
| 174 | + | ### Вписанные имена праздников | |
| 175 | + | ||
| 176 | + | Кроме того, вы также можете напрямую добавить название праздника в сетку календаря. Добавьте следующий обработчик события для `OnGetDayText`. Обратите внимание, что размер календаря должен быть достаточно большим, чтобы обеспечить место для дополнительного текста: | |
| 177 | + | ||
| 178 | + | ``` pascal | |
| 179 | + | procedure TForm1.CalendarLite1GetDayText(Sender: TObject; AYear, AMonth, ADay: Word; | |
| 180 | + | var AText: String); | |
| 181 | + | var | |
| 182 | + | s: String; | |
| 183 | + | begin | |
| 184 | + | GetHintText(Sender, AYear, AMonth, ADay, s); | |
| 185 | + | if s <> '' then | |
| 186 | + | AText := IntToStr(ADay) + LineEnding + s; | |
| 187 | + | end; | |
| 188 | + | ``` | |
| 189 | + | ||
| 190 | + | ### Праздники в popup-меню | |
| 191 | + | ||
| 192 | + | Если свойство календаря `PopupMenu` пустое, предоставляется встроенное всплывающее меню, в котором отображаются все праздники текущего выбранного года. Как обычно, это всплывающее окно открывается щелчком правой кнопкой мыши на компоненте. | |
| 193 | + | ||
| 194 | + | ## Рисование иконок для определенных дней | |
| 195 | + | ||
| 196 | + | Следующий пример рисует значок дня рождения в ячейке 11 ноября каждого года. Значок хранится в списке изображений с индексом 0: | |
| 197 | + | ||
| 198 | + | ``` pascal | |
| 199 | + | procedure TForm1.CalendarLite1DrawCell(Sender: TObject; ACanvas: TCanvas; | |
| 200 | + | AYear,AMonth,ADay: Word; AState: TCalCellStates; var ARect: TRect; | |
| 201 | + | var AContinueDrawing: Boolean); | |
| 202 | + | var | |
| 203 | + | bmp: TBitmap; | |
| 204 | + | begin | |
| 205 | + | if (AMonth = 11) and (ADay = 11) and not (csOtherMonth in AState) then begin | |
| 206 | + | bmp := TBitmap.Create; | |
| 207 | + | try | |
| 208 | + | ImageList1.GetBitmap(0, bmp); | |
| 209 | + | ACanvas.Draw(ARect.Left, (ARect.Top + ARect.Bottom - bmp.Height) div 2, bmp); | |
| 210 | + | inc(ARect.Left, bmp.Width + 2); | |
| 211 | + | // свойство AContinueDrawing, оставленное со значением по умолчанию (true), означает, | |
| 212 | + | // что текст дня рисуется встроенной процедурой в уменьшенный прямоугольник | |
| 213 | + | finally | |
| 214 | + | bmp.Free; | |
| 215 | + | end; | |
| 216 | + | end; | |
| 217 | + | end; | |
| 218 | + | ``` | |
| 219 | + | ||
| 220 | + | --- | |
| 221 | + | *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](/wiki-contact).* |
