ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.04.2019

Просмотров: 5782

Скачиваний: 8

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Отметим, что визуальными называются компоненты, которые видны на форме как во время создания приложения, так и во время работы приложения. Невизуальные компоненты - видны только во время разработки приложения.

Визуальные компоненты делятся на оконные и неоконные элементы управления.

«Оконные» компоненты (windowed controls) являются специализированными окнами внутри окна формы. Их самое главное качество — способность получать фокус ввода. К числу оконных компонентов относятся, например, компоненты Button, RadioButton, CheckBox, GroupBox, и т.д. Класс TWinControl обеспечивает использование в Delphi оконных элементов управления. Главное отличие оконного элемента управления от любых других — наличие дескриптора окна hwnd. Дескриптор окна — это специальный идентификатор, который операционная система присваивает всем объектам, которые должны обладать свойствами окна. Если элемент управления имеет дескриптор окна, то он должен уметь выполнять следующие операции:

  • получать и передавать фокус управления во время выполнения приложения;

  • воспринимать управляющие воздействия от мыши и клавиатуры;

  • уметь размещать на себе другие элементы управления.

Класс TCustomControl является общим предком для целой группы классов, обеспечивающих создание различных нестандартных типов оконных (получающих фокус) элементов управления Windows: редакторов, списков и т. д.

Для обеспечения создания обычных (не оконных) элементов управления непосредственно от класса TControl порожден класс TGraphicControl. Его потомки не могут получать фокус, но используют для визуализации канву (специальный объект, предназначенный для отображения графики).

1.14 Основные поля, методы и свойства, используемые в визуальных, не визуальных и оконных компонентах.

Невизуальные компоненты практически не имеют общих свойств и событий, единственные общие для них свойства — это Name (комментариев не требует) иTag (целочисленное значение, не несущее смысловой нагрузки — вы можете использовать его по своему усмотрению). А вот визуальные компоненты имеют много общих свойств и событий.

Визуальные компоненты имеют ряд общих свойств:

Left иTop — местоположение визуального компонента внутри формы (или внутрикомпонента-владельца).

BiDiMode — позволяет сделать так, чтобы текст читался справа налево (используется при работе с восточными языками).

Caption — надпись компонента.

Color — цвет компонента. Компонент либо использует свой собственный цвет, либо копирует цвет содержащего компонента. Это определяется значением свойстваParentColor. Если свойство ParentColor имеет значение True, то цвет вложенного компонента (например, кнопки) при изменении станет такой же, как цвет у содержательного компонента (например, формы). Однако, если вы измените значение свойства Color, то свойство ParentColor автоматически примет значение False, и компонент получит свой собственный цвет.


Cursor — определяет, какой вид принимает указатель мыши, когда пользователь наводит его на компонент.

Font — шрифт надписи на компоненте.

Enabled — определяет, доступен ли компонент для пользователя. Если свойство имеет значение True, то компонент доступен, а если значение False, то недоступен.

Hint — подсказка, появляющаяся над компонентом, когда пользователь временно задерживает над ним указатель мыши.

Visible — определяет видимость компонента на экране. Если свойство имеет значение True, то компонент виден, а если значение False, то — не виден.

Общие события визуальных компонентов

Визуальные компоненты имеют ряд общих событий:

OnClick — происходит в результате щелчка мыши по компоненту.

OnDblClick — происходит в результате двойного щелчка мыши по компоненту.

OnKeyDown — происходит при нажатии пользователем любой клавиши (если компонент обладает фокусом ввода). При отпускании нажатой клавиши происходит событиеOnKeyUp.

OnMouseDown — происходит при нажатии пользователем кнопки мыши, когда указатель мыши наведен на компонент. После отпускания кнопки мыши в компоненте происходит событиеOnMouseUp.

OnEnter — происходит при получении компонентом фокуса ввода. Когда компонент теряет фокус ввода, происходит событиеOnExit. События OnEnter и OnExit не происходят при переключении между формами и приложениями.

1.15 Понятие замещения

Замещение (также "перекрытие" или "переопределение" методов) - общее название механизма, предоставляемого ООП для поддержки применения этого принципа при проектировании иерархий классов. 

Замещение реализуется в инкапсуляции. Полиморфизм заключается в том, что одно и то же имя может соответствовать различным действиям в зависимости от типа объектаКратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций».

Слово «полиморфизм» можно перевести как «много форм». В ОО программировании этим термином обозначают возможность использования одного и того же имени операции или метода к объектам разных классов, при этом действия, совершаемые с объектами, могут существенно различаться. Поэтому можно сказать, что у одного и того же слова много форм. Например, два разных класса могут содержать метод draw, однако инструкции в методах могут предусматривать совершенно разные операции: так в классе circle – это «код, рисующий именно круг», а в square – «код, рисующий именно квадрат». В зависимости от того, к объекту какого класса применяется метод draw, выполняются те или иные инструкции.

class Фигура:

virtual void draw();

class Круг : public Фигура:

virtual void draw() {

// код рисующий круг

}

class Квадрат : public Фигура:

virtual void draw() {

// код рисующий квадрат

}



У Вас есть множество фигур, но каждая выглядит по своему. Тем не менее каждую можно нарисовать. Получается, что изучая множество объектов, вы выделяете общие для всех свойства и действия и формируете "Абстракцию", в данном примере "Фигура". Когда Вы обобщили и сформулировали абстракцию в коде, настает время описать детали о Круге и Квадрате. Когда Вы пишите draw() для квадрата , то Вы замещаете код написанный в "Фигуре". Таким образом Вы переходите от общего к частному.


В классе фигура метод draw() объявлен как виртуальная функция.

При описании в дочернем классе модификатор virtual необязателен. Как только метод объявляется виртуальным в родительском классе, он остается виртуальным и во всех подклассах. Однако для повышения читабельности этот модификатор обычно повторяется во всех дочерних классах.

Если модификатор virtual не задан, в экземпляре класса circle метод по-прежнему будет замещать одноименный метод родительского класса. Однако процесс связывания метода и сообщения будет происходить статически, в период компиляции (исходя из объявленного статического типа получателя), а не во время вычислений, исходя из динамического типа получателя. Если ключевое слово virtual удалить из описания родительского метода draw(), то переменные, объявленные с типом circle, будут выполнять метод из класса circle, а переменные, объявленные с типом фигура, будут выполнять метод из этого класса независимо от действительного значения переменной.

1.16 Замещение, как основной способ создания собственных элементов объектов.

В рамках ООП поведенческие свойства объекта определяются набором входящих в него методов. Изменяя алгоритм того или иного метода в потомках объекта, программист может придавать этим потомкам отсутствующие у родителя специфические свойства. Для изменения метода необходимо перекрыть его в потомке, т.е. объявить в потомке одноименный метод и реализовать в нем нужные действия. В результате чего в объекте-родителе и объекте-потомке будут действовать два одноименных метода, имеющих разную алгоритмическую основу и, следовательно, придающие объектам разные свойства. Это и называется полиморфизмом объектов… (и возьми всё из предыдущего).

С помощью полиморфизма объект способен обладать новыми элементами (способом реализации), несмотря на то, что в другом классе реализация у него совсем другая. Возьми из предыдущего пример там и остальное.

1.17. Статическое замещение

Полиморфизм позволяет коду быть более гибким. Переопределение, наследование виртуальных методов, перегрузка методов... Так вот когда эти инструменты используются во время компиляции (когда мы уже переводим наш код высокого уровня в машинный код) - это статический полиморфизм, а когда в рантайме (в процессе выполнения программы) - виртуальным.

полиморфизм, обеспечивающий возможность задания различных

реализаций некоторого единого по названию метода для классов различных

уровней иерархии. В ООП такой полиморфизм называется простым, а методы,

имеющие одинаковое название - статическими полиморфными.

Простой полиморфизм (класс Окио_с_текстом). Пусть

необходимо разработать на базе класса Окно класс Окностекстом. Для этого

к полям класса Окно необходимо добавить специальные поля для определения

координат первой буквы текста - Xt, Yt и поле, содержащее сам текст - Text.


Кроме этого, понадобится специальный метод, который будет обрабатывать

сообщение «Нарисовать». Однако у нас уже существует родительский метод

Изобразить (!), который обрабатывает это сообщение. Следовательно,

необходимо заменить родительский метод методом потомка. Механизм

полиморфизма позволяет для класса-потомка Окно_с_текстом предусмотреть

собственный метод Изобразить (рис. 1.21).

Метод Инициализировать также должен бьггь переопределен, так как

он должен инициализировать дополнительные поля класса.

Класс Окно_с_текстом - родитель: класс Окно:

поля Xt, Yt, Text

метод Инициализировать (aXl,aYl,aX2,aY2,aColor,aXt, aYt, aText)

метод Изобразить

Конец описания.

При статическом полиморфизме статические методы включаются в код программы при компиляции. Это означает, что до использования программы определено, какая процедура будет вызвана в данной точке. Компилятор определяет, какого типа объект используется при данном вызове, и подставляет метод этого объекта.

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

Это удобно, так как одинаковые по смыслу методы разных типов объектов можно и назвать одинаково, а это упрощает понимание и задачи и программы. Статическое перекрытие – первый шаг полиморфизма. Одинаковые имена – вопрос удобства программирования, а не принцип.

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

Этот принципиально новый механизм, называемый поздним связыванием, обеспечивает полиморфизм, т.е. разный способ поведения для разных, но однородных (в смысле наследования) объектов.

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

Этот принципиально новый механизм, называемый поздним связыванием, обеспечивает полиморфизм, т.е. разный способ поведения для разных, но однородных (в смысле наследования) объектов.

1.18 Особенности работы со статически замещенными методами.

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

Статические методы

включаются в код программы при компиляции. Это означает, что до использования программы определено, какая процедура будет вызвана в данной точке. Компилятор определяет, какого типа объект используется при данном вызове, и подставляет метод этого объекта.

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


Это удобно, так как одинаковые по смыслу методы разных типов объектов можно и назвать одинаково, а это упрощает понимание и задачи и программы. Статическое перекрытие – первый шаг полиморфизма. Одинаковые имена – вопрос удобства программирования, а не принцип.

С++

class Фигура:

virtual void draw();

class Круг : public Фигура:

virtual void draw() {

// код рисующий круг

}

class Квадрат : public Фигура:

virtual void draw() {

// код рисующий квадрат

}

У Вас есть множество фигур, но каждая выглядит по своему. Тем не менее каждую можно нарисовать. Получается, что изучая множество объектов, вы выделяете общие для всех свойства и действия и формируете "Абстракцию", в данном примере "Фигура". Когда Вы обобщили и сформулировали абстракцию в коде, настает время описать детали о Круге и Квадрате. Когда Вы пишите draw() для квадрата , то Вы замещаете код написанный в "Фигуре". Таким образом Вы переходите от общего к частному.

В классе фигура метод draw() объявлен как виртуальная функция.

При описании в дочернем классе модификатор virtual необязателен. Как только метод объявляется виртуальным в родительском классе, он остается виртуальным и во всех подклассах. Однако для повышения читабельности этот модификатор обычно повторяется во всех дочерних классах.

Если модификатор virtual не задан, в экземпляре класса circle метод по-прежнему будет замещать одноименный метод родительского класса. Однако процесс связывания метода и сообщения будет происходить статически, в период компиляции (исходя из объявленного статического типа получателя), а не во время вычислений, исходя из динамического типа получателя. Если ключевое слово virtual удалить из описания родительского метода draw(), то переменные, объявленные с типом circle, будут выполнять метод из класса circle, а переменные, объявленные с типом фигура, будут выполнять метод из этого класса независимо от действительного значения переменной.

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

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

статическими — их адреса определяются на этапе компиляции и в программе не изменяются (т.е. вызовом данного имени всегда будет исполняться один и тот же программный код). Статические методы вызываются быстрее всего.

Обращение к полям, методам и свойствам классов в программе и через инспектор объектов.

1.19 Обращение к полям, методам и свойствам классов в программе и через инспектор объектов.

Инспектор объектов Используемыми в приложении компонентами можно управлять с помощью свойств, методов и событий.