Sign in Join
Wiki copytemporary

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

OldNewLine
1+# Использование
2+
3+![](/wiki-images/9/90/Callite.png)
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).*

Back to history