Назад.    Содержание.

ФОРМА

ПОНЯТИЕ ФОРМЫ

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

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

Для изучения следующего материала нам понадобится новое приложение. Выберите в меню команду File | New Application. Delphi автоматически создаст в новом проекте чистую форму и поместит в окно Редактора Кода ее исходный текст (рис. 5. 12).

Сразу сохраните проект и его форму, чтобы потом к этому не возвращаться. Выберите в меню команду File | Save All и дайте модулю имя MAIN. PAS, а проекту — имя FORMTEST. DPR. Полигон для изучения формы подготовлен, можно заняться ее свойствами.

ИМЯ И ЗАГОЛОВОК ФОРМЫ

Главное свойство, с которого вы начинаете настройку формы, — это свойство Name (имя). Оно содержит идентификатор, используемый для обращения к форме из программы. По умолчанию первой же форме нового проекта назначается имя Form1. Мы советуем всегда его изменять, чтобы имя формы отражало ее роль в приложении. Например, главную форму приложения можно назвать MainForm (если ничего лучше в голову не приходит) (рис. 5. 13).

На будущее заметим, что свойство Name есть в любом компоненте и оно редактируется в окне Object Inspector. Осмысленные имена следует давать всем компонентам.

Каждая форма приложения должна иметь оригинальный заголовок, чтобы пользователь мог быстро и безошибочно отыскать ее на экране среди других. Заголовок задается в свойстве Caption. Наша форма — учебная, поэтому ей можно дать заголовок Main .

СТИЛЬ ФОРМЫ

Настраивая форму, нужно принимать во внимание, какой пользовательский интерфейс будет иметь ваше приложение: многодокументный интерфейс MDI (от англ. Multipl Document Interface) или обычный однодокументный интерфейс SDI (от англ. Singli Document Interface). За это отвечает свойство формы FormStyle, которое может принимать следующие значения:

• fsMDIChild — дочернее окно MDI-приложения;

• fsMDIForm — главное окно MDI-приложения;

• fsNormal — обычное окно (значение по умолчанию);

• fsStayOnTop — окно, всегда расположенное поверх других окон на экране.

Многие приложения, с которыми вы работаете, имеют пользовательский интерфейс MDI. Они состоят из родительского» окна, которое включает одно или несколько «дочерних» окон. Дочерние окна ограничены областью родительского окна и не могут выходить за его границы. Для главной формы MDI-приложения значение свойства FormStyle равно fsMDIForm. Для всех дочерних форм значение свойства FormStyle равно fsMDIChild. Для модальных диалоговых окон свойство FormStyle равно fsNormal, что дает возможность выносить их за пределы основной формы.

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

Очевидно, что наш простой вычислитель идеального веса является SDI-приложением и поэтому свойство FormStyle имеет значение по умолчанию, т. е. fsNormal.

РАЗМЕРЫ И ПОЛОЖЕНИЕ ФОРМЫ НА ЭКРАНЕ

Теперь определимся с размерами формы и ее местоположением на экране. Установить размеры и положение формы проще всего во время проектирования с помощью мыши. Другой способ — обратиться к Инспектору Объектов и задать размеры формы значениями свойств Width и Height, а местоположение — значениями свойств Left и Тор (значения задаются в пикселах). Смысл свойств поясняет (рис.5.14)

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

• poDefault — размер и положение формы подбираются автоматически средой Windows;

• poDefaultPosOnly — положение формы подбирается автоматически, а ширина и высота — по значениям свойств Width и Height;

• poDefaultSizeOnly — размер формы устанавливается автоматически по умолчанию, местоположение — по значению Left и Тор;

• poDesigned — размер и положение задаются значениями Left, Top, Width, Height, установленными во время разработки приложения;

• poScreenCenter — форма размещается в центре экрана; размеры задаются значениями Width и Height.

Иногда размеры формы рассчитываются из размеров ее рабочей области (client area) на которой размещаются компоненты. Как известно, в рабочую область не входят рамка и заголовок. Размеры рабочей области хранятся в свойствах ClientWidth и ClientHeight. При их установке значения свойств Width и Height автоматически пересчитываются (и наоборот).

Бывает, что при выборе размеров формы учитываются размеры экрана. Поскольку современные видеоадаптеры поддерживают множество режимов с различным разрешением, встает вопрос: как обеспечить одинаковую пропорцию между формой и экраном независимо от разрешающей способности дисплея. На этот случай в форме предусмотрено свойство Scaled. Если оно установлено в значение True, то форма будет автоматически масштабироваться в зависимости от разрешающей способности дисплея.

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

• wsNormal — форма ни свернута, ни развернута;

• wsMinimized — форма свернута;

• wsMaximized — форма развернута.

Если при проектировании вы измените значение свойства WindowState на wsMinimized или wsMaximized, то получите форму, которая будет себя сворачивать или разворачивать автоматически при первом появлении на экране.

ЦВЕТ РАБОЧЕЙ ОБЛАСТИ ФОРМЫ

С размерами формы все ясно и теперь желающие могут изменить установленный по умолчанию цвет ее фона с помощью свойства Color. Для этого следует обратиться к Инспектору Объектов. Щелкните мышью на свойстве Color и выберите любой цвет из списка базовых цветов. Базовые цвета представлены в списке именованными константами. Вы можете также выбрать цвет из всей цветовой палитры, выполнив двойной щелчок мыши на значении свойства.  На экране появится стандартное диалоговое окно   выбора  цвета.Когда вы установите цвет в окне Инспектора Объектов, изменение немедленно отразится на форме. Можно работать с самыми разными цветами, но хорошим тоном считается использовать стандартную цветовую гамму Windows. Поэтому лучшее значение для свойства Color — clBtnFace (цвет такой, как у кнопок).

РАМКА ФОРМЫ

Во внешнем виде формы очень важную роль играет рамка и расположенные на ней кнопки «Свернуть», «Развернуть», «Закрыть». Стиль рамки задается с помощью свойства BorderStyle, которое может принимать следующие значения:

bsDialog — неизменяемая в размерах рамка, свойственная диалоговым окнам;

• bsSingle — неизменяемая в размерах рамка для обычного окна;

• bsNone — у окна вообще нет ни рамки, ни заголовка;

• bsSizeable — изменяемая в размерах рамка для обычного окна;

• bsToolWindow — аналогично значению bsSingle, но окно имеет слегка уменьшенный заголовок, что свидетельствует о его служебном назначении;

• bsSizeToolWin — аналогично значению bsSizeable, но окно имеет слегка уменьшенный заголовок, что свидетельствует о его служебном назначении

Обычно для окантовки формы используют значение bsSizeable. В этом случае форма имеет стандартную изменяемую в размерах рамку (как при проектировании), заголовок, управляющее меню, кнопки «Свернуть», «Развернуть», «Закрыть».

Когда значение в свойстве BorderStyle допускает наличие заголовка, вы можете использовать свойство Borderlcons для определения системных элементов рамки (управляющего меню, кнопок «Свернуть», «Развернуть», «Закрыть», «Справка»), которые будут доступны пользователю . Свойство Borderlcons состоит из следующих вложенных свойств булевского типа:

• biSystemMenu — форма имеет управляющее меню (оно вызывается по щелчку правой кнопки мыши на заголовке формы);

• biMinimize — рамка формы имеет кнопку «Свернуть»;

• biMaximize — рамка формы имеет кнопку «Развернуть»;

• biHelp — рамка формы имеет кнопку «Справка»; при нажатии кнопки «Справка» курсор мыши превращается в стрелку со знаком вопроса; выбирая таким курсором нужный элемент формы, пользователь получает по нему справку во всплывающем окне.

ЗНАЧОК ФОРМЫ

Если вы разрабатываете коммерческое приложение, а не тестовый пример, следует позаботиться о том, чтобы форма имела в своем левом верхнем углу выразительный значок. Для разработки значков в Delphi существует специальное средство — Редактор Изображений (Image Editor). Он прост в работе и мы надеемся, что вы разберетесь с ним самостоятельно. Когда пиктограмма разработана, ее нужно просто установить в свойстве формы Icon. Для этого сделайте двойной щелчок мыши в окне Инспектора Объектов на значении свойства. Delphi откроет показанное ниже диалоговое окно, только без рисунка. Нажмите кнопку Load... и выберите какой-нибудь файл значка из папки Delphi 2. 0\Images\Icons, после этого закройте диалоговое окно с помощью кнопки ОК.Delphi сразу же подставит эту пиктограмму в левый верхний угол формы .

НЕВИДИМАЯ ФОРМА

Сценарий решения задачи может потребовать, чтобы в некоторый момент форма стала невидимой, т. е. исчезла с экрана. За «видимость» формы отвечает булевское свойство Visible. Установка в нем значения False скроет форму, а установка значения True — отобразит.

НЕДОСТУПНАЯ ФОРМА

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

Как вы понимаете, все описанные выше свойства доступны не только в Инспекторе Объектов, но и в Редакторе Кода, т. е. в тексте программы. При работе с формой на уровне исходного кода вы также получаете доступ к некоторым дополнительным свойствам, которые не видны в Инспекторе Объектов. Они будут рассматриваться лишь по мере надобности.

СОБЫТИЯ ФОРМЫ

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

Событие OnCreate происходит сразу при создании формы. Обработчик этого события может устанавить начальные значения для свойств формы и ее компонентов, запросить у Windows необходимые ресурсы, создать служебные объекты, а также выполнить другие действия прежде, чем пользователь сможет работать с формой. Парным для события OnCreate является событие OnDestroy.

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

Событие OnShow происходит непосредственно перед тем, как форма становится видимой. Парным для события OnShow является OnHide.

Событие OnHide происходит непосредственно перед тем, как форма становится невидимой. Парным для события OnHide является OnShow.

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

Событие OnDeactivate происходит, когда пользователь переключается на другую форму, т.е. текущая форма теряет состояние активности. Парным для события OnDeactivate является OnActivate.

Событие OnCloseQuery происходит при попытке закрыть форму. Попытка может исходить от пользователя, который нажал на рамке формы кнопку «Закрыть», или от программы, которая вызвала у формы метод Close. В обработчик события OnCloseQuery передается по ссылке булевский параметр CanClose, разрешающий или запрещающий действительное закрытие формы.

Событие OnClose происходит после события OnCloseQuery, непосредственно перед закрытием формы.

НЕСКОЛЬКО ФОРМ В ПРИЛОЖЕНИИ

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

СОЗДАНИЕ В ПРОЕКТЕ НОВОЙ ФОРМЫ

Добавить в проект новую форму крайне просто: выберите команду меню File|New Form, и на экране сразу появится вторая форма. При этом в окне Редактора Кода автоматически появится соответствующий новой форме программный модуль. Только что созданную форму назовите SecondaryForm и дайте ей заголовок — Secondary.

Сохраните модуль с новой формой под именем SECOND. PAS — форма нам еще понадобится.

ДОБАВЛЕНИЕ НОВОЙ ФОРМЫ ИЗ ХРАНИЛИЩА ОБЪЕКТОВ DELPHI

Существует и второй, более продуктивный, способ создания форм. Он основан на использовании готовых форм, существующих в Хранилище Объектов Delphi (Object Repository). Хранилище Объектов содержит шаблоны форм, программных модулей и целых проектов, которые вы можете либо просто скопировать в свой проект, либо унаследовать, либо вообще использовать напрямую. Чтобы взять новую форму из Хранилища Объектов, выберите в меню команду File|New.... Delphi откроет многостраничное окно диалога.

Если выбрать на первой странице диалогового окна значок Form, то в проект добавится обычная пустая форма, как по команде меню File|New Form. Если вас интересуют формы с начинкой, обратитесь к страницам Forms и Dialogs. На страницах Forms и Dialogs существуют три зависимых переключателя, задающих различные варианты выполняемых с формой-шаблоном действий: скопировать (Copy), унаследовать (Inherit) и использовать (Use). Отличие между ними состоит в следующем:

• Copy — означает, что в проект помещается полная копия формы-шаблона, которая хранится в Хранилище Объектов;

• Inherit — означает, что добавляемая в проект форма должна быть унаследована от формы-шаблона, которая хранится в Хранилище Объектов;

• Use — означает, что в проект добавляется именно та форма, что хранится в Хранилище Объектов как шаблон.

Какой из режимов использовать — зависит от условия задачи. Режим Copy хорош просто тем, что не с нуля начинает разработку новой формы. Режим Inherit полезен, когда в проекте существует несколько форм, у которых совпадают некоторые части. В этом случае все похожие между собой формы порождаются от какой-то одной формы, реализующей общую для всех наследников часть. Режим Use позволяет добавить в проект именно ту форму, которая находится в Хранилище Объектов. Изменение формы будет означать изменение содержимого Хранилища Объектов.

ПЕРЕКЛЮЧЕНИЕ МЕЖДУ ФОРМАМИ ВО ВРЕМЯ ПРОЕКТИРОВАНИЯ

Иногда за формами становится трудно уследить. Навести порядок помогает окно View Form, для вызова которого служит команда меню View|Forms... (рис. 5. 18).

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

ВЫБОР ГЛАВНОЙ ФОРМЫ ПРИЛОЖЕНИЯ

Когда в проекте несколько форм, возникает вопрос: какая из них главная. Давайте не будем ломать голову, а обратимся к известному вам диалоговому окну Project Options и Вы обнаружите, что активна форма MainForm, т.е. та, которая была добавлена в проект первой (Delphi создает ее автоматически при создании нового проекта). Вы можете выбрать другую форму — и тогда она будет отображаться при запуске приложения. В данном случае этого делать не надо, поскольку главная форма уже установлена правильно.

ОТОБРАЖЕНИЕ ВТОРОСТЕПЕННЫХ ФОРМ ВО ВРЕМЯ РАБОТЫ ПРИЛОЖЕНИЯ

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

• вызвать форму с помощью метода Show для немодального выполнения вместе с остальными формами (режим параллельной работы);

• вызвать форму с помощью метода ShowModal для модального выполнения отдельно от остальных форм (режим последовательной работы).

Покажем, как реализуются эти способы на примере вызова формы Secondary из формы Main.

Чтобы форма Secondary была доступна для использования формой Main, необходимо подключить модуль формы Secondary к модулю формы Main. Это делается очень просто.

Шаг 1. Активизируйте форму Main и выберите в главном меню команду File|Use Unit.... В появившемся диалоговом окне выберите модуль Second (так называется модуль формы Secondary) и щелкните по кнопке ОК.

На экране не произойдет видимых изменений, но в секции implementation программного модуля Main добавится строка uses Second;

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

Шаг 2. Отыщите в Палитре Компонентов на странице Standard значок с подсказкой Button, щелкните на нем и затем щелкните на форме Main. На форме будет создана командная кнопка Buttoni и в окне Object Inspector отобразятся ее свойства. Активизируйте свойство Caption и замените в нем текст Button1 на текст Secondary .

Чтобы кнопка вызывала форму Secondary, в ней следует определить обработчик события OnClick. Это делается просто.

Шаг 3. Активизируйте в Инспекторе Объектов страницу Events и выполните двойной щелчок мыши на значении события OnClick. Визуальная среда определит для кнопки обработчик события, поместив его заготовку в исходный текст модуля Main. Вставьте в тело обработчика оператор SecondaryForm. Show, в результате метод обработки события станет выглядеть следующим образом:

procedure TMainForm. ButtonlClick (Sender: TObject);

begin

SecondaryForm. Show;

end;

Шаг 4. Выполните компиляцию и запустите приложение. Когда на экране покажется форма Main, щелкните на кнопке Secondary. На экране покажется еще одна форма — Secondary. Вы можете активизировать любую из них произвольно.

Отсюда следует вывод: с помощью метода Show организуется параллельное выполнение нескольких форм.

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

Шаг 5. Посмотрим, что произойдет, если в предыдущем примере заменить вызов метода Show на ShowModal.

procedure TMainForm. ButtonlClick (Sender: TObject);

begin

SecondaryForm. ShowModal;

end;

Шаг 6 (Последний). После компиляции и запуска приложения нажмите в форме Main кнопку Secondary. После появления формы Secondary попробуйте активизировать форму Main. У вас ничего не выйдет, поскольку на этот раз форма Secondary исполняется в модальном режиме.

 Только закрыв форму Secondary, вы вернетесь в форму Main. Теперь понятно и назначение метода ShowModal. С его помощью организуется последовательное выполнение форм. Последовательное выполнение форм применяется при организации диалоговых окон, которые описаны в гл. 7.

Назад.    Содержание.