Difference between revisions of "CalLite: Usage/ru"

From Lazarus wiki
Jump to navigationJump to search
 
(9 intermediate revisions by the same user not shown)
Line 23: Line 23:
 
* '''WeekendColor''': цвет текста, используемый для отрисовки выходных дней (по умолчанию: clRed <span style="background: #FF0000"> &nbsp; &nbsp;&nbsp;  </span>)
 
* '''WeekendColor''': цвет текста, используемый для отрисовки выходных дней (по умолчанию: clRed <span style="background: #FF0000"> &nbsp; &nbsp;&nbsp;  </span>)
  
==Использование свойства Options календаря==
+
==Использование свойства TCalOption календаря==
Отображение календаря можно изменить, изменив свойство Options календаря, представленного как перечисление флагов:
+
Отображение календаря можно изменить, модифицируя свойство <tt>TCalOption</tt> календаря, представленного как перечисление флагов:
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
type
 
type
Line 46: Line 46:
 
* '''coUseTopRowColors''': Рисует фон и текст верхней строки навигации, используя цвета, заданные в <code>Colors.TopRowColor</code> и <code>Colors.TopRowTextColor</code>.
 
* '''coUseTopRowColors''': Рисует фон и текст верхней строки навигации, используя цвета, заданные в <code>Colors.TopRowColor</code> и <code>Colors.TopRowTextColor</code>.
  
== 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 <code>Languages</code>:
+
Строки, используемые компонентом, могут быть легко переведены на множество языков путем изменения значения свойства <code>Languages</code>:
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
type
 
type
Line 54: Line 54:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==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:
+
Помимо стандартных событий TCalendarLite запускает следующие события. Некоторые события получают номер года, месяца и дня окрашенной ячейки в качестве параметра. Набор флагов состояния указывает, является ли день отмеченным, текущим или принадлежит предыдущему или следующему месяцу:
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
type
 
type
Line 62: Line 62:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
*'''OnDateChange''': Fires whenever another date is selected in the calendar.
+
*'''OnDateChange''': Срабатывает всякий раз, когда в календаре выбрана другая дата.
*'''OnDrawCell''': Can be used to override the painting process of a day cell completely or partially. If the boolean parameter <code>AContinueDrawing</code> is set to true the normal painting process continues after leaving the event handler; if it is false then no default painting occurs for this day. The event can be used, for example, to add birthday or holiday icons to the day cells.
+
*'''OnDrawCell''': Может использоваться для полного или частичного переопределения процесса окраски ячейки дня. Если для логического параметра <code>AContinueDrawing</code> установлено значение <code>true</code>, нормальный процесс рисования продолжается после выхода из обработчика события; если оно <code>false</code>, то отрисовка по умолчанию этого дня не выполняется. Это событие можно использовать, например, для добавления значков дня рождения или праздника в ячейки дня.
*'''OnGetDayText''': Can be used to modify the text display for the specified day. The default is a string showing the day value. Using this event, the names of holidays can be added to calendar, for example.
+
*'''OnGetDayText''': Может использоваться для изменения отображения текста на указанный день. По умолчанию используется строка, показывающая значение дня. Используя это событие, например, можно добавить названия праздников в календарь.
*'''OnGetHolidays''': Defines which days of current month are holidays. The day number of the holidays are encoded as set bits in a 32-bit integer.
+
*'''OnGetHolidays''': Задает, какие дни текущего месяца являются выходными. Номер дня выходных кодируется в виде установленных битов в 32-разрядном целом числе.
*'''OnHint''': Defines a hint which can be displayed in a popup hint window for each day. Useful, for example, to show the name of holidays if the mouse hovers over a holiday.
+
*'''OnHint''': Определяет подсказку, которая может отображаться во всплывающем окне подсказок для каждого дня. Полезно, например, для отображения названия праздников, если указатель мыши находится над праздником.
*'''OnMonthChange''': Fires whenever another month is displayed in the calendar. Can be used for more efficient holiday calculation.
+
*'''OnMonthChange''': Срабатывает всякий раз, когда в календаре отображается другой месяц. Может использоваться для более эффективного расчета отпуска.
*'''OnPrepareCanvas''': Is called immediately before a cell is painted. Can be used to override Brush and Pen properties, for example, in order to draw different backgrounds for appointments and important events.
+
*'''OnPrepareCanvas''': Вызывается непосредственно перед окрашиванием ячейки. Может использоваться для переопределения свойств кисти и пера, например, для рисования различных фонов для встреч и важных событий.
  
==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:
+
Календарь не «знает» ни одного праздника. Вы должны написать обработчик событий, чтобы определить, какие дни в текущем месяце являются выходными. Значения месяца и года соответствующего месяца передаются в качестве параметров. Информация о том, что день является выходным или нет, кодируется как установленные биты в 32-разрядном целом числе. Модуль ''callite'' упрощает это, предоставляя следующие универсальные процедуры:
  
*procedure '''AddHoliday'''(ADay: Integer; var AHolidays: THolidays): Adds the specified day to the holiday bit list in parameter <code>AHolidays</code>.
+
*procedure '''AddHoliday'''(ADay: Integer; var AHolidays: THolidays): Добавляет указанный день в список бит праздников в параметре <code>AHolidays</code>.
*function  '''IsHoliday'''(ADay: Integer; AHolidays: THolidays): Boolean: Checks whether the specified day is listed in <code>AHolidays</code>
+
*function  '''IsHoliday'''(ADay: Integer; AHolidays: THolidays): Boolean: Проверяет, указан ли указанный день в <code>AHolidays</code>.
*'''ClearHolidays'''(var AHolidays: THolidays): Clears the holiday list
+
*procedure '''ClearHolidays'''(var AHolidays: THolidays): Очищает список праздников.
  
Here is a simple example defining the holidays New Year, Christmas, Easter and Whit Sunday:
+
Вот простой пример определения праздников Нового Года, Рождества, Пасхи и Троицы:
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
function Easter(year:integer): TDateTime;  
 
function Easter(year:integer): TDateTime;  
Line 89: Line 89:
 
     19,20 : begin m := 24; n := 5; end;
 
     19,20 : begin m := 24; n := 5; end;
 
     21    : begin m := 24; n := 6; end;
 
     21    : begin m := 24; n := 6; end;
     else    raise Exception.Create('Only years after 1700 supported.');
+
     else    raise Exception.Create('Поддерживается дата только после 1700 года.');
 
   end;
 
   end;
 
   a := Year mod 19;
 
   a := Year mod 19;
Line 118: Line 118:
 
   if not FNoHolidays then
 
   if not FNoHolidays then
 
   begin
 
   begin
     // Fixed holidays
+
     // Фиксированные праздники
 
     case AMonth of
 
     case AMonth of
       1: AddHoliday(1, Holidays);          // New Year
+
       1: AddHoliday(1, Holidays);          // Новый Год
     12: AddHoliday(25, Holidays);        // Christmas
+
     12: AddHoliday(25, Holidays);        // Рождество
 
     end;
 
     end;
     // Easter
+
     // Пасха
 
     e := Easter(AYear);
 
     e := Easter(AYear);
 
     DecodeDate(e, y,m,d);
 
     DecodeDate(e, y,m,d);
 
     if m = AMonth then
 
     if m = AMonth then
 
       AddHoliday(d, Holidays);
 
       AddHoliday(d, Holidays);
     // Whit Sunday --> 49 days after easter
+
     //Троица --> 49 дней после Пасхи
 
     DecodeDate(e+49, y,m,d);
 
     DecodeDate(e+49, y,m,d);
 
     if m = AMonth then
 
     if m = AMonth then
Line 136: Line 136:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Make sure to have the calendar Option <code>coShowHolidays</code> set in order to highlight the holidays in the calendar.
+
Убедитесь, что опция календаря <code>coShowHolidays</code> установлена, чтобы выделять праздники в календаре.
  
=== Hints for holidays ===
+
=== Подсказки для праздников ===
If you want to display the holiday name as a mouse popup hint window then you should set the calendar's <code>ShowHint</code> to <code>true</code> and add this event handler for <code>OnHint</code>:
+
Если вы хотите отобразить название праздника как всплывающее окно с подсказкой при наведении мыши, установите для <code>ShowHint</code> в календаре значение <code>true</code> и добавьте этот обработчик события для <code>OnHint</code >:
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
Line 149: Line 149:
 
   AText := '';
 
   AText := '';
 
   case AMonth of
 
   case AMonth of
     1: if ADay = 1 then AText := 'New Year';
+
     1: if ADay = 1 then AText := 'Новый Год';
   12: if ADay = 25 then AText := 'Christmas';
+
   12: if ADay = 25 then AText := 'Рождество';
 
   else
 
   else
 
       e := Easter(AYear);
 
       e := Easter(AYear);
 
       dt := EncodeDate(AYear, AMonth, ADay);
 
       dt := EncodeDate(AYear, AMonth, ADay);
 
       if (dt = e) then
 
       if (dt = e) then
         AText := 'Easter'
+
         AText := 'Пасха'
 
       else if (dt = e + 49) then
 
       else if (dt = e + 49) then
         AText := 'Whit Sunday';
+
         AText := 'Троица';
 
   end;
 
   end;
 
end; </syntaxhighlight>
 
end; </syntaxhighlight>
  
=== Embedded holiday names ===
+
=== Вписанные имена праздников ===
In addition, you can also add the holiday name to the calendar grid directly. Add the next event handler for <code>OnGetDayText</code>. Note that the size of the calendar must be large enough to provide space for the additional text:
+
Кроме того, вы также можете напрямую добавить название праздника в сетку календаря. Добавьте следующий обработчик события для <code>OnGetDayText</code>. Обратите внимание, что размер календаря должен быть достаточно большим, чтобы обеспечить место для дополнительного текста:
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
Line 176: Line 176:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Holidays in popup menu ===
+
=== Праздники в popup-меню ===
If the calendar's <tt>PopupMenu</tt> 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.
+
Если свойство календаря <tt>PopupMenu</tt> пустое, предоставляется встроенное всплывающее меню, в котором отображаются все праздники текущего выбранного года. Как обычно, это всплывающее окно открывается щелчком правой кнопкой мыши на компоненте.
  
== 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:
+
Следующий пример рисует значок дня рождения в ячейке 11 ноября каждого года. Значок хранится в списке изображений с индексом 0:
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
Line 195: Line 195:
 
       ACanvas.Draw(ARect.Left, (ARect.Top + ARect.Bottom - bmp.Height) div 2, bmp);
 
       ACanvas.Draw(ARect.Left, (ARect.Top + ARect.Bottom - bmp.Height) div 2, bmp);
 
       inc(ARect.Left, bmp.Width + 2);
 
       inc(ARect.Left, bmp.Width + 2);
       // Not changing AContinueDrawing from its default value (true) means
+
       // свойство AContinueDrawing, оставленное со значением по умолчанию (true), означает,
       // that the day text is drawn by the built-in procedure into the reduced rectangle
+
       // что текст дня рисуется встроенной процедурой в уменьшенный прямоугольник
 
     finally
 
     finally
 
       bmp.Free;
 
       bmp.Free;

Latest revision as of 13:56, 2 June 2020

English (en) suomi (fi) русский (ru)

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

CalLite

Просто поместите компонент 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;