3574
.pdfМинистерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный лесотехнический университет имени Г.Ф. Морозова»
ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ
Методические указания к лабораторным работам для студентов по специальности
09.05.01 – Применение и эксплуатация автоматизированных систем специального назначения
Воронеж 2017
УДК 681.3.06 (076)
Лавлинский, В. В. Объектно-ориентированное программирование [Текст] : м етодические указания к лабораторным работам для студентов по специальности 09.05.01 – Применение и эксплуатация
автоматизированных |
систем |
специального |
назначения / В . В . |
Л а в л и н с к и й , О . В. Оксюта, |
Ю.Г. Табаков; |
М-во образования и |
науки РФ, ФГБОУ ВО «ВГЛТУ им. Г.Ф. Морозова». – Воронеж, 2017. – 47 с.
ОГЛАВЛЕНИЕ |
|
ВВЕДЕНИЕ .............................................................................................. |
4 |
Лабораторная работа №1. Создание и хранение шаблонов |
|
компонентов ............................................................................................................... |
5 |
Лабораторная работа №2. Объявление и описание классов................ |
11 |
Лабораторная работа №3. Структура класса компонента................... |
22 |
Лабораторная работа №4. Создание методов и событий. ..................... |
33 |
ВВЕДЕНИЕ
Методические указания разработаны на кафедре вычислительной техники и информационных систем. Могут быть использованы для подготовки к выполнению лабораторных работ по курсу «Объектноориентированное программирование».
В методических указаниях описывается работа в среде С++ Builder, возможности программирования в этой системе. Перед текстом программы показан порядок действий при разработке программ и дана кратко теория. Затем приведен текст программы с подробными комментариями. В лабораторных работах показано, как использовать основные компоненты, как разработать главное и контекстное меню, панель инструментов, информационную строку и создать многооконное приложение, показаны основные понятия и свойства объектно-ориентированного программирования, приведены программы для решения задач.
Методические указания могут использоваться студентами для подготовки к контрольным работам и выполнения домашних заданий.
Каждое задание выполняется студентом индивидуально в соответствии с вариантом задания. Вариант задания каждому студенту выдается преподавателем. Для выполнения задания необходимо изучить теоретический материал, разобрать примеры и протестировать их с различными исходными данными. Для выполнения задания студент должен определить необходимые переменные и пользовательские типы данных (классы и объекты), разработать структуру типов данных, реализовать поставленную задачу на языке программирования С++, протестировать программу с разными исходными значениями и выполнить анализ полученных результатов. Все этапы выполнения лабораторной работы студент должен отразить в отчете.
Отчет для каждой лабораторной работы должен содержать:
1.Титульный лист с указанием номера и темы лабораторной работы, даты сдачи и ФИО выполнявшего.
2.Цель лабораторной работы. Задание.
3.Анализ задачи.
4.Результаты выполнения лабораторной работы (текст программы).
5.Вывод о проделанной работе и полученных результатах.
Лабораторная работа №1. Создание и хранение шаблонов компонентов
1.Цель лабораторной работы.
Целью работы является практическое освоение методологии и принципов объектно-ориентированного подхода при разработке программных систем. Принципы объектной методологии изучаются сначала на базовом уровне - на примере решения классической задачи управления набором графических объектов. Далее рассматривается подход к самой разрабатываемой программе как к объекту.
2.Теоретический материал для домашнего изучения.
Впроцессе разработки различных приложений нередко используются одинаковые компоненты, с одинаковыми настройками их свойств и одинаковыми обработчиками событий. Каждый раз повторять все эти настройки — непроизводительная трата собственных сил и времени. C++Builder предоставляет широкие возможности повторного использования однажды разработанных кодов. Наиболее простой способ сохранения разработанных компонентов или групп компонентов для последующего их использования в других проектах — запоминание в библиотеке визуальных компонентов соответствующих шаблонов.
Пусть вы хотите на основе компонента Edit создать окно редактирования, в котором пользователь мог бы вводить только целые числа, т.е. не мог бы вводить никаких других символов, кроме цифр. Кроме того, при нажатии пользователем клавиши Enter фокус должен передаваться следующему компоненту в последовательности табуляции. Это можно сделать, например, следующим образом.
Откройте новое приложение и перенесите на форму компонент типа Edit. В обработчике его события OnKeyPress напишите оператор:
Set <char, ‗0‘, ‗9‘> Dig;
if (! (Dig << ‗0‘ << ‗1‘ << ‗2‘ << ‗3‘ << ‗4‘ << ‗5‘ << ‗6‘ << ‗7‘ << ‗8‘ << ‗9‘).Contains(Key))
Key = 0;
ав обработчике события OnKeyDown — оператор:
if (Key == VK_RETURN)
FindNextControl((TWinControl *)Sender, true, true, false)->SetFocus();
Эти операторы, заменяют все символы, кроме цифр (нулевым символом), который не будет отображаться в окне, и при нажатии Enter передадут фокус очередному компоненту.
Измените также текст в окне (свойство Text) на «0».
Пусть мы хотим сохранить шаблон этого компонента в библиотеке визуальных компонентов, чтобы в дальнейшем включать подобный
компонент в другие свои приложения. Для этого надо, выделив предварительно данный компонент, выполнить команду Component | Create Component Template (создать шаблон компонента). В открывшемся диалоговом окне Component Template information вы можете задать имя компонента (в верхнем окне редактирования), которое будет появляться на ярлычке подсказки, если пользователь задержит курсор мыши над пиктограммой этого компонента в библиотеке визуальных компонентов.
В выпадающем списке в средней части окна вы можете выбрать страницу библиотеки визуальных компонентов, на которой вы хотите разместить пиктограмму компонента, Вы можете также указать новое имя «Мои шаблоны» и тогда в библиотеке визуальных компонентов будет создана новая страница с этим именем. Можно также изменить пиктограмму данного компонента (кнопка Change). Пиктограмма, если вы ее хотите сменить, должна быть подготовлена заранее в виде файла .bmp размером 24 на 24. После выполнения всех описанных операций щелкните на кнопке ОК.
Ваш шаблон появится в библиотеке. Вы можете убедиться в этом, посмотрев на указанную вами страницу библиотеки.
Теперь попробуйте создать новое приложение и перенести на форму созданный вами компонент. Вы увидите, что он появится на форме в том виде, в котором вы его записали в библиотеку. Посмотрев на страницу событий этого компонента в Инспекторе Объектов, вы увидите, что на ней указаны обработчики событий OnKeyDown и OnKeyPress, а в процедурах этих обработчиков уже записаны те операторы, которые вы написали перед созданием шаблона.
Правда, у такого подхода имеется определенный недостаток. Если вы разместите на форме несколько созданных вами компонентов, то для каждого из них в текст модуля включатся соответствующие обработчики событий. Это явная избыточность, поскольку написанные вами операторы обработки универсальны и хватило бы одного обработчика события OnKeyDown и одного обработчика события OnKeyPress на все размещенные компоненты. Чтобы избежать избыточности, желательно будет оставить в модуле по одному обработчику каждого вида, остальные удалить из текста, а во всех окнах редактирования сослаться на оставшиеся обработчики.
Таким образом, вы можете создать себе немало шаблонов компонентов, которые легко переносятся из приложения в приложение. Аналогичным образом можно создавать шаблоны не только отдельных компонентов, но и групп компонентов, расположенных, например, на панели. В этом случае следует сохранять шаблон всей панели, и он будет включать расположенные на ней компоненты. Впрочем, повторяющиеся панели компонентов лучше оформлять в виде фреймов и использовать сохранение их в Депозитарии. А вот меню вместе с соответствующей ему инструментальной панелью, диспетчером действий и списком изображений очень удобно сохранять в виде шаблона.
Можно потратить один раз время и сформировать некий универсальный шаблон различный типовых действий. Перенесите на форму компонент ActionList и создайте в нем список действий, встречающихся в различных ваших программах. Для каждого действия задайте тексты подсказок в свойствах Hint и назначьте, где надо, быстрые клавиши. Далее для этого списка действий следует подобрать в компоненте ImageList набор хороших пиктограмм для разделов меню и кнопок. Затем на основании этого списка в компонентах MainMenu и ToolBar сформируйте соответствующее меню и инструментальную панель. Можно также в создаваемый шаблон добавить компоненты StatusBar — панель состояния и ApplicationEvents — перехватчик событий приложения.
Для многих действий вам постоянно требуются компоненты диалогов. Их тоже полезно добавить в шаблон. Далее вы можете описать обработчики многих из введенных вами действий. Там, где невозможно их полностью описать, можно создать некие заготовки обработчиков, которые вам будет легко заполнять в конкретных приложениях.
Завершив эту работу, выделите все компоненты, которые хотите включить в шаблон, выполните команду Component | Create Component Template и включите описанным выше способом ваш шаблон в библиотеку. В дальнейшем вы сможете с поражающей всех быстротой создавать с помощью вашего шаблона прототипы различных приложений, поскольку удалить из шаблона лишние действия намного быстрее, чем описывать все каждый раз. Но выигрыш будет не только в скорости разработки. Вы обеспечите единство стиля ваших разработок. А это очень важно.
В дальнейшем вы можете развивать и пополнять ваш шаблон, перенося его со страницы библиотеки на форму, что-то в нем модернизируя и повторно занося измененный шаблон в библиотеку под тем же или иным именем.
Если в дальнейшем вам перестанет нравиться созданный вами шаблон, вы можете удалить его из библиотеки. Для этого надо выполнить команду Component | Configure Palette. При выполнении этой команды вы увидите диалоговое окно страницы Polette опций среды C++Builder. В этом окне вы можете удалить (кнопка Delete) компонент или целую страницу, если она пустая, переименовать (кнопка Rename) компонент или страницу, добавить (кнопка Add), изменить последовательность размещения страниц библиотеки и компонентов.
Создание новых компонентов и включение их в библиотеку Начало создания и установка компонента
При создании компонентов, наследующих каким-либо имеющимся в C++Builder компонентам, вы можете добавить новые свойства, в том числе и отображаемые в Инспекторе Объектов, добавить новые события и т.п. Однако создание новых компонентов — это непростой процесс,
требующий хорошего понимания тонкостей наследования и хорошего знания свойств, методов и событий родительских компонентов.
Давайте поставим перед собой сравнительно простую задачу: создать окно редактирования, в котором по желанию во время проектирования и во время выполнения можно будет разрешать ввод только цифр (например, если предполагается, что пользователь должен вводить целое число), запрещать ввод цифр (например, при вводе пользователем фамилии, имени и отчества) или разрешать ввод любых символов. Кроме того предусмотрим очистку содержимого окна и свойство, показывающее, был ли модифицирован пользователем текст с момента последней очистки. В момент очистки определим генерацию соответствующего события, которое пользователь при желании может обрабатывать.
Построим наш компонент как наследника класса TEdit и назовем наш новый класс TEditLetNum. В компонент, помимо свойств, обычных для TEdit, желательно добавить два новых свойства: EnableNum и EnableLet. Тип обоих свойств — bool. Первое из них разрешает или запрещает ввод цифр, а второе разрешает или запрещает ввод каких-либо символов, кроме цифр. Таким образом, если EnableNum = true и EnableLet = true, то это будет обычное окно редактирования. Если EnableNum = true, a EnableLet = false, получим окно, в котором можно вводить только цифры. Если
EnableNum = false, a EnableLet = true, то в окно, запрещено вводить цифры. Ну а ситуацию, когда EnableNum = false и EnableLet = false, надо запретить, поскольку в такое окно ничего ввести невозможно.
Предусмотрим в компоненте метод Clear — очистку текста в окне и свойство Modified, которое будет показывать, был ли модифицирован текст с момента гаэи следней очнстки. В момент очистки будем генерировать событие OnClear.
Компоненты в C++Builder компилируются в пакеты. Поэтому, если вы еще не создали пакет, в который хотите компилировать ваш новый компонент, то можете начать с его создания (впрочем, это можно сделать и позднее). Предварительно удобно закрыть предшествующий проект командой File | Close All. Для создания нового пакета:
1.Выполните команду File | New | Other и в диалоговом окне New Items на странице New выберите пиктограмму Package — пакет. После этого вы попадете в окна Диспетчера Пакетов (Package Manager). В этом окне Contains — содержимое пакета, а Requires — список других пакетов, требующихся для поддержки вашего.
2.Сразу сохраните пакет в файле с расширением .dpk, выполнив команду File | Save As или выбрав команду Save из меню, всплывающего при щелчке правой кнопкой мыши.
3.Щелкнув на кнопке Add (добавить), вы попадете в окно, позволяющее вам включить в пакет модуль (Add Unit), компонент
(New Component) или ActiveX (Import ActiveX). В данном случае вам надо включить в пакет свой новый компонент. Для этого вы открываете соответствующую страницу. Укажите в этом окне
родительский тип (выберите TEdit модуля StdCtrls из выпадающего списка Ancestor type), имя нового класса в окне Class Name (для нашего примера — TEditLetNum), страницу в библиотеке компонентов (Palette Page), на которой хотите разместить пиктограмму вашего нового компонента. Можете указать новую страницу, и она будет создана. Задайте также путь и имя модуля вновь создаваемого компонента (окно Unit file name).
4.Щелкните на OK и вы вернетесь в окно Диспетчера Пакетов, но в нем уже появится имя вашего компонента. А если вы заранее создали файл ресурса компонента .dcr с его новой циктограммой, то Диспетчер Пакетов включит в пакет и этот файл.
5.Щелкните на кнопке Install (установка) и компонент будет установлен на указанной вами странице библиотеки компонентов. Можете открыть эту страницу и увидеть его там. Выполнив в окне Диспетчера Пакетов двойной щелчок на имени файла компонента, вы можете перейти в окно редактирования и увидеть, что в нем появилась заготовка модуля вашего компонента. Сохраните ее в файле (File | Save).
6.Чтобы скомпилировать модуль вашего компонента, можно щелкнуть в окне Диспетчера Пакетов на кнопке Compile (компиляция). Но в
данном случае модуль уже скомпилирован во время его установки. Возможно и другое начало проектирования нового компонента.
1.Выполните команду Component | New Component и попадете в почти такое же, как описано выше, окно New Component.
2.Занеся в него необходимую информацию, щелкните на кнопке Install (установка) и перед вами появится диалоговое окно с двумя закладками: Into existing package (устанавливать в существующий пакет) и Into new packoge (устанавливать в новый пакет). Выберите файл пакета из существующих или, лучше, укажите имя нового файла и строку его описания на странице into new package. Вам будет задан вопрос: «File ... will be build then installed. Continue?» («Файл ... будет сначала построен, а потом установлен. Продолжать?»). Ответьте на заданный вопрос утвердительно и файл будет установлен в пакет, зарегистрирован на указанной странице в
библиотеке, а его модуль появится в окне редактирования.
Мы рассмотрели пути создания новых пакетов и включения в них новых компонентов. Если вы в дальнейшем захотите удалить какойнибудь модуль из пакета, это можно сделать в окне Диспетчера Пакетов, выделив нужный модуль и щелкнув на кнопке Remove.
Удалить сам зарегистрированный пакет можно следующим образом;
1.Выполните команду Project | Options из главного меню и выберите страницу Росkages.
2.На этой странице щелкните на пакете, который вы хотите удалить, и затем щелкните на Remove.
Итак, вы создали прообраз вашего компонента и зарегистрировали его. По умолчанию пиктограмма компонента на соответствующей странице библиотеки будет взята тождественной пиктограмме родительского типа. А если вы заранее создали файл ресурсов компонента и включили в него новую пиктограмму, то именно ею вы сможете любоваться в палитре компонентов на указанной вами странице.
3.Лабораторные задания.
По одному из приведенных ниже вариантов составить программу создания средствами ООП набора управляемых с клавиатуры графических объектов. Организовать управление движением объектов курсорными клавишами по вертикали, по горизонтали и по диагоналям. Ввести возможность менять цвет объектов (изменением кода цвета).
1.Набор из 30 пикселов разного цвета, двух ромбов с диагоналями, параллельными краям экрана, и двух эллипсов. Менять размеры ромба и эллипса по вертикали и по горизонтали.
2.Набор нз 40 пикселов одного цвета, двух прямоугольников со сторонами, параллельными краям экрана, и двух дуг окружности. Менять размеры прямоугольника по вертикали и по горизонтали, а для дуги менять радиус и конечный угол (стартовый угол принять равным нулю).
3.Набор нз 50 пикселов разного цвета, двух прямоугольных треугольников с катетами, параллельными краям экрана, н двух отрезков толстой линии. Менять размеры треугольников по вертикали и по горизонтали. Для отрезков ввести возможность их врашения по или против часовой стрелки.
4.Набор из 60 пикселов одного цвета, двух прямоугольников со сторонами, параллельными краям экрана, и двух отрезков прямой. Менять размеры прямоугольника по вертикали и по горизонтали, а для отрезков задать вращение по или против часовой стрелки.
4. Контрольные вопросы.
1.Что такое ООП? Какова основа методологии ООП?
2.Что такое класс?
3.Что такое объект?
4.Что такое абстракция?
5.Как используется указатель на объект в языке С++?