Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЯВУ.docx
Скачиваний:
2
Добавлен:
23.04.2019
Размер:
210.36 Кб
Скачать

25. Абстрактные методы.

Иногда попытка создать иерархию классов путем выделения общих признаков к тому, что образуется класс, методы которого реализовывать бессмысленно. Например, если создать класс TAnimal, который должен объединять общие свойства всех животных, то в нем необходимо описать метод Voice (голос), поскольку большинство животных могут издавать звуки. Для каждого отдельного животного (объектов дочерних классов TAnimal) этот звук известен и можно, перекрыв метод Voice определить его реализацию. Однакометода Voice для объекта класса TAnimal бессмыслен, а следовательно его реализация тоже. Тем не менее, формально, компилятор требует, чтобы любой метод описанный в классе, был бы реализован. Чтобы исключить создание подобного ненужного кода и были предусмотрены абстрактные методы.

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

Обратите внимание, что программисту не надо описывать реализацию абстрактного метода TAnimal.Voice.

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

26. Информация о типах времени выполнения.Механизм RTTI заключен в двух операциях для работы с объектами: is, as. Операция as фактически осуществляет приведение типа объекта к другому классу, например: MyAnimal as Dog. данная конструкция возвращает указатель типа TDog на ту область оперативной памяти, где расположен экземпляр объекта MyAnimal. Таким образом, для объекта MyAnimal становится возможным вызов метода класса TDog:

(MyAnimal as TDog).Eat

Однако если перед этим не было выполнено присваивание объекту MyAnimal объекта типа то при таком вызове произойдет ошибка времени выполнения. Чтобы избежать этой исключительной ситуации, можно использовать операцию is, которая возвращает true, если фактический тип объекта соответствует указанному в операции типу класса, иначе false.

If MyAnimal is TDog then

(MyAnimal as TDog).Eat;

Две операции RTTI, is, as, являются чрезвычайно мощными, и их можно рассматривать как стандартные конструкции программирования. Однако использование RTTI вместо полиморфизма приводит к более медленным программам, поскольку для проверки корректности преобразования типов приходится осуществлять обход по всей иерархии классов. Поэтому следует ограничивать их применение некоторыми специальными случаями, когда полиморфизмом не обойтись.

27. Перегрузка методов (overload). Вызов переопределенного метода (inherited).Перегрузка методов никак не связана с понятием полиморфизм. Она в определенной степени соответствует понятию перегрузка процедур и функций. При перегрузке определяются несколько методов с одним и тем же именем, но разным числом или типом параметров (сигнатурой). Перегрузка нужна, чтобы произвести одинаковые или похожие действия с разнотипными данными. При вызове метода будет вызываться тот метод, список параметров которого соответствует фактическим аргументам. Перегружен может быть любой метод статический, виртуальный и динамический. Перегружаемый метод описывается с помощью ключевого слова overload. для виртуальных методов в этом случае нужно дополнительно использовать ключевое слово reintroduce.

Перегрузка методов может осуществляться как внутри одного класса, так и, в отличие от перегрузки функций, на разных уровнях иерархии.

Например, перегружаемые методы внутри одного класса:

TMyObject=class(TObject)

Function Test (I: integer): string; overload;

Function Test (S: integer): string; overload;

End;

Очевидно, что отличие двух методов состоит в типе передаваемого в метод параметра. Теперь если будет создан объект класса TMyObject, то при вызове метода Test будет вызван тот метод, к которому подойдет тип фактического параметра.

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

1. При перегрузке виртуального метода следует использовать ключевое слово reintroduce. Иначе компилятор предупреждает о том, что перекрывается динамический метод.

2. Нельзя перегружать метод в разделе published объявления объекта. Но можно перекрывать метод в разделе published, если это происходит на разных уровнях иерархии.

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

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

Например: inherited Create (…);

вызывает метод Create родителя.

Если записать слово inherited и после него не писать имя вызываемого метода, то будет вызываться наследуемый метод, совпадающий по имени с именем того метода, из которого он вызывается. Например, если написать inherited в конструкторе, то вызовется конструктор родительского класса.

28. Методы и данные класса. Ссылки на классы.Методы и данные класса.Определенное в классе поле существует как локальная переменная в каждом объекте класса. Однако иногда необходимо иметь поле, которое будет доступно для чтения/записи всех объектов данного класса, и только для них — своего рода глобальную переменную класса. Такие поля (общие для всех объектов класса) называют данными класса.

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

Если нужно обратиться к данным класса извне модуля, то можно использовать открытые методы объектов класса. В этом случае обязательно должен быть определен хотя бы один объект класса, что не всегда возможно. Альтернативным решением является использование метода класса. Метод класса — это метод, который не имеет доступа к данным конкретного объекта, но может быть применен к классу в целом. Для описания метода класса в ОР перед описанием метода добавляется ключевое слово class.

Type

MyClass=class

Class function ClassValue: integer;

End;

Методы класса не очень часто используются в OP, т.к. такого эффекта можно добиться, просто добавив процедуру или ф-ию в модуль, где описан класс. Но с точки зрения ООП предпочтительнее вместо не связанных с классом глобальных подпрограмм использовать методы класса. В VCL методы класса используются часто, хотя присутствует также много глобальных процедур. Основное отличие методов класса от простых подпрограмм в том, что они могут быть виртуальными, при этом их можно переопределять и использовать полиморфизм.

Ссылки на классы не является ни классом, ни объектом, ни ссылкой на объект; это просто ссылка на тип класса. Тип ссылки на класс определяет тип соответствующей переменной. Например:

Type

MyClass=class

End;

MyClassRef=class of MyClass;

Var

AClassRef: MyClassRef;

AnObject: MyClass;

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

Ссылки на класс не были бы так полезны, если бы не поддерживали то же правило совместимости типов, что используется и для обычных классов. Определяя переменную-ссылку на класс, такую как MyClassRef можно присвоить ей как родной класс, так и все его подклассы. Delphi определяет множество ссылок на классы в библиотеках VCL, RTL.

TClass=class of TObject;

ExceptClass=class of Exception;

TComponentClass=class of TComponent;

TControlClass=class of TControl;

TFormClass=class of TForm;

29. Указатели на методы. События и делегирование.Тип данных указателя на метод-процедурный ТД(тип данных) со скрытым параметром self. Переменная типа указатель на метод содержит два адреса: адрес кода метода и адрес экземпляра объекта, к-ый появ-ся в коде метода как неявный параметр self.

Описание типа указатель на метод выглядит как описание обычного процедурного типа с добавленными в конце ключевыми словами of project.

Например, описание процедурного типа:

Type IntProceduralType=procedure (Num: integer);

Описание типа указатель на метод:

Type IntProceduralType=procedure (Num: integer) of object;

Поля такого типа можно использовать в объектах.

Type

MyClass=class

Value: integer;

Operation: IntMethodPointerType

End;

Полю Operation можно присвоить любой совместимый метод — такого же вида (процедура или функция) и с таким же набором параметров, для функции должен совпадать также тип возвращаемого результата. Например можно написать еще один класс, у которого есть метод с целочисленным параметром:

tуре

AnotherClass=class

X: integer;

Procedure Add (N: integer);

End;

Если определить объекты этих двух классов, например:

Var

MyObject: MyClass;

AnotherObject: AnotherClass;

то после инициализации объектов можно сделать такое присваивание:

AnotherObject.Operation:=AnotherObject.Add;

если после этого вызвать метод MyObject.Operation, то в действительности произойдет вызов метода Add объекта AnotherObject.

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

Например, когда добавляется событие OnClick для кнопки, Delphi присваивает свойству кнопки с именем OnClick (типа указатель на метод) имя метода формы, который является обработчиком указанного события. При нажатии на кнопку, выполняется код данного обработчика события, даже если он описан внутри совершенно др. класса.

Свойства, имеющие тип указателя на метод, выделяют в особый вил элементов класса, называемый событиями. Все события, видимые на странице Events в Object Inspector, являются на самом деле свойствами типа <указатель на метод», размещенными в разделе published класса данного компонента.

Для вызова обработчика события в первую очередь необходимо проверить был ли сопоставлен событию такой обработчик. Это осуществляется функцией assigned, которая возвращает true, если событию был сопоставлен обработчик.

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

30. Компоненты Delphi для ввода и отображения текстовой,цифров и иерархич информации. Компоненты Delphi для работы с графикой, печатью, мультимедиа. Компоненты Delphi представлены на палитре компонентов. Палитра компонентов имеет ряд панелей-закладок, на которых компоненты сгруппированы по своим функциям. Компоненты могут быть визуальными и невизуальными. Визуальные компоненты сразу видны на экране в момент проектирования в том же виде, в каком их видит пользователь при выполнении программы. Невизуальные компоненты видны в момент проектирования в виде пиктограмм, но пользователю в момент выполнения приложения они не видны. По умолчанюо на палитре имеются следующие основные страницы:

Standard, Additional(содержат наиболее часто используемые компоненты,такие как главное меню,метка поле ввода, кнопка и кнопи с рисунками,маскирование поля ввода,таблица строк,изображение,рисунок);Win32(вкл элементы управл присущте 32-разрядной версииW,напр стр с закладками,анимирован.изображение, перемещаемая панель инстр,дерево и.др);System(содержит системные компоненты, такие как таймеры, плееры,окно рисования);Data Access(содержит компоненты определяющие доступ к БД), Data Controls(представляет компоненты визуального управления информ в БД),Internet(компоненты для создания Интернет-приложений);DecisionCube(компоненты для многомерного анализа данных);Dialogs(стандартные, системные диалоги);Win3.1(вкл элементы управления присущие 16-разрядной версииW);Samples(образцы компонентов как рпавило менее документированные);ActiveX(образцы компонентов, выполненных по технологии ActiveX).

Пользователь может самостоятельно пермещать компоненты м/у страниц,создавать новые стр и компоненты. Поэтому при описании компонентов Delphi лутще их группировать не по стр а по функц группам. Функционнальные группы:Компоновка ввода и отображения текстовой инфор

Label(неоконный компонет для вывода текста на форме)

staticText(оконный компонет для вывода текста на форме)

edit(однострочный текст)

maskEdit(однострочный редактор текста с маскированием-ввода)

labelEdit(однострочный редактор текста с ассоциированной текстовой инфор)

Memo(многострочный редактор текста)

LisBox(списков элем в списке с прокруткой)

CheckListBox(списков элем в списке с прокруткой,кажому элементу сопоставлен элемент выбора CheckBox)

ComboBox(объединение функц однострочного редактора текста и спска с прокруткой)

comboBoxEx(ComboBox с расширенными возможностями,в частности элементы могуть быть изображения,можно управлять стилем отображения элементов списка,но он не имеет ряд функции ComboBox,напр сортировка)

valueListEditor(компонент для редактирования списка строк,представляющих пары «название/значение»)

Компоновка ввода и отображения чисел,дат и времени:

upDown(выбор последовательных значений,обычно числовых)

SpinEdit(аналог копонента upDown,объединненого в Edit)

TrackBar(ползунок ,ввод инфор осуществляется премещением ползунка по конечному множеству допустимых значений)

DateTimerPicker(ввод дат и времени с выпадающим календарем)

Calendar(пример компонента для ввода инфор о дате и врмени)

Компонент отображения заголовков и иерархических данных:

headerControl(контейнер для набора заголовка столбцов с возможностью изменения их размеров)

treeView(окно для отображения иерархического списка в виде дерева)

ListView(служит для отображения списка элементов неск способами:в колонках,столбцах с заголовками и подэлементами,вертикально и горизонтально с малыми или большими иконками)

Компонент отображения рисунков и изображений:

Shape(рисует на формате геометрические фигуры:эллипс,прямоуг и др)

Image(область отображающая графическое изобр)

paintBox(обасть формы с возможностью рисования изобр)

ColorBox(компонент для выбора цвета)

Компонент для созд табоиц,построения графика и диаграмм:

stringGrid(исползуется для отображения текстовой инфор в таблице из строк и столбцов)

drawGrid(используется для отображения таблицы в строках и столбцах в которых содерж нетекстовые данные)

chart(создание графиков по информ,не хранящейся в БД)

chartfx(создание графиков с возможностью пользовательской настройки)

Мультимедиа и анимация:

progressBar(отображения хода выполнения длительных процессов)

Gauge(пример компонента, используемого для созд индикатора хода процесса в виде линейки,текста или секторной диаграммы)

Animate(воспроизведение немых видеоклипов),MediaPlayer(универсальный проигрыватель).

31. Компоненты Delphi:Кнопки,индикаторы,управляющие элементы.Компоненты меню.Панели и компоненты внешнего оформления.Диалоги. Пользователь может самостоятельно пермещать компоненты м/у страниц,создавать новые стр и компоненты. Поэтому при описании компонентов Delphi лутще их группировать не по стр а по функц группам. Функционнальные группы:

Компоненты кнопки и переключатели:

Button(стандартная кнопка)

bitBtn(кнопки с битовой графикой,может иметь 4изобраджения,характ ее состояние:нажата,отжата,недоступна,щелчок.используется также для инициализации выбранного действия при закрытии формы)

SpeedButton(служит для созд групп кнопок на форме,напр инструментальной панели. Имеет фиксацию нажатого состояния)

CheckBox(элемент выбора для вкл и откл опций)

RadioButton(выбора из набора взаимоисключающих альтернатив)

CheckListBox(список элементов с прокруткой,каждому элементу сопоставлен элемент выбора CheckBox).

Панели и контейнеры:

Panel(представляет типовую панель windos)

groupBox(представляет стандарт элемент windos для группировки элементов управления. Является родительским компонентом для помещенных в него элементов упрв)

RadioGroup(особый groupBox,предназначенный только для группировки элементов RadioButton и имеющие спец св-ва управления этими объктами)

Bevel(используется для рисования выступающих и утопленных лини или прямогульных рамок)

ScrollBox(использ для создания зон отображения с прокруткой. Как правило использ для задания на форме области,которая не будет прокручиваться,напр инструментальная панели)

Splitter(разбивает клиентскую область формы на части с изменяемыми размерами)

StatusBar(служит для реализации строки состояния).

ScrollBar(служит для организации прокрутки окон или элементов управл)

OLEContainer(позволяет внедрять или привязывать OLE-объекты)

TabControl(организует одну стр с закладками,которые может выбирать пользователь. Выбор новой закладки приводит к обновлению содержимого стр)

PageControl(содержит набор стр выбор которых опред закладками или иными органами управл,расположенными на рабочем столе).

Меню и инструментальные панели:

MainMenu(реализует главное меню)

PopupMenu(реализует всплывающее меню)

ToolBar(контейнер для организации компонентов и автоматическ выстаривания их в строки. Как правило использ для организ инструментальной панели)

CoolBar(контейнер группирующий элементы управл перемещаемую инструментальную панель с изменяемыми размерами)

PageScroller (определяет видимую часть для ограниченных окон и механизм просмотра всего окна напр прокрутку инструментальной панели)

ControlBar(управляет местоположением компонента ToolBar: является подложкой для прикрепления инструмент панелей).

Диалоги:

openDialog(диалог выбора файла)

Save Dialog(диалог сохр файла «сохр как»)

OpenPicture Dialog(диалог выбора графического файла)

SavePicture Dialog(диалог сохр графического файла «сохр как»)

Font Dialog(диалог выбора шрифта)

Color Dialog(диалог выбора цвета)

Prin Dialog(диалог печати)

PrinterSetup Dialog(диалог установки принтера)

Find Dialog(диалог поиска текста)

Replace Dialog(диалог замены текста)

PageSetup Dialog(диалог настройки стр для печати).

Компоненты организации управления приложением:

ActionList(служит для централизованного управл списком действий,выполняемых элементами управления,например кнопками или элементами меню)

CustomizeDlg(пользовательская настройка для элементов диалога управл)

ImageList(хранит список изображений,позволяет др компонентам адресоваться к этим изобр)

HotKey(ипользуется для определения комбинации клавиш быстрого вызова функций программ)

ApplicationEvents(перехватывает события глобального объекта Application )

Timer(реализует стандартный таймер).

32.Иерархия компонентов Delphi. Общие свойства компонентов: имена и владельцы. Родительские и дочерние компоненты. Иерархия компонентовВсе компоненты Delphi являются объектами классов, встроенных в иерархиюVCL Delphi. Компонентами в Delphi называются потомки класса ТComponent, поскольку в этом классе определяются самые общие свойства и методы всех компонентов. По мере детализации определяются сначала группы компонентов (например, компоненты — элементы управления), для этого в иерархию включаются классы, представляющие общие свойства и методы компонентов этой группы (например, группа компонентов- элементов управления — класс TControl). Таким образом, дерево компонентов описывает все классы, а его листья (а также отдельные ветви нижних уровней) являются классами тех компонентов, которые представлены на палитре компонентов.

Рассматривая свойства и методы классов-предков компонентов, можно рассмотреть все общие свойства и методы компонентов. Упрощённая иерархия классов:TObject->ТPersistent->ТComponent->ТControl: TGraphicControl, TWinControl: TScrollingWinControl (->TCustomForm), TCustomControl

Работа с иерархией объектов VCL осуществляется с помощью инструмента Browser, который может быть вызван командой главного меню View.—>Browser или быстрыми клавишами Shift +Ctrl+В. Зная свойства и методы можно предполагать какие свойства и методы есть у кнопки.

Классы компонентов, как и всё классы Delphi, происходят от класса TObject, и от него получают методы для создания и уничтожения себя в оперативной памяти и т.д.

Следующим классом, от которого происходят все классы компонентов, и который происходит непосредственно от TObject, является класс ТPersistent. Он обеспечивает своих потомков возможностью взаимодействовать с другими объектами. В частности, класс передает своим потомкам виртуальный метод Assign.

procedure Assign (Source: ТPersistent);

С помощью этого метода поля и свойства объекта Source копируются в объект, вызвавший метод Assign. Если описаны два объекта Obj1 и Obj2 классов-наследников ТPersistent, то записи

Obj1 := Obj2; // присваивание

Obj1.Assign (Obj2); // копирование

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

С помощью полиморфизма обмениваться данными между собой могут все наследники класса ТPersistent.. Класс ТPersistent никогда не используется напрямую, от него порождаются потомки, которые должны уметь передавать другим объектам значения своих свойств.

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

Класс ТControl происходит от ТComponent и описывает общие свойства и методы видимых компонентов. Два наследника этого класса TWinControl и TGraphicControl— определяют соответственно две группы компонентов: имеющих оконный ресурс (способных получать и обрабатывать сообщения Windows) и не имеющих этого ресурса.

Оконный компонент в момент своего создания обращается к требованием выделения оконного ресурса и, если требование удовлетворяется, получает так называемый дескриптор окна. Класс TWinControl и его потомки хранят дескриптор окна в свойстве Handle. Программист может использовать этот дескриптор для непосредственного обращения к функциям АРI Windows. Потомки TGraphicControl не требуют от Windows дефицитного оконного ресурса, но они и не могут обрабатывать сообщения Windows — управляет такими компонентами оконный компонент-владелец (например, форма), который и является посредником между Windows и неоконными компонентами.

На основе класса TWinControl создан ряд дополнительных классов, например: TCustomControl, TScrollingWinControl и пр. В частности, свойства и методы классов TCustomControl и TGraphicControl обеспечивают компоненты дополнительными возможностями по рисованию графики на канве.

Имена и владельцы компонентов.Имя компонента строится по тем же правилам, что и любой идентификатор. Оно должно быть уникальным в области своей видимости в программе. Имя компонента определяется в свойстве Name класса ТComponent

Type ТComponentName = type string;

property Name: ТComponentName read FName write SetName stored False;

Свойство Tag класса TComponent определяет целочисленный параметр, который программист может использовать по своему усмотрению.

property Tag: Longint read FTag write FTag default 0;

Любой компонент Delphi (кроме форм и модулей данных) является собственностью другого компонента и, в свою очередь, может быть владельцем одного или нескольких компонентов. При создании объекта-владельца автоматически вызываются конструкторы всех подчиненных объектов, а при удалении объекта-владельца вызываются деструкторы всех подчиненных объектов. Такой механизм позволяет избежать программного создания и удаления компонентов, принадлежащих какой-либо форме. Достаточно назначить эту форму владельцем ее компонентов (что и происходит при ее проектировании), и все начнет работать автоматически. Для реализации данного механизма в классе TComponent переопределяется конструктор класса TObject и перекрывается деструктор класса TObject. Конструктор ТComponent.Create имеет параметр, в котором компоненту передается ссылка на его владельца.

constructor Create (AOwner: TComponent); virtual;

Очевидно, что владельцем может являться только компонент. Поэтому вызов конструктора для объекта-компонента всегда связан с указанием его владельца. Например, обычно при создании компонента в методе формы в конструктор компонента передается неявный параметр Self, который называет на форму:

Btn1 := TButton.Create (self)

В классе TComponent также предусмотрен ряд свойств для реализации механизма владения.

У подчиненного компонента:Для ссылки на владельца используется свойство Owner класса.

property Owner: TComponent read FOwner

Положение компонента в массиве Components своего владельца определяет свойство ComponentIndex.

property ComponentIndex: Integer read GetComponentIndex

write SetComponentIndex;

Свойство ComponentState возвращает текущее состояние компонента.

У компонента-владельца:Свойство-массив Components содержит список всех компонентов, которыми владеет данный компонент.

Количество зарегистрированых в списке компонентов возвращает свойство ComponentCount.

property ComponentCount : Integer read SetComponentCount;

Методы класса TComponent, предназначенные для управления списком свойства Components

Родительские и дочерние компоненты.Наследники класса TControl образуют всю палитру видимых компонентов Delphi. В терминах Windows они называются элементами управления.

Некоторые из наследников TControl обладают дескрипторами окон, специальными идентификаторами, которые Windows присваивает всем объектам, обладающим свойствами окна. Такие элементы управления обладает свойствами окна, то он должен уметь принимать и обрабатывать сообщения Windows, то есть выполнять следующие операции:

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

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

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

Такие компоненты называют оконными элементами управления. Эти компоненты являются наследниками класса TWinControl, непосредственно следующего за TControl.

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

Класс TControl определяет для каждого видимого компонента свойство Parent, которое содержит ссылку на его родительский компонент.

property Parent: TWinControl read FParent write SetParent;

Таким образом владелец (Owner) создает компонент (не обязательно видимый), а родитель (Parent) управляет видимым компонентом. Поскольку конструктор TComponent.Create не изменяет свойства Parent, то при создании видимых компонентов это свойство необходимо изменять программно.

В классе TWinControl (для каждого оконного компонента) описаны:

свойство Controls, содержащее список дочерних компонентов.

property Controls [Index: Integer]: TControl read GetControl;

свойство ControlCount возвращает количество дочерних элементов

property ControlCount: Integer read GetControlCount;

а также методы для работы со списком Controls.