ГЛАВА 6

- Компоненты
- Типы компонентов
- Структура компонентов
  - Свойства
  - Типы свойств
- Свойства стандартных компонентов Delphi
  - Методы
  - Поля
  - События
    - Стандартные события
- Иерархия визуальных компонентов
- Типы времени выполнения (RTTI)

В этой главе мы рассмотрим, что представляет собой компонент Delphi, изучим типы компонентов, их структуру. Особое внимание уделим иерархии визуальных компонентов Delphi. Кратко остановимся на изучении типов времени выполнения (RTTI).
Компоненты
Компоненты Delphi являются частью классовой иерархии Delphi, которая называется библиотекой визуальных компонентов (Visual Component Library, VCL). Библиотека визуальных компонентов Delphi, несмотря на название, содержит в своем составе как визуальные (видимые во время выполнения приложения), так и невизуальные (видимые только на этапе проектирования) компоненты. К визуальным компонентам относятся TButton, TEdit, TLabel и др. К невизуальным относятся такие компоненты, как TTimer, TTable, TQuery И др.
Компонент - это небольшая часть приложения, обеспечивающая создание пользовательского интерфейса. Компоненты можно представить как небольшие "кирпичики", из которых строится "дом" - приложение.
Компоненты могут находиться на панели компонентов. Разработчик может брать компоненты из панели компонентов и располагать их на форме.
Компоненты могут сильно отличаться по степени своей сложности. Можно использовать в своем приложении как простые компоненты (как, например, TLabel, TEdit), так и достаточно сложные (скажем, компонент, объединяющий в себе возможности текстового процессора).
Для того чтобы успешно работать с компонентами, нужно понимать основные типы компонентов Delphi, а также представлять себе их внутреннее строение и иерархию компонентов. Все это мы опишем далее в этой части книги.
Типы компонентов
В Delphi имеется четыре базовых типа компонентов. Вы можете использовать в своих приложениях любые компоненты данных типов, а также создавать новые компоненты любого из них.
Первый тип компонентов - стандартный.
Стандартные компоненты включают в себя поведение элементов управления Windows. К таким компонентам относятся: TListView, TRichEdit, TImageList и др. Все эти компоненты находятся на вкладке Win32 панели компонентов Delphi. Каждый из данных компонентов представляет собой так называемую оболочку (wrapper) стандартного элемента управления Windows. Эти компоненты позволяют легко использовать элементы управления Windows в ваших программах.
Второй тип компонентов - пользовательский.
К пользовательским компонентам относятся все компоненты, которые невходят в стандартную библиотеку компонентов Delphi. Эти компоненты добавляются вами в существующий набор компонентов. Пользовательские компоненты создаются вами самостоятельно или приобретаются у других программистов.
Примечание
Информацию о создании собственных компонентов см. в главе 6.
Третий тип компонентов - графический.
Графические компоненты предназначены для создания визуальных элементов управления, которые не могут получать фокус ввода. Обычно, подобные компоненты применяются для отображения какой-либо информации (текстовой или графической). В качестве примера таких компонентов можно Привести TShape, TLabel, TImage И Др.
И, наконец, последний тип компонентов - невизуальный.
Невизуальные компоненты не видны пользователю во" время выполнения приложения. Хотя они обладают свойствами, событиями и методами. Ярким примером компонента такого типа является TTimer.
Структура компонентов
Компоненты, как и всякий другой класс, инкапсулируют в себе свойства, события, методы и поля.
Примечание
Компоненты являются классами, с которыми можно работать в интегрированной среде разработки Delphi.
Рассмотрим свойства, события, методы и поля компонентов.
Свойства
Свойства компонента предназначены для доступа пользователя к внутренним полям компонента. Свойства позволяют изменять атрибуты компонента, в том числе и вычисляемыми значениями. Определение свойства компонента должно содержать его имя и тип, а также как минимум одно объявление способа доступа к данному свойству (описания). Синтаксис определения свойства компонента имеет вид:
property Имя свойства: тип описания;
- имя свойства - должно быть уникальным;
- тип - определяет, значения какого типа могут быть записаны в данном свойстве;
- описания - объявления способов доступа к этому свойству.
Как мы уже говорили, каждое свойство компонента должно иметь как минимум одно обязательное объявление способа доступа к свойству. К таким описаниям относятся read или write. Кроме того, в Delphi имеются дополнительные описания: stored, default (nodefault), implements.
Рассмотрим описания более подробно.
Синтаксис обязательных описаний read и write имеет следующий вид:
read поле или метод write поле или метод
где поле или метод - поле, из которого берется (или в которое помещается) значение свойства, или метод, который берет или помещает значение свойства компонента.
Несложно догадаться, что объявление read (читать) описывает поле или метод, предназначенный для чтения значения свойства, а объявление write (писать) описывает поле или метод, предназначенный для записи значения свойства компонента.
К необязательным описаниям способа доступа относятся описания stored, default (nodefault), implements.
Эти описания называют хранимыми описаниями, они не дают эффекта при выполнении программы, но отвечают за способы хранения переменных средой Delphi.
Описание stored может принимать любое из двух значений: true или false. Оно используется, когда Delphi сохраняет текущее состояние компонента. При сохранении, Delphi проверяет свойства компонента, если свойство отличается от величины, установленной по умолчанию и описание stored имеет значение true, то в этом случае новое значение величины свойства компонента сохраняется. В противном случае (когда описание stored имеет значение false) новое значение величины свойства не сохраняется.
Для установки значения свойства компонента по умолчанию используется писание default.
Приведем пример описания свойства компонента:
property MaxLength: Integer read FMaxLength write SetMaxLength default 0;
В этом примере мы описываем свойство компонента, которое имеет имя MaxLength, тип integer и получает значение из поля FMaxLength, а для записи значения в поле FMaxLength используется метод SetMaxLength. По умолчанию, значение данного свойства равно о.
Наконец, описание implements служит для поддержки свойством компонента интерфейсов. Например,
property Mylnterface: IMylnterface read FMylnterface implements IMylnterface;
Описание implements должно находиться в самом конце описаний. Оно может содержать несколько интерфейсов, разделенных запятыми. Свойство, содержащее описание implements, должно:
- быть классом или интерфейсом;
- не быть массивом;
- иметь описание read.
Типы свойств
Следует отметить, что к свойствам применимы те же правила, которые используются для описания типов в Object Pascal. Типы свойств компонента нужны в первую очередь для отображения и редактирования его в окне инспектора объектов. Перечислим основные типы свойств компонентов Delphi (табл. 2.1).
Таблица 2.1. Типы свойств

| Тип свойства | Отображение свойств в окне инспектора объектов |
| Простой (Simple) | Числовые, символьные и строковые свойства отображаются соответственно как числа, символы и строки. Разработчик может редактировать значения данных свойств непосредственно в окне инспектора объектов |
| Перечисляемый (Enumerated) | Свойства перечисляемых типов (включая булевы) отображаются в инспекторе объектов как редактируемые строки. Разработчик может кроме непосредственного ввода значения свойства переключать допустимые значения свойства двойным щелчком в поле значения свойства инспектора объектов, либо выбирать допустимое значение из выпадающего списка |
| Множество (Set) | Свойства типа Set отображаются в инспекторе объектов как множества. При помощи двойного щелчка на значении свойства разработчик может расширить множество и установить каждому элементу множества булево значение (true, если данный элемент входит во множество) |
| Объект (object) | Свойства такого типа часто имеют свой собственный редактор свойств. Свойства типа объект должны быть потомками класса TPersistent |
| Массив (Array) | Свойства типа Array должны иметь свой собственный редактор свойств. Инспектор объектов Delphi не поддерживает редактирование свойств данного типа. Разработчик должен при регистрации компонента определить редактор свойств |

Свойства стандартных компонентов Delphi
Рассмотрим свойства, которые имеют стандартные компоненты Delphi.
Свойство Action предназначено для определения действия, связанного с элементом управления (меню, кнопкой и т. д). Значение данного свойства устанавливается во время разработки приложения, путем выбора из выпадающего списка предусмотренных действий. Данный список формируется путем размещения на форме компонента TActionList и задания его свойств.
Свойство Active предназначено для определения наличия соединения с базой данных, а также для установки или отключения этого соединения. Данное свойство может принимать одно из двух значений: false или true. Если значение свойства равно false, то в этом случае база данных является закрытой и работа с ней (чтение или запись данных) невозможна. Если вы установите свойство Active в true, то произойдет следующее:
- приложение сгенерирует событие BeforeOpen;
- набор данных (свойства state) установится в состояние dsBrowse;
- в наборе данных установится курсор;
- приложение сгенерирует событие AfterOpen.
Данное свойство можно установить непосредственно, например:
Tablel.Active := true;
или с помощью вызова методов open (установка свойства Active в true) или
Close (false): Tablel.Open;
Свойство Align предназначено для задания способа выравнивания компонента внутри компонента контейнерного типа. Перечислим возможные значения данного свойства.
- alNone - компонент остается на том месте, где он был размещен во время разработки приложения. Данное значение присваивается свойству Align по умолчанию.
- alTop - компонент занимает всю верхнюю часть компонента-контейнера. Во время выполнения приложения ширина компонента зависит от ширины компонента-контейнера. Высота компонента остается неизменной независимо от высоты контейнера.
- alBottom - аналогичен значению aiTop, за исключением того, что компонент занимает всю нижнюю часть компонента-контейнера.
- alLeft - компонент занимает всю левую часть компонента-контейнера. Во время выполнения приложения высота компонента зависит от высоты компонента-контейнера. При изменении ширины компонента-контейнера ширина компонента остается неизменной.
- alRight - аналогичен значению alLeft, за исключением того, что компонент занимает всю правую часть компонента-контейнера.
- alclient - компонент занимает всю клиентскую часть компонента-контейнера. При изменении высоты и ширины компонента-контейнера меняется высота и ширина компонента. Если в клиентской части компонента контейнерного типа уже имеются другие компоненты, то данный компонент занимает всю оставшуюся незанятую часть компонента-контейнера.
Примечание
Значения alTop и alBottom имеют больший приоритет по сравнению со значениями alLeft и aiRight. Таким образом, если вы вывели на форму два компонента, присвоив свойству Align одного из них значение alTop, а другого - alRight, то первый компонент вытеснит верхнюю часть второго компонента (рис. 2.1).
Свойство Anchors предназначено для определения привязки компонента к родительскому компоненту при изменении размеров родительского компонента. Данное свойство было введено начиная с Delphi 4. Это свойство имеет тип множества, которое может содержать такие элементы:
- akTop - компонент привязан к верхнему краю родительского компонента; - akLeft - компонент привязан к левому краю родительского компонента;
- akBottom - компонент привязан к нижнему краю родительского компонента;
- akRight - компонент привязан к правому краю родительского компонента.
Рис. 2.1. Применение свойства Align
В случае, когда существует привязка к противоположным сторонам родительского компонента, при изменении его размеров будет происходить сжатие или растяжение дочернего компонента вплоть до полного исчезновения его изображения. Таким образом, данное свойство определяет как бы фиксацию расстояния от компонента до краев родительского компонента.
Свойство AutoCalcFields определяет режим автоматической генерации события onCalcFields. Данное свойство установлено в true по умолчанию. В этом случае события onCalcField, связанные с пересчетом вычисляемых полей таблицы данных, генерируются в следующих случаях:
- когда открывается набор данных;
- когда набор данных переводится в состояние dsEdit;
- когда фокус переходит между компонентами, содержащими данные или перемещается по столбцам таблицы, связанной с данными;
- когда ищется какая-либо запись.
Для того чтобы уменьшить время, необходимое на пересчет вычисляемых полей, можно установить свойство AutoCalcField В false.
Свойство AutoEnable служит для задания автоматического определения доступных кнопок медиаплейера в разных режимах. Если это свойство установлено в true, то значение, заданное свойством EnabledButtons, игнорируется. В противном случае доступные кнопки определяются свойством EnabiedButtons (описание этого свойства см. далее).
Свойство AutoMerge применяется для того, чтобы объединить меню вторичных форм c меню главной формы. Для этого нужно в каждой вторичной форме установить данное свойство в true.
Примечание
В приложениях MDI установка свойства AutoMerge необязательна, т. к. все равно будет выполнено объединение меню.
Свойство AutoOpen предназначено для автоматического открытия медиа-плейера во время выполнения приложения. Если данному свойству присвоить значение true, то медиаплейер автоматически откроет при создании формы устройство, указанное в свойстве DeviceType (описание этого свойства см. далее). В случае если при открытии устройства возникает ошибка, то приложение генерирует исключение EMClDeviceError. Если значение свойства AutoOpen равно false, то для открытия устройства необходимо использовать метод Open.
Свойство AutoSelect показывает, будет ли текст, содержащийся в компоненте, выделяться в тот момент, когда данный компонент получает фокус. Это свойство не применяется в многострочных редакторах (таких как Memo, RichEdit и др.). Если данное свойство имеет значение true, то текст, содержащийся в однострочном редакторе, будет выделен при получении фокуса. Свойство AutoSelect удобно применять, когда пользователь, скорее всего, будет вводить новое значение в поле для ввода вместо старого, а не редактировать.
Свойство AutoSize применяется для того, чтобы приложение автоматически устанавливало высоту поля для ввода (Edit), в зависимости от высоты используемого шрифта. Если значение данного свойства равно true, то поле для ввода будет автоматически изменять размер при смене размера используемого в нем шрифта.
Свойство Bitmap предназначено для указания на объект типа TBitmap, который содержит изображение. В случае если свойство Bitmap не пустое, то свойство style игнорируется и в качестве шаблона заполнения берется объект, на который указывает свойство Bitmap.
Свойство BoundsRect применяется для получения одновременно координат всех четырех вершин компонента.
Примечание
Данные координаты можно получить из следующих свойств компонента: Left (левый край компонента), тор (верхний край), width (ширина компонента) и Height (высота). Описание этих свойств мы приведем ниже.
Началом координат считается левый верхний угол окна, содержащего данный компонент.
Свойство Break предназначено для разбивания списка разделов меню на несколько столбцов. Это свойство может принимать следующие значения:
- mbNone - нет разбивки (установлено по умолчанию);
- mbBarBreak - в меню добавляется новый столбец разделов и отделяется от предыдущего полосой;
- mbBreak - в меню добавляется новый Столбец разделов и отделяется от предыдущего пробелами.
Рассмотрим пример (рис. 2.2).
В данном примере мы отделили Первый раздел меню от Второго полосой (установили значение свойства Break для Второго раздела в mbBarBreak), а также отделили Третий и Четвертый разделы меню от Второго пробелами (установили значение свойства Break для Третьего раздела в mbBreak).
Рис. 2.2. Разбиение меню приложения на столбцы разделов с помощью свойства Break
Свойство Brush применяется для чтения текущего значения цвета и стиля заполнения фона окна. Обратите внимание на то, что данное свойство предназначено только для чтения. Но значение этого свойства можно изменить при помощи изменения свойств Color и style.
Свойство Canvas предназначено для рисования, изменения изображения и других действий с изображениями. Данное свойство имеется у тех компонентов, которые имеют поверхности для рисования.
Свойство Capabilities определяет возможности открытого устройства мультимедиа. Данное свойство устанавливается при открытии устройства мультимедиа методом Open. Это свойство доступно только для чтения. Свойство capabilities может принимать следующие значения:
- mpCanEject - возможно освобождение объекта, загруженного в устройство; - mpCanPlay - возможно воспроизведение; - mpCanRecord - возможна запись;
- mpcanstep - возможно перемещение на задаваемое число кадров вперед и назад;
- mpuseswindow - возможно использование окна для отображения выходного изображения.
Свойство capacity применяется для определения количества элементов, которые могут храниться в компоненте класса TList. В случае, когда при увеличении значения данного свойства возникает нехватка оперативной памяти, генерируется исключение EOutOfMemory. Свойство capacity отличается от похожего свойства Count тем, что хранит в себе число, указывающее, сколько элементов может храниться в Компоненте класса TList, a count показывает, сколько элементов действительно хранится в компоненте. Таким образом, значение свойства capacity всегда больше или равно значению свойства count. При увеличении значения свойства count, в случае необходимости, происходит увеличение значения Capacity. Данное свойство применяется для того, чтобы предотвратить слишком частое перераспределение оперативной памяти. Если принудительно задать значение свойства capacity меньше, чем значение свойства count, приложение сгенерирует исключение EListError.
Свойство caption связывает с компонентом некоторую строку текста, поясняющую его назначение. Данная строка является обычно заголовком компонента (заголовком кнопки, метки, пункта меню и др.). По умолчанию это свойство устанавливается таким же, как имя компонента (свойство Name). Для пунктов меню и кнопок с помощью этого свойства можно задать кнопку быстрого вызова. Для этого перед символом кнопки быстрого вызова ставится символ амперсанда (&). Например, для быстрого вызова меню Файл перед буквой "Ф" в свойстве caption данного пункта меню можно поставить знак &: &Файл. При этом буква "Ф" в пункте меню будет подчеркнутой. Теперь для вызова данного пункта меню достаточно нажать комбинацию клавиш <А1t>+<Ф>.
Свойство charset применяется для задания используемого набора символов шрифта. Каждый вид шрифта поддерживает один или несколько наборов символов. Ниже приведена сокращенная таблица констант, применяемых в данном свойстве (табл. 2.2).
Таблица 2.2. Константы наборов символов

| Константа | Числовое значение | Набор символов |
| ANSI CHARSET | 0 | Символы ANSI |
| DEFAULT_CHARSET | 1 | Символы, установленные по умолчанию. Шрифт выбирается только по имени (Name) и размеру (size) |
| SYMBOL CHARSET | 2 | Стандартный символьный набор |
| MAC__CHARSET | 77 | Набор символов Macintosh |
| GREEK CHARSET | 161 | Набор греческих символов |
| RUSSIAN_CHARSET | 204 | Кириллица |
| EASTEUROPE CHARSET | 238 | Набор, включающий в себя символы, добавляемые к основным буквам для восточноевропейских языков |
| OEM_CHARSET | 255 | Набор символов операционной системы |

В некоторых случаях, для того, чтобы правильно отображались русские шрифты, полезно установить значение свойства charset в RUSSIAN_CHARSET.
Свойство clientHeight предназначено для установки или чтения высоты клиентской области компонента. Данное свойство применяется при изменении размеров компонента, который содержит в себе другие компоненты. При таком изменении будет происходить изменение компонентов, содержащихся в компоненте-контейнере.
Свойство clientorigin предназначено для получения экранных координат (х и у) левого верхнего угла клиентской области компонента. Началом координат является верхний левый угол экрана. Возвращаемые координаты передаются в структуре типа TPoint. Данное свойство предназначено только для чтения.
Свойство clientRect возвращает координаты углов клиентской области компонента. Данное свойство также предназначено только для чтения. Координаты возвращаются в структуре типа TRect.
Свойство clientwidth предназначено для установки или чтения горизонтального размера клиентской области компонента.
Свойство ciipRect определяет область, доступную для рисования. То есть вне области, определяемой свойством clipRect, рисовать невозможно. Использование данного свойства сокращает затраты времени на перерисовку этой области.
Свойство color определяет цвет фона компонента. Значение этого свойства может быть или числом, определяющим интенсивность трех основных цветов (красного, зеленого и синего), или константой, определенной в Delphi (табл. 2.3).
Таблица 2.3. Константы, определяющие цвета

| Константа | Цвет |
| ClBlack | Черный |
| CIMaroon | Темно-бордовый |
| ClGreen | Зеленый |
| ClOlive | Оливковый |
| CINavy | Темно-синий |
| Cl Purple | Пурпурный |
| CITeal | Морской |
| CIGray | Серый |
| CISilver | Серебристый |
| CIRed | Красный |
| CILime | Лимонный |
| ClBlue | Синий |
| ClYellow | Желтый |
| ClFuchsia | Сиреневый |
| СlAqua | Голубой |
| ClWhite | Белый |
| ClBackground | Цвет фона рабочего стола Windows |
| CIScrollBr | Цвет полос прокрутки |
| ClActiveCaption | Цвет фона полосы заголовка активного окна |
| CllnactiveCaption | Цвет фона полосы заголовка неактивного окна |
| CIMenu | Цвет фона меню |
| ClWindow | Цвет фона окна |
| ClWindowFrame | Цвет рамки окна |
| CIMenuText | Цвет текста меню |
| ClWindowText | Цвет текста окна |
| CICaptionText | Цвет текста заголовка в активном окне |
| ClActiveBorder | Цвет бордюра активного окна |
| ClInactiveBorder | Цвет бордюра неактивного окна |
| ClAppWorkSpace | Цвет рабочей области приложения |
| ClHighlight | Цвет фона выделенного текста |
| ClHighlightText | Цвет выделенного текста |
| ClBtnFace | Цвет поверхности кнопки |
| ClBtnShadow | Цвет тени, отбрасываемой кнопкой |
| CIGrayText | Цвет текста недоступных элементов окна |
| ClBtnText | Цвет текста кнопки |
| ClInactiveCaptionText | Цвет заголовка в неактивном окне |
| ClBtnHighlight | Цвет выделенной кнопки |
| C13DdkShadow | Цвет темных теней трехмерных элементов окна |
| ClBDlight | Светлый цвет на краях трехмерных элементов окна |
| ClInfoText | Цвет текста советов |
| ClInfoBk | Цвет фона советов |

Данные константы цвета, начиная с clBackground, определяются той цветовой схемой Windows, которая установлена пользователем на данном конкретном компьютере. Эти цвета рекомендуется использовать при разработке приложений для передачи третьим лицам.
Свойство commonAvi предназначено для определения стандартного клипа Windows из файла-библиотеки Shell32.dll. То есть такие клипы, как копирование файлов, поиск файлов, удаление файлов в корзину и др.
Свойство componentcount определяет число компонентов, содержащихся в данном компоненте контейнерного типа.
Свойство component index определяет индекс (порядковый номер) компонента, содержащего в компоненте-контейнере.
Свойство components хранит в себе массив компонентов, владельцем которых является данный компонент. Параметр свойств index позволяет выбрать любой компонент из массива, благодаря свойству Componentindex. Индексы компонентов нумеруются начиная с нуля. Число компонентов, которые содержатся в массиве, можно определить с помощью свойства Componentcount.
Рассмотрим пример применения данных свойств. Предположим, что у нас на форме имеется несколько компонентов. Наша задача - сместить все компоненты, которые присутствуют на форме, кроме компонента Button1 вправо на 10 единиц. Для этого мы можем использовать следующий код:
for i := 0 to Componentcount - 1 do
if (Components[i].Name <> 'Button1') then
(Components[i] as TControl).Left:=(Components[i] as TControl).Left + 10;
Свойство controicount определяет число дочерних компонентов данного оконного элемента. Дочерними называются компоненты, которые расположены в клиентской области этого элемента и, кроме того, в свойстве Parent которых указан данный элемент. Свойство controicount предназначено только для чтения.
Свойство controls является массивом, содержащим все дочерние компоненты данного элемента. Параметр index определяет индекс соответствующего компонента. Индексы начинают нумероваться с нуля. Это свойство предназначено только для чтения.
Свойство Controlstate определяет различные условия, действующие на данный экземпляр компонента. Например, двойной щелчок мыши или необходимость выравнивания компонента.
Свойство Controlstyle определяет различные атрибуты компонента. Например, может ли компонент быть захвачен мышью, имеет ли компонент фиксированные размеры и др. Данное свойство описывает не экземпляры класса, а класс в целом.
Свойство CopyMode определяет способ копирования графического изображения на канву с помощью метода copyRect, или при рисовании объекта типа TBitmap. При помощи данного свойства можно достичь разных эффектов объединения изображений. В табл. 2.4 перечислены возможные значения свойства CopyMode.
Таблица 2.4. Возможные значения свойства CopyMode

| Значение свойства | Действие при копировании |
| cmBlackness | Заполняет область, в которую производится копирование, черным цветом. Собственное изображение и копируемое изображение удаляются |
| cmDstlnvert | Инвертирует изображение области копирования. Копируемое изображение может быть любым - оно не участвует в процессе инвертирования |
| cmMergeCopy | Объединяет изображение, находящееся в области копирования, и копируемое изображение при помощи булевой операции AND |
| cmMergePaint | Объединяет изображение, находящееся в области копирования, и инвертированное копируемое изображение при помощи булевой операции OR |
| cmNotSrcCopy | Помещает в область копирования инверсное копируемое изображение, причем изображение, находящееся в копируемой области, игнорируется |
| crnNotSrcErase | Объединяет изображение, находящееся в области копирования, и копируемое изображение при помощи булевой операции OR, после чего результат копирования инвертируется |
| cmPatCopy | Копирует шаблон источника в область копирования, причем собственное изображение игнорируется |
| cmPatlnvert | Объединяет изображение, находящееся в области копирования, и шаблон источника при помощи булевой операции XOR |
| cmPatPaint | Объединяет инверсное изображение источника и его шаблон при помощи булевой операции OR, затем результат объединяется с изображением, находящемся в области копирования, при помощи булевой операции OR |
| cmSrcAnd | Объединяет изображение, находящееся в области копирования, и изображение источника при помощи булевой операции AND |
| cmSrcCopy | Копирует изображение источника в область копирования. Собственное изображение, находящееся в области копирования, игнорируется. Данный режим применяется по умолчанию |
| cmSrcErase | Инвертирует изображение в области копирования и объединяет результат с изображением источника при помощи булевой операции AND |
| cmSrcInvert | Объединяет изображение источника с изображением в области копирования при помощи булевой операции XOR. Повторное копирование восстанавливает прежнее изображение в области копирования |
| cmSrcPaint | Объединяет изображение в области копирования и изображение источника при помощи булевой операции OR |
| cmWhiteness | Заполняет область копирования белым цветом, собственное изображение и копируемое изображение игнорируются |

Приведем пример использования способов копирования. Предположим, нам нужно в область с изображением вывести некоторое изображение, а затем убрать его, восстановив прежнее изображение. Для этого можно использовать код:
Imagel.Canvas.CopyMode := cmSrcInvert;
Imagel.Canvas.CopyRect (Rect (0,0,200,200), Image2.Canvas,
Rect (0,0,200,200)); Imagel.Canvas.CopyRect (Rect (0,0,200,200), Image2.Canvas,.
Rect '(0,0,200,200));
Свойство count предназначено для хранения количества элементов, содержащихся в компоненте класса TList. При добавлении новых элементов или при удалении (при помощи методов Add и Delete) значение данного свойства изменяется автоматически. При увеличении значения данного свойства вручную, в компонент класса TList будет добавлено соответствующее значение нулевых элементов. Удалить нулевые элементы можно при помощи вызова метода Pack. При уменьшении данного свойства count будут удалены последние элементы, содержащиеся в данном компоненте.
Свойство cti3D предназначено для установки внешнего вида компонента. Если данное свойство имеет значение true, то компонент будет выглядеть бъемным, если - false, то компонент будет плоским.
Свойство Cursor определяет вид указателя мыши, когда он находится над данным компонентом. Есть еще одно свойство Dragcursor, которое определяет вид указателя мыши, когда над компонентом происходит перетаскивание другого компонента. Delphi имеет встроенные виды указателей. Кроме встроенных, разработчик может помещать в приложение собственные виды указателя мыши. В табл. 2.5 находится список встроенных типов указателей мыши.
Таблица 2.5. Встроенные указатели мыши

| Значение свойства Cursor | Изображение указателя мыши |
| crDefault | Указатель, принятый по умолчанию. Обычно это crArrow |
| crNone | Без изображения указателя |
| crArrow | Стрелка |
| crcross | Крест |
| crIBeam | Указатель в виде курсора для ввода текста |
| crSize | Указатель изменения размера окна |
| crSizeNESW | Указатель изменения размера окна в правом верхнем углу или в левом нижнем |
| crSizeNS | Указатель изменения размера окна вверху или внизу (по вертикали) |
| crSizeNWSE | Указатель изменения размера окна в левом верхнем углу или в правом нижнем |
| crSizeWE | Указатель изменения размера окна слева или справа (по горизонтали) |
| crUpArrow | Стрелка вверх |
| crHourGlass | Песочные часы |
| crDrag | Перетаскивание компонента |
| crNoDrop | Указатель, показывающий невозможность переноса компонента в данную область |
| crHSplit | Горизонтальный разделитель |
| crVSplit | Вертикальный разделитель |
| crMultiDrag | Перетаскивание нескольких компонентов |
| crSQLWait | Ожидание выполнения SQL-запроса |
| crNo | Указатель, показывающий невозможность действия |
| crAppStart | Ожидание старта приложения (стрелка с песочными часами) |
| crHelp | Стрелка с вопросом |
| crHandPoint | Указатель в форме руки |

Свойство DesktopFont предназначено для определения, использует ли компонент для отображения текста шрифт Windows. Установка свойства DesktopFont в True определяет, что компонент должен применять для свойства Font изображение шрифта Windows. Этот шрифт задается свойством lconFont глобальной переменной Screen. Таким образом, всякий раз, когда будет изменяться используемый Windows шрифт, будет автоматически изменяться свойство Font для данного компонента.
Свойство DeviceType применяется для задания типа устройства мультимедиа, открываемого медиаплейером. По умолчанию значение данного свойства dtAutoSelect. Это означает, что тип устройства будет определяться по расширению файла, указанного в свойстве FileName.
Свойство Display определяет компонент окна, который будет использован мультимедийным устройством для вывода. Таким компонентом может быть форма или панель. По умолчанию значение данного свойства равно nil, это означает, что устройство создает собственное окно для вывода. Например, если мы хотим, чтобы изображение выводилось на панель Panel 1, мы можем использовать следующий код:
MediaPlayerl.Display := Panel1;
Свойство DispiayRect предназначено для задания прямоугольной области окна, определенного свойством Display, для вывода в нее изображения.
Данное cвойство игнорируется, если Display = nil. свойство DispiayRect должно задаваться только после того, как устройство мультимедиа открыто. При задании значения данного свойства обратите внимание на то, что первые два числа задают координаты левого верхнего угла изображения, а следующие два - ширину и высоту изображения, а не координаты правого нижнего угла. Например:
MediaPlayerl.DispiayRect := Rect(10,10,300,200);
Данная строка задает область вывода с координатами левого верхнего угла (10, 10) шириной изображения 300 и высотой 200 точек.
Свойство DragMode определяет поведение компонента в процессе его перетаскивания. Данное свойство может принимать одно из двух значений: automatic и dmManual. В первом случае, от разработчика не требуется обработка событий. Достаточно щелкнуть на компоненте и начать его перетаскивание. Во втором случае, компонент не может начать процесс перетаскивания, пока приложение не вызовет метод BeginDrag.
Свойство Drawingstyle применяется для задания стиля изображения. Данное свойство может принимать следующие значения:
- dsFocused - изображение на 25% смешивается с цветом, указанным в свойстве BlendColor. Данное значение влияет только на те изображения, которые содержат маску;
- deselected - то же, что и dsFocused, только смешивание происходит на 50%;
- dsNormal - изображение рисуется цветом, указанным в свойстве BkColor. Если BkCoior равно ciNone, то изображение рисуется прозрачным с использованием маски;
- dsTransparent - изображение рисуется с помощью маски, независимо от свойства BkCoior.
Свойство Enabled показывает, будет ли компонент доступен пользователю во время работы приложения. Недоступный компонент (Enabled = false) отображается серым цветом. Он игнорирует события клавиатуры, мыши и таймера. Данное свойство применяется для временного ограничения доступа пользователя к компонентам. Например, если мы хотим сделать временно недоступной кнопку, нужно в свойстве Enabled кнопки установить значение false:
Buttonl.Enabled := false;
Свойство Font предназначено для установки шрифта, а также всех его атрибутов (размера, стиля, цвета и т. д.).
Свойство Groupindex применяется для описания способа объединения меню.
Свойство Handle используется для обеспечения доступа к дескриптору окна при обращении к функциям Win32 API, которые требуют дескриптор окна. Свойство Handle применяется только для чтения.
Примечание
Обращение к свойству Handle приводит к тому, что приложение создает дескриптор окна, если он не был создан ранее. Поэтому не обращайтесь к данному свойству при создании компонента или чтении его из потока.
Свойство Height применяется для задания высоты компонента.
Свойство HelpContext определяет номер, используемый в контекстно-зависимой справке. То есть задается номер страницы справки, которая будет отображаться на экране, когда пользователь нажмет клавишу <F1>.
Свойство Hint применяется для задания текста всплывающей подсказки. Оно обычно состоит из двух частей, разделяемых символом вертикальной черты (|). Например:
Buttonl.Hint := "Открыть[Выбор и открытие файла рисунка"
В данном случае, при наведении указателя мыши на кнопку Buttonl будет выдана всплывающая подсказка "Открыть", вторая часть подсказки будет выведена в специальную область, отведенную для таких подсказок, например, панель состояния. Разработчик может пользоваться только первой частью подсказки, без использования символа (|). Кроме того, для отображения всплывающих подсказок нужно дополнительно установить свойство ShowHint В true.
Свойство imageindex применяется для указания индекса изображения, появляющегося левее надписи данного раздела меню. Индексы начинают нумерацию с нуля.
Свойство lsControl определяет способ сохранения формы. Если оно равно true, то сохраняются только те свойства, которые характерны для элементов управления. Если же оно равно false, то все свойства записываются вместе с формой.
Свойство items применяется для доступа к массиву указателей, хранящихся в объекте типа TList. Свойство items имеет тип Pointer. Индексы начинают нумерацию с нуля.
Свойство Left используется для задания координаты левого края компонента. Для всех компонентов за начало координат берется левый верхний угол клиентской области родительского компонента. Для форм началом координат является левый верхний угол экрана.
Свойство List предназначено для доступа к массиву указателей объекта типа TList. Данное свойство имеет доступ только для чтения.
Свойство LockCount указывает, сколько раз была заблокирована область вывода изображения (канва) компонента для предотвращения эффектов наложения от действий различных потоков многопоточного приложения. Данное свойство доступно только для чтения.
Свойство Mode предназначено для задания режима переноса данных из одной таблицы в другую. В табл. 2.6 приведены возможные значения этого свойства.
Таблица 2.6. Возможные значения свойства Mode

| Значение свойства | Режим переноса данных |
| batAppend | Записи из источника данных переносятся в приемник, не изменяя уже существующих в приемнике данных. Таблица-приемник должна существовать до начала переноса данных |
| batUpdate | Записи из источника данных переносятся в приемник, изменяя уже существующие значения в приемнике. Новые записи в таблицу-приемник не добавляются. Таблица-приемник должна существовать до начала переноса данных |
| batAppendUpdate | Записи из источника данных переносятся в приемник, заменяя уже существующие и добавляя новые записи. Таблица-приемник должна быть создана до начала переноса данных и индексирована |
| batDelete | Записи в таблице-приемнике, которым есть соответствие в таблице-источнике, удаляются из приемника. Таблица-приемник должна быть создана до начала переноса данных и должна быть индексирована |
| batCopy | Создается копия таблицы-источника. Если до копирования таблица-приемник уже существовала, ее содержимое полностью изменяется на содержимое источника |

Свойство Name определяет имя компонента, по которому на него ссылаются другие компоненты, а также которое в дальнейшем используется разработчиком. Имя задается в процессе разработки программы и не должно изменяться во время работы программы. Delphi по умолчанию самостоятельно дает имена новым компонентам, например Button1, Button2, Labell и т. д. Рекомендуется изменять эти имена на более осмысленные.
Свойство Notify указывает, должно ли генерироваться событие onNotify после завершения вызова некоторых методов медиаплейера (open, close, Next и др.).
Свойство Parent определяет родительский компонент (родительский компонент - это не родительский объект!) контейнерного типа, в пределах которого располагается данный компонент.
Примечание
Важно различать два похожих свойства. Свойство Parent определяет родительский компонент, т. е. тот компонент, на котором располагается данный компонент. Свойство Owner определяет владельца компонента. Владелец - это компонент, который передается в качестве параметра в конструктор компонента и который владеет им. Например, форма является владельцем всех расположенных на ней компонентов (и, одновременно, родителем).
Свойство Parentctiso предназначено для определения, будет ли компонент наследовать от своего родительского компонента значение свойства ctiso.
Свойство ParentFont предназначено для определения, будет ли для данного компонента использоваться шрифт, применяемый в родительском компоненте контейнерного типа. Например, если на форме находится кнопка, то при установке у этой кнопки свойства parentFont в true приведет к тому, что надпись на кнопке будет выполнена тем шрифтом, который указан в свойстве Font формы.
Свойство ParentshowHint предназначено для включения и выключения родительского свойства showHint. Данное свойство используется для одновременного разрешения или запрещения показа всплывающих подсказок в пределах некоторой формы или компонента контейнерного типа.
Свойство Реп определяет атрибуты пера, которое используется для рисования линий. Данное свойство имеет тип треп. Свойство Реп определяет такие атрибуты, как ширину, цвет, стиль линий и режим рисования пером.
Свойство PenPos предназначено для определения положения пера на области для рисования. Значение этого свойства можно изменять вызовом метода MoveTo и другими методами. Можно непосредственно установить требуемое значение данного свойства, это будет равносильно вызову метода MoveTo.
Свойство Pitch применяется для установки ширины символов шрифта. Применяемые в Windows шрифты могут быть двух типов:
- шрифты с фиксированной шириной символа, т. е. каждый символ имеет определенную ширину, равную ширине других символов;
- шрифты с различной шириной символов. Рассмотрим возможные значения свойства Pitch:
- fpDefauit - ширина шрифта устанавливается равной значению, принимаемому по умолчанию, т. е. такой, какая описана для данного шрифта;
- fpFixed - одинаковая ширина для всех символов; - fpvariable - различная ширина символов.
Свойство Pixels предназначено для получения значения цвета точки с координатами х и Y в пределах текущей области компонента, определенной свойством clipRect. Попытка получить значение цвета точки вне области, заданной свойством ciipRect, возвращает значение -1.
Свойство shortcut предназначено для задания комбинации горячих клавиш, с помощью которых пользователь может выбрать нужный раздел меню.
Свойство showHint применяется для включения или выключения показа всплывающих подсказок при задержке указателя мыши над компонентом. Текст подсказки задается в свойстве Hint.
Свойство showing предназначено для определения, видит ли пользователь данный компонент в настоящий момент времени. При этом не учитывается, что этот компонент могут загораживать другие компоненты. Данное свойство предназначено только для чтения. Свойство showing связано со свойством visible. Если свойство visible компонента и всех его родителей (компонентов, содержащих его) равно true, то и showing равно true. Если же свойство visible компонента или какого-то из его родителей равно false, то Showing равно false.
Свойство size определяет размер используемого шрифта.
Свойство Taborder применяется для задания последовательности перехода от одного компонента формы к другому при помощи клавиши <Таb>. Нумерация осуществляется начиная с нуля. Если задать свойству Taborder компонента значение -1, то этот компонент не сможет получить фокус при помощи клавиши <Таb>. Предположим, что у нас на форме расположены три кнопки: Button1, Button2 и Button3. Для того чтобы фокус между этими кнопками передавался следующим образом: сначала активна кнопка Button2, потом Button1 и затем Button3, нужно установить свойство Taborder для кнопки Button1 равным 1, для Button2 равным 0, а для Button3 равным 2.
Свойство Tabstop применяется для указания возможности передачи фокуса на, компонент при помощи клавиши <Таb>. Если значение этого свойства равно true, то при помощи клавиши <Таb> можно передать фокус данному компоненту, в зависимости от его свойства Taborder. Если значение свойства Tabstop равно false, то независимо от свойства Taborder фокус будет невозможно передать при помощи клавиши <Таb>.
Свойство Tag применяется программистом по своему усмотрению. Тип данного свойства Longint. Разработчик может использовать свойство Tag в своих целях, помещая в него нужную информацию.
Свойство Text предназначено для задания или чтения строки текста, связанной с данным компонентом. Применяется в компонентах типа TEdit и в компонентах-списках.
Свойство TextFlags применяется для задания способа вывода текста в область вывода при помощи методов TextOut и TextRect. При задании способа вывода можно воспользоваться следующими константами:
- ETO_CLIPPED - выводится текст, размещающийся в заданной прямоугольной области;
- ETO_OPAQUE - выводится текст с непрозрачным цветом фона;
- ETO_RTLREADING - текст выводится справа налево. Доступно только для версий Windows, предназначенных для восточных стран;
- ETO_GLYPH_INDEX - текст передается непосредственно в GDI Windows. Применяется только для шрифтов TrueType.
Свойство тор предназначено для задания или чтения значения, определяющего координату верхнего края компонента.
Свойство Transparentcoior определяет прозрачный цвет при рисовании.
Свойство visible применяется для определения, будет ли виден компонент на форме во время выполнения программы. Если свойство имеет значение true, то компонент будет виден, иначе - невидим.
Свойство width используется для установки горизонтального размера компонента, а также для чтения текущего значения ширины компонента.
Методы
Методы - это процедуры или функции, принадлежащие объекту. Методы определяют поведение объекта. Для вызова метода объекта сначала записывается имя объекта, с которым ассоциирован данный метод, затем, через точку, название метода. Например:
Buttonl.Click
Вызывает метод нажатия (click) кнопки (Buttonl).
Для создания метода его нужно сначала объявить внутри описания класса или компонента, содержащего данный метод. Например:
type TMyComponent = class(TObject)
procedure DoSomething;
end;
Здесь, внутри описания нового компонента, объявляем метод DoSomething с помощью служебного слова procedure. После того как мы объявили новый метод, мы должны создать тело данного метода. Эта процедура может находиться где угодно внутри модуля, в котором был описан компонент. Например:
procedure TMyComponent.DoSomething; begin
// Здесь размещаем команды и операторы, которые должны выполняться
// при вызове метода DoSomething на выполнение
end;
Заметим, что при создании процедуры DoSomething мы должны указывать его полное имя вместе с указанием имени компонента или класса (procedure TMyComponent.DoSomething;).
Рассмотрим основные методы, которые имеются в среде Delphi.
Метод Add предназначен для добавления нового элемента в список типа TList, TstringList или Tstrings. Если список не отсортирован, то новый элемент добавляется в самый конец списка. Если список отсортирован, то новый элемент добавляется в позицию списка, определяемую сортировкой. Вызов этого метода увеличивает значение свойства Count для данного списка. При выполнении подобного метода может возникнуть исключение EListError в случае, когда список отсортирован, добавляемая строка уже присутствует в списке и для данного списка свойство Duplicates установлено В dupError..
Метод Аrc предназначен для рисования дуги окружности или эллипса. В качестве параметров метода передаются координаты четырех точек. Первые две точки (X1, YI) и (X2, Y2) определяют прямоугольник, описывающий эллипс. Следующая точка (X3, YЗ) задает начальную точку дуги, которая находится на пересечении прямой, проходящей через центр окружности или эллипса и точки (X3, YЗ). Точка (X4, Y4) фиксирует конечную точку дуги, которая находится на пересечении прямой, проходящей через центр окружности или дуги и точки (X4, Y4). Дуга рисуется против часовой стрелки от начальной до конечной точки. Для наглядности, приведем рис. 2.3.
Рис. 2.3. Координаты точек, задаваемых при вызове метода Arc
Для рис. 2.3 можно привести такой пример вызова метода Arc: Imagel.Canvas.Arc (0,0, 200,100, 200,10, 0,0);
Примечание
Если вы создаете приложение, предназначенное для работы в Windows 95, обратите внимание на суммы Х1+Х2, Y1+Y2 и X1+X2+Y1+Y2. Они не должны превышать числа 32 768.
Метод Assign применяется для копирования данных одного объекта в другой. Данный метод имеет отличие от простого присваивания: объект1 := объект2. Разница заключается в том, что при присваивании указатель на <объект-назначение> начинает указывать на <объект-источник>, а метод Assign создает новую копию объекта. После применения Assign имеется два объекта с одинаковыми данными. Если объекты разного типа, то при вызове D.Assign(S) тип D должен "знать", как скопировать в него тип s (тип s может ничего не знать о преобразовании типов). Если метод Assign не может осуществить преобразование типов, то он вызывает защищенный метод AssignTo, объявленный в классе TPersistent и перегруженный в классах, производных от него. Вызов имеет вид s.AssignTo(D). Если и метод AssignTo не может осуществить преобразование или если он не перегружен, то вызывается AssignTo класса TPersistent и генерируется исключение. Метод Assign можно применять в разных ситуациях. Хорошей иллюстрацией использования данного метода может служить копирование изображения из буфера обмена в графический компонент Timage:
Imagel.Picture.Assign (Clipboard);
и, наоборот, из компонента в буфер обмена
Clipboard.Assign (Imagel.Picture);
Примечание
Для работы с буфером обмена Windows необходимо в блок uses модуля, в котором идет работа с Clipboard, добавить ClipBrd.
Метод BeginDrag вызывается, когда начинается процесс перетаскивания компонента. Данный метод применяется только в случае, когда свойство DragMode компонента имеет значение dmManual. В случае, когда свойство имеет значение dmAutomatic, перетаскивание компонента осуществляется автоматически. Вызов метода BeginDrag обычно вставляют в обработчик события onMouseDown. Параметр immediate метода BeginDrag показывает, сразу ли после нажатия кнопки мыши указатель курсора сменит вид на тот, который определен в свойстве DragCursor, и сразу ли начнется процесс перетаскивания. В случае, когда параметр immediate имеет значение false, перетаскивание начинается только после того, как пользователь щелкнет на компоненте и сместит указатель мыши на расстояние в пять пикселов. Это удобно для того, чтобы обрабатывать щелчок на компоненте, не начиная его немедленного перетаскивания.
Метод BringToFront применяется для переноса компонента наверх в так называемой Z-последователъности. Z-последовательность определяет порядок компонентов в свойстве controls родительского оконного компонента (см. раздел "Иерархия визуальных компонентов" этой главы). Тот компонент, который расположен в Z-последовательности выше других, в случае частичного или полного перекрытия компонентов, будет виден. Таким образом, вызов метода BringToFront позволит переместить "наверх" компонент, скрытый под другими компонентами. Данный метод можно применять как к неоконным, так и к оконным компонентам. Однако все неоконные компоненты располагаются в Z-последовательности ниже оконных, поэтому в случае, когда неоконный компонент перекрыт оконным, например кнопка перекрыта компонентом типа TMето, вызов метода - BringToFront для кнопки ничего не даст.
Метод BrushCopy вызывается для копирования части изображения битовой матрицы на область вывода (канву) и замены указанного цвета в изображении на значение, установленное для кисти канвы. Данный метод сохранился от предыдущих версий Delphi и применяется только для совместимости с ними.
Метод CanFocus используется для определения, может ли данный компонент получать фокус. Этот метод возвращает значение true, если у компонента и всех его родителей свойства visible и Enabled имеют значения true.
Метод changeScale применяется для изменения масштаба компонента и всех его дочерних элементов. При вызове этого метода масштабируются такие свойства компонента, как тор, Left, width, Height. Метод ChangeScale имеет два параметра, определяющие множитель и делитель масштаба: м и о. Приведем пример использования данного метода. Допустим, мы хотим увеличить размер формы Forml в два раза, для этого зададим множитель масштаба равный двум, а делитель - единице:
Forml.ChangeScale (2,1);
При выполнении данной строки размеры формы Forml увеличатся в два раза.
Для уменьшения размеров, например, в три раза, нужно задать значение м, равное единице, а значение D, равное трем:
Forml.ChangeScale (1,3);
Метод chord применяется для рисования замкнутой фигуры, границами которой являются дуга окружности или эллипса и хорда. Параметры данного метода аналогичны параметрам метода Arc. Результатом работы метода chord могут стать фигуры, изображенные на рис. 2.4.
Рис. 2.4. Фигуры, получаемые после вызова метода Chord
Метод className применяется для определения имени типа компонента.
Метод clear предназначен для удаления всех элементов, входящих в список, или для удаления всего текста, входящего в компонент.
Примеры:
ListBoxl.Clear; Memol.Clear;
Метод Clear можно применять и к объекту Clipboard. вызов метода Clear для буфера обмена удалит все содержимое буфера.
Метод click служит для вызова обработчика события Onciick для данного компонента. Применяется для имитации нажатия левой кнопки мыши над объектом. Например, для вызова обработчика события Onciick кнопки Buttoni можно проделать следующее:
Button1.Click;
Метод clientloScreen применяется для преобразования координат клиентской области компонента в координаты экрана. Началом координат клиентской области является левый верхний угол клиентской области компонента. Началом координат экрана - левый верхний угол экрана. Для обратного преобразования координат можно использовать метод ScreenTodient.
Метод containsControi определяет, каким наследником (прямым или косвенным) является данный компонент по отношению к какому-либо оконному компоненту. Если этот компонент прямой наследник, то метод возвращает true, иначе - false.
Метод controlAtpos предназначен для оконных компонентов. Он применяется для того, чтобы определить, какой дочерний компонент находится в позиции с координатами, задаваемыми параметром POS. В случае, если в заданной позиции нет ни одного дочернего компонента, метод ControiAtpos возвращает в качестве результата значение nil. Второй параметр AllowDisabled определяет, нужно ли учитывать при вызове метода те компоненты, которые отключены ( которые Disabled = true).
Метод copyRect применяется для копирования прямоугольной части изображения с одной канвы на другую. Копирование осуществляется в том режиме, который определен свойством copyMode.
Метод Delete применяется по отношению к таким компонентам, как TList, TStringList, TStrings и TMenuitem. Данный метод вызывается при необходи-мости удаления какого-либо элемента из списка. В качестве параметра этого метода передается число, определяющее индекс удаляемого элемента. Нумерация элементов начинается с нуля. При удалении пункта меню, содержащего подменю, удаляется и данный пункт, и его подменю.
Примечание
Обратите внимание на то, что при удалении элемента списка происходит перестроение данного списка. То есть, если вы удалили третий элемент, то после его удаления на место третьего элемента будет поставлен четвертый. Таким образом, пустых мест в списках не бывает.
Метод Destroy применяется для вызова деструктора объекта. То есть вызов данного метода уничтожает объект и освобождает занимаемую память.
Примечание
Не рекомендуется вызывать непосредственно метод Destroy для уничтожения объекта. Для этих целей лучше использовать метод Free, он проверяет, не была ли уже раньше освобождена занимаемая объектом память, после чего вызовет метод Destroy. Более того, метод Free генерирует меньший код. Для уничтожения форм используйте метод Release.
Метод DisabieAiign применяется для временного запрета выравнивания дочерних компонентов оконного компонента. Обратное действие можно получить, ВОСПОЛЬЗОВаВШИСЬ МеТОДОМ EnableAlign.
Метод Dormant служит для создания битовой матрицы в оперативной памяти для освобождения дескриптора матрицы. Применение данного метода позволяет сократить расходы ресурсов GDI, которые используются приложением. Приведем пример (листинг 2.1).
Листинг 2.1
// Загрузка картинки в Bitmapl
Bitmapl.LoadFromFile ('mypicture.bmp');
// Копирование в Bitmap2 из Bitmapl
Bitmap2.Assign (Bitmapl);
// Применение метода Dormant и освобождение ресурсов GDI
Bitmap2.Dormant;
Метод Draw применяется для рисования изображения, хранящегося в объекте, который определен параметром Graphic, в координаты, задаваемые параметрами х и У. Изображение может быть либо битовой матрицей, либо пиктограммой, либо метафайлом. Например:
Imagel.Canvas.Draw (10, 10, Image2.Picture.Bitmap);
Таким образом, в координаты 10, 10 канвы картинки image1 будет занесен рисунок из канвы картинки Image2.
Метод DrawFocusRect предназначен для рисования прямоугольника с помощью булевой операции XOR. То есть повторное рисование такого же прямоугольника на том же месте удалит этот прямоугольник. Пример:
Imagel.Canvas.DrawFocusRect (Rect (0,0,30,30);
Метод Ellipse служит для рисования окружности или эллипса. Параметры - точки (X1, YI) и (X2, Y2) определяют прямоугольник, в который вписан эллипс.
Метод Error вызывается при необходимости генерации исключения при работе с объектом типа TList. Вызов данного метода дает лучший результат по сравнению с командой Raise. Примером вызова этого метода может служить следующая строка:
List.Error ("Ошибка в элементе %и списка List', I);
Выполнение данной строки вызовет сообщение об ошибке в какой-либо строке списка.
Метод Exchange предназначен для обмена местами двух элементов списка. Позиции этих двух элементов задаются параметрами index1 и index2.
Примечание
Не используйте метод Exchange для отсортированных списков - это может нарушить упорядоченность списков.
Метод Expand служит для увеличения емкости списка типа TList. Вызов данного метода приводит к выделению дополнительной памяти для быстрого добавления новых элементов списка. В случае когда при вызове данного метода список не заполнен, то его емкость не изменяется, иначе - увеличивается.
Метод FiliRect применяется для заполнения указанного прямоугольника канвы цветом, определенным значением свойства Brush. Например, приведенный ниже код заполняет всю область канвы компонента image1 фоновым цветом, определенным свойством Brush:
with Image1.Canvas do FiliRect (Rect (0, 0, Width, Height));
Метод FindNextControl применяется для определения следующего за указанным в параметре curControl дочернего оконного компонента, соответствующего последовательности табуляции. Если в качестве параметра выступает не дочерний элемент данного оконного компонента, то метод возвращает первый в последовательности табуляции компонент. Второй параметр GoForward определяет направление- поиска компонента. Если этот параметр имеет значение true, то ищется следующий компонент, иначе - предыдущий. Еще один параметр checkTabstop - указывает, будут ли при поиске учитываться компоненты, в которых свойство Tabstop установлено в false. Если значение данного параметра равно true, то такие компоненты не учитываются, иначе - учитываются. Последний параметр checkParent применяется для того, чтобы указывать, учитывать ли при поиске только те компоненты, которые являются прямыми потомками данного оконного компонента. Если этот параметр равен false, то просматриваются все компоненты, иначе - только прямые потомки.
Метод First возвращает первый элемент списка типа TList.
Метод FloodFill применяется для закрашивания замкнутой области канвы произвольной формы каким-либо цветом. В качестве параметров данного метода выступают: начальная точка закрашивания, цвет и стиль заполнения. Начальная точка закрашивания (х, у) должна находиться внутри закрашиваемой области. Два других параметра применяются для задания границы этой области. Параметр color служит для указания цвета, который является границей закрашивания. Параметр Fillstyle может иметь два значения. Если он равен fsSurface, то происходит закрашивание именно той области, которая окрашена цветом Color, а на других цветах закрашивание не происходит. Если же параметр Fiiistyie имеет значение fsBorder, то заполняется область, в которой могут присутствовать любые цвета, кроме color, который является цветом границы закрашивания.
Метод Focused используется для определения, является ли в настоящий момент времени оконный компонент активным. Метод возвращает значение true, если фокус принадлежит данному оконному компоненту, иначе - false.
Метод FrameRect предназначен для рисования на канве прямоугольной рамки. Данный метод использует установки текущей кисти (Brush). Толщина рамки равна одному пикселу. Внутренняя часть рамки не заполняется никаким цветом. В качестве примера, приведем код, который рисует на канве компонента imagei красную прямоугольную рамку:
with Imagei.Canvas do begin
Brush.Color := clRed;
FrameRect ( Rect (10,10,150,100));
end;
Метод Free применяется для вызова деструктора объекта. Этот метод проверяет, не была ли уже ранее высвобождена память, предназначенная для данного объекта, после чего вызывает метод Destroy.
Метод GetTabOrderList предназначен для построения списка типа TList дочерних оконных компонентов, расположенных в последовательности табуляции. Свойство Tabstop во внимание не принимается. В список входят как прямые, так и косвенные потомки данного оконного компонента.
Метод HandleAl located предназначен для проверки наличия дескриптора окна у данного компонента. В случае, когда дескриптор окна есть, метод возвращает значение true. Данный метод удобно применять, если нет необходимости создавать дескриптор окна компоненту, у которого его нет. Непосредственная проверка свойства Handle компонента приводит к созданию дескриптора окна.
Метод HandleNeeded применяется для создания дескриптора окна для компонента, у которого его не было. При работе метод вызывает сначала метод createHandle у родительского компонента, а затем создает дескриптор для данного компонента.
Метод Hide применяется для.того, чтобы сделать компонент невидимым. Вызов этого метода равносилен команде Component.Visible := false;
Если данный компонент является оконным и содержит в себе другие компоненты, то эти компоненты также становятся невидимыми.
Примечание
Обратите внимание на тот факт, что хотя компонент является невидимым, все его свойства и методы остаются доступными.
Метод indexof -применяется для определения индекса первого вхождения в компонент типа TList данного элемента. Если такого элемента в списке нет, метод возвращает значение -1.
Метод insert предназначен для вставки нового элемента списка в заданную позицию. Единственный параметр данного метода index показывает, в какую именно позицию будет вставлен новый элемент списка. При вставке нового элемента все последующие элементы сдвигаются (их индексы увеличиваются на единицу). В случае, когда происходит попытка вставить новый элемент в отсортированный список, генерируется исключение EListError. Тогда лучше использовать метод Add.
Метод invalidate применяется для полной перерисовки компонента, когда с компонентом произошли какие-либо визуальные изменения.
Метод Last возвращает значение, равное последнему указателю списка типа TList, равное значению Count -i.
Метод LineTo применяется для рисования на канве объекта прямой линии. Начало линии совпадает с текущим значением координат пера (penPos) и заканчивающейся в точке с координатами (х, Y), за исключением самой точки, которые передаются в качестве параметров метода.
Метод LoadFromClipboardFormat применяется для загрузки изображения в графический компонент из буфера обмена в формате Windows Clipboard.
Метод LoadFromFiie предназначен для загрузки изображения в графический компонент из файла, задаваемого параметром FileName. Если данный графический файл по каким-либо причинам не может быть загружен (несоответствие типов, незарегистрированный графический формат файла), то генерируется, исключение EInvalidGraphic.
Метод LoadFromstream позволяет загружать графическое изображение из потока, задаваемого параметром stream. Данный метод может использоваться при загрузке, например, графических полей в наборе данных из объекта типа TBlobStream.
Метод Lock применяется для блокировки канвы компонента и запрету рисования на ней из других потоков многопоточного приложения. Обратный результат достигается при помощи метода unlock. При многократном вызове метода Lock будет увеличиваться свойство Lockcount, в котором фиксируется количество блокировок. Канва будет недоступной из других потоков, пока не снимется последняя блокировка. Если вы не хотите использовать многократную блокировку, можно воспользоваться методом TryLock. После блокирования канвы общая производительность приложения может существенно снизиться.
Метод Mask применяется для преобразования цветного изображения в черно-белую маску. В результате замены цвет Transparentcoior переходит в белый, а все остальные цвета в черный.
Метод Move предназначен для перемещения элемента списка, находящегося в позиции, задаваемой параметром Curindex в позицию, задаваемую параметром Newlndex.
Метод MoveTo применяется для изменения текущей позиции пера (Penpos) в заданную параметрами (х, у). При перемещении пера на канве ничего не рисуется. Данный метод аналогичен прямой установке координат пера в свойстве penPos.
Метод OpenBit предназначен для возврата индекса первого элемента массива типа TBits, имеющего значение false.
Метод Pack предназначен для удаления из списка типа TList всех элементов, значение которых равно nil. После удаления происходит переиндексация всех элементов списка.
Метод Pie рисует замкнутый сегмент окружности или эллипса. Параметры данного метода аналогичны параметрам метода Arc. В результате выполнения метода pie может быть рисунок, похожий на рис. 2.5.
Рис. 2.5. Результат выполнения метода Pie
Метод Play предназначен для воспроизведения заданной последовательности кадров видеоклипа типа AVI. Параметры данного метода: FromFrame, ToFrame и count. Первый параметр задает начальный кадр клипа, второй - конечный кадр клипа, а третий - количество повторений показа данных кадров. В случае, когда count равен нулю, клип будет повторяться до тех пор, пока не будет выполнен метод stop.
Метод Polygon рисует на канве многоугольник по заданному множеству точек, определенных массивом Points, причем первая точка соединяется с последней, после чего многоугольник закрашивается цветом, определенным свойством кисти Brush. Например:
Imagel.Canvas.Polygon ( [ Point (10, 10), Point (30,10),
Point (130, 30), Point (240, 120) ]) ;
Вышеприведенный код рисует на канве компонента image1 закрашенный четырехугольник, координаты которого заданы непосредственно.
Метод PolyLine рисует на канве незамкнутый многоугольник, т. е. кусочно-линейную кривую. Основное отличие этого метода от метода Polygon заключается в том, что PolyLine не соединяет первую и последнюю точки массива Points.
Метод Rectangle предназначен для рисования на канве прямоугольника. В качестве параметров метода передаются координаты двух точек: верхнего левого и правого нижнего углов прямоугольника. Прямоугольник рисуется текущим пером Реп и закрашивается цветом, определенным в свойстве Brush.
Примечание
Для рисования прямоугольника без рамки используйте метод FillRect, а для рисования прямоугольника со скругленными углами - метод RoundRect. Чтобы нарисовать незакрашенный прямоугольник, вызовите метод FrameRect.
Метод Refresh служит для немедленной перерисовки изображения компонента. Данный метод вызывает метод Repaint.
Метод Remove предназначен для удаления элемента со значением равным параметру item из списка типа TList. Данный метод удобно использовать, когда неизвестен индекс удаляемого элемента, а известно лишь его значение. В противном случае можно применять метод Delete.
Метод Repaint применяется для перерисовки изображения компонента. Данный метод можно применять вместо Refresh. Метод Repaint вызывает сначала метод invalidate, а затем update.
Метод RoundRect служит для рисования прямоугольника со скругленными углами. Прямоугольник закрашивается цветом, установленным в свойстве Brush. Два параметра (X1, Y1) и (Х2, Y2) задают координаты углов прямоугольника (как в методе Rectangle). Два других параметра X3 и YЗ задают эллипс с шириной X3 и высотой XЗ. Углы прямоугольника скругляются с помощью данного эллипса.
Метод saveToclipboardFormat применяется для создания копии изображения в формате Windows Clipboard и передачи его в буфер обмена Windows. Однако записать изображение в буфер обмена можно гораздо проще: воспользовавшись методом Assign.
Метод saveToFile сохраняет графическое изображение в файл, задаваемый параметром FileName.
Метод SaveToStream сохраняет графическое изображение в потоке, задаваемом параметром stream.
Метод ScreenTociient служит для преобразования координат экранной области в координаты клиентской части данного компонента.
Метод ScroilBy предназначен для сдвига содержимого данного оконного компонента (включая все его дочерние компоненты). Два параметра Deltax и DeltaY, задают, соответственно, сдвиг по горизонтали и по вертикали. Положительные значения задают сдвиг вправо и вниз, отрицательные - влево и вверх. Например, нижеприведенный код сдвигает содержимое формы Formi на 10 пикселов влево:
Forml.ScroilBy (-10, 0);
Метод SelectFirst предназначен для передачи фокуса компоненту, находящемуся первым в последовательности табуляции. Например, код Forml.SeiectFirst; выберет первый находящийся в последовательности табуляции компонент для формы Forml.
Метод SelectNext передает фокус следующему компоненту, расположенному в последовательности табуляции после указанного в параметре curControl. Второй параметр GoForward определяет направление поиска компонента: если он равен true, то вперед, иначе - назад. Последний параметр checkTabstop определяет, должен ли следующий компонент иметь значение true свойства TabStop.
Метод sendCancelMode предназначен для прекращения модального состояния данного компонента. Модальным состоянием называется такое состояние компонента, когда он ожидает от пользователя какого-либо действия, причем ни один другой компонент приложения не доступен. Вызов данного метода прекращает ожидание действия со стороны пользователя.
Метод sendToBack перемещает указанный компонент в самый конец Z-noследовательности. Таким образом, компонент может стать невидим из-за его перекрытия другими компонентами. Если данный компонент до вызова метода имел фокус, то он его потеряет после выполнения метода.
Метод SetBounds предназначен для одновременного изменения четырех свойств компонента: Left, Top, width и Height. Параметры, соответственно, - ALeft, ATop, AWidth и AHeight. Вызов данного метода позволяет сделать код приложения более компактным. Кроме того, перерисовка компонента произойдет здесь всего один раз, а не четыре, если бы вы изменяли последовательно эти четыре свойства.
Метод SetchiidOrder применяется для изменения позиции компонента, задаваемого параметром child, в списке дочерних компонентов данного оконного компонента. Компоненту присваивается новый индекс, задаваемый параметром order: Пример:
Forral.SetChildOrder (Buttonl, 5);
Таким образом, кнопка Buttonl будет расположена в последовательности дочерних элементов формы Form1 на шестом месте (нумерация начинается с нуля).
Метод SetFocus служит для передачи фокуса данному компоненту. Наример:
Memol.SetFocus;
Метод setzorder предназначен для перемещения данного компонента в начало или конец Z-последовательности. Если параметр TopMost имеет значение true, то компонент перемещается в начало Z-последовательности, иначе в конец.
Метод show используется для того, чтобы сделать видимым невидимый компонент. То есть метод равносилен установке свойства visible данного компонента В true.Метод sort применяется для быстрой сортировки элементов списка типа TList.
Метод stretchDraw применяется для рисования графического изображения, содержащегося в компоненте, указанном параметром Graphic в прямоугольную область канвы, указанную параметром Rect, растягивая или сжимая изображение под размер данной области. Например, нижеприведенный код уменьшает изображение, находящееся в компоненте image2 и имеющее размер больше чем 20x20 точек до размера 20x20 точек, и помещает его в компонент Image 1:
Imagel.Canvas.StretchDraw ( Rect (0,0,19,19), Image2.Picture.Bitmap);
Метод TextExtent применяется для получения и длины, и ширины текста Text, который предполагается вывести на канву данного компонента, используя текущий шрифт. Возвращаемое методом значение имеет тип TSize.
Метод TextHeight возвращает значение, равное высоте текста Text, который предполагается вывести на канву с использованием текущего шрифта.
Метод Textout предназначен для вывода строки текста, задаваемой параметром Text на канву в позицию с координатами (х, Y). Например: Imagel.Canvas.TextOut (10, 100, 'Мне нравится Delphi'); выведет строку "Мне нравится Delphi" на канву компонента image1, начиная с координаты (10, 100).
Метод TextRect похож на метод Textout за исключением того, что текст, выходящий за границы определенной прямоугольной области, урезается.
Метод Textwidth предназначен для определения длины текста Text в пикселах, который предполагается вывести на канву компонента текущим шрифтом.
Метод TryLock блокирует канву компонента, не позволяя другим потокам многопоточного приложения рисовать на ней. Данный метод возвращает значение true и устанавливает свойство LockCount в единицу, если канва не была ранее блокирована. Если канва была ранее блокирована, то метод возвращает false и не увеличивает значение свойства LockCount.
Метод unlock предназначен для разблокирования канвы компонента. Каждый вызов метода Unlock уменьшает значение свойства LockCount на единицу.
Метод update предназначен для немедленной перерисовки компонента, не ожидая завершения каких-либо других процессов.
Поля
Поле (Field) компонента (класса) - это данные, находящиеся в компоненте или классе. Можно представить поле в виде переменной, которая описывается внутри компонента или класса. Например:
type
TMyComponent = class private
FMyFieldl: char; FMyField2: real; FMyFieldS: string; FMyField4: boolean;
end;
На приведенном выше примере, внутри описания компонента TmyComponent, описываются четыре поля FMyFieldl, FMyField2, FMyFieldS И FMyField4, имеющие различный тип. Поля могут быть тех же типов, как и обычные переменные.
Примечание
При создании наследников компонента (класса) они будут наследовать все поля от своего класса предка. Например, на приведенном выше примере компонент TMyComponent будет содержать все поля своего предка - базового класса TObject, и, кроме него, дополнительные четыре поля, описанные выше. Заметим, что удалить или переопределить поля, перешедшие от класса-предка невозможно, поэтому, чем больше предков имеет компонент или класс, тем больше у него полей.
События
Можно смело утверждать, что все программирование в Windows связано с какими-либо событиями. Событием может быть движение мышью, нажатие клавиши на клавиатуре или на мыши, закрытие окна и т. д. Программисту остается лишь перехватывать эти события и писать методы, которые будут выполняться при генерации того или иного события.
Событие (event) - это механизм, который связывает системное событие с конкретным кодом, называемым обработчиком события (event handler).
Рассмотрим простой случай, когда происходит системное событие нажатия мышью кнопки на форме. С точки зрения программиста, событие - это всего лишь имя, связанное с системным событием, в нашем случае onclick, которое связано с обработчиком события. Например, кнопка Button1 имеет метод onciick. По умолчанию, Delphi генерирует обработчик события - метод Buttonlclick, связанный с событием Onciick. Программист должен добавить код, который выполняется при нажатии на кнопку Buttoni внутри метода Buttonlclick.
Итак, для наглядного представления процесса обработки рассмотрим простую схему (рис. 2.6).
Рис. 2.6. Схема обработки события
Стандартные события
Рассмотрим основные события, учитываемые компилятором Delphi. Для начала перечислим эти события:

| OnChange | OnEnter | OnMouseMove |
| OnClick | OnExit | OnPaint |
| OnDblClick | OnKeyDown | OnProgress |
| OnDragDrop | OnKeyPress | OnStartDrag |
| OnDragOver | OnKeyUp | OnMouseUp |
| OnEndDrag | OnMouseDown |  |

Рассмотрим каждое событие более подробно.
Событие onchange наступает после изменения какого-либо графического объекта. Создавайте обработчик такого события для выполнения каких-либо операций, происходящих после изменения графического объекта.
Событие onclick компонента наступает в случае, если пользователь нажал и отпустил левую кнопку мыши в тот момент, когда указатель мыши находился на компоненте. Кроме того, событие Onciick происходит в следующих случаях:
- при выборе пользователем, путем нажатия клавиш управления курсором, элемента в сетке (Grid), дереве (Tree), списке (List) или выпадающем списке (DropDown List);
- при нажатии пользователем клавиши <Пробел> или <Enter> в тот момент, когда компонент (например, кнопка) был в фокусе (component.Focused = True);
- при нажатии пользователем клавиши <Enter>, в случае, когда активная форма имеет кнопку по умолчанию;
- при нажатии пользователем клавиши <Esc>, в случае, когда активная форма имеет кнопку прерывания;
- при нажатии пользователем комбинации клавиш быстрого доступа ("горячих" клавиш) для обращения к кнопке или пункту меню. Например, в свойстве caption кнопки формы записано &пуск, при этом надпись на кнопке имеет вид Пуск. В результате, когда пользователь нажимает комбинацию клавиш <Alt>+<П>, происходит событие onclick;
- при установке приложением свойства checked переключателя RadioButton В true;
- при изменении приложением свойства Checked индикатора checkBox; - при вызове метода click элемента меню приложения.
Событие onciick возникает для формы в случае, когда пользователь щелкнул на любом месте формы, незанятом компонентами.
Событие onDblclick наступает в случае, когда пользователь дважды щелкнул левой кнопкой мыши на компоненте, причем отпустил кнопку мыши после второго щелчка над компонентом.
Примечание
К одному и тому же компоненту нельзя написать обработчики событий Onclick и OnDbiciick, поскольку первый из них всегда перехватит первый из щелчков. Событие OnStartDrag наступает, когда пользователь начинает перетаскивать компонент, т. е. нажал над компонентом левую кнопку мыши и, не отпуская ее, начал смещать курсор мыши. Событие имеет параметр Sender, содержащий наименование компонента, который должен перетаскиваться или который содержит объект перетаскивания (в случае, когда компонент является компонентом контейнерного типа).
Событие onDragDrop компонента наступает, когда пользователь отпускает перетаскиваемый компонент над компонентом. В обработчике события нужно описать, что должно происходить в момент отпускания перетаскиваемого компонента. При этом параметр source должен соответствовать перетаскиваемому компоненту, а параметр Sender - компоненту, над которым компонент будет отпущен. Кроме того, два параметра х и Y служат для хранения координат курсора мыши над компонентом. Система координат, в данном случае, соответствует клиентской части компонента.
Событие onDragOver компонента наступает, когда перетаскиваемый компонент пересекает границу данного компонента и оказывается над ним. Это событие возникает все время, пока пользователь перемещает компонент над компонентом-приемником. Как только пользователь отпускает компонент (отпускает левую кнопку мыши) происходит событие OnDragDrop, описанное выше. Для того чтобы определить, компоненты какого типа принимает данный компонент, используется параметр Accept. Если компонент способен принимать любые компоненты, то можно оставить обработчик OnDragOver пустым, но он обязательно должен присутствовать. Например:
procedure TForml.ListBox2DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean); begin
// Данный комментарий нужен, чтобы компилятор не удалил этот пустой // обработчик
end;
Во время перетаскивания компонента форма указателя мыши может изменяться. Для установки этого свойства служит свойство DragCursor компонента, на который будет переноситься другой компонент.
Приведем простой пример использования событий OnDragDrop и OnDragOver.
Для наглядного применения события OnDragDrop создадим приложение, которое позволит пользователю перетаскивать строки одного списка в другой. Итак, расположим на форме два списка ListBox: ListBoxi и ListBox2. Добавим строки в первый список путем редактирования его свойства items. Назовем строки Строка 1. . .Строка 10 (рис. 2.7).
Для простоты будем перетаскивать строки из первого списка во второй. Поменяем значение СВОЙСТВа DragMode СПИСКа ListBoxi на dmAutomatic, ЧТО обеспечит автоматическое начало перетаскивания. Теперь для второго списка (ListBox2) напишем Обработчик события OnDragOver (Листинг 2.2).
Листинг 2.2
procedure TForml.ListBox2DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := Source is TListBox;
end;
Рис. 2.7. Пример применения событий OnDragDrop и OnDragOver
В данном обработчике мы указываем, что на компонент ListBox2 можно перетаскивать компоненты типа TListBox. Затем в обработчике события OnDragDrop запишем следующий код (листинг 2.3):
Листинг 2.3
procedure TForml.ListBox2DragDrop(Sender, Source: TObject; X, У: Integer);
begin
ListBox2.Items.Add(ListBoxl.Items[ListBoxl.Itemlndex]);
end;
Таким образом, мы добавляем выбранную строку компонента ListBoxl в компонент ListBox2.
Все! Можно запускать приложение. Попробуйте перетащить любую строку из первого списка во второй.
Событие OnEndDrag - последнее из событий, которые предназначены для обработки переноса одного компонента на другой. Оно наступает при любом окончании процесса переноса, как успешного, так и неудачного (когда компонент отпущен над формой или компонентом, не способном его принять). Данное событие наступает в перетаскиваемом компоненте. Событие
OnEndDrag. может применяться для реакции приложения на перетаскивание (например, "выполнено успешно" или "неудача"). В обработчике данного события параметр Sender - это сам объект перетаскивания, а параметр Target принимает значение компонента-приемника (при успешном перетаскивании) или nil (при неудачном переносе). Приведем пример (листинг 2.4).
Листинг 2.4
procedure TForml.ComponentlEndDrag(Sender, Target: TObject; X, Y: Integer);
begin
If Target = Nil then ShowMessage('Перенесение объекта '+
(Sender as TControl).Name + ' завершилось неудачно') else
ShowMessage((Sender as TControl).Name + ' перенесен в ' + (Target as TControl).Name);
end;
Добавим код, записанный в листинге 2.3, в вышеописанное приложение. При этом код нужно поместить в обработчике события OnEndDrag для первого списка (ListBox1). В результате, при каждом успешном перетаскивании строки из первого списка во второй будет выдаваться окно-сообщение (рис. 2.8), а при неудачном - окно-сообщение, изображенное на рис. 2.9.
Рис. 2.8. Окно, выдаваемое при успешном перетаскивании строки из ListBox1 в ListBox2
Рис. 2.9. Окно, выдаваемоe при неудачном перетаскивании строки из ListBox1
Событие OnEnter происходит, когда компонент получает фокус. Данное событие не наступает при переключении между разными формами приложения или между различными приложениями. При переключении между компонентами контейнерного типа (т. е. между компонентами, которые могут размещать на себе другие компоненты, например панели) событие OnEnter наступает сначала для компонента контейнерного типа, а затем для содержащегося в нем компонента.
Событие OnExit является противоположным по отношению к OnEnter. Оно наступает в момент, когда компонент теряет фокус, т. е. когда фокус переходит к другому компоненту. Это событие также не наступает при переключении между разными формами или приложениями. В отличие от события OnEnter, событие OnExit наступает сначача для компонента, содержащегося в компоненте-контейнере, а затем для самого компонента контейнерного типа.
Приведем пример, иллюстрирующий события OnEnter и OnExit. Расположим на форме кнопку Button1 и группу переключателей RadioGroupi (рис. 2.10). Добавим в группу переключателей несколько строк (путем редактирования свойства items).
Рис. 2.10. Пример, иллюстрирующий работу событий OnEnter и OnExit
Запустим приложение. Фокус при запуске будет передан компоненту, который был размещен на форме первым (в нашем случае - это кнопка Button1). Если теперь выбрать щелчком мыши любой переключатель группы переключателей, то произойдет следующее:
И для кнопки Button1 наступит событие OnExit;
- для группы переключателей RadioGroupi - событие OnEnter;
- наконец, для выбранного переключателя из группы - событие OnEnter.
Если после этого выбрать щелчком мыши кнопку Button1, то события произойдут в таком порядке:
- для активного переключателя группы наступит событие OnExit; - для группы переключателей - событие OnExit;
- для кнопки Button1 - событие OnEnter.
Событие onKeyDown наступает, когда пользователь нажимает любую клавишу. Данное событие наступает для компонента, имеющему фокус в момент нажатия кнопки. С помощью этого события можно обрабатывать все клавиши, включая <Shift>, <Alt> и <Ctrl>. В процедуру-обработчик передаются, кроме параметра sender, такие параметры, как Key и shift. Параметр Key определяет нажатую клавишу. В случае, если нажата не алфавитно-цифровая клавиша, в параметр передается виртуальный код клавиши. Приведем таблицу кодов клавиш (табл. 2.7).
Таблица 2.7. Коды клавиш

| Клавиша | Десятичное число | Шестнадцатеричное число | Символическое имя |
| <F1> | 112 | 70 | VK F1 |
| <F2> | 113 | 71 | VK_F2 |
| <F3> | 114 | 72 | VK_F3 |
| <F4> | 115 | 73 | VK_F4 |
| <F5> | 116 | 74 | VK_F5 |
| <F6> | 117 | 75 | VK_F6 |
| <F7> | 118 | 76 | VK F7 |
| <F8> | 119 | 77 | VK_F8 |
| <F9> | 120 | 78 | VK_F9 |
| <F10> | 121 | 79 | VK F10 |
| <Пробел> | 32 | 20 | VK SPACE |
| <BackSpace> | 8 | 8 | VK_BACK |
| <Tab> | 9 | 9 | VKJTAB |
| <Enter> | 13 | OD | VK_RETURN |
| <Shift> | 16 | 10 | VK SHIFT |
| <Ctrl> | 17 | 11 | VK_CONTROL |
| <Alt> | 18 | 12 | VK_MENU- |
| <CapsLock> | 20 | 14 | VK_CAPITAL |
| <Еsc> | 27 | 1В | VK ESCAPE |
| <lnsert> | 45 | 2D | VK INSERT |
| <PageUp> | 33 | 21 | VK PRIOR |
| <PageDown> | 34 | 22 | VK_NEXT |
| <End> | 35 | 23 | VK END |
| <Home> | 36 | 24 | VK HOME |
| <Стрелка влево | 37 | 25 | VK_LEFT |
| <Стрелка вверх> | 38 | 26 | VK UP |
| <Стрелка вправо> | 39 | 27 | VK_RIGHT |
| <Стрелка вниз> | 40 | 28 | VK DOWN |
| <Delete> | 46 | 2E | VK_DELETE |
| <PrintScreen> | 44 | 2C | VKJ3NAPSHOT |
| <ScrollLock> | 145 | 91 | VK SCROLL |
| <Pause> | 19 | 13 | VK_PAUSE |
| <NumLock> | 144 | 90 | VK_NUMLOCK |

На цифровой клавиатуре, при выключенном режиме NumLock

| <0> | 96 | 60 | VK_NUMPADO |
| <1> | 97 | 61 | VK_NUMPAD1 |
| <2> | 98 | 62 | VK_NUMPAD2 |
| <3> | 99 | 63 | VK_NUMPAD3 |
| <4> | 100 | 64 | VK_NUMPAD4 |
| <5> | 101 | 65 | VKJTOMPAD5 |
| <6> | 102 | 66 | VK_NUMPAD6 |
| <7> | 103 | 67 | VK_NUMPAD7 |
| <8> | 104 | 68 | VK_NUMPAD8 |
| <9> | 105 | 69 | VK_NUMPAD9 |
| <*> | 106 | 6А | VK_MULTIPLY |
| <+> | 107 | 6В | VK_ADD |
| <-> | 109 | 6D | VK_SUBTRACT |
| <.> | 110 | 6Е | VK_DECIMAL |
| </> | 111 | 6F | VK_DIVIDE |

Данные коды не различают регистр и раскладку клавиатуры (латинская/кириллица). Параметр shift является множеством, которое может быть пустым или содержать следующие элементы:
- ssshift - при нажатой клавише <Shift>;
- ssAlt - при нажатой клавише <Alt>;
- ssctrl - при нажатой клавише <Ctrl>.
Приведем пример использования события OnKeyDown. Предположим, что нам необходимо распознать, когда пользователь нажмет комбинацию клавиш <Ctrl>+<Shift>+<L>. В обработчике события OnKeyDown напишем следующий код:
if ((Key = ord CL1)) and (ssShift in Shift) and (ssCtrl in Shift)) then ShowMessage ('Нажата комбинация клавиш <Ctrl>+<Shift>+<L>');
В вышеприведенном примере мы использовали функцию ord (), которая позволяет по символу клавиши получить код клавиши (в нашем случае, код клавиши <L>). Теперь, всякий раз, когда фокус будет у компонента, к которому привязан данный обработчик, и когда пользователь нажмет комбинацию клавиш <Ctrl>+<Shift>+<L>, будет выводиться окно (рис. 2.11).
Рис. 2.11. Окно, появляющееся при обработке события OnKeyDown
Событие onKeypress наступает при нажатии пользователем символьной клавиши. Данное событие имеет параметр Key, который содержит символ нажатой клавиши и имеет тип char. При этом различаются символы верхнего и нижнего регистров, а также раскладка клавиатуры.
Примечание
С помощью события OnKeyPress невозможно обработать нажатие функциональных клавиш и клавиш <Shift>, <Ctrl> и <Alt>. Таким образом, когда вы нажимаете комбинацию клавиш <Shift>+<b>, в параметр Key события OnKeyPress поступит значение "В", клавиша <Shift> только поменяет регистр символа. При нажатии комбинации клавиш, включающих клавишу <Alt>, событие OnKeyPress при нажатии комбинации клавиш <АИ>+<любая символьная клавиша> не наступает. При нажатой комбинации клавиш <С1г1>+<любая символьная клавиша> событие OnKeyPress наступает, но в параметр Key ничего не передается.
Событие OnKeyUp происходит при отпускании пользователем любой ранее нажатой клавиши. Данное событие позволяет обрабатывать все клавиши, как и событие OnKeyDown. По своим параметрам и поведению событие OnKeyUp равносильно событию OnKeyDown.
Событие onMouseDown наступает при нажатии пользователем любой кнопки мыши в тот момент, когда указатель мыши находится над компонентом. Данное событие имеет параметры Button, shift, x и Y. Параметр Button определяет, какая кнопка мыши нажата:
- mbLeft - левая кнопка; - mbMiddle - средняя кнопка; - mbRight - правая кнопка.
Параметр shift равносилен параметру shift для событий, связанных с обработкой клавиатуры. Таким образом, можно обрабатывать нажатие любой кнопки мыши одновременно с клавишами <Shift>, <Ctrl> или <Alt>.
Параметры х и Y содержат координаты указателя мыши в области компонента.
Событие onMouseUp наступает, когда пользователь отпускает любую кнопку мыши над компонентом. По своим функциям и параметрам данное событие аналогично событию onMouseDown.
Событие onMouseMove наступает при перемещении указателя мыши над компонентом. Это событие возникает'независимо от того, нажаты какие-либо клавиши мыши или нет.
Примечание
При нажатой левой кнопке мыши данное событие не возникает. Эта особенность почему-то не документирована.
Данное событие имеет следующие параметры: shift, х и Y, аналогичные вышеописанным.
Событие onPaint. наступает, когда приложение получает сообщение Windows о необходимости перерисовки испорченного изображения. Изображение может испортиться от перекрытия окон одного или нескольких приложений. В обработчик данного события программист должен разместить процедуру, выполняющую перерисовку изображения. Например, если на форме был размещен рисунок, хранящийся в компоненте BitMap, тогда можно использовать следующий обработчик события OnPaint для перерисовки изображения:
Canvas.Draw (О, О, BitMap);
Событие OnProgress наступает при прохождении медленных процессов, связанных с изменением графического изображения. Данное событие позволяет строить индикаторы хода выполнения процесса. Событие OnProgress имеет следующие параметры: stage, PercentDone, RedrawNow, R и Msg. Параметр stage предназначен для указания стадии прогресса (начало, продолжение, окончание) и может принимать значения psstarting (начало), psRunning (продолжение), psEnding (окончание). Параметр PercentDone показывает, какая часть процесса выполнена. Параметр RedrawNow говорит, может ли в настоящий момент изображение успешно отобразиться на экране. Параметр R служит для указания области изображения, которая изменена и требует перерисовки. Наконец, параметр Msg служит для отображения сообщений о ходе процесса. Этот параметр имеет строковый тип. Параметр Msg может быть пустым.
Иерархия визуальных компонентов
Рассмотрим иерархию классов Delphi, частью которой является и VCL (рис. 2.12).
Рис. 2.12. Иерархия классов Delphi
Как мы уже знаем, все классы, и компоненты в том числе, являются прямыми или косвенными потомками класса TObject. Класс TObject инкапсулирует небольшой набор обычных для всех классов методов:
- способность создания, поддержки и уничтожения экземпляра класса с выделением, инициализацией и освобождением оперативной памяти для данного экземпляра класса;
- предоставление информации об экземпляре класса и информации о типе времени выполнения (RTTI);
- поддержка обработки сообщений;
- поддержка интерфейсов, осуществляющих экземпляр класса.
Следующий базовый класс, являющийся прямым потомком TObject - класс TPersistent. Данный класс является предком для всех классов, предназначенных для работы с потоками. Класс TPersistent наследует все свойства и методы своего предка - класса TObject, и может, кроме того, считывать данные из потока и записывать их в поток. Класс TPersistent обеспечивает:
- определения процедур для загрузки и помещения данных в поток;
- назначение свойствам экземпляра класса конкретных значений;
- средства для передачи содержимого одного экземпляра класса другому.
- отомком класса TPersistent является класс TComponent - базовый класс всех компонентов визуальной библиотеки компонентов (VCL) Delphi. Наследники класса Tcomponent, как и сам класс имеют следующие возможности:
- способность отображаться на палитре компонентов Delphi, а также способность размещения на форме;
- способность быть обладателем иных компонентов и управлять другими компонентами;
- способность быть преобразованным в элемент управления ActiveX или объект СОМ с помощью мастера (Wizard).
Следующий класс - потомок вышеописанного класса TComponent - класс Tcontrol. Класс TControl является базовым классом для всех визуальных компонентов, т. е. потомки этого класса будут видны и доступны пользователю во время выполнения приложения. Все классы, являющиеся потомками TControl, имеют свойства, методы и события, которые определяют особенности данного класса, например положение компонента на экране, размер и т. д.
Нам осталось рассмотреть еще два класса, которые являются потомками класса TControl.
Первый из этих классов - класс TGraphicControl. Данный класс предназначен для создания визуальных компонентов, которые не являются окнами, т. е. не могут содержать в себе других компонентов и получать фокус ввода. Главное предназначение данного класса - способность отображать графику или текст на компоненте. Примерами потомков класса TGraphicControl могут выступать такие компоненты, Как TBevel, TImage, TSpeedButton И Др.
Класс TGraphicControl передает своим потомкам свойство canvas, позволяющее получать доступ к поверхности компонента, на которой можно рисовать или писать. Кроме того, класс TGraphicControl передает своим потомкам метод Paint. Так как графический компонент - потомок TGraphicControl не нуждается в идентификаторе окна Windows, данный компонент требует немного ресурсов, и использование графического компонента занимает меньше времени, чем оконного компонента Twincontrol.
Второй из этих классов - класс Twincontroi. Данный класс является базовым классом для всех оконных визуальных компонентов. Оконный визуальный компонент - это компонент, который:
- может получать фокус ввода во время выполнения приложения;
- может содержать в себе другие компоненты. Компонент, который содержит в себе другие компоненты, называется родительским (parent). Компонент, содержащийся в другом компоненте, называется дочерним (child);
- имеет идентификатор окна Windows (handle). Каждый оконный компонент обрабатывается непосредственно операционной системой, поэтому ему назначается свой уникальный идентификатор.
Примерами оконных компонентов являются TButtonControl, TCustomEdit и др.
Типы времени выполнения (RTTI)
Информация о типе во время выполнения (Runtime Type Information, RTTI) - это способность среды Delphi предоставлять приложению информацию об объектах во время выполнения приложения. Так как все объекты Delphi являются потомками класса TObject, то все они содержат указатель на информацию о типе, а также методы для работы с этой информацией. В приведенной ниже табл. 2.8 приведены некоторые из этих методов.
Таблица 2.8. Методы для работы с RTTI

| Название метода | Тип возвращаемого результата | Результат |
| Classlnfo | Pointer | Указатель на информацию о типе объекта |
| ClassName | String | Имя класса объекта |
| ClassParent | Tclass | Тип класса-предка объекта |
| ClassType | Tclass | Тип объекта |
| InheritsFrom | Boolean | Является ли объект потомком данного класса |
| InstanceSize | Word | Размер объекта, как экземпляра класса, в байтах |

Для работы с информацией о типе времени исполнения в Delphi имеется два основных оператора: is и as. Первый применяется для сравнения типов, второй - для преобразования типов времени выполнения.
Информация о типе времени выполнения используется в Delphi в основном для определения, с объектом какого типа работает сейчас приложение. Рассмотрим пример использования информации RTTI. Разместим на новой форме несколько различных компонентов. Предположим, что в какой-то момент во время работы приложения нам необходимо отключить все кнопки, расположенные на форме. Для реализации этого можно пройтись по всем компонентам формы, узнать их тип, и если это тип TButton, то задать свойству Enabled данного компонента значение false. Код для этого примера приведен на листинге 2.5.
Листинг 2.5
for i:=0 to ComponentCount-1 do
if Components[i] is TButton then
TButton(Components[i]).Enabled:=false;
В данном примере мы используем оператор is для определения типа компонента. Теперь рассмотрим пример использования оператора as. Код, представленный на листинге 2.6, отключает все компоненты, которые произошли от одного предка TControi.
Листинг 2.6
for i:=0 to ComponentCount-1 do
(Sender as TControi).Enabled:=false;

Глава 5 Содержание Глава 7