Объектно-ориентированное программирование в Delphi

Изначально в классе может и не быть процедуры для какого-то события, а если и есть, то она действует как обработчик по умолчанию. В среде Delphi в качестве обработчиков вы будете назначать собственные процедуры только в строго опре­деленном формате (в зависимости от события). Формат процедуры заранее опреде­лен и в разных случаях класс должен будет передавать вам различные параметры. Ваши процедуры должны будут соответствовать предопределенному формату, чтобы не было разногласий с классом, к которому они будут относиться. Если формат (например, количество параметров или их тип) не будет соответствовать заранее определенному, то класс не сможет вызвать процедуру.

 

Рассмотрим пример. Пусть пользователь нажал на кнопку. В этом случае она, как класс, генерирует соответствующее событие.. В результате этого может быть вызвана процедура-обработчик, которую вы назначили кнопке при возникновении данного события. В этом случае не требуется никакая дополнительная информация, поэтому класс не будет пересылать вам никаких параметров, кроме указателя на самого себя. Однако если нужно обработать событие, связанное с перемещением курсора мыши, дело будет обстоять несколько иначе. В этом случае класс будет генерировать событие и автоматически передавать вам новые координаты X и Y курсора, поэтому процедура должна быть объявлена с соответствующими па­раметрами, чтобы можно было принять их от класса.

 

События — одна из самых сложных частей классов, но на практике работа с ними намного проще, и вы сейчас должны понимать только это. В дальнейшем мы рассмотрим всю технологию работы более подробно и от простых примеров продвинемся к более сложным.

 

Раздел называется объектное программирование, но мы все время гбворим о классах, почему? Давайте теперь посмотрим, что такое объект.

 

Объект — это экземпляр класса. С помощью класса вы описываете сущность, с которой нужно работать. Например, это может быть описание свойств, методов или событий классов. Объект — это экземпляр. Чтобы поместить на форму кнопку, вы должны объявить класс, создать свойства, методы и события, а когда вы поме­щаете кнопку на форму, то создается экземпляр, т. е. объект. Если вы поместите вторую кнопку, будет создан еще один экземпляр, т. е. еще один объект. Вот такая тонкая разница между двумя понятиями.

Теперь рассмотрим работу свойств, методов и событий как единого целого. И снова для примера возьмем класс — кнопку. Такой класс должен обладать сле­дующим минимальным набором:

  • свойства:
    • левая позиция (X);
    • верхняя позиция (Y);
    • ширина;
    • высота;
    • заголовок;
  •  методы:
    • создать кнопку;
    • уничтожить кнопку;
    • нарисовать кнопку;
  •  события:
    • кнопка нажата;
    • заголовок кнопки изменен.

Объект работает как единое целое. Например, вы изменили заголовок кнопки. Объект генерирует событие "заголовок кнопки изменен". По этому событию вызы­вается метод "нарисовать кнопку". Этот метод рисует кнопку в позиции, указанной в свойствах объекта, и выводит на кнопке новый текст, указанный в свойстве "заголовок".

У каждого класса обязательно присутствуют два метода: "создать объект" и "уничтожить объект". Во время создания объекта происходит выделение памя­ти для хранения необходимых свойств и заполняются значения по умолчанию. Во время уничтожения объекта происходит освобождение выделенной памяти.

 

ПРИМЕЧАНИЕ. Метод для создания объекта называется конструктором (constructor). Метод для уничтожения объекта называется деструктором (destructor). Сам процесс создания объекта называется инициализацией.

Теперь рассмотрим использование нашей кнопки.

  1. Создание кнопки с помощью вызова метода "Создать кнопку".
  2. Изменение необходимых свойств. Все. Наша кнопка готова к работе.

Объект— это сложный тип. Это значит, что вы можете объявлять переменные типа "объект" (точно так же как объявлялись переменные типа "число" или "стро­ка") и обращаться к объекту через эту переменную.

На языке программирования это будет выглядеть немного сложнее:

  1. Объявить переменную типа "кнопка".
  2. В эту переменную проинициализировать объект.
  3. Изменить нужные свойства.
  4. Можно использовать объект.

Вот тут нужно собрать все, что вы поняли об объектах и классах, в одно целое. Итак, мы можем объявлять переменные типа "класс". Давайте объявим перемен­ную объект 1 типа Кнопка. Теперь можно создать кнопку, для чего есть конструктор (метод для создания объекта), который выделяет свободную память под этот объ­ект. Процесс инициализации объекта-кнопки выглядит так: переменной 0бъект1 нужно присвоить результат работы конструктора класса Кнопка. Конструктор вы­делит необходимую объекту память и присвоит свойствам значения по умолчанию. Результат этого действия будет присвоен переменной объект 1. Эта переменная бу­дет указывать на область памяти, в которой находится созданная кнопка и ее свой­ства. После всех этих действий мы можем получить доступ к созданному объекту через переменную Объект1.

 

Давайте напишем прототип небольшой программы (листинг 4.8), которая пояс­нит весь процесс создания объекта.

 

Начало программы.

Переменные: Объект1 - Кнопка;

Начало кода

Объект1:= Кнопка. Создать__объект Объект1.Заголовок:='Привет' Объект1.Уничтожить_объект. Конец кода

Доступ к свойствам и методам объектов осуществляется при помощи записи имяПеременной_типаОбъект.Свойство, или метод определяется записью вида — имяПеременной_типаОбъект. метод (записывается как имя_объекта — точка — свойство или метод). Именно таким образом мы изменили в вышеуказанном при­мере свойство заголовка (объект1.заголовок), присвоив ему значение 'Привет1. Точно так же был организован доступ к конструктору (метод "создать_объект") И деструктору (метод "Уничтожить_объект").

Создание объекта— обязательно. Однако если вы попробуете использовать следующий код (листинг 4.9), то у вас произойдет ошибка.

 

Начало программы.

Переменные: Объект1 — Кнопка;

Начало кода

0бъект1.Заголовок: =  Привет1

Конец кода

Здесь мы пытаемся изменить заголовок без создания и уничтожения объекта, а это ошибка! Переменная Объект1 ничего не хранит и ни на что не указывает. Ее необходимо сначала проинициализировать и создать для нее объект-кнопку или присвоить адрес расположения в памяти уже существующей кнопки.

 

Без инициализации можно использовать только простые переменные, такие как число или строка. Тут Delphi выделяет под них память автоматически, потому что размер этих переменных фиксирован, и Delphi уже на этапе компиляции знает, сколько памяти нужно отвести под переменную.

 

Сложные переменные типа объектов обязательно должны инициализироваться. Это связано еще и с размещением данных. Простые переменные хранятся в стеке (сегмент стека) или в сегменте данных, а сложные переменные типа объектов хра­нятся в памяти компьютера. Как ранее уже указывалось, при старте программы, сегмент стека инициализируется автоматически. Поэтому переменные могут спо­койно размещаться в уже подготовленной памяти сегмента стека. Когда вы создае­те объект, он создается в нераспределенной памяти компьютера. Так как память еще нераспределена, ее нужно сначала подготовить (выделить нужный объем под создаваемый объект). После того как объект не нужен, эту память необходимо ос­вободить, вызвав деструктор объекта.

 

Простые переменные освобождать не надо, потому что стек и сегмент данных очищаются автоматически. Эти сегменты ОС может контролировать и очищать без нашего вмешательства.

 

Мы еще не раз встретимся со стеком и необходимостью инициализации, когда будем говорить про типы переменных и просто на практических примерах.

Класс — очень удобная вещь. Он работает как шаблон, на основе которого соз­даются переменные типа объектов. Например листинг 4.10.

Начало программы.

Переменные: Объект1 — Кнопка; Объект2 — Кнопка;
Начало кода
Объект1:= Кнопка.Создать объект Объект2:= Кнопка.Создать объект
Объект1.Заголовок:='Привет' Объект2.Заголовок:='Пока'
Объект1.Уничтожить объект. Объект2.Уничтожить объект. Конец кода

В данном примере можно сказать, что наши переменные 0бъект1 и 0бъект2 указывают на собственные экземпляры объекта кнопка, т. е. в памяти остаются две независимые копии класса (кнопки). Любую из них можно менять, и она не бу­дет влиять на другую переменную.

Теперь более подробно о самом примере. В нем объявляется две переменных типа "кнопка". Потом производится их инициализация и изменение заголовка на нужный. В результате мы получили из одного объекта две кнопки с разными заго­ловками. Обе кнопки работают автономно и не мешают друг другу, потому что им выделена разная память. Таким образом, создаются новые объекты на основе шаб­лона и потом раздельно используются, изменяя разные свойства шаблона и исполь­зуя его методы.

Для уничтожения объекта всегда есть метод Free. Если объект вам больше не нужен, и вы хотите его уничтожить, просто вызовите этот метод:

Объект1.Free.

Я, конечно же, забегаю вперед, объясняя метод Free. Но все же вам не помеша­ло бы уже познакомиться с ним. Пора приводить реальные строчки кода и потихо­нечку вникать в смысл программирования.

ВНИМАНИЕ. Мы пока еще не затрагиваем программирование, но необходимо заме­тить, что в Delphi при именовании классов в начало имени добавляется буква NTH. Благодаря этому вы всегда можете уже по имени определить, что перед вами не про­сто переменная, а целый класс. Исключение составляет только именование классов исключительных ситуаций, но это отдельный разговор.

 

 

dle

Помоги проекту! Расскажи друзьям об этом сайте: