Лекция
доцента кафедры ИВТ Гродненского госуниверситета
канд. техн. наук Ливак Елены Николаевны
Создание форм. Методы. События.
Разработка приложений в Delphi - это
· проектирование форм,
· включение компонентов в формы
· и размещение кода, соответствующего компонентам.
«Формы являются основными блоками, из которых строится приложение» (Матчо)
Итак, форма - основа любого приложения.
С точки зрения пользователя, форма - это окно, в котором он работает с приложением. Обычно сколько-нибудь сложное приложение содержит несколько форм.
Каждой форме приложения соответствует свой модуль, описывающий эту форму как класс.
! |
Для обмена любой информацией между формами модули соответствующих форм должны использовать друг друга.
В модуле Unit1 - uses Unit2;
в модуле Unit2 - uses Unit1;
Замечание. Если операторы uses в обоих модулях расположены в разделах interface, возникнут проблемы с недопустимыми круговыми ссылками (circular unit reference) и компилятор выдаст соответствующую ошибку.
Необходимо поместить один или оба (!) оператора uses в раздел implementation.
Можно использовать команду File | Use Unit, которая автоматизирует этот процесс и гарантирует отсутствие круговых ссылок.
По умолчанию, все формы создаются автоматически при запуске приложения, и первая из введенных в приложение форм считается главной.
Главная форма отличается от других тем, что
1) именно этой форме передается управление в начале выполнения приложения;
2) закрытие пользователем главной формы означает завершение выполнения приложения;
3) главная форма, как и любая другая, может быть спроектирована невидимой, но если все остальные формы закрыты, то главная форма становится в любом случае видимой (надо же пользователю иметь возможность продолжать работу с приложением, хотя бы, завершить его).
Главной можно сделать любую форму из имеющихся в проекте.
Для этого следует в окне опций проекта (Project | Options) на странице Forms в выпадающем списке Main forms выбрать необходимую форму.
При создании любой формы для нее выделяется память. Повторим, что по умолчанию все формы создаются автоматически при запуске приложения.
Для каждой автоматически создаваемой формы Delphi добавляет в головной файл проекта соответствующий оператор ее создания методом CreateForm.
Например, файл проекта <имя>.dpr
Application.CreateForm(TForm, Form1); {создает форму Form1}
Application.CreateForm(TAboutBox, AboutBox); {создает форму AboutBox}
Application.Run; {запускает приложение}
В момент создания формы возникает событие OnCreate.
В обработчик этого события можно внести действия, которые необходимо выполнить при создании формы (например, изменить свойства формы, настроить некоторые компоненты формы и т.п.)
Но в приложении могут быть формы, которые требуются не в каждом сеансе работы с приложением. Следовательно, при автоматическом создании таких форм расходуется лишняя память.
Замечание. В приложениях MDI дочерние формы в принципе не могут быть автоматически создаваемыми, так как число таких форм определяет пользователь во время работы приложения.
С помощью окна опций проекта (Project | Options) на странице Forms можно установить, какие формы будут создаваться автоматически, а какие нет. Для этого следует в окне Auto-Create forms выбрать необходимые формы и переместить их в окно Availabel forms-доступные формы (с помощью кнопки со стрелкой вправо).
! |
Для форм, исключенных из списка автоматически создаваемых форм, метод CreateForm необходимо выполнить в тот момент, когда форма должна быть создана.
Код будет примерно следующим:
Form2 := TForm2.Create(Self);
Form2.Visible := True; {сразу после открытия формы сделать ее видимой}
Form2.SetFocus; {если необходимо установить фокус клавиатуры к данному окну}
В нужный момент форму можно сделать видимой методами Show или ShowModal.
Понятие модальной формы
Модальная форма приостанавливает выполнение вызвавшей ее процедуры до тех пор, пока пользователь не закроет эту форму.
Если управление было передано модальной форме, то пользователь не может передать фокус никакой другой форме до тех пор, пока он не закроет модальную форму. Т.е. пользователь должен выполнить предложенные ему действия прежде, чем продолжить работу.
Если форма делается видимой методом ShowModal, то она становится модальной.
Если форма делается видимой методом Show, то она не будет модальной.
Поведение модальной формы определяется ее свойством ModalResult.
Это свойство доступно только во время выполнения приложения. При открытии формы методом ShowModal свойство ModalResult=0. Как только при обработке некоторых событий на форме свойству будет присвоено значение от 1 до 8, модальная форма закроется.
Метод ShowModal в качестве результата возвращает значение свойства ModalResult.
0 - mrNone
1 - mrOk { закрытие модальной формы нажатием кнопки Ok}
2 - mrCancel
3 - mrAbort
4 - mrRetry
5 - mrIgnore
6 - mrYes
7 - mrNo
8 - mrAll
Таким образом можно узнать, на какой кнопке щелкнул пользователь.
! |
Методы Show и ShowModal можно применять только к невидимой в данный момент форме.
В случае сомнения следует проверить свойство Visible формы.
Например,
if (not Form2.Visible) then Form2.ShowModal;
При выполнении методов Show и ShowModal возникает событие формы OnShow (! До того момента как форма действительно станет видимой).
Поэтому обработку этого события можно использовать для настройки каких-то компонентов открываемой формы.
Замечание. Настройку компонентов формы можно выполнять и при наступлении события OnCreate. Следует учитывать, что событие OnCreate наступает для каждой формы только один раз в момент ее создания, а события OnShow наступают всякий раз, когда форма становится видимой. Т.о. можно в настройке использовать информацию, возникающую в процессе выполнения приложения.
Методом Hide форму в любой момент можно сделать невидимой. В этот момент в ней возникает событие OnHide.
Закрыть форму можно методом Close.
При этом в закрывающейся форме возникает последовательность событий, которые можно обрабатывать.
Можно проверить возможность закрытия формы. Например, в случае работы пользователя с документом необходимо проверить, сохранил ли пользователь изменения в документ. Если нет, то следует спросить его о необходимости сохранения.
Первым возникает событие OnCloseQuery. В его обработчик передается как Var (по ссылке) булева переменная CanClose.
Если CanClose = True (установлено по умолчанию), то закрытие продолжается.
Если CanClose = False , то последующих событий, связанных с закрытием не произойдет.
! |
Если из ответа пользователя на запрос о закрытии формы следует, что закрывать не надо, следует выполнить присваивание CanClose := False;
Если обработчик события OnCloseQuery отсутствует или CanClose = True, то наступает событие OnClose. В обработчик этого события передается как Var переменная Action.
Значения Action:
caNone - Не закрывать форму. Это позволяет еще в обработчике этого события
отказаться от закрытия формы.
сaHide - Закрыть форму значит сделать ее невидимой
(по умолчанию, для форм, не являющихся главными и дочерними в MDI).
Вся хранящаяся в форме информация сохраняется.
сaMinimize - Закрыть форму - значит свернуть ее до пиктограммы.
Вся хранящаяся в форме информация сохраняется
caFree - Уничтожение формы и освобождение занимаемой ею памяти.
Если Action = caFree, то при освобождении памяти возникает событие OnDestroy. Оно используется для очистки памяти от тех объектов, которые автоматически не уничтожаются при закрытии приложения.
Свойства формы
По существу форма - это окно, с которым работает пользователь.
К внешнему виду окон в Windows предъявляются определенные требования.
Delphi автоматически обеспечивает стандартный для Windows вид окон приложения.
Но разработчику необходимо продумать и установить многие характеристики окон.
Все характеристики окон обеспечиваются установкой и управлением свойствами формы.
Свойство BorderStyle определяет общий вид окна и операции с ним, которые разрешается выполнять пользователю. Это свойство может принимать следующие значения:
bsSizeabIe (по умолчанию) Обычный вид окна Windows с полосой заголовка, с возможностью для пользователя изменять размеры окна с помощью кнопок в полосе заголовка или с помощью мыши, потянув за какой-либо край окна.
bsDialog Неизменяемое по размерам окно. Типичное окно диалогов
bsSingle Окно, размер которого пользователь не может изменить, потянув курсором мыши край окна, но может менять кнопками в полосе заголовка
bsToolWindow To же, что bsSingle, но с полосой заголовка меньшего размера
bsSizeToolWin To же, что bsSizeabIe, но с полосой заголовка меньшего размера и с отсутствием в ней кнопок изменения размера
bsNone Без полосы заголовка. Окно не только не допускает изменения размера, но и не позволяет переместить его по экрану
Свойство Borderlcons определяет набор кнопок, которые имеются в полосе заголовка. Множество кнопок задается элементами:
bySistemMenu кнопка системного меню (для Windows 95/98 и NT это кнопка с крестиком, закрывающая окно)
by Minimize кнопка Свернуть, сворачивает окно до пиктограммы byMaximize кнопка Развернуть, разворачивает окно на весь экран
byHelp кнопка справки
Замечание. Не все кнопки могут появляться при любых значениях BorderStyle.
Совет. Для создания диалоговых окон обычно используется стиль заголовка bsDialog, причем в этих окнах можно исключить кнопку системного меню и в этом случае пользователь не может закрыть окно никакими способами, кроме как выполнить какие-то предписанные ему действия на этой форме.
! |
Без особой необходимости не делайте окна приложения с изменяемыми пользователем размерами. При изменении размеров (если не применены специальные приемы), нарушается компоновка окна и пользователь ничего не выигрывает от своих операций с окном. Окно имеет смысл делать с изменяемыми размерами, только если это позволяет пользователю изменять полезную площадь каких-то расположенных в нем компонентов отображения и редактирования информации: текстов, изображении, списков и т.п.
______________________
! |
Для основного окна приложения с неизменяемыми размерами наиболее подходящий стиль — BorderStyle = bsSingle с исключением из числа доступных кнопок кнопки Развернуть (Borderlcons.byMaximize = false). Это позволит пользователю сворачивать окно, восстанавливать, но не даст возможности развернуть окно на весь экран или изменить размер окна.
______________________
! |
Для вторичных диалоговых окон наиболее подходящий стиль — BorderStyle = bsDialog. Можно также использовать BorderStyle = bsSingle, одновременно исключая из числа доступных кнопок кнопку Развернуть (задавая Borderlcons.byMaximize = false). Это позволит пользователю сворачивать диалоговое окно, если оно заслоняет на экране что-то нужное ему, восстанавливать окно, но не даст возможности развернуть окно на весь экран или изменить размер окна.
______________________
! |
Избегайте, кок правило, стиля BorderStyle = bsNone. Невозможность переместить окно может создать пользователю трудности, если окно заслонит на экране что-то интересующее пользователя.
Свойство формы WindowState определяет вид, в котором окно первоначально предъявляется пользователю при выполнении приложения. Оно может принимать значения:
wsNormal нормальный вид окна (используется по умолчанию)
wsMinimized окно свернуто
wsMaximized окно развернуто на весь экран
Если свойство WindowState имеет значение wsNormal или пользователь, манипулируя кнопками в полосе заголовка окна, привел окно в это состояние, то положение окна при запуске приложения определяется свойством Position, которое может принимать значения:
poDesigned Первоначальные размеры и положение окна во время выполнения те же, что во время проектирования. Это значение принимается по умолчанию, но обычно его следует изменить
poScreenCenter Окно располагается в центре экрана. Размер окна тот, который был спроектирован. В мультиэкранных приложениях, работающих одновременно с множеством мониторов (только начиная с Delphi 4) эта центральная позиция может быть несколько изменена, чтобы изображение попало точно на один монитор, определяемый свойством DefaultMonitor
poDesktоpCenter (предусмотрено начиная с Delphi 4) Окно располагается в центре экрана. Размер окна тот, который был спроектирован. Этот режим не приспосабливается к приложениям с множеством мониторов.
poDefault Местоположение и размер окна определяет Windows, учитывая размер и разрешение экрана. При последовательных показах окна его положение сдвигается немного вниз и вправо
poDefaultPosOnly Местоположение окна определяет Windows. При последовательных показах окна его положение сдвигается немного вниз и вправо. Размер окна — спроектированный
poDefanltSizeOnly Размер окна определяет Windows, учитывая размер и разрешение экрана.
Положение окна — спроектированное
poMainFormCenter (предусмотрено начиная с Delphi 5)
Окно располагается в центре главной формы. Размер окна тот, который был спроектирован. Этот режим не приспосабливается к приложениям с множеством мониторов. Используется только для вторичных форм. Для главной формы действует так же, как poScreenCenter.
! |
Обычно целесообразно для главной формы приложения задавать значение Position равным poScreenCenter или poDetault. И только в сравнительно редких случаях, когда на экране при выполнении приложения должно определенным образом располагаться несколько окон, имеет смысл оставлять значение poDesigned, принимаемое по умолчанию.
Если выбранное значение свойства Position предусматривает выбор размера формы самим Windows по умолчанию, то на этот выбор влияют свойства PixelsPerInch и Scaled. По умолчанию первое из них задается равным количеству пикселей на дюйм в системе, второе установлено в false. Если задать другое число пикселей на дюйм, то свойство Scaled автоматически становится равным true. В этом случае при запуске приложения размер формы будет изменяться в соответствии с пересчетом заданного числа пикселей на дюйм к реальному числу пикселей на дюйм в системе (но только при разрешающем это значении свойства Position).
Свойство AutoScroll определяет, будут ли на форме в процессе выполнения появляться автоматически полосы прокрутки в случае, если при выбранном пользователем размере окна не все компоненты помещаются в нем. Если значение AuntoScrоll равно true, то будут. В противном случае при уменьшении размера окна пользователь теряет доступ к компонентам, не поместившимся в его поле.
Свойство Icon задает пиктограмму формы. По умолчанию используется стандартная пиктограмма Delphi. Нажав в Инспекторе Объектов кнопку с тремя точками в строке свойства Icon, вы попадаете в окно Редактора Изображений (Picture Editor). Щелкнув в нем на кнопке Load (загрузить), вы можете выбрать любой файл с изображением пиктограммы (файл с расширением .ico). С Delphi поставляется некоторое число пиктограмм, расположенных в каталоге lmages\lcons.
! |
Свойство Icon задает только пиктограмму формы, которая отображается в левом верхнем углу окна приложения в его нормальном состоянии. Но если пользователь свернет окно, то в полосе задач будет видна другая пиктограмма — пиктограмма приложения. Ту же пиктограмму увидит пользователь, если будет просматривать средствами Windows содержимое каталога. По умолчанию для нее используется стандартная пиктограмма Delphi. При свертывании приложения рядом с пиктограммой в полосе задач пользователь будет видеть надпись — по умолчанию это имя приложения. Можно изменить эту пиктограмму и эту надпись. Для этого необходимо выполнить команду Project | Options и в открывшемся окне опций проекта перейти на страницу Application. В этом окне можно задать заголовок (Title), который увидит пользователь в полосе задач при сворачивании приложения. А кнопка Load Icon позволяет выбрать пиктограмму, которая будет видна в полосе задач при сворачивании приложения или при просмотре пользователем каталога, в котором расположен выполняемый файл приложения.
Одно из основных свойств формы — FormStyle, которое может принимать значения:
fsNormal Окно обычного приложения. Это значение FormStyle принято по умолчанию
fsMDIForm Родительская форма приложения MDI, т.е. приложения с дочерними окнами, используемого при работе с несколькими документами одновременно
fsMDIChild Дочерняя форма приложения MDI
fsStayOnTop Окно, остающееся всегда поверх остальных окон Windows. Не только данного приложения, но и всех других приложений, в которые может перейти пользователь
! |
Используйте стиль FormStyle — tsStayOnTop для отображения окон сообщений пользователю о каких-то аварийных ситуациях.
В ряде случаев полезно предоставить пользователю самому решать, сделать ли данное окно располагающимся всегда поверх остальных, или нет. Например, ему может временно потребоваться перейти в какое-то другое приложение, чтобы получить необходимую информацию, и при этом будет хотеться видеть поверх этого приложения ваше окно, чтобы сравнивать в этих двух окнах какие-то данные. Такую возможность легко предоставить пользователю. Достаточно ввести в меню окна раздел «Поверх остальных» и в обработчик щелчка на этом разделе вставить операторы
MStayOnTop.Checked := not MStayOnTop.Checked;
if MStayOnTop.Checked
then Formi.FormStyle := fsStayOnTop
else Formi.FormStyle := fsNormal;
В этом коде подразумевается, что объект раздела меню, о котором идет речь, назван MStayOnTop. Тогда при выборе пользователем этого раздела меню в нем появится индикатор, а окно приобретет статус расположенного всегда поверх остальных.
При повторном выборе этого раздела индикатор (птичка) исчезнет, и окно приобретет оббычный вид. виобычный видстатус.