Тема: Календарь
Показать сообщение отдельно
  #3  
Старый 11.02.2011, 06:12
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

К сожалению на работе перешли на лиц. софт. А Delphi не есть необходимое ПО в сфере работы. Поэтому сижу тут на Лазарусе. Поэтому функции и модули в Делфи поищешь сам.

А Общая идея такая:
1. Заводим переменные dYear, dMonth, dDay: Word; (Хотя для дня и месяца было бы достаточно Byte)

2. Для указанного года и месяца (в переменных dYear, dMonth - см. п.1) вычисляем количество дней в месяце:
2.1 Можно составить табличку. В лазарусе она выглядит так:
Код:
type
  TDayTable = array[1..12] of Word;
const
  MonthDays: array [Boolean] of TDayTable =
     ((31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
      (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31));
2.2 Почему Таблицы 2? Да потому, что год может быть високосный. А определить это можно функцией IsLeapYear, которая по указанному году вернет True/False взависимости от високосности.
2.3 По результату этой функции выбираешь, по какой табличке тебе смотреть количество дней в месяце.

3. Теперь необходимо узнать, с какого дня недели начинается месяц. В этом поможет функция DayOfWeek. Если не ошибаюсь, то она вернет результат от 0..6, где 0 - Воскресенье. (Проверь!)

4. Ну а дальше отрисовываешь свой компонент как тебе нравится. Ты знаешь сколько дней в месяце, знаешь с какого дня начинать. Заводишь табличку в 7 столбцов. первую строку подписываешь пн...вс. А со следующей строки, с определенного столбца (см. п.3) заполняешь построчно от 1 до количество дней в месяце (см. п.2). А если указанный день совпадает с номером отрисовываемого дня, можншь его пометить как-нибудь.

Собственно, это касается вычислений, необходимых для правильного построения календаря (примитивных собственно ). А что касается создания компонент - это уже другой вопрос, и вариантов реализации уйма.

Можешь создавать массив TRect, в котором запоминать "расположение" дней в месяце. И по клике по компоненту проверять, в какой день кликнули, и выполнить соответствующее действие. Можешь усложнить структуру и хранить информацию, например, о цвете отрисовки (например для пометки важного дня). Можешь добавить хинты для каждого дня и т.п. Вобщем, тут полет фантазии.


Почему я это расписал? Да потому, что меня спугнула твоя идея создания календаря из контролов в ДизайнТайм. Расставление лейблов и прочего. Нафига? Посмотри тут на формуме, полно тем про динамическое создание компонент. Очень удобно
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием