Интернет

Стандартные компоненты Delphi. Где найти свойства

Стандартные компоненты Delphi. Где найти свойства

Ранее в наших классах существовали только поля и методы. Поля выполняют функцию хранения каких-либо данных, а методы позволяют обрабатывать эти данные, хранящиеся в полях. Но достаточно часто возникает потребность в том, чтобы иметь возможность контролируемого присвоения данных в поля, с возможностью предварительной обработки присваиваемых значений, а также полезна была бы возможность предварительной обработки возвращаемых значений из поля. Как раз для этих целей и были придуманы свойства (property).
Попробуем понять принципы их работы, и зачем, собственно, они нам нужны. И как всегда сразу же обратимся к примеру:
type
TTriangle = class
public
a, b, c: double;

function Square: double;
function Perimeter: double;


end;
Перед вами пример достаточно простого класса «треугольник». Он содержит три поля с соответствующими сторонами и два метода, которые позволяют найти площадь и периметр этого треугольника. В прошлых уроках мы редко рассматривали примеры реализации методов, давайте исправим это недоразумение. Перед вами реализация методов TTriangle.Square и TTriangle.Perimeter, хотя я думаю, что вы и так прекрасно понимаете как можно найти площадь и, тем более, периметр треугольника, зная его стороны.
function TTriangle.Square: double;
var
p: double; // Полупериметр, пригодится в вычислениях
begin
// Находим площадь треугольника по формуле Герона
p:= (a + b + c) / 2;
result:= sqrt(p*(p-a)*(p-b)*(p-c));
end;

function TTriangle.Perimeter: double;
begin
result:= a + b + c;
end;

// Конструктор тоже будет выглядеть очень просто:
constructor TTriangle.Create(NewA, NewB, NewC: double);
begin
a:= NewA;
b:= NewB;
c:= NewC;
end;
Все правда совсем просто и не нуждается в дополнительных комментариях.
Но теперь перед нами стоит задача сделать так, чтобы была возможность устанавливать значения сторон треугольника, присваивая ему периметр. Т.к. мы еще не знакомы со свойствами, то реализуем еще один метод, который будет присваивать поля a, b и c в зависимости от переданного ему значения периметра:
type
TTriangle = class
public
a, b, c: double;

function Square: double;
function GetPerimeter: double; // Переименуем метод «Perimeter», так будет звучать логичнее

constructor Create(NewA, NewB, NewC: double);
end;

procedure TTriangle.SetPerimeter(Value: double);
begin
a:= Value / 3;
b:= Value / 3;
c:= Value / 3;
end;
Для того, чтобы объединить такие методы GetPerimeter и SetPerimeter в единую структуру, и были придуманы свойства (property). Объявляются они так же как и поля или методы внутри класса, их синтаксис выглядит так:
property {Название свойства}: {Тип данных} read {Getter} write {Setter};
С названием свойства и типов данных все понятно — на их месте мы напишем Perimeter и double соответственно. А вот про Getter и Setter нужно поговорить немного подробнее.
Getter — Название метода (обязательно функция) или поля данного класса, которое будет возвращать значение при попытке получить значение от данного property. В случае использования метода — значение будет возвращаться методом-функцией, в случае поля — значение будет доставаться из поля. Используемый метод или поле должны обязательно существовать в классе, иметь описание и реализацию. Тип возвращаемый методом или полем должен обязательно соответствовать типу, указанному в объявлении property в классе.
В случае с реализацией метода в качестве Getter`а появляется возможность каким-то образом модифицировать возвращаемые данные, производить дополнительную обработку или совершить какие-либо изменения в самом экземпляре объекта, т.к. Getter в этом случае — это обыкновенный метод. Главное, чтобы он возвращал значение, как и обычная процедура.
Setter — Название метода-процедуры данного класса, которая будет устанавливать значение, переданное ей в качестве единственного параметра Value, в какое-либо существующее поле. Само присвоение может быть реализовано любым образом, оно описывается в этом методе по усмотрению программиста. А сам метод должен обязательно содержать единственный параметр с именем Value и с типом, который соответствует типу property. Setter позволяет, например, предварительно преобразовать данные, прежде чем их куда-то присваивать, хотя их даже присваивать куда-то необязательно. Все зависит от цели использования property. Возможно setter просто производит какие-то взаимодействия с полями класса, и эти взаимодействия как-то зависят от переданных в property данных.
Наверное, вы уже догадались, для чего мы реализовывали методы TTriangle.GetPerimeter и TTriangle.SetPerimeter, потому что они являются самыми классическими примерами Getter`а и Setter`а. Метод GetPerimeter отвечает за возврат значения периметра во внешний код при обращении, а SetPerimeter устанавливает периметр треугольника, имея при этом параметр Value, поделенное на три значение которого затем присваивает сторонам треугольника. Посмотрим, как же будет выглядеть наше свойство (property):
TTriangle = class
private
function GetPerimeter: double;
procedure SetPerimeter(Value: double);
public
a, b, c: double;

property Perimeter: double read GetPerimeter write SetPerimeter;

function Square: double;

constructor Create(NewA, NewB, NewC: double);
end;
Вот и все, наш property успешно создан!
Прошу обратить внимание на то, что свойства объявляются после объявления полей и перед объявлением методов! И да, почему же наши методы GetPerimeter и SetPerimeter, являющиеся Getter`ом и Setter`ом для свойства Perimeter, мы поместили в область доступа private? А затем, что теперь доступ нам к этим методам из внешнего кода не понадобится, их функциональные возможности теперь можно использовать посредством свойства Perimeter. Их можно и даже нужно скрыть. А нужно их скрыть еще и потому, что при объявлении свойства требуется, чтобы используемые при этом поля и методы были объявлены ранее. А т.к. методы нельзя объявлять перед property (они объявляются после всех property), то удобнее будет поместить группу доступа private выше группы доступа public. Хотя этот побочный эффект можно обойти, но в нашем случае этого делать не нужно.
Рассмотрим простой пример работы с новым классом и нашим первым свойством:
procedure TForm1.FormCreate(Sender: TObject);
var
t: TTriangle;
begin
t:= TTriangle.Create(10, 11, 12);
t.Perimeter:= 30; // Присваиваем периметр посредством property.
// Соответственно будет выполнен Setter (SetPerimeter) и присвоено значение сторонам треугольника
ShowMessage(‘Стороны треугольника: ‘+FloatToStr(t.a)+’;’+FloatToStr(t.b)+’;’+FloatToStr(t.c)+’ Периметр: ‘+FloatToStr(t.Perimeter));
// Здесь мы опять обращаемся к property Perimeter, это свойство вызывает Getter GetPerimeter, которое и возвращает нам значение
end;

Работа над новым проектом , так в Delphi называется разрабатываемое приложение, начинается с создания стартовой формы проекта Delphi .

На этапе разработки программы, на языке программирования Delphi, диалоговые окна называют формами проекта Delphi .

Стартовая форма проекта Delphi создается путем изменения значений свойств формы Form1 и добавления к форме необходимых компонентов (полей ввода и вывода текста, командных кнопок).

Свойства формы проекта Delphi (таблица 1) определяют ее внешний вид: размер, положение на экране, текст заголовка, вид рамки.

Для просмотра и изменения значений свойств формы, создаваемой на языке программирования Delphi, и ее компонентов используется окно Object Inspector . В верхней части окна Object Inspector указано имя объекта, значения свойств которого отображается в данный момент. В левой колонке вкладки Properties (Свойства) перечислены свойства объекта, а в правой - указаны их значения.

Таблица 1. Свойства формы Delphi

Свойство Описание
Name Имя формы. В программе имя формы используется для управления формой и доступа к компонентам формы
Caption Текст заголовка
Width Ширина формы
Height Высота формы
Top Расстояние от верхней границы формы до верхней границы экрана
Lef Расстояние от левой границы формы до левой границы экрана
BorderStyle Вид границы. Граница может быть обычной (bizizeable ), тонкой (bisingle ) или отсутствовать (biNone ). Если у окна обычная граница, то во время работы программы пользователь может при помощи мыши изменить размер окна. Изменить размер окна с тонкой границей нельзя. Если граница отсутствует, то на экран во время работы программы будет выведено окно без заголовка. Положение и размер такого окна во время работы программы изменить нельзя
Bordericons Кнопки управления окном. Значение свойства определяет, какие кнопки управления окном будут доступны пользователю во время работы программы. Значение свойства задается путем присвоения значений уточняющим свойствам biSystemMenu , biMinimaze , biMaximaze и biHelp . Свойство biSystemMenu определяет доступность кнопки Свернуть и кнопки системного меню , biMinimaze - кнопки Свернуть , biMaximaze - кнопки Развернуть , biHelp - кнопки вывода справочной информации
Icon Значок в заголовке диалогового окна, обозначающий кнопку вывода системного меню
Color Цвет фона. Цвет можно задать, указав название цвета или привязку к текущей цветовой схеме операционной системы. Во втором случае цвет определяется текущей цветовой схемой, выбранным компонентом привязки и меняется при изменении цветовой схемы операционной системы
Font Шрифт. Шрифт, используемый "по умолчанию" компонентами, находящимися на поверхности формы. Изменение свойства Font формы приводит к автоматическому изменению свойства Font компонента, располагающегося на поверхности формы. То есть компоненты наследуют свойство Font от формы (имеется возможность запретить наследование)

При создании формы проекта Delphi в первую очередь следует изменить значение свойства Caption (Заголовок). В нашем первом проекте, созданном на Delphi надо заменить текст Form1 на "Скорость бега ". Чтобы это сделать, нужно в окне Object Inspector щелкнуть мышью в строке Caption , в результате чего будет выделено текущее значение свойства, в строке появится курсор, и можно будет ввести текст "Скорость бега " (рисунок 7).

Рисунок 7. Изменение значение свойств Caption на Delphi

Аналогичным образом можно установить значения свойств Height и Width , которые определяют высоту и ширину формы. Этим свойствам надо присвоить значения 250 и 330, соответственно.

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

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

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

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

Некоторые свойства являются сложными, т. е. их значение определяется совокупностью значений других (уточняющих) свойств. Перед именами сложных свойств стоит значок "+", при щелчке на котором раскрывается список уточняющих свойств (рисунок 9). Например, свойство Bordericons определяет, какие кнопки управления окном будут доступны во время работы программы. Так, если свойству biMaximize присвоить значение false, то во время работы программы кнопки Развернуть в заголовке окна не будет.

Рисунок 8. Установка значения свойства

объекта Delphi путем выбора из списка

Рисунок 9. Раскрытый список вложенных свойств

объекта Delphi сложного свойства BorderIcons


Рядом со значениями некоторых свойств отображается командная кнопка с тремя точками. Это значит, что для задания значения свойства можно воспользоваться дополнительным диалоговым окном. Например, значение сложного свойства Font можно задать путем непосредственного ввода значений уточняющих свойств, а можно воспользоваться стандартным диалоговым окном выбора шрифта.

В таблице 2 перечислены свойства формы разрабатываемой программы, которые следует изменить. Остальные свойства оставлены без изменения и в таблице не приведены.

Таблица 2.

Свойство Значение
Caption
Скорость бега
Height
250
Width 330
BorderStyle BsSingle
Borderlcons.biMinimize False
Borderlcons.biMaximize False
Font.Size 10

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

Рисунок 10. Так выглядит форма после установки значение свойств

Свойства в Delphi

Что такое свойства? Что является свойствами в реальной жизни? Например, в физике это температура плавления, температура кипения, вязкость, плотность, растворимость и т.д. Аналогично и объектно-ориентированном программировании. Каждый объект имеет какие-либо свойства. Свойства отвечают либо за внешний вид объекта, либо за его поведение в программе во время её выполнения.

Где найти свойства

Каждый компонент, помещённый на форму, имеет своё отражение в Инспекторе объектов (Object Inspector). Попробуйте, к примеру, поместить на форму кнопку TButton и текстовое поле TEdit и выделить по очереди сначала один объект, а затем другой, наблюдая при этом за Инспектором объектов. Вы заметите, что содержимое его окна изменяется. Это связано с тем, что каждый объект имеет свои свойства. Свойство может быть у одного объекта, но его может не быть у другого. Например, у поля ввода (TEdit) есть свойство ReadOnly, отвечающее за возможность изменения текста в этом поле. Совершенно логично, что у кнопки (TButton) этого свойства нет и быть не может.

Как создаются программы

Чтобы научиться создавать программы, для начала нужно понять основные принципы их создания. Коротко на этом остановимся. Итак, Вы уже научились помещать компоненты на форму, управлять ими и просматривать свойства. Размещение компонентов на форме - один из первых этапов разработки программы. Однако, просто поместив компоненты никаких действий происходить не будет - по кнопке можно будет щёлкнуть, но при этом ничего не произойдёт. В поле ввода можно ввести текст, но этот текст никуда не отправится и никак не обработается. Поэтому совершенно логичным этапом является настройка взаимодействий между компонентами. Некоторые простые взаимодействия уже "встроены" в стандартные компоненты и легко изменяются через Инспектор объектов. Всё остальное нужно создавать и программировать вручную. Практически основным методом создания взаимодействий компонентов является написание реакций на события. Но об этом чуть позже.

Типы свойств

Прежде чем перейти к рассмотрению типов свойств, нужно понять, что же из себя вообще представляет свойство? Всё очень просто. Свойство - это поле какой-либо структуры, содержащее определённое значение. Отталкиваясь от того, каким образом задаются эти значения и какую "природу", т.е. структуру имеет свойство, выделено несколько типов свойств.

  1. Простые свойства. Простыми являются те свойства, значения которых являются числами, либо строками (текстом). Примерами таких свойств могут служить Left и Top формы. Эти свойства определяют положение формы на экране (в частности, её левого верхнего угла). Значения этих свойств - числа. Пример свойства со значением-строкой - Caption формы. Это свойство хранит заголовок формы и задаётся в виде обычного текста.
  2. Перечислимые свойства. Такими являются свойства, задать значения которым в явном виде нельзя, а можно только выбрать из списка. Список возможных значений определяется заранее. Пример такого свойства - свойство AutoSize формы. Оно отвечает за то, будет ли форма автоматически изменять свой размер, чтобы отобразить все размещённые на ней компоненты. Значение - либо истина (True), либо ложь (False). Другой пример - свойство BorderStyle. Это свойство отвечает за внешний вид формы, а также за поведение её границ, т.е. можно ли изменять размеры формы во время работы программы. Это свойство принимает одно из 6 значений.
  3. Вложенные свойства. Это те свойства, которые имеют внутри несколько других свойств. В Инспекторе объектов слева от названий таких свойств отображается маленькая кнопка со знаком "+", нажатие на которую раскрывает данное свойство (знак при этом меняется на "-"). Повторный щелчок "сворачивает" свойство обратно. Вложенные свойства бывают двух основных типов - это множества и комбинированные значения. Множества - это набор каких-либо значений, каждое из которых либо "включено", либо "выключено". Комбинированные значения - это набор из нескольких свойств, которые могут иметь разный тип данных. Примером множества является свойство BorderIcons у формы - оно отвечает за кнопки, которые будут показаны в строке заголовка окна. Понятно, что любая из кнопок может либо отображаться на экране, либо нет - такой набор очень удобно задавать с помощью множества. Примером комбинированного значения является свойство Font (оно есть у большинства визуальных компонентов) - задаёт шрифт для элемента. В его включено несколько других свойств - название шрифта, цвет, стиль, размер и т.п.

Управление свойствами

Управлять свойствами, т.е. изменять их значения можно двумя способами - в режиме проектирования программы (Design-time) и во время выполнения (Run-time). В данный момент нас интересует режим проектирования. Изменять свойства можно всё в том же Инспекторе объектов. Если это простое свойство, то достаточно щёлкнуть по строке с названием этого свойства и ввести новое значение. Если это перечислимое свойство, то значение можно выбрать из списка. Некоторые свойства (например, Left, Top, Width и Height) можно изменять простыми операциями перетаскивания и изменением размеров с помощью мыши.
Примечание: Left, Top - положение формы на экране, Width - ширина, Height - высота формы.

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

Немного о компонентах

Чтобы у Вас не возникало путаниц и непонятных моментов, считаю необходимым сделать следующее уточнение. Все компоненты подразделяются на визуальные и невизуальные. Во время проектирования (Design-time) видны все компоненты без исключения. А вот во время выполнения (Run-time) - не все. Те, которые представляют собой какой-то видимый объект (поле, кнопка, таблица и т.д.) и являются визуальными. Невизуальные компоненты на экране не видны, но при этом используются в самой программе. В качестве примера невизуального компонента можно привести TApplicationEvents со вкладки Additional. Во время проектирования этот компонент присутствует на форме и он доступен через Инспектор объектов, но во время работы программы его не видно. За видимость объекта на экране в большинстве случаев отвечает свойство Visible (True - видимый, False - невидимый).




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

Свойство Align

Задает способ выравнивания компонента внутри формы. Имеет одно из следующих значений:

Значение

Описание

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

Компонент перемещается в верхнюю часть формы, и его ширина становится равной ширине формы. Высота компонента не изменяется

Компонент перемещается в нижнюю часть формы, и его ширина становится равной ширине формы. Высота компонента не изменяется

Компонент перемещается в левую часть формы, и его высота становится равной высоте формы. Ширина компонента не изменяется

Компонент перемещается в правую часть формы, и его высота становится равной высоте формы. Ширина компонента не изменяется

Компонент занимает всю рабочую область формы

Свойство Color

Задает цвет фона формы или цвет компонента или графического объекта. Может иметь одно из следующих значений:

Цвета, приведенные в следующей таблице, являются системными цветами Windows и зависят от используемой цветовой схемы.

Значение

Текущий цвет фона окна

CllnactiveCaption

Текущий цвет заголовка неактивного окна

Текущий цвет фона меню

Текущий цвет фона Windows

Текущий цвет рамки окна

Текущий цвет текста элемента меню

Текущий цвет текста внутри окна

Текущий цвет заголовка активного окна

Текущий цвет рамки активного окна

CllnactiveBorder

Текущий цвет рамки неактивного окна

Текущий цвет рабочей области окна

Текущий цвет фона выделенного текста

ClHightlightText

Текущий цвет выделенного текста

Текущий цвет кнопки

Текущий цвет фона кнопки

Текущий цвет недоступного элемента меню

Текущий цвет текста кнопки

Помимо перечисленных в таблице цветов значение свой­ства Color может задаваться шестнадцатеричными значениями.

Свойство Ctl3D

Позволяет задать вид компонента. Если значение этого свойства равно False, компонент имеет двумерный вид, если True - трехмерный (значение по умолчанию).

Свойство Cursor

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

Свойство DrogCursor

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

Свойство DrogMode

Позволяет определить режим поддержки протокола drag-and-drop. Возможны следующие значения:

Свойство Enabled

Если это свойство имеет значение True, компонент реагирует на сообщения от мыши, клавиатуры и таймера. В противном случае (значение False) эти сообщения игнорируются.

Свойство Font

Многие визуальные компоненты используют шрифт по умолчанию. При создании компонента изначальное значение свойства Font (класс TFont) имеет следующие параметры:

Свойство

Значение

— MulDiv(10, GetDeviceCaps(DC, LOGPIXELSY), 72)

Свойство Height

Это свойство задает вертикальный размер компонента или формы.

Свойство HelpContext

Задает номер контекста справочной системы. Этот номер должен быть уникальным для каждого компонента. Если компонент активен (находится в фокусе), нажатие клавиши F1 приводит к отображению экрана справочной системы (если такой существует для данного компонента).

Свойство Hint

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

Свойство Left

Задает горизонтальную координату левого угла компонента относительно формы в пикселах. Для форм это значение указывается относительно экрана.

Свойство ParentColor

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

Свойство ParentCtl3D

Это свойство позволяет указать, каким образом компонент будет определять, является он трехмерным, или нет. Если значение этого свойства равно True, то вид компонента задается значением свойства Ctl3D его владельца, если же значение этого свойства равно False - то значением его собственного свойства Ctl3D.

Свойство ParentFont

Это свойство позволяет указать, каким образом компонент будет определять используемый им шрифт. Если значение этого свойства равно True, используется шрифт, заданный у владельца компонента, если же это значение равно False, то шрифт задается значением его собственного свойства Font.

Свойство PopupMenu

Это свойство задает название локального меню, которое будет отображаться при нажатии правой кнопки мыши. Локальное меню отображается только в случае, когда свойство AutoPopup имеет значение True или когда вызывается метод Popup.

Свойство TabOrder

Задает порядок получения компонентами фокуса при нажатии клавиши Tab. По умолчанию этот порядок определяется размещением компонентов в форме: первый компонент имеет значение этого свойства, равное 0, второй - 1 и т. д. Для изменения этого порядка необходимо изменить значение свойства TabOrder определенного компонента. TabOrder может использоваться только совместно со свойством Tab Stop.

Свойство TabStop

Это свойство позволяет указать, может компонент получать фокус или нет. Компонент получает фокус, если значение его свойства TabStop равно Тruе.

Свойство Tag

С помощью этого свойства можно «привязать» к любому компоненту значение типа Longlnt.


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

Система Delphi при добавлении новой формы в проект автоматически создает один экземпляр класса (Form1, Form2 и т. д.), внося соответствующие изменения в файл проекта, например, добавляя строку кода:

Управлять процессом автоматического создания форм можно, непосредственно редактируя файл проекта (не рекомендуется делать неопытным программистам) или выполняя настройки в окне параметров проекта (список Auto-create forms на странице Form). Если форма переведена из этого списка в список Available forms доступных форм проекта, то инструкция ее создания исключается из файла проекта, и программист в ходе выполнения приложения должен динамически создать экземпляр этой формы.

На данном скринште мы видим, что Form1 будет создана при запуске программы, а Form2 необходимо будет создать динамически при выполнении программы.

Метод Сreate

Для создания экземпляров форм служит метод (конструктор) Сreate . Сам класс формы обычно предварительно описывается при конструировании приложения, и для формы уже существуют файлы формы (dfm) и программного модуля (pas).

В вышеуказанной процедуре создается форма Form2 , принадлежащая объекту приложения и имеющая заголовок новая форма .

События формы (Form)

При создании и использовании формы генерируются следующие события типа TNotifyEvent, указанные в порядке их возникновения:

  1. OnCreate;
  2. OnShow;
  3. OnActivate;
  4. OnPaint.

Событие OnCreate

Событие OnCreate генерируется только один раз- при создании формы, остальные события происходят при каждом отображении, активизации и каждой прорисовке формы соответственно.

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

Приведем в качестве примера процедуру, обрабатывающую событие OnCreate формы Form2:

При создании форма получает новый заголовок пример формы, в комбинированный список ComboBox2 загружаются данные из файла list.txt , кнопка Button3 блокируется, а фокус ввода устанавливается на редактор Edit1.

Свойство Visible

Из всех созданных форм Delphi при выполнении приложения автоматически делает видимой главную форму, для этого свойство Visible этой формы устанавливается в значение True. Для остальных форм значение данного свойства по умолчанию равно False, и после запуска приложения они на экране не отображаются. Если формы создаются вручную, то их отображение и скрытие в процессе работы приложения регулируется программистом через свойство Visible. Даже если форма невидима, ее компонентами можно управлять, например, из других форм.

Дочерние формы многодокументного приложения становятся видимыми на экране сразу после их создания.

В вышеуказанных процедурах нажатие кнопок btnShowForm2 и btnHideForm2 , расположенных в форме Form1, приводит, соответственно, к отображению и скрытию формы Form2.

Методы Show и Hide

Управлять видимостью форм на экране можно также с помощью методов Show и Hide . Процедура Show отображает форму в немодальном режиме, при этом свойство Visible устанавливается в значение True, а сама форма переводится на передний план. Процедура Hide скрывает форму, устанавливая ее свойство Visible в значение False.

Если окно видимо, то вызов метода Show переводит форму на передний план и передает ей фокус ввода.

Пример отображения и скрытия формы:

Здесь нажатие кнопок btnShowForm3 и btnHideForm3 , расположенных В форме Form1, приводит соответственно к отображению на экране и удалению с экрана формы Form3.

В момент отображения формы на экране ее свойство visible принимает значение True, и возникает событие OnShow . Соответственно при скрытии формы свойство visible принимает значение False, и возбуждается событие OnHide .

События OnActivate и OnDeActivate

При получении формой фокуса ввода, например при нажатии кнопки мыши в области формы, происходит ее активизация и возникает событие OnActivate , а при потере фокуса- событие OnDeActivate .

Событие OnPaint

Событие OnPaint генерируется при необходимости перерисовки формы, например, при активизации формы, если до этого часть ее была закрыта другими окнами.

Метод Сlose — закрывает форму

Для закрытия формы используется метод close , который, если это возможно, удаляет ее с экрана. В случае закрытия главной формы прекращается работа врего приложения.

В вышеуказанной процедуре кнопка btnClose закрывает форму Form2 . Форма делается невидимой, но не уничтожается. Для этой кнопки полезно задать соответствующий заголовок (свойство Caption), например, Закрыть .

Процедура Close не уничтожает созданный экземпляр формы, и форма может быть снова вызвана на экран, в частности, с помощью методов Show или ShowModal .

Уничтожение формы (Release, Free или Destroy)

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

В приведенной процедуре кнопка btnDestroy уничтожает форму Form3 . Для этой кнопки полезно задать соответствующий заголовок, например Удалить .

События при закрытии и уничтожении формы

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

  1. OnDeActivate;
  2. OnHide;

Событие OnCloseQuery

Событие типа TcloseQueryEvent возникает в ответ на попытку закрытия формы. Обработчик события получает логическую переменную-признак CanClose, определяющую, может ли быть закрыта данная форма. По умолчанию эта переменная имеет значение True, и форму можно закрыть. Если установить параметр CanClose в значение False, то форма остается открытой. Такую возможность стоит использовать, например, для подтверждения закрытия окна или проверки, сохранена ли редактируемая информация на диске. Событие OnCloseQuery вызывается всегда, независимо от способа закрытия формы.

Приведем в качестве примера процедуру закрытия формы:

Здесь при закрытии формы Form2 выдается запрос на подтверждение операции, который представляет собой модальное диалоговое окно с текстом и двумя кнопками - Yes и No . Нажатие кнопки Yes вызывает закрытие формы, при нажатии кнопки No закрытие формы не происходит.

Событие OnClose

Событие типа TCioseEvent возникает непосредственно перед закрытием формы. Обычно оно используется для изменения стандартного поведения формы при закрытии. Для этого обработчику события передается переменная Action типа TCloseAction, которая может принимать следующие значения:

  • caNone (форму закрыть нельзя);
  • caHide (форма делается невидимой);
  • caFree (форма уничтожается, а связанная с ней память освобождается);
  • caMinimize (окно формы сворачивается) - значение по умолчанию для MDI-форм.

При закрытии окна методом Close переменная Action по умолчанию получает значение caHide, и форма делается невидимой. При уничтожении формы, например, методом Destroy, переменная Action по умолчанию получает значение caFree, и форма уничтожается.

Событие возникает при закрытии формы щелчком мыши на кнопке закрытия системного меню или при вызове метода Close. Когда закрывается главная форма приложения, все остальные окна закрываются без вызова события OnClose.

В выше указанной процедуре при закрытии формы Form2 проверяется признак модификации содержимого редактора Memo1. Если информация в Memo1 была изменена, то форма не закрывается.

Событие onDestroy

Событие типа TNotifyEvent возникает непосредственно перед уничтожением формы и обычно используется для освобождения ресурсов.

Событие onResize

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

    procedure TForml. FormResize (Sender: TObject ) ; begin

    // Установка размеров и положения сетки строк

    StringGrid1. Left : = 10 ;

    StringGrid1. Top : = 5 ;

    StringGrid1. Width : = Form1. ClientWidth �— 20 ;

    StringGrid1. Height : = Form1. ClientHeight �— 15 ;

    Button1. Height ;

    // Установка положения кнопки

    Button1. Left : = Form1. ClientWidth �— 10�— Button1. Width ;

    Button1. Top : = Form1. ClientHeight - 5 - Button1. Height ;

    end ;

В форме Form1 находятся два компонента: сетка строк StringGrid1 и кнопка Button1. Эти компоненты расположены в форме следующим образом:

  • сетка StringGrid1 занимает всю ширину клиентской области формы Form3, отступы слева и справа составляют 10 пикселов;
  • кнопка Button1 (Закрыть) выровнена по правому краю сетки StringGrid1;
  • расстояния между сеткой, кнопкой, верхним и нижним краями формы составляют 5 пикселов.

При изменении размеров формы Form1 выполняется пересчет параметров, задающих размеры и положение сетки строк, а также положение кнопки.

Cвойство FormStyle — стиль формы

Стиль формы определяется свойством типа TFormstyle, принимающим следующие значения:

  • fsNormal (стандартный стиль, используемый для большинства окон, в том числе и диалоговых);
  • fsMDiChild (дочерняя форма в многодокументном приложении);
  • fsMDiForm (родительская форма в многодокументном приложении);
  • fsStayOnTop (форма, которая после запуска всегда отображается поверх других окон) - обычно используется при выводе системной информации или информационной панели программы.

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

Пример динамического изменения стиля формы:

При выборе пункта меню mnuTop форма переключает свой стиль между значениями fsNormal и fsStayOnTop . Смена стиля отображается графически галочкой в заголовке этого пункта меню.

Cвойство BorderStyle — свойства рамки формы

Каждая форма имеет ограничивающую рамку. Вид и поведение рамки определяет свойство типа TFormBorderstyle. Оно может принимать следующие значения:

  • bsDialog (диалоговая форма);
  • bsSingle (форма с неизменяемыми размерами);
  • bsNone (форма не имеет видимой рамки и заголовка и не может изменять свои размеры) - часто используется для заставок;
  • bsSizeable (обычная форма с изменяемыми размерами) - по умолчанию, имеет строку заголовка и может содержать любой набор кнопок;
  • bsToolwindow (форма панели инструментов);
  • bsSizeToolwin (форма панели инструментов с изменяемыми размерами).

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

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

Пример программного изменения размеров формы:

При нажатии кнопки btnResizeForm ширина формы Form2 увеличивается на 100 пикселов, даже если ее свойство BorderStyle имеет значение, равное bsDialog, bsSingle или bsNone.

Метод ShowModal

Если установить диалоговый стиль формы, то она не становится модальной и позволяет пользователю переходить в другие окна приложения. Для запуска формы, в том числе любой диалоговой, в модальном режиме следует использовать метод ShowModal . Таким образом, стиль определяет внешний вид формы, но не ее поведение.

Cвойство BorderIcons

В области заголовка могут отображаться 4 вида кнопок. Реализуемый набор кнопок определяет свойство типа TBorderIcons, которое может принимать комбинации следующих значений:

  • blSystemMenu (окно имеет системное меню и может содержать кнопки системного меню);
  • blMinimize (окно содержит кнопку свертывания);
  • blMaximize (окно содержит кнопку развертывания/восстановления);
  • blHelp (окно содержит кнопку справки, которая отображает вопросительный знак и вызывает контекстно-зависимую справку).

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

Различные значения свойства не являются независимыми друг от друга. Так, если отсутствует системное меню, то ни одна кнопка не отображается. Если имеются кнопки развертывания и свертывания, то не отображается кнопка справки. Возможность появления кнопок также зависит от стиля формы. Например, отображение кнопок развертывания и свертывания возможно только для обычной формы и формы панели инструментов с изменяемыми размерами.

Обычно стиль формы и набор кнопок заголовка задаются на этапе разработки приложения в окне Инспектора объектов. При этом в проектируемой форме всегда видны обычная рамка и три кнопки (развертывания, свертывания и закрытия формы), независимо от значения свойств и . Заданные стиль формы и набор кнопок становятся видимыми при выполнении программы.

Форма включает в себя клиентскую и неклиентскую области. Неклиентская область занята рамкой, заголовком и строкой главного меню. Обычно эта область прорисовывается Windows и программистом не затрагивается. При необходимости изменить отображение в неклиентской области программист может перехватить и обработать сообщение WM_NCPaint .

Cвойства ClientWidth и ClientHeight

В клиентской области обычно размещаются различные элементы управления, выводится текст или отображается графика. Аналогично тому как свойства Width и Height определяют размеры всей формы, свойства ClientWidth и ClientHeight типа Integer задают ширину и высоту (в пикселах) клиентской части формы.

В вышеуказанной процедуре значения размеров клиентской области выводятся в заголовке формы.

Обычно форму перетаскивают мышью, указатель которой устанавливается в любом месте области заголовка. При необходимости можно переместить форму и при помещении указателя на ее клиентскую область, для чего требуется описать соответствующие операции программно. Одним из способов является перехват системного сообщения WM_NCHitTest . Для этого создается процедура FormMove , которая анализирует, в каком месте формы находится указатель мыши при нажатии кнопки. Код местоположения указателя мыши содержится в поле Result системного сообщения типа TMessage. Если значение Result равно 1, что соответствует нажатию кнопки мыши в клиентской области, то полю Result присваивается новое значение, равное 2, имитирующее нахождение указателя мыши в области заголовка. В процедуре FormMove первая инструкция inherited осуществляет вызов предопределенного обработчика перехватываемого события.

Чтобы указать среде Delphi, что процедура FormMove является обработчиком события WM_NCHitTest, при ее описании в классе формы TForm1 используется специальный синтаксис, включающий ключевое слово message . Как обработчик системного сообщения, процедура содержит один параметр типа TMessage.

Имена MoveForm и Msg процедуры и ее параметра могут быть изменены.

Свойство Menu

Отображаемое формой меню задается свойством Menu типа TMainMenu. При разработке приложения размещение компонента MainMenu главного меню в форме вызывает автоматическое присвоение значения MainMenu1 свойству Menu. Это самый простой способ ссылки на главное меню. Если в ходе выполнения приложения какая-либо форма должна отображать различные меню, то через свойство Menu можно указать другое главное меню, например, следующим образом: Form1.Menu:= MainMenu2;

Свойство Icon



Каждая форма отображает в левой стороне области заголовка свой значок, определяемый свойством Icon типа Ticon. Если форма не является главной в приложении, то этот значок отображается при свертывании формы. Для любой формы свойство Icon можно задать с помощью Инспектора объектов или динамически (при выполнении приложения). Если значок не задан, то форма использует значок, указанный в свойстве Icon объекта Application. Последний выводится также при свертывании и отображении в панели задач Windows значка главной формы приложения.

В вышеуказанной процедуре значок динамически загружается из файла Picture1.ico при создании формы Form1 .

Свойство Position

Размещение и размер формы при отображении определяет свойство типа TPosition. Оно может принимать значения, перечисленные далее:

  • poDesigned (форма отображается в той позиции и с теми размерами, которые были установлены при ее конструировании) - значение по умолчанию. Положение и размеры формы определяются свойствами Left, Tор, Width и Height . Если приложение запускается на мониторе с более низким разрешением, чем у того, на котором оно разрабатывалось, часть формы может выйти за пределы экрана;
  • poScreenCenter (форма выводится в центре экрана, ее высота и ширина- свойства Height и width- не изменяются);
  • poDefault (Windows автоматически определяет начальную позицию и размеры формы) - при этом значении программист не имеет возможности управлять этими параметрами, поэтому оно не допускается для форм многодокументных приложений;
  • poDefaultPosOnly (Windows определяет начальную позицию формы, ее размеры не изменяются);
  • poDefaultSizeOnly (Windows определяет начальные ширину и высоту формы и помещает форму в позицию, определенную при разработке);
  • PoDesktopCenter (форма выводится в центре экрана, ее высота и ширина не изменяются);
  • PoMainFormCenter (форма выводится в центре главной формы приложения, ее высота и ширина не изменяются) - это значение используется для вторичных форм, при применении его для главной формы оно действует как значение poScreenCenter;
  • PoOwnerFormCenter (форма выводится в центре формы, которая является ее владельцем, высота и ширина формы не изменяются) - если для формы не указан владелец (свойство Owner), то данное значение аналогично значению poMainFormCenter.

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

Свойство Active

Свойство Active типа Boolean позволяет определить активность формы. В любой момент времени активной может быть только одна форма, при этом ее заголовок выделяется особым цветом (обычно синим). Если свойство Active имеет значение True, то форма активна (находится в фокусе ввода), если False - то неактивна. Это свойство доступно для чтения во время выполнения программы. Если требуется активизировать форму программно, следует использовать свойство или метод Show (showModal).

Cвойство ChildActiveForm

В многодокументном приложении родительское окно не может быть активным независимо от цвета заголовка. Для определения активного дочернего окна многодокументного приложения служит свойство ChildActiveForm типа TForm родительской формы.

    procedure TForm1CheckFormActive модуля главной формы выполняет проверку активности для двух форм приложения и отображает соответствующую информацию в заголовках форм.

    Свойство WindowState

    Свойство типа TWindowstate определяет состояние отображения формы и может принимать одно из трех значений:

    • wsNormal (обычное состояние) - по умолчанию;
    • wsMinimized (свернута);
    • wsMaximized (развернута).

    Кнопки btnMiniForm и btnNormalForm в форме Form1 сворачивают и восстанавливают обычное состояние формы Form2 соответственно.

    Форма, для которой изменяется состояние отображения на экране, предварительно должна быть создана методами CreateForm или Create . Если форма не создана, то при обращении к ней будет сгенерировано исключение, несмотря на то, что переменная формы объявлена в модуле. Если форма создана, но не отображается на экране, то изменения ее состояния (свойства windowstate) происходят, однако пользователь не видит этого до тех пор, пока форма не будет отображена на экране.

    Свойство ActiveControl

    Будучи контейнером, форма содержит другие элементы управления. Оконные элементы управления (потомки класса TWinControl) могут получать фокус ввода. Свойство типа TWinControl определяет, какой элемент формы находится в фокусе. Для выбора элемента, находящегося в фокусе ввода (активного элемента), можно устанавливать это свойство в нужное значение при выполнении программы:

    Эту же операцию выполняет метод SetFocus , который устанавливает фокус ввода для оконного элемента управления:

    Свойство AutoScroll

    В случае, когда размеры окна недостаточны для отображения всех содержащихся в форме интерфейсных компонентов, у формы могут появляться полосы прокрутки. Свойство AutoScroll типа Boolean определяет, появляются ли они автоматически, Если свойство AutoScroll имеет значение True (по умолчанию), то полосы прокрутки появляются и исчезают автоматически, без каких-либо действий программиста. Необходимость в полосах прокрутки может возникнуть, например, в случае, если пользователь уменьшит размеры формы так, что не все элементы управления будут полностью видны. Если же свойство AutoScroll установлено в значение False, то программист реализует управление просмотром информации вручную через свойства HorzScrollBar (горизонтальная прокрутка) и VertScrollBar (вертикальная прокрутка) типа TControlScrollBar формы.

    Метод ScrollInView

    Для программного управления полосами прокрутки можно использовать метод ScrollInView . Процедура ScrollInView (AControl: TControl) автоматически изменяет позиции полос прокрутки так, чтобы заданный параметром AControl элемент управления стал виден в отображаемой области.

    Свойство KeyPreview

    Свойство типа Boolean определяет, будет ли форма обрабатывать события клавиатуры, прежде чем их обработают элементы управления формы. Если свойство имеет значение False (по умолчанию), то клавиатурные события поступают к активному элементу управления (имеющему фокус ввода). При установке свойства KeyPreview в значение True форма первой получает сообщения о нажатии клавиш и может на них реагировать, что обычно используется для обработки комбинаций клавиш, независимо от активности элементов управления формы.

    В вышеуказанной процедуре форма Form1 обрабатывает нажатие алфавитно-цифровых клавиш, отображая введенный символ в диалоговом окне Information .

    Форма не может обрабатывать нажатие клавиши <ТаЬ> в связи с ее особым назначением.

    Cвойство MDichildCount и метод Cascade

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