Задание 1. Создание и использование отдельных классов для графических примитивов.
Постановка задачи.Требуется создать небольшой набор не связанных друг с другом классов, описывающих основные графические примитивы (окружность, отрезок, прямоугольник и т.д.). Каждый класс должен содержать необходимые параметры-свойства (координаты базовой точки, размеры, признак видимости), не менее двух конструкторов, метод отображения примитива Show,метод для перемещения объекта MoveTo. Кроме того, классы могут содержать уникальные методы, например – изменение радиуса окружности, изменение линейных размеров прямоугольника, поворот отрезка и т.д. Каждый класс оформляется в виде отдельного модуля, который подключается к основной программе для демонстрации возможностей.
Порядок выполнения работы (для инструментального пакета Delphi):
1. Создать новый проект и сохранить его в собственном каталоге.
2. Разместить на главной форме основное меню для последующей реализации команд демонстрации возможностей объектов-примитивов. На начальном этапе достаточно в меню поместить две команды – Создать и Переместить, подменю которых конкретизируют используемые объекты.
3. Разместить на форме компонент Image для отображения примитивов и выровнять его на всю клиентскую область.
4. Создать обработчик события формы OnCreate для инициализации датчика псевдослучайных чисел и установки режима рисования на поверхности компонента Image:
Image1.Canvas.Pen.Mode := pmNotXOR;
этот режим позволяет стирать существующее изображение за счет повторного вывода на то же самое место с автоматическим восстановлением фона.
5. Добавить в проект новый программный модуль, НЕ СВЯЗАННЫЙ со своей формой: команда меню File / New / Unit и обязательно сохранить его вместе с проектом. Поскольку модуль является чисто программным, то его заготовка содержит лишь заголовок, начало интерфейсной секции (директива interface) и начало секции реализации (директива implementation).
6. В интерфейсном разделе нового модуля ввести описание (ТОЛЬКО ОПИСАНИЕ!) одного из создаваемых классов (в разделе описания типов). Для простоты сначала можно взять класс окружностей, подробно описанный в лекционном материале. Остальные классы можно добавить после проверки работы класса окружностей. В классе сделать поля данных закрытыми, а методы – открытыми. Каждый примитив должен иметь базовую точку, изменение координат которой приводит к перемещению примитива без изменения его размеров.
7. Оформить раздел реализации модуля, включив в него программную реализацию каждого объявленного метода. Например:
procedure TCircle.MoveTo(dx, dy : integer);
Begin
Show; //повторный вывод для стирания изображения примитива
x := x + dx; y := y + dy; //изменение координат базовой точки
Show; //рисование в новом месте
end;
В методе MoveTo для удобства дальнейшего использования задаются не новые координаты базовой точки, а СМЕЩЕНИЕ относительно нее, которое может быть и отрицательным.
8. Программная реализация методов показа примитивов может использовать стандартные графические примитивы системы Windows. Например, вывод окружности выполняется следующим образом:
Form1.Image1.Canvas.Ellipse(x-r, y-r, x+r, y+r);
Поскольку этот код использует компонент Image основной формы, необходимо подключить модуль главной формы к модулю с классами, записав сразу после директивы interface строку
usesИмяГлавногоМодуля;
9. После полного описания всех методов сохранить модуль и подключить его к основному модулю.
10. В разделе реализации основного модуля объявить одну-две переменные объектного типа, а также – массив объектных указателей для проверки возможностей групповой обработки объектов-примитивов.
11. Написать обработчики команд создания примитивов, выполняющие следующие действия:
· если соответствующий объект-примитив уже был ранее создан (указатель на него не равен nil), то стереть старое изображение повторным вызовом метода Show и уничтожить старый объект методом Free;
· создать новый объект вызовом конструктора со случайными параметрами примитива;
· показать примитив методом Show.
12. Написать обработчики команд перемещения примитивов в новую точку со случайными координатами, используя генерацию значений смещения координат в пределах [-50, 50].
13. Написать обработчики команд изменения геометрических свойств объектов (радиус окружности, размеры прямоугольника, положение конечной точки отрезка и т.д.).
14. Написать обработчики команд создания массивов объектов и группового изменения их свойств.