Компонента Delphi TСalendar. Делаем свою.

2010-07-09 papirosnik Delphi

Развивая тему о разработке собственных компонет Delphi и C++ Builder предлагаю потренироваться на компоненте, которая находится на закаладке Samples и служит для визуального выбора даты из окошка, представленного в виде календаря — TCalendar. Такие компоненты встречаются повсеместно (как на сайтах так и в оффлайновых программах). Существуют как примтивные реализации, так и очень навороченные (платные). Но рано или поздно у любого программера наступает момент, когда по каким-либо причинам существующие компоненты не подходят: хочется что-то убрать или добавить каку-то фичу. В этой статье я даю для разработки собственного календаря в Delphi (ну и естсественоо, его без каких-либо ограничений можно использовать в C++ Builder).

Как приступить к созданию собсвенных компонент на основе существующих, я описывал здесь: http://papirosnik.info/2010/06/bsgrid-sozdayom-sobstvennyj-dbgrid-chast-1/. Но я хочу показать и другой способ создания компонет на основе существующих: не штатными средствами среды Delphi, а в ручную. Но полностью писать с нуля код — дело неблагодарное, поэтому:

  1. Создаём новый проект, но тип его будет Package (File->New->Other->Delphi Packages->Package).
  2. Сохряняем сразу же его под каким-либо именем (у меня BSComps, вы можете писать MyComponents либо ещё как) в папку, желательно отличную от той, что среда предлагает по умолчанию (уж слишком далеко она обычно прелагает).
  3. Копируем файл с исходным кодом компоненты TCalendar в папку нашего проекта под другим именем: в моём случае из папки Embarcadero2010SourceWin32SamplesSource файл Calendar.pas я скопировал в..TestBSCompsBSCalendar.pas.
  4. Добавляем новый файл в проект: Project->Add to Project (или жмём Shift+F11). Здесь следует выбрать BSCalendar.pas (или как он у Вас там называется) из папки проекта и нажать Ок.
  5. В файле BSCalendar заменяем все типы (фразы) TCalendar на TBSCalendar.
  6. В секцию interface добавляем следующую процедуру: Procedure Register.
  7. В секции implementation прописываем код её реализации:
    procedure Register;
    begin
      RegisterComponents('BumperSoft', [TBSCalendar]);
    end;
  8. Компилируем проект (Ctrl+F9) и если всё прошло успешно, устанавливаем нашу новую компоненту. Я для этого щёлкая правой кнопкой мышки в Prioject Manager На названии проекта и выбираю пункт меню Install.

Если всё прошло успешно, среда нам скажет, что новый компонет TBSCalendar зарегистрирован и установлен на закладку BumperSoft. Теперь можно создать новый тестовый проект, кинуть на его главную форму TBScalendar и посмотреть его в действии. Запустив приложение, мы обнаружим, что он ведёт себя полностью аналогично стандартному. Но мы же не для того затеяли всю эту пляску, чтобы продублировать функционал уже изобретённого велосипеда. Нам нужно что-то добавить.

Мне понадобилось добавить справа колонку с номером недели в году. Кроме того, выделить каким-либо образом текущий день. А ещё показать другим цветом выходные дни (суббота и воскресенье) и предоставить выбор — выводить ли названия дней недели сокращённо или полными именами… Ну и чтобы все эти возможности были настраиваемыми. Т.е. можно было их включить, поменять цвет.. а можно было отключить и привести всё к стандартному виду.

Для этого надо вводить дополнительные свойства в класс TBSCalendar и вносить изменения в его методы. Подробно и детально описывать весь процесс — тема не одной статьи, поэтому здесь ограничусь лишь основными моментами. Чтобы ввести новое свойство в компонент, нужно прописать его в секции published. Но не так, как там прописаны уже существующие поля (унаследованные от предка TCustomGrid), а с указанием типа. Например, вводя свойтсво ShowWeeks типа boolean  (показывать ли недели), я пишу в секции published следующий код:

property ShowWeeks: boolean read FShowWeeks write SetShowWeeks;

Это свойство доступно как для чтения, так и для записи. При чтении оно просто возвращает значение приватной (из секции private) переменной FShowWeeks (типа boolean), а при записи вывзывает процедуру SetShowWeeks, которая установит ту же внутреннюю переменную, но и ещё застваит компоненту перерисоваться, чтобы немедленно отобразить изменения (это осуществляется вызовом процедуры Invalidate).

Аналогичным образом построена работа с остальными свойствами. Поддержка свойств реализована отдельными методами и  внесением изменений в методы (процедуры) класса (например TWeekColor используется в процедуре DrawCell).

Весь исходный текст примера с комментариями в коде можно скачать здесь: http://papirosnik.info/Files/BSCalendar.zip

Проект, в котором этот компонет задействован, находится здесь: http://papirosnik.info/programmy/

По всем вопросам с удовольствием отвечу в комментариях.

Bumper soft, Delphi, VCL Components,


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Powered by WordPress. Designed by elogi.