Лекция № 2
Тема: «Работа с формами. Диалоговые окна»
План
1. Понятие формы
2. Работа с формами
3. Свойства, методы и события форм
4. Проектирование окон с изменяемыми размерами
5. Процедуры и функции вызова диалоговых окон
Основным элементом любого приложения является форма – контейнер, в котором размещаются другие визуальные и не визуальные компоненты. С точки зрения пользователя форма – это окно, в котором он работает с приложением. Каждой новой форме, которая вводится в приложение, соответствует свой модуль (Unit), описывающий эту форму как класс, какие-то дополнительные константы, переменные, функции и процедуры. Рассмотрим некоторые свойства, методы и события форм.
Обычно какое-нибудь сложное приложение содержит несколько форм. Главная форма отличается от других рядом свойств. Во-первых, именно этой форме передается управление в начале выполнения приложения. Во-вторых, закрытие пользователем главной формы означает завершение выполнения приложения. Главной в вашем приложении может быть совсем не та форма, которая была спроектирована первой.
Изменить принятые по умолчанию условия относительно форм можно в окне опций проекта, которое вызывается командой Project – Options. В окне опций проекта (Project Options) надо выбрать страницу Forms. В верхнем списке Main forms можно выбрать главную форму среди имеющихся в проекте.
Открытие форм в модальном режиме используется в большинстве диалоговых окон. Модальная форма прекращает выполнение процедуры, которая ее вызвала, до тех пор, пока пользователь не закроет эту форму. Модальная форма не позволяет также пользователю переключить фокус курсором мыши на другие формы данного приложения, пока форма не будет закрыта. То есть пользователь должен выполнить предложенные ему действия прежде, чем продолжить работу.
Во многих случаях ваш проект будет содержать не одну, а несколько форм. Кроме того, вы, может быть, захотите убрать из нового проекта пустую форму и включить вместо нее другую, разработанную ранее вами или кем-то другим. Например, если вы для какого-то своего проекта разработали форму, которая запрашивает пароль пользователя, или форму с информацией о программе и вашим красивым логотипом, то не имеет смысла в новом проекте создавать их заново. Форму с паролем вы могли бы взять из прошлого приложения вообще без каких-либо изменений, а в форме информации о программе вам достаточно изменить только имя программы.
Для всех форм, которые включаются в проект, даже если в вашем проекте всего одна форма, задавайте уникальные имена (свойство Name), изменяя установленные Delphi по умолчанию. Это существенно облегчит вам повторное использование ваших форм, так как позволит избежать дублирования имен при включении прежней формы в новый проект.
Включение в проект форм
Включение в проект новой формы может проводиться различными способами.
Если вы хотите включить новую пустую форму, вам достаточно выполнить команду File – New – Form или нажать соответствующую быструю кнопку.
Теперь рассмотрим случай, когда вам нужно включить в свой проект форму, разработанную ранее вами или кем-то еще для другого проекта. Тут возможны несколько вариантов действий, имеющих различные последствия.
Можно включить готовую форму в проект командой Project – Add to Project или соответствующей быстрой кнопкой. При этом, если включаемая форма имеет то же имя, которое имеет одна из уже имеющихся в проекте форм (например, Form1, если вы не привыкли менять имена форм, принятые Delphi по умолчанию), то вы получите предупреждение вида: "The project already contains a form or module named Form1" (Проект уже содержит форму или модуль с именем Form1). В результате форма откроется, но в проект не включится.
Учтите, что форма, которая содержится в одном приложении и включена описанным способом в другое приложение, становится общей для обоих приложений. Если вы сделаете в ней какие-то изменения, а затем перекомпилируйте оба приложения, то внесенные изменения отразятся в обоих приложениях.
Совместное владение несколькими приложениями одной и той же формой имеет свои плюсы и минусы.
Удаление формы из проекта
Для удаления формы из проекта нужно использовать команду меню Project - Remove from Project и подтвердите выполнение операции.
Создание отдельной копии формы
Чтобы избежать совместного владения формой несколькими приложениями, после того, как вы включили в новое приложение форму из другого приложения, перейдите в окно Редактора кода в модуль этой формы и выполните команду File – Save As, сохранив модуль в каталоге нового приложения и, если хотите, под другим именем (имя менять не обязательно). В этом случае различные приложения будут использовать совершенно разные копии одной формы и изменения одной из них не коснутся других приложений.
3. Свойства, методы и события форм
Каждая форма в Delphi имеет набор свойств, методов и событий.
Свойства формы задают ее внешний вид и поведение. Задавать свойства формы можно при проектировании или в коде программы с помощью команды:
имя_формы.свойство:=значение;
Приведем список наиболее используемых свойств формы
Свойство | Описание |
Align | Задает выравнивание формы на экране. Может привязать форму к краю экрана (alTop- к верхнему краю; alBottom- к нижнему краю; alLeft- к левому краю; alRight- к правому краю; alClient-растягивает форму на весь экран; alCustom-форма размещается там, где ее установили при проектировании и не может быть перемещена) |
Alphablend | При значении true используется степень прозрачности формы, заданное свойством AlphablendValue. |
AlphablendValue | Определяет при Alphablend = true степень прозрачности формы. При значении 255 выводится обычная непрозрачная форма; при значении 0 форма совсем не видима. Если нужно сделать прозрачными отдельные области формы, следует использовать свойства TransparentColorValue и TransparentColor. |
Autoscroll | Значение true, принятое по умолчанию, определяет, что если при выбранном пользователем размере окна не все компоненты помещаются в нем, на форме будут в процессе выполнения автоматично появляться полосы прокрутки. При значении false, уменьшая размер окна, пользователь может потерять доступ к компонентам, которые не поместились в его клиентской области. |
Autosize | Значение true определяет, что размер формы автоматично подгоняется под размер имеющихся компонентов |
Borderlcons | Определяет перечень кнопок в заголовке окна формы. |
Borderstyle | Определяет стиль границы формы и возможность пользователя изменять размер формы. |
Caption | Название формы, отображается в заголовке окна |
Clientheight | Высота клиентской области формы в пикселях. |
Clientwidtht | Ширина клиентской области формы в пикселях. |
Color | Цвет фона формы |
Cursor | Указатель мыши при наведении на форму |
Enabled | Значение true определяет, что доступ к форме разрешен |
Font | Параметр шрифта для всех компонентов формы |
Height | Высота формы в пикселях |
Hint | Текст всплывающей подсказки |
Icon | Определяет пиктограмму, которая будет отображаться при сворачивании окна формы. Если пиктограмма не задана, по умолчанию будет отображаться пиктограмма Delphi. |
Left | Расстояние формы от левого края экрана в пикселях |
Name | Имя формы, по которому к форме можно обратиться в коде программы. |
Position | Определяет размер и положение окна при запуске приложения. |
Screensnap | Обеспечивает захват формы при ее перемещении к краю экрана: если пользователь перемещает окно формы, приближая его к краю экрана на расстояние, меньше Snapbuffer, то при ееотпускании форма сдвинется так, что будет придвинута к соответствующему краю экрана. |
Snapbuffer | Определяет расстояние в пикселях, которое вызывает захват формы при ее перемещении к краю экрана при Snapbuffer = true |
Showhint | Если равно true, то отображается текст всплывающей подсказки |
Top | Отступ формы от верхнего края экрана в пикселях |
Transparent | При значении true делает прозрачным цвет, указанный свойством Transparentcolorvalue. |
Transparent | Указывает цвет на форме и в компонентах, который делается прозрачным при TransparentColor = true. Например, можно разместить на форме панель, установить в ней Color = clRed, задать в форме TransparentColorValue = clRed и установить TransparentColor в true. На форме во время выполнения появиться прозрачное окно. А если вы при этом установите для формы Color = clRed, то станет прозрачной клиентская область формы и будет видна только полоса заголовка и компоненты, покрашенные в другие цвета. |
Visible | Определяет видимость формы. По умолчанию равно false, но для главной формы приложения в момент ее создания делается равным true. Если вы программно установите в какой-то момент Visible для главной формы равным false, то форма исчезает с экрана, из полосы задач и даже из диспетчера задач Windows (останется только в диспетчеровой задач на странице процессов). |
Width | Ширина формы в пикселях |
Windowstate | Определяет состояние окна: wsNormal – нормальное, wsMinimized – свернутое, wsMaximized – развернутое на весь экран. |
Методы формы определяют действия, которые можно выполнять над формой. Для вызова нужного метода используют команду:
имя_формы.метод;
Приведем перечень методов форм:
Метод | Описание |
Close | Закрывает окно формы. Если метод применяется к главной форме приложения, приложение закрывается. Закрытие окна может быть прервано в обработчике событий ОnCloseQuery и OnClose. |
GetFormImage | Возвращает изображение клиентской области формы. Это изображение можно, например, занести в буфер обмена оператором Clipboard.Assign(GetFormImage) и потом перенести в какой-то документ, например, в документ Word. |
Free | Закрывает форму и освобождает занятую ею память. |
Hide | Делает форму невидимой, устанавливая значение его свойства Visible в false. Форма в момент использования метода должна иметь значение Visible = true. |
Печатает клиентскую область формы, занося ее образ, полученный методом GetFormImage, в контекст принтера. | |
Release | Закрывает форму и освобождает занятую ею память. Для формы генерируются все события, свойственные закрывающейся форме. Для форм нужно использовать именно этот метод, а не метод Free. |
Setfocus | Передает фокус формы и ее активному компоненту. |
Show | Делает форму видимой |
ShowModal | Делает форму видимой и модальной. |
Форма, как и любой объект, может реагировать на события, которые генерируются пользователем или другими объектами программы. Для каждого такого события можно написать подпрограмму, которая выполниться при наступлении события.
Приведем события формы:
Событие | Описание |
OnActivate | Событие наступает, когда форма становиться активной, т.е. получает фокус, например, при щелчке на ней. |
OnClose | Событие наступает при закрытии формы после события OnCloseQuery. В обработчике можно указать причину закрытия или отменить закрытие. |
OnCloseQuery | Первое событие при закрытии формы. В его обработчике можно перервать закрытие |
OnCreate | Первое событие при создании формы. В его обработчике можно настроить форму и ее компоненты. |
OnDeactivate | Событие наступает, когда форма перестает быть активной, то есть теряет фокус |
OnDestroy | Последнее событие при закрытии формы и удаления ее из памяти. В его обработчике следует очистить память от объектов, созданных в обработчике Oncreate. |
OnHide | Событие наступает перед тем, как форма становиться невидимой. |
OnPaint | Событие наступает перед прорисовкой формы. |
OnResize | Событие наступает каждый раз, когда форма меняет свой размер |
OnShow | Событие наступает перед тем, как форма становится видимой. |
Часто программа состоит из множества форм, и формы обращаются одна к другой. Каждая форма имеет собственный файл модуля, в котором храниться ее описание и все ее подпрограммы.
Чтобы одна форма могла ссылаться на другую форму, необходимо подключиться модуль нужной формы в разделе Uses.
Для этого используют несколько способов:
4. Проектирование окон с изменяемыми размерами
Выравнивание компонентов – свойство Align
Если проектируется окно, размеры которого пользователь может изменять во время выполнения приложения, то необходимо принять меры, чтобы компоненты в окне при этом тоже меняли свои размеры или местоположение, равномерно распределяясь по площади окна и не оставляя пустых мест.
Во многих компонентов есть свойство Align - выравнивание. По умолчанию оно равно alNone. Это означает, что никакое выравнивание не производится. Но его можно задать равным аlTор, или alBottom, или alLeft, или alRight, что будет означать, что компонент должен занимать всю верхнюю или нижнюю, или левую, или правую часть клиентской области компонента-контейнера. Под клиентской областью понимается вся свободная площадь формы или другого контейнера, в котором могут размещаться включенные в этот контейнер компоненты. Можно также задать свойства Align компонента значением alClient, что приводит к заполнению компонентом всей свободной клиентской области. Во всех этих случаях размеры компонента будут автоматически изменяться при изменении размеров контейнера.
Изменение местоположения и размеров компонентов
Оконные компоненты Delphi имеют свойство Anchors – привязку к родительскому компоненту при изменении размеров последнего. Это свойство представляет собой множество, которое может содержать следующие элементы:
акТор | Верхний край компонента привязанный к верхнему краю родительского компонента. |
akLeft | Левый край компонента привязанный к левому краю родительского компонента. |
akRight | Правый край компонента привязанный к правому краю родительского компонента. |
akBottom | Нижний край компонента привязанный к нижнему краю родительского компонента. |
Если во множестве Anchors присутствуют привязки к противоположным сторонам родительского компонента, то при изменении размеров родительского компонента происходит растяжение или сжатие дочернего компонента, поскольку расстояния от сторон родительского компонента выдерживаются. Сжатие может происходить до полного исчезновения изображения данного компонента.
По умолчанию привязка осуществляется к левому и верхнему краям родительского компонента: свойство Anchors равно [akLeft, akTop]. Если задать в свойстве Anchors привязку к противоположным сторонам родительского компонента, то при изменении размеров родительского компонента будут меняться размеры и данного компонента.
Ограничение границ изменения размеров окон и компонентов
Все рассмотренные ранее методы изменения размеров панелей и компонентов на них имеют общий недостаток: при чрезмерном уменьшении пользователем размеров окна какие-то компоненты могут исчезать из поля зрения. Иногда к некрасивым с точки зрения эстетики результатам приводит и чрезмерное увеличение размеров окна. Хотелось бы иметь средства, ограничивающие пользователя в его манипуляциях с окном и не позволяют ему чрезмерно уменьшать и увеличивать размеры окна.
Таким средством является свойство Constraints, позволяющее задавать ограничения на допустимые изменения размеров. Свойство имеет четыре основных подсвойства: MaxHeight, MaxWidth, MinHeight и MinWidth – соответственно максимальная высота и ширина, и минимальная высота и ширина. По умолчанию значение всех этих подсвойств равно 0, что означает отсутствие ограничений. Но задание каждому из этих свойств положительного значения приводит к соответствующему ограничению размера заданным числом пикселей.
Чтобы какие-то компоненты не исчезали из поля зрения, можно задать им ограничения минимальной высоты и длины. Таким образом, можно поддерживать нормальные пропорции отдельных частей окна. Можно задать ограничения на минимальные и максимальные размеры формы, то есть всего окна.
5. Процедуры и функции вызова диалоговых окон
Процедуры ShowMessage
В приложениях часто приходится отображать различные простые диалоговые окна, чтобы дать пользователю какие-то указания или поставить несложный вопрос, на который возможен один из стандартных ответов: да, нет, отменить, прервать. В законченном приложении желательно эти окна проектировать самому, обеспечивая единство стиля всех окон приложения, надписи на кнопках и т.п. Но при разработке прототипа будущего проекта и в процессе отладки удобно пользоваться готовыми диалоговыми окнами.
Простейшей из таких процедур является ShowMessage, которая отображает окно сообщения с кнопкой ОК. Она имеет вид:
ShowMessage(текст);
Команда выдает модальное окно с текстом и кнопкой ОК. Заголовок окна совпадает с именем исполняемого файла приложения.
Команда может выдать текстовую константу:
ShowMessage('Доброе утро');
При выдачи числового значения его нужно предварительно конвертировать в текст при помощи специальных функций:
IntToStr(целое число)
FloatToStr(вещественное число)
Например.
var a:integer; b:real;
begin
a:=15;
b:=12.36;
ShowMessage('a='+IntToStr(a));
ShowMessage('b='+FloatToStr(b));
Метод Application.MessageBox
Метод объявлен следующим способом:
Application.MessageBox(текст, заголовок, флажки)
Он отражает диалоговое окно с заданными кнопками, сообщением и заголовком и позволяет проанализировать ответ пользователя.
Параметр Текст представляет собой текст сообщения, которое не может превышать 255 символов. Для длинных сообщений осуществляется автоматический перенос текста.
Параметр Заголовок представляет собой текст заголовка окна. Он тоже не может превышать 255 символов, но не переносится. Так что длинный заголовок приводит к появлению длинного и не очень красивого диалогового окна.
Параметр Флажки представляет собой множество флажков, определяющих вид и поведение диалогового окна. Этот параметр может комбинироваться операцией сложения по одному флагу из следующих групп.
Флажки кнопок
Флажок | Значение |
MB_ABORTRETRYIGNORE | Кнопки Abort (Стоп), Retry (Повтор) и Ignore (Пропустить) |
МВ_ОК | Кнопка ОК. Этот флажок принят по умолчанию |
MB_OKCANCEL | Кнопки ОК и Cancel (Отмена) |
MB_RETRYCANCEL | Кнопки Retry (Повтор) и Cancel (Отмена) |
MB_YESNO | Кнопки Yes (Да) и No (Нет) |
MB_YESNOCANCEL | Кнопки Yes (Да), No (Нет) и Cancel (Отмена) |
Флажки пиктограмм в диалоговом окне
Флажок | Пикторгамма |
MB_ICONEXCLAMATION, MB_ICONWARNING | Знак восклицания (замечание, предупреждение) |
MB_ICONINFORMATION, MB_ICONASTERISK | Буква «I» в кругу (подтверждение) |
MB_ICONQUESTION | Знак вопроса (ожидание ответа) |
MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND | Знак креста на красном кругу (запрет, ошибка) |
Флажки для указаняи кнопки по умолчанию
Флажок | Кнопка |
MB_DEFBUTTON1 | Первая кнопка. Это принято по умолчанию |
MB_DEFBUTTON2 | Вторая кнопка |
МВ_ DEFBUTTON3 | Третья кнопка |
MB_DEFBUTTON4 | Четвертая кнопка |
Флажки модальности
Флажок | Пояснение |
MB_APPLMODAL | Пользователь должен ответить на запрос, прежде чем сможет продолжить работу с приложением. Но он может перейти в окна другого приложения. Он может также работать со всплывающими окнами данного приложения. Этот флажок принят по умолчанию. |
MB_ SYSTEMMODAL | То же самое, что MB_APPLMODAL, но окно диалога отображается в стиле WS_EX_TOPMOST, то есть всегда остается наверху, даже если пользователь перешел к другим приложениям. Используется для предупреждения о серьезных ошибках, требующих немедленного вмешательства |
Если функция используется для выдачи запроса, то проанализировать ответ пользователя можно с помощью констант:
Значение | Численное значение | Пояснение |
IDABORT | 3 | Выбранна кнопка Abort (Стоп) |
IDCANCEL | 2 | Выбранна кнопка Cancel (Отмена) или нажата клавиша Esc |
IDIGNORE | 5 | Выбранна кнопка Ignore (Пропустить) |
IDNO | 7 | Выбранна кнопка No (Нет) |
IDOK | 1 | Выбранна кнопка ОК |
IDRETRY | 4 | Выбранна кнопка Retry (Повтор) |
IDYES | 6 | Выбранна кнопка Yes (Да) |
Например, при выходе из программы часто выдается запрос на подтверждение данной операции. Для выдачи такого запроса нужно в событии формы CloseQuery ввести код:
if Application.MessageBox ('Выйти?', 'Запрос', mb_yesno+mb_iconquestion+ mb_defbutton2) = idno then
CanClose:=false;
Функция ввода данных с клавиатуры InputBox
InputBox ('заголовок', 'текст-подсказка', 'значение по умолчанию')
Функция InputBox предлагает пользователю диалоговое окно с заголовком, с предложением пользователю что-то написать и с полем редактирования, в котором предварительно загруженно значение текста по умолчанию. Если пользователь нажмет в окне ОК, то функция вернет введенную им строку текста. Если же пользователь в диалоге нажал Cancel, или нажал Esc, или закрыл окно системной кнопкой, то функция вернет строку по умолчанию, даже если перед этим пользователь что-то написал в поле редактирования.
Для вызова функции нужно описать строковую переменную и присвоить ей эту функцию:
var name:string;
. . .
name:= InputBox('Регистрация’, 'Укажите цель вашего приезда', 'Неизвестно');
Вопросы для самоконтроля
1. Опишите принципы работы с формами в проекте: добавление, удаление, задание главной формы проекта. Что означает понятие «главная форма проекта»?
2. Какие свойства формы вы знаете? Дайте характеристику основным из них. Как задать свойства формы?
3. Какие методы формы вы знаете? Как вызвать метод формы? Какие события формы вы знаете? Как написать обработчик для нужного события?
4. Какие свойства позволяют организовать масштабирования компонентов при изменении размера формы? Дайте их характеристику.
5. Опишите команду выдачи сообщений на экран ShowMessage и команду ввода данных с клавиатуры InpurBox. Примеры.
6. Опишите функцию Application.Messagebox. Приведите все ее параметры и пример использования.