События и процедуры обработки событий на Delphi.

30.07.2019 Ios

Операционная система Windows - многозадачная, т.е. несколько программ в ней могут функционировать одновременно. Когда, например, мы щёлкаем по кнопке в окне нашей программы, система Windows определяет, что произошло событие именно в нашей программе, и посылает ей сообщение об этом. Наша программа должна соответствующим образом отреагировать на него. Для этого мы, как программисты, должны написать код-обработчик этого события. Таким образом, структура программы для Windows представляет собой набор подпрограмм, каждая из которых ответственна за обработку конкретного события и вызывается только при его возникновении. Удобство Delphi состоит в том, что мы избавлены от необходимости получать сообщения от Windows сами, Delphi это делает за нас. Каждый компонент имеет впечатляющий набор событий, на которые он может реагировать. Программист сам определяет, какие события в программе требуется обрабатывать.

Изменим нашу программу так, чтобы текст на форме появлялся прямо в момент его ввода. В момент ввода у Edit1 меняется свойство Text - в нём появляется новая буква! Значит, воспользуемся событием onChange (change - изменение (англ.)), которое и происходит в этот момент. Итак:

Теперь рассмотрим событие onClick . Как вы догадываетесь, это событие возникает при щелчке мышкой на компоненте. Воспользуемся им, чтобы очищать строку ввода от уже введённых символов. Вы сами уже должны сообразить, что сделать. В обработчике нужно присвоить свойству Text значение пустой строки. Строка в Delphi образуется заключением текста в одинарные кавычки (находятся на кнопке Э ):
" Так в Delphi образуется строка"
Значит, пустая строка - это кавычки без текста: "" . Не должно быть даже пробела, иначе он окажется в строке ввода:

Edit1.Text:="";

Есть другой способ, воспользоваться специально предназначенным для этого методом компонента Edit, который так и называется Clear (очистка англ.):

Edit1.Clear;

Но подумайте о пользователе, который будет работать с вашей программой. Ему должно быть удобно. Если при вводе текста он захочет что-то исправить, и щёлкнет мышкой в том месте текста, где нужно внести изменение?! И всё сотрётся! Поэтому лучше использовать событие onEnter , которое происходит, когда вы "входите" в него и компонент получает фокус ввода, или использовать для очистки специальную кнопку и её событие onClick .
Конечно, у каждого компонента свой набор событий. Мы познакомились с тремя из них:

  • onChange
  • onClick
  • onEnter
Другие важные события, которые есть почти у каждого визуального компонента:
  • onExit - возникает, когда компонент теряет фокус ввода;
  • onDblClick - возникает при двойном щелчке мышкой по компоненту;
  • onKeyDown - когда при нажатии на кнопку на клавиатуре она оказалась в нижнем положении;
  • onKeyUp - когда при отпускании клавиатурной кнопки она оказалась в верхнем положении;
  • onKeyPress - возникает при нажатии на клавиатурную кнопку. От событий onKeyDown и onKeyUp оно отличается типом используемого параметра Key ;
  • onMouseDown - когда при нажатии кнопки мышки она оказалась в нижнем положении;
  • onMouseUp - когда при отпускании кнопки мышки она оказалась в верхнем положении;
  • onMouseMove - возникает при перемещении указателя мышки над компонентом.
В начале работы любой программы происходит очень важное событие событие нашего основного компонента - Формы, onCreate . Оно происходит перед появлением Формы на экране. Это событие используется для задания свойств тех элементов программы, которые нуждаются в настройке, например, размеры и положение Формы на экране. Если вы захотите сделать невидимую программу, можно приравнять нулю ширину Width и высоту Height Формы. На этапе проектирования сделать этого нельзя, т.к. это помешает работе, поэтому делаем это по событию onCreate:

Form1.Width:= 0;
Form1.Height:= 0;

Дополнительно нужно убрать и заголовок Формы, выбрав в Инспекторе Объектов параметр BorderStyle равным None. Теперь Форма на экране не появится. Единственным визуальным признаком останется появление её "значка" на панели задач. В дальнейшем я расскажу, как избавиться и от него.

Лабораторная работа № 4

Цель работы: научиться программировать различные обработчики событий

Управление программой в Windows основано на обработке сообщений о событиях,

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

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

События можно разделить на следующие типы:

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

События щелчка мыши;

События типа Drag&Drop, что означает "Перетащить и бросить" объект мышью;

События клавиатуры (возникающие при нажатии клавиш);

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

3. События, обусловленные исключительными ситуациями ,которые могут возникать

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

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

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

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



Для того чтобы создать в Delphi нужный обработчик событий, следует выбрать интересующий Вас компонент, щелкнув по нему мышкой, перейти на закладку Events (События) Инспектора Объектов и, выбрав необходимое событие, дважды щелкнуть по его полю ввода. Раскроется Редактор Кода программы, куда Delphi автоматически поместит заготовку процедуры обработчика. Вам остается только вставить между служебными словами begin и end операторы программного кода, реализующие какую либо реакцию Вашей программы на данное событие. Для каждого компонента, в том числе и для формы, можно создать свои собственные обработчики событий

Списки событий, относящихся к конкретному компоненту, в том числе и к форме, заданы на странице Events (События) Инспектора Объектов.


Наиболее часто встречающиеся события для компонентов:

Название Событие
OnCreate При создании объекта (формы, элемента управления).
OnClick Одинарный щелчок левой клавиши мыши на объекте
OnDblClick Двойной щелчок левой клавиши мыши на объекте
OnMouseDown При нажатии кнопки мыши
OnMouseUp При отпускании кнопки мыши
OnMouseMove При перемещении мыши над заданным компонентом
OnKeyDown Нажатие клавиши возвращает значение
Key(тип: Word)-код нажатой клавиши
Shift(Тип: TShiftState)–состояние клавиши
OnKeyPress Нажатая символьная клавиша возвращает значение
Key(тип: Char)-код нажатой клавиши
ОпКеyUр При отпускание клавиши клавиатуры
OnEnter При получении элементом управления фокуса
OnExit При потере элементом управления фокуса

Для каждого события Delphi автоматически определяет имя обработчика в соответствии с именем компонента, для которого эта процедура предназначена. Например, заголовок процедуры обработчика события щелчка левой клавиши мыши (Click) для компонента кнопка (Buttonl), размещенного в окне стартовой формы (Forml) будет выглядеть следующим образом:

Procedure TForm1.Button1Click(Sender:TObject);

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

Задание 1. Создание обработчика событий для формы"Одинарный щелчок мышью ".

Поместите на форму компонент Label (Метка). Цвет метки, тип и размер шрифта на ней задайте по желанию.

Активизируйте форму, щелкнув по ней левой клавишей мыши. Заголовку формы дайте название "Обработка событий".

Перейдите на страницу Events (События) Инспектора Объектов и внимательно рассмотрите, какие события для формы там присутствуют.

Выберете событие OnClick (Одинарный щелчок левой клавишей мыши) и в пустом поле справа от него выполните мышью двойной щелчок. В раскрывшемся окне Редактора Кода будет создана заготовка процедуры обработчика этого события для формы.

Обратите внимание на заголовок обработчика! Между ключевыми словами begin и end

вставьте подчеркнутый текст, приведенный ниже: procedure TForm1.FormСliсk(Sеndеr: TObject);

Label1.Caption: = "ПРИВЕТ! ЭТО ОДИНАРНЫЙ ШЕЛЧОК!"; end;

Запустите приложение и проверьте выполнение одинарного щелчка мышью на форме.

Задание 2. Создание обработчика событий для формы“Двойной щелчок мышью”.

Активизируйте форму, и на странице Events (События) Инспектора Объектов выберете событие OnDblClick (Двойной щелчок левой клавишей мыши).

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

Что такое событие на языке Delphi и что из себя представляют процедуры обработки событий на языке Delphi.

В качестве примера описания события на языке Delphi возмём пример, описанный в предыдущих статьях. Вид созданной формы подсказывает, как работает приложение. Очевидно, что пользователь должен ввести в поля редактирования исходные данные и щелкнуть мышью на кнопке Вычислить . Щелчок на изображении командной кнопки - это пример того, что в Windows называется событием.

Событие (Event ) на Delphi - это то, что происходит во время работы программы. В Delphi каждому событию присвоено имя. Например, щелчок кнопкой мыши - это событие OnClick , двойной щелчок мышью - событие onDblClick .

В таблице 9 приведены некоторые события Windows.

Таблица 9. Некоторые события Windows.

Событие Происходит
OnСlick При щелчке кнопкой мыши
OnDblClick При двойном щелчке кнопкой мыши
OnMouseDown При нажатии кнопки мыши
OnMouseUp При отпускании кнопки мыши
OnMouseMove При перемещении мыши
OnKeyPress При нажатии клавиши клавиатуры
OnKeyDown При нажатии клавиши клавиатуры. События OnKeyDown и OnKeyPress - это чередующиеся, повторяющиеся события, которые происходят до тех пор, пока не будет отпущена удерживаемая клавиша (в этот момент происходит событие OnKeyUp)
OnKeyUp При отпускании нажатой клавиши клавиатуры
OnCreate При создании объекта (формы, элемента управления). Процедура обработки этого события обычно используется для инициализации переменных, выполнения подготовительных действий
OnPaint При появлении окна на экране в начале работы программы, после появления части окна, которая, например, была закрыта другим окном и в других случаях
OnEnter При получении элементом управления фокуса
OnExit При потере элементом управления фокуса

Реакцией на событие в Delphi должно быть какое-либо действие. В Delphi реакция на событие реализуется как процедура обработки события на языке программирования Delphi . Таким образом, для того, чтобы программа выполняла некоторую работу в ответ на действия пользователя, программист должен написать процедуру обработки соответствующего события. Следует обратить внимание, на то, что значительную часть обработки событий на Delphi берет на себя компонент. Поэтому программист должен разрабатывать процедуру обработки события на языке Delphi только в том случае, если реакция на событие отличается от стандартной или не определена. Например, если по условию задачи ограничений на символы, вводимые в поле Edit нет, то процедуру обработки события onKeyPress писать не надо, т. к. во время работы программы будет использована стандартная (скрытая от программиста) процедура обработки этого события.

Методику создания процедур обработки событий на Delphi рассмотрим на примере процедуры обработки события onclick для командной кнопки Вычислить .

Чтобы приступить к созданию процедуры обработки события, надо сначала в окне Object Inspector выбрать компонент, для которого создается процедура обработки события. Затем, в этом же окне нужно выбрать вкладку Events (События).

Рисунок 21. На вкладке Event (Delphi) перечислены события, которые может воспринимать компонент на Delphi

В левой колонке вкладки Events (рисунок 21) перечислены имена событий на языке программирования Delphi, которые может воспринимать выбранный компонент (объект). Если для события определена (написана) процедура обработки события, то в правой колонке, рядом с именем события, выводится имя этой процедуры.

Для того чтобы создать функцию обработки события на языке программирования Delphi, нужно сделать двойной щелчок мышью в поле имени процедуры обработки соответствующего события. В результате этого откроется окно редактора кода, в которое будет добавлен шаблон функции обработки события, а в окне Object Inspector , рядом с именем события, появится имя функции его обработки (рисунок 22).

Delphi присваивает функции обработки события имя, которое состоит из двух частей. Первая часть имени идентифицирует форму, содержащую объект (компонент), для которого создана процедура обработки события. Вторая часть имени идентифицирует сам объект и событие. В нашем примере имя формы - Form1 , имя командной кнопки - Button1 , а имя события - Click .

Рисунок 22. Примеры процедуры обработки событий сгенерированной Delphi

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

В Листинге 1 приведен текст функции обработки события onclick для командной кнопки Вычислить . Обратите внимание на то, как представлена программа. Ее общий вид соответствует тому, как она выглядит в окне редактора кода: ключевые слова выделены полужирным, комментарии - курсивом (выделение выполняет редактор кода). Кроме того, инструкции программы набраны с отступами, в соответствии с принятыми в среде программистов правилами хорошего стиля.

Функция Button1Click выполняет расчет скорости и выводит результат расчета в поле Label4. Исходные данные вводятся из полей редактирования Edit1 и Edit2 путем обращения к свойству Text . Свойство Text содержит строку символов, которую во время работы программы введет пользователь. Для правильной работы программы строка должна содержать только цифры. Для преобразования строки в числа в программе используются функции StrToInt и StrToFloat . Функция StrToInt проверяет символы строки, переданной ей в качестве параметра (Edit1.Text - это содержимое поля Edit1 ), на допустимость, и, если все символы верные, возвращает соответствующее число. Это число записывается в переменную dist . Аналогичным образом работает функция StrToFloat , которая возвращает дробное число, соответствующее содержимому поля Edit2 . Это число записывается в переменную t .

После того как исходные данные будут помещены в переменные dist и t , выполняются подготовительные действия и расчет. Первоначально с использованием функции Trunc , которая "отбрасывает" дробную часть числа, выделяется целая часть переменной t - это количество минут. Значением выражения Trunc(t*l00) mod 100 является количество секунд. Вычисляется это выражение так. Сначала число t умножается на 100 . Полученное значение передается функции Trunc , которая возвращает целую часть результата умножения t на 100 . Полученное таким образом число делится по модулю на 100 . Результат деления по модулю - это остаток от деления.

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

Вычисленное значение скорости выводится в поле Label4 путем присваивания значения свойству Caption . Для преобразования чисел в строки используются функции IntToStr и FloatToStr .

В результате нажатия кнопки Завершить программа должна завершить работу. Чтобы это произошло, надо закрыть, убрать с экрана, главное окно программы. Делается это при помощи метода Сlose . Процедура обработки события OnClick для кнопки Завершить приведена в листинге 2.

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

Событие (Event) - это то, что происходит во время работы программы. В Delphi каждому событию присвоено имя. Например, щелчок кнопкой мыши - это событие O nClick, двойной щелчок мышью - событие O nDblClick.

В табл. 9 приведены некоторые события Windows.

Таблица 9

Событие

Происходит

OnClick

При щелчке кнопкой мыши

OnDblClick

При двойном щелчке кнопкой мыши

OnMouseDown

При нажатии кнопки мыши

OnMouseUp

При отпускании кнопки мыши

OnMouseMove

При перемещении мыши

OnKeyPress

При нажатии клавиши клавиатуры

OnKeyDown

При нажатии клавиши клавиатуры. События OnKeyDown и OnKeyPress - это чередующиеся, повторяющиеся события, которые происходят до тех пор, пока не будет отпущена удерживаемая клавиша (в этот момент происходит событие OnKeyUp)

OnKeyUp

При отпускании нажатой клавиши клавиатуры

OnCreate

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

OnPaint

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

OnEnter

При получении элементом управления фокуса

OnExit

При потере элементом управления фокуса

Реакцией на событие должно быть какое-либо действие. В Delphi реакция на событие реализуется как процедура обработки события. Таким образом, для того, чтобы программа выполняла некоторую работу в ответ на действия пользователя, программист должен написать процедуру обработки соответ ствующего события. Следует обратить внимание, на то, что значительную часть обработки событий берет на себя компонент. Поэтому программист должен разрабатывать процедуру обработки события только в том случае, если реакция на событие отличается от стандартной или не определена. Например, если по условию задачи ограничений на символы, вводимые в поле Edit, нет, то процедуру обработки события onKeyPress писать не надо, т. к. во время работы программы будет использована стандартная (скрытая от программиста) процедура обработки этого события.

Методику создания процедур обработки событий рассмотрим на примере процедуры обработки события OnClick для командной кнопки Вычислить .

Чтобы приступить к созданию процедуры обработки события, надо сначала в окне Object Inspector выбрать компонент, для которого создается процедура обработки события. Затем, в этом же окне нужно выбрать вкладку Events (События).

В левой колонке вкладки Events (рис. 21) перечислены имена событий, которые может воспринимать выбранный компонент (объект). Если для события определена (написана) процедура обработки события, то в правой колонке, рядом с именем события, выводится имя этой процедуры.

Рис. 21. На вкладке Events перечислены события, которые может воспринимать компонент

Для того чтобы создать функцию обработки события, нужно сделать двойной щелчок мышью в поле имени процедуры обработки соответствующего события. В результате этого откроется окно редактора кода, в которое будет добавлен шаблон функции обработки события, а в окне Object Inspector , рядом с именем события, появится имя функции его обработки (рис. 22).

Delphi присваивает функции обработки события имя, которое состоит из двух частей. Первая часть имени идентифицирует форму, содержащую объект (компонент), для которого создана процедура обработки события. Вторая часть имени идентифицирует сам объект и событие. В нашем примере имя формы - Form1, имя командной кнопки- Button1, а имя события - Click.

Рис. 22. Пример процедуры обработки события, сгенерированной Delphi

В окне редактора кода между словами begin и end можно печатать инструкции, реализующие функцию обработки события.

В листинге 1 приведен текст функции обработки события OnClick для командной кнопки Вычислить. Обратите внимание на то, как представлена программа. Ее общий вид соответствует тому, как она выглядит в окне редактора кода: ключевые слова выделены полужирным, комментарии - курсивом (выделение выполняет редактор кода). Кроме того, инструкции программы набраны с отступами, в соответствии с принятыми в среде программистов правилами хорошего стиля.

Листинг 1. Процедура обработки события OnClick на кнопке Вычислить

// нажатие кнопки Вычислить

procedure TForm1.ButtonlClick(Sender: TObject);

dist: integer; // дистанция, метров

t: real; // время, как дробное число

min: integer; // время, минуты sek: integer; // время, секунды

v: real; // скорость

begin

// получить исходные данные из полей ввода

dist:= StrToInt(Edit1.Text);

t:= StrToFloat(Edit2.Text);

// предварительные преобразования

min:= Trunc(t); // кол-во минут - это целая часть числа t

sek:= Trunc(t*100) mod 100; // кол-во секунд - это дробная часть числа t

// вычисление

v:= (dist/1000) / ((min * 60 + sek)/3600);

// вывод результата

label4.Caption:= "Дистанция: "+ Edit1.Text + " м" + #13 +

"Время: " + IntToStr(min) + " мин " + IntToStr(sek) + " сек " + #13 +

"Скорость: " + FloatToStrF(v,ffFixed,4,2) + " км/час";

end;

Функция Button1Click выполняет расчет скорости и выводит результат расчета в поле Label4 . Исходные данные вводятся из полей редактирования Edit1 и Edit2 путем обращения к свойству Text.

Свойство Text содержит строку символов, которую во время работы программы введет пользователь. Для правильной работы программы строка должна содержать только цифры. Для преобразования строки в числа в программе используются функции S trToInt и S trToFloat. Функция StrToInt проверяет символы строки, переданной ей в качестве параметра (Edit1.Text - это содержимое поля Editl), на допустимость, и, если все символы верные, возвращает соответствующее число. Это число записывается в переменную dist. Аналогичным образом работает функция StrToFloat, которая возвращает дробное число, соответствующее содержимому поля Edit2. Это число записывается в переменную t.

После того как исходные данные будут помещены в переменные dist и t, выполняются подготовительные действия и расчет. Первоначально с использованием функции Trunc , которая "отбрасывает" дробную часть числа, выделяется целая часть переменной t - это количество минут. Значением выражения Trunc (t * l00) mod 100 является количество секунд. Вычисляется это выражение так. Сначала число t умножается на 100. Полученное значение передается функции Trunc , которая возвращает целую часть результата умножения t на 100. Полученное таким образом число делится по модулю на 100. Результат деления по модулю - это остаток от деления.

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

Вычисленное значение скорости выводится в поле Label4 путем присваивания значения свойству C aption. Для преобразования чисел в строки используются функции IntToStr и EloatToStr.

В результате нажатия кнопки Завершить программа должна завершить работу. Чтобы это произошло, надо закрыть, убрать с экрана, главное окно программы. Делается это при помощи метода C lose. Процедура обработки события OnClick для кнопки Завершить приведена в листинге 2.

Листинг 2. Процедура обработки события OnClick на кнопке Завершить

// нажатие кнопки Завершить

procedure TForm1.Button2Click(Sender: TObject);

begin

Form1.Close; // закрыть главное окно программы

end;


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

Система 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 , предназначенных для организации многодокументных приложений.