Автор работы: Пользователь скрыл имя, 23 Февраля 2011 в 07:41, лабораторная работа
. Цель работы
Ознакомление со средой визуального программирования Delphi и разра-
ботка в ней простейших приложений.
3.4. Модули и программы
Приложение Delphi создается из файлов исходного текста двух
разных видов. Это один или несколько модулей и один файл программы.
Модули можно считать
ется основная часть приложения – программа. На практике файл программы
обычно является автоматически сгенерированным файлом с ограниченной
ролью. Он нужен только для запуска программы, которая выполняет основ-
ную форму. Код файла программы, или файла проекта Delphi (DPR), можно
отредактировать вручную или с помощью Project Manager и некоторых оп-
ций проекта.
3.5. Информация о типе на этапе выполнения
Правило языка Object Pascal о совместимости типов для классов-
потомков позволяет вам использовать класс-потомок там, где ожидается
класс - предок, обратное невозможно. Теперь предположим, что класс Dog
содержит функцию Eat, которая отсутствует в классе Animal.
Если переменная MyAnimal ссылается на объект типа Dog, вызов
этой функции должен быть разрешен. Но если вы попытаетесь вызвать эту
функцию, а переменная ссылается на объект другого класса, возникнет
ошибка. Поскольку компилятор не способен определить, будет ли значение
правильным на этапе выполнения, то, делая явное приведение типов, мы
рискуем вызвать опасную ошибку этапа выполнения программы.
Для решения данной проблемы
можно воспользоваться
ми подходами, основанными на системе RTTI. Каждый объект знает свой
тип и своего предка и может получить эту информацию с помощью опера-
ции is. Параметрами операции is являются объект и тип:
if MyAnimal is Dog then …
Выражение is становится истинным, только если в настоящее вре-
мя объект MyAnimal имеет тип Dog или тип потомка от Dog. Другими сло-
вами, это выражение приобретает значение True, если вы можете без риска
присвоить объект (MyAnimal) переменной заданного типа данных (Dog).
Такое прямое
приведение можно выполнить так:
if MyAnimal is Dog then
MyDog := Dog (MyAnimal) ;
То же действие можно выполнить напрямую с помощью другой опера-
ции RTTI –
as. Мы можем написать так:
MyDog := MyAnimal as Dog ;
Text := MyDog. Eat ;
41
Если мы хотим вызвать функцию Eat, можно использовать и дру-
гую форму
записи:
(MyAnimal as Dog) . Eat ;
Результатом выражения будет объект с типом данных класса Dog,
поэтому вы можете применить к нему любой метод этого класса.
Приведение с операцией as отличается от традиционного приведе-
ния
тем, что в случае
пытаетесь его привести, порождается исключение EInvalidCast.
Чтобы избежать этого
случае
успеха делайте простое
if MyAnimal is Dog then
(Dog (MyAnimal) ) . Eat ;
4. Порядок
выполнения работы
1. В среде программирования Delphi cоздайте новый проект, выбрав пункт
меню File/New Application.
2.
Сохраните этот проект в папке
"С:\Ваша_группа\Ваша_фамилия
(Unit1.pas под новым именем Main4.pas, а Project1.dpr под новым именем
Lab4.dpr).
3. Открыть модуль, не связанный с формой (File/New и отметьте на страни-
це New появившегося окна Object Repository элемент Unit), и поместить в
него три класса:
♦ Класс Animal, который содержит в разделе public объявление конструк-
тора Create и объявление метода-функции: Voice – звук, издаваемый жи-
вотным. Тип результата возвращаемого функцией, – string. Метод Voice
объявить виртуальным и
public
constructor Create;
function GetKind: string;
function Voice: string; virtual; abstract;
В разделе private класса определить переменную Kind: string.
♦ Класс Dog объявить потомком класса Animal:
TDog = class (TAnimal)
В разделе public этого класса объявить конструктор и методы Voice
и Eat. Метод Eat типа string объявить
виртуальным (пища животного).
public
constructor Create;
function Voice: string; override;
function Eat: string; virtual;
♦ Класс Cat объявить потомком класса Animal.
TCat = class (TAnimal)
Раздел public класса содержит те
же определения, что и
вующий раздел класса Dog.
public
constructor Create;
function Voice: string; override;
function Eat: string; virtual;
В реализациях конструктора каждого класса переменной Kind
присваивается
имя соответствующего
Animal:
Kind := ‘An Animal’.
В реализациях методов Voice возвращается звук, издаваемый жи-
вотным, например:
Voice := ‘Mieow’.
В реализациях методов Eat возвращается название пищи, которой
питается соответствующее животное:
Eat:= 'A bone, please!';
4. Задать имя модуля и имя проекта, в который этот модуль будет включен.
7. Добавить в проект форму, которой присвоить имя Animals, также задать
имя модулю, связанному с формой.
8. В форме расположить три кнопки опций (компонент RadioButton) с на-
званиями Animal, Dog, Cat ; кнопкой команды (компонент Button) с на-
званием Kind и две крупные надписи (компонент Label)(рис. 4.1). Нажа-
тию одной из кнопок опций будет соответствовать выбор животного.
При нажатии кнопки команды
надписи должны отобразить
ваемый животным, и его пищу.
Рис. 4.1. Форма проекта
9. Определите
в классе формы private-
private
MyAnimal: TAnimal;
Запишите код для обработчика события OnCreate формы, где созда-
ется объект типа Dog, на который ссылается переменная MyAnimal.
begin
MyAnimal := TDog.Create;
end;
10. В обработчиках события OnClick каждой кнопки опций записать код,
который удаляет текущий
begin
MyAnimal.Free;
MyAnimal := TAnimal.Create;
end;
11. В обработчике события OnClick кнопки команды записать код, который
будет помещать в надписи звук, издаваемый животным.
begin
LabelVoice.Caption := MyAnimal.Voice;
end;
44
Рис. 4.2.Звук для Cat
Рис. 4.3. Сообщение об ошибке
12. Если
вы все сделали правильно, при
запуске приложения надписи
отображать пищу и звук для Dog и Cat (рис. 4.2) и приложение завершит
работу по ошибке при выборе Animal (рис. 4.3).
13. Уберите ключевое слово abstract в объявлении метода Voice. Запустите
приложение снова. Посмотрите, что
изменилось в работе
Объясните различия.
14. Попробуйте использовать метод Eat без приведения типов (без is).
15. Доработайте
проект согласно варианту
5. Варианты индивидуальных заданий
Вариант 1
Разработайте два класса
особенности
двух пород собак.
зволяющие
получить некоторые
сти, длина ушей и т.д.). Дополните форму компонентами, позволяющими
увидеть
все характеристики
Примерная форма проекта
После запуска программы
значениями: Animal, Dog, Cat. Выбор осуществляется при помощи кнопки
SELECT. Далее предоставляется дополнительная возможность для выбора
породы собаки.
При выделении знаком:
интересующей породы можно
Вариант 2
Разработайте два класса
особенности двух новых животных Wolf (волк) и Jascal (шакал). Разрабо-
тайте методы для этих классов, позволяющие получить некоторые характе-
ристики этих видов животных (рост по холке, длина клыков, вес и т.д.). До-
полните форму компонентами, позволяющими увидеть все характеристики