Главная » Уроки по ООП » Урок 17. Формы

Урок 17. Формы

Управление формами

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

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

Главная форма

  • Ей передается управление в начале выполнения приложения.
  • закрытие пользователем главной формы означает завершение выполнения приложения.
  • Она может быть спроектирована невидимой, но если все остальные формы закрыты, то главная форма становится в любом случае видимой (иначе пользователь не смог бы продолжать работать с приложением и даже не смог бы его завершить).

Главной в приложении может быть не та форма, которая была спроектирована первой.

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

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

В нужный момент форму можно сделать видимой методами Show или ShowModal. Их можно применять только к невидимой в данный момент форме. Если нет уверенности, что форма в данный момент видима, то прежде, чем применять эти методы, следует проверить свойство Visible формы. Например:

if (not Form2.Visible) then Form2.ShowModal;

При выполнении методов Show или ShowModal возникает событие формы onShow. Это событие возникает до того момента, как форма действительно станет видимой. Поэтому обработку события onShow можно использовать для настройки каких-то компонентов открываемой формы. Отличие от упомянутой ранее настройки компонентов в момент события onCreate заключается в том, что событие onCreate наступает для каждой формы только один раз в момент ее создания, а события onShow наступают каждый раз, когда форма делается видимой. Так что при этом в настройке можно использовать какую-то оперативную информацию, возникающую в процессе выполнения приложения.
Методом Hide форму в любой момент можно сделать невидимой. В этот момент в ней возникает событие onHide.

Закрытие формы

Закрыть форму можно методом Close. При этом в закрывающейся форме возникает последовательность событий, которые можно обрабатывать. Их назначение — проверить возможность закрытия формы и указать, что именно подразумевается под закрытием формы. Проверка возможности закрытия формы необходима, например, для того, чтобы проанализировать, сохранил ли пользователь документ, с которым он работал в данной форме и который изменял. Если не сохранил, приложение должно спросить его о необходимости сохранения и, в зависимости от ответа пользователя, сохранить документ, закрыть приложение без сохранения или вообще отменить закрытие.
Рассмотрим последовательность событий, возникающих при выполнении метода Close.
Первым возникает событие onCloseQuery. В его обработчик передается булева переменная CanClose, определяющая, должно ли продолжаться закрытие формы. По умолчанию CanClose равно true, что означает продолжение закрытия. Но если из анализа текущего состояния приложения или из ответа пользователя на запрос о закрытии формы следует, что закрывать ее не надо, параметру CanClose должно быть присвоено значение false. Тогда последующих событий, связанных с закрытием формы не будет.

Задание 1: Откройте разрабатываемый вами текстовый редактор (или создайте новое приложение и установите RichEdit). Создайте обработчик события формы onCloseQuery и внесите следующий код:
if RichEdit1.Modified then
if MessageDlg('Документ не сохранен. Вы действительно хотите завершить работу?', mtConfirmation, [mbOk,mbNo],0)=mrNo then CanClose:=False;
Если пользователь в диалоговом окне с запросом о сохранении ответит Нет, то CanClose будет равно false и окно не закроется. Причем этот обработчик сработает при любой попытке пользователя закрыть приложение: нажатии в нем кнопки или раздела меню Выход, нажатии кнопки системного меню в полосе заголовка окна и т.п.

Если обработчик события onCloseQuery отсутствует или если в его обработчике сохранено значение true параметра CanClose, то следом наступает событие OnClose. В обработчик этого события передается переменная Action, которой можно задавать значения:

  • сaNone - не закрывать форму. Это позволяет и в обработчике данного события еще отказаться от закрытия формы.
  • caHide - при этом значении закрыть форму будет означать сделать ее невидимой. Для пользователя она исчезнет с экрана, однако вся хранящаяся в форме информация сохранится.
  • caMinimize - при этом значении закрыть форму будет означать свернуть ее до пиктограммы. Как и в предыдущем случае, вся информация в форме будет сохранена.
  • сaFree - при этом значении закрыть форму будет означать уничтожение формы и освобождение занимаемой ею памяти. Если эта форма в дальнейшем потребуется еще раз, ее надо будет создавать методом CreateForm.

Свойства формы


Свойство

Описание

BorderStyle

Возможные значения:
bsSizeable (по умолчанию) - обычное окно с изменяемыми размерами, имеющее стандартную строку заголовка.
bsDialog -  диалоговое окно, которое не изменяет свои размеры (нет кнопок свернуть и развернуть).
bsSingle - форму, которая не может изменять размеры во время работы.
bsSizeToolWin - окно может изменять размеры и не имеет кнопок biMinimize, biMaximize HbiHelp.
bsToolWindow – аналогично  bsSizeToolWin, но не позволяет изменять размеры
bsNone - окно без рамки и заголовка

KeyPreview

KeyPreview = False, тогда события клавиатуры пересылаются только тому управляющему элементу, который имеет фокус ввода.
KeyPreview = True, тогда событие сначала пересылается форме, а затем — управляющему элементу, имеющему фокус ввода.        

Position

Определяет размещение формы при запуске приложения.
poDesigned - форма выводиться в месте, определенном при разработке приложения. 
poScreenCenter - форма выводится в центре экрана.
poDefault - Windows автоматически установит размеры и положение формы.
poDefaultPosOnly - автоматически определяет расположение формы, но не ее размеры.
poDefaultSizeOnly - автоматически определяет размер, но не расположение формы.

WindowState

определяет состояние окна— свернутое, развернутое или нормальное.
Возможные значения: wsNormal, wsMinimize, wsMaximize

События формы:


OnResize

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

OnActivate

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

OnPaint

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

OnDestroy

Выполняется перед уничтожением формы. Используется для освобождения ресурсов, выделенных в OnCreate.

Модальные формы

Открытие форм как модальных используется в большинстве диалоговых окон. Модальная форма приостанавливает выполнение вызвавшей ее процедуры до тех пор, пока пользователь не закроет эту форму. Модальная форма не позволяет также пользователю переключить фокус курсором мыши на другие формы данного приложения, пока форма не будет закрыта.
Модальной может быть сделана любая форма, если она делается видимой методом ShowModal.
Поведение модальной формы определяется ее основным свойством ModalResult. При открытии формы методом ShowModal сначала свойство ModalResult=0.
Как только при обработке каких-то событий на форме свойству ModalResult будет присвоено положительное значение, модальная форма закроется. А значение ее свойства ModalResult можно будет прочитать как результат, возвращаемый методом ShowModal. Таким образом программа, вызвавшая модальную форму, может узнать, что сделал пользователь, работая с этой формой, например, на какой кнопке он щелкнул.


Численное значение ModalResult

Константа

Пояснение

0

mrNone

 

1

mrOk или idOK

закрытие модальной формы нажатием кнопки ОК

2

mrCancel или idCancel

закрытие модальной формы нажатием кнопки Cancel или методом Close, или нажатием кнопки системного меню в полосе заголовка окна

6

mrYes или idYes

закрытие модальной формы нажатием кнопки Yes

7

mrNo или idNo

закрытие модальной формы нажатием кнопки No

Требуемые значения ModalResult можно задавать в обработчиках соответствующих событий в компонентах модальной формы. Однако при использовании кнопок можно обойтись и без подобных обработчиков. Дело в том, что кнопки типа TButton и TBitBtn имеют свойство ModalResult, по умолчанию равное mrNone.
Для кнопок, расположенных на модальной форме, значение этого свойства можно изменить и тогда не потребуется вводить каких-либо обработчиков событий при щелчке на них. В кнопках BitBtn при свойстве Kind, не равном bkCustom, заложены по умолчанию значения ModalResult, соответствующие назначению той или иной кнопки.

MDI-интерфейс (многодокументный интерфейс)

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

Задание 2:
Создайте новое приложение. Установите у формы свойство FormStyle = fsMDIForm (это будет родительская форма). Свойство Caption='Родительская форма'.
Создайте новую форму (она будет дочерней), свойство FormStyle = fsMDIChild. Свойство Caption=’Окно'.  Свойство Name=FDoc.
Сохраните приложение и запустите на выполнение. Как ведет себя дочерняя форма?

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

Задание 3. Откройте файл проекта командой Project- View Source. Удалите строку
Application.CreateForm(TFDoc, FDoc);
Этим вы исключите дочернюю форму из числа создаваемых автоматически.

Рассмотрим теперь, как можно сделать обработчик команды, по которой пользователь задает в родительском окне создание нового окна документов — нового экземпляра дочерней формы. Этот обработчик может иметь вид:

var <имя> : <имя класса дочерней формы>;
begin
<имя>:=<имя класса дочерней формы>.Create(Application);
<операторы настройки, если они нужны>
<имя>.Show;
end;

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

Задание 4.
Установите на родительскую форму панель ToolBar, и на ней создайте кнопку «Новое окно» (у ToolBar свойство ShowCaptions=True).
Свяжите две формы, для этого выделите родительскую форму и выполните команду File-Use Unit… в открывшемся окне выберите второй модуль.
Создайте обработчик для кнопки «Новое окно», и добавьте в него следующий код:
var NewF : TFDoc;
begin
NewF:=TFDoc.Create(Application);
NewF.Show;
end;
Запустите программу и нажмите на кнопку «Новое окно». Что произошло? Объясните код программы.

Управление дочерними окнами

В родительской форме имеется ряд свойств, позволяющих управлять дочерними окнами. Все они доступны только для чтения и только во время выполнения.
Свойство MDIChildCount определяет количество открытых дочерних окон.
Свойство MDIChildren[i: integer] дает доступ к i-му окну (окна индексируются в порядке их создания).

Задание 5. Добавьте в обработчик, созданный вами ранее, перед строчкой NewF.Show; следующую строку, для задания уникального имени вновь созданного окна NewF:
NewF.Caption :='Окно ' + IntToStr(MDIChildCount);

Задание 6.  Создайте в родительской форме кнопку «Свернуть все окна». В обработчик нажатия введите код:
Var I: Integer;
begin
with Form1 do
for I:=MDIChildCount-1 downto 0 do MDIChildren[I].Close;
end;

Добавьте еще и кнопку «Восстановить все окна».
Var I: Integer;
begin
for I:=0 to MDIChildCount-1 do MDIChildren[I].WindowState:=wsNormal;
end;

Дополнительные задания

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

 

Составитель: Салий Н.А.

Яндекс.Метрика
Сайт создан в системе uCoz