- •22)Windows- приложение
- •23.Проект приложения в Delphi.
- •24.Приложение в Delphi.
- •25.Структура программы проекта.
- •26.Структура модуля.
- •27. Модули в Delphi.
- •29.Класс как тип данных.
- •31. Базовый класс всех объектов – Tobject.
- •32. Объектные переменные.
- •37.Наследование.
- •38.Статические методы.
- •39.Виртуальные методы.
- •40.Другие виды методов.
- •41.Конструктор и деструктор, указатели на объекты.
- •42. Полиморфные объекты.
- •44.Делегирование обработчиков.
- •46. Исключительные ситуации.
- •49.Граф.Определения.
- •50. Визуализация графа.
- •51.Алгоритмы в графах.
- •52.Построение минимального остовного дерева в графе.
41.Конструктор и деструктор, указатели на объекты.
• Конструктор – это процедура, в которой
ключевое слово PROCEDURE заменено на CONSTRUCTOR. К конструктору необходимо
обращаться перед началом работы с
виртуальными методами объекта.
• Допускается наличие у объекта нескольких
конструкторов.
• Конструкторы наследуются точно так же, как и другие методы.
• Главная задача конструктора – организация
связи конкретного экземпляра объекта с
соответствующей ему таблицей виртуальных методов.
Деструктор. Это вид Procedure, служащий для
освобождения памяти, т.е. разрушения
объектов.
Указатели на объекты.
Объявим класс TMyObject и переменную – указатель на объект класса TMyObject.
Type
TMyObject = object
…
end;
Var Pobject : ^TMyObject;
Для того, чтобы создать динамический объект обращаемся к процедуре New(Pobject). Если объект содержит виртуальные методы, то необходимо провести инициализацию
объекта путем вызова конструктора:
New(Pobject);
Pobject^.create(<список аргументов>);
Другой вариант создания и инициализации объекта путем использования процедуры
New c двумя параметрами:
New(<тип – указатель на класса>, <конструктор>( <список параметров> ) );
New( Pobject, TMyObject.create( <список параметров> ) );
Деструктор. • В случае динамических переменных, память,
связанная с динамическими объектами, может
освобождаться. Для освобождения памяти
используется процедура Dispose: Dispose(<указатель>);
• Автоматическое обращение к таблице
виртуальных методов с целью определения
объема освобождаемой памяти
осуществляется с помощью виртуального
метода, называемого деструктором.
Заголовок деструктора записывается следующим
образом:
Destructor <имя> (<список параметров>);
Для освобождения памяти достаточно
использовать имя деструктора в качестве аргумента.
процедуры Dispose:
Dispose(<указатель>, <имя деструктора>);
Помимо освобождения памяти,
непосредственно связанной с объектом, в
деструкторе могут быть предусмотрены любые
действия, завершающие процесс работы с данным экземпляром объекта. Указатели на объекты. Вызов деструктора.
Объявим класс TMyObject и переменную – указатель на объект класса TMyObject.
Type
TMyObject = object
…
end;
Var Pobject : ^TMyObject;
Begin
New( Pobject, TMyObject.create( <список параметров> ) );
…
Dispose( Pobject, Destroy );
End;
42. Полиморфные объекты.
Для одного и того же типа объекта может существовать
несколько деструкторов. Деструкторы одних объектов могут
наследоваться другими объектами.
Деструкторы бывают статическими и виртуальными.
Рекомендуется делать деструкторы виртуальными для того,
чтобы в процессе работы программы для каждого
экземпляра объекта автоматически вызывался правильный
деструктор. Чтобы показать, в каких случаях применение
деструкторов просто необходимо, введем понятие
полиморфного объекта. Объект, значениями которого могут
быть экземпляры объектов разных типов, называется
полиморфным.
Когда возникают полиморфные объекты?
Предположим, имеется переменная указатель,
относящаяся к объекту-предку. Значением этой
переменной может являться указатель, ссылающийся на
любого из потомков объекта предка. Тогда определить, с объектом какого типа мы работаем, можно только
динамически, анализируя значение указателя. Эту задачу в случае освобождения памяти, распределенной
для конкретного экземпляра объекта, и выполняет деструктор.
Рассмотрим пример программы, демонстрирующей
необходимость использования деструктора.
43.События. В приложениях и компонентах событие
возникает как результат послания операционной
системе сообщения, что произошло некоторое
действие, которое контролирует метод послания
уведомления о событии. Этот метод проверяет,
назначил ли пользователь соответствующий
обработчик событий. Если событие произошло и обработчик назначен, то метод послания
уведомляет о событии вызывает соответствующий
обработчик. Методы послания уведомления о
событии можно переопределить, используя
стандартные методы, или создать свои
собственные.
Рассмотрим вариант переопределения методов послания
уведомления о событии.
Такие методы реализуются в разделе Protected.
TtimeButton= class(Tbutton)
Protected
Procedure click; override;
End;
…
Procedure TtimeButton.Click;
Begin
Inherited Click;
Caption := DataTimeToStr(Now);
End;
Методы послания уведомления о событии
являются указателями на метод, которые
вызываются в случае, когда компонент
получает сообщение от Windows о том, что
произошло некоторое событие,
воздействующее на данный компонент.
Обработчики событий представляют собой свойства, которые выполняют чтение и запись в указатели на метод. Например, рассмотрим
фрагмент, взятый из класса TControl,
содержащегося в исходном коде VCL.
Класс TNotifyEvent. Имена обработчиков событий по соглашению содержат префикс
On. Вначале объявляется событие: TNotifyEvent = procedure(Sender:
Tobject) of Tobject;. Далее объявляется класс, содержащий поля данного
типа, и обработчики событий, работающие с этими полями.
Type
TNotifyEvent = procedure(Sender: Tobject) of Tobject;
…
TControl=class(TComponent)
FOnClick : TNotifyEvent;
…
Property OnClick: TNotifyEvent read FOnClick write FOnClick;
…
End;