![]() |
|
#1
|
|||
|
|||
![]() Всем привет. Первый раз сталкиваюсь с написанием компонентов, поэтому пришел сюда.
Хочу написать компонент Календарь. Все которые есть не устраивают или по внешнему виду или по функционалу. Да и в общем хочется свой сделать. О самом компоненте только сейчас задумался. Пока календарь делаю на самой форме из VCL компонентов. Я использую одни Label, планирую добавить пару имажев и панелей для красоты, но это потом. Сейчас стал вопрос очень жестко, как все отсортировать, т.е. дни недели месяца и все тому подобные данные я могу получить, вот что бы составить по порядку дни и в виде стандартного календаря ума не приложу как и что написать. Подскажите как лучше отсортировать дни и выставить их правильном порядке и что бы совпадали дни недели? Буду рад любым высказываниям. |
#2
|
|||
|
|||
![]() Только что додумался как организовать эту так называемую сортировку.
Каждый Label нумеруем по порядку от labday1 до labday42, первый labday всегда будет понедельник и пошло по порядку. Теперь вопрос ко всем Вам. Подскажите кодик какой нибудь заполняющий это чудо, а то что то у меня не получается. И собственно по теме раздела. Как это чудо переделать в компонент? Какого потомка использовать? Жду Ваших ответов. |
#3
|
||||
|
||||
![]() К сожалению на работе перешли на лиц. софт. А 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.3 По результату этой функции выбираешь, по какой табличке тебе смотреть количество дней в месяце. 3. Теперь необходимо узнать, с какого дня недели начинается месяц. В этом поможет функция DayOfWeek. Если не ошибаюсь, то она вернет результат от 0..6, где 0 - Воскресенье. (Проверь!) 4. Ну а дальше отрисовываешь свой компонент как тебе нравится. Ты знаешь сколько дней в месяце, знаешь с какого дня начинать. Заводишь табличку в 7 столбцов. первую строку подписываешь пн...вс. А со следующей строки, с определенного столбца (см. п.3) заполняешь построчно от 1 до количество дней в месяце (см. п.2). А если указанный день совпадает с номером отрисовываемого дня, можншь его пометить как-нибудь. Собственно, это касается вычислений, необходимых для правильного построения календаря (примитивных собственно ![]() Можешь создавать массив TRect, в котором запоминать "расположение" дней в месяце. И по клике по компоненту проверять, в какой день кликнули, и выполнить соответствующее действие. Можешь усложнить структуру и хранить информацию, например, о цвете отрисовки (например для пометки важного дня). Можешь добавить хинты для каждого дня и т.п. Вобщем, тут полет фантазии. Почему я это расписал? Да потому, что меня спугнула твоя идея создания календаря из контролов в ДизайнТайм. Расставление лейблов и прочего. Нафига? Посмотри тут на формуме, полно тем про динамическое создание компонент. Очень удобно ![]() Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. Последний раз редактировалось dr. F.I.N., 11.02.2011 в 06:18. |
#4
|
|||
|
|||
![]() Спасибо за ответ.
Сразу отвечу на последний вопрос. Я как бы не очень хороший программист и поэтому ищу удобные способы реализации своих идей. Создавать динамически все эти компоненты для меня тяжело так как высчитывать их расстояния друг от друга и расположение на форме, я думаю на практике это легче будет, но пока боюсь. Я думал о сортировке дней и мне становилось страшно о методе реализации. Я как то и не подумал хранить данные в переменных о текущем году. Визуальную красоту потихоньку продумываю как что и как отмечать. Сегодня закончу с самой программой надеюсь и буду потихоньку переходить на создание компонента. Хотя вопрос стоит или не стоит его создавать? Будет ли на него спрос? Я не думаю о материальной выгоде. Просто хочется создать и что бы кому то пригодился. Ладно пока начнем а там видно будет. О создании компонентов я ничего не знаю, хотя немного есть знаний, но они не пригодятся. Мог бы кто-нибудь выложить шаблон или пример не большой подобного компонента. Я бы только заполнял его кодом. Я не знаю как сделать что бы он при перетаскивании на форму отображался и его можно было перетаскивать и растягивать ну соответственно и настраивать. Буду очень рад примерчику. |