11. ИСПОЛЬЗОВАНИЕ ФОРМ

 

11.1. Настройка окна приложения

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

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

 

Таблица 23

Значения свойства «BorderStyle»

Значение

Описание

0 – None

Нет ни границ, ни заголовка. Форму нельзя перемещать. Используется, как правило, для заставок

1 – Fixed Single

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

2 – Sizable

Допускает изменение размеров и использование кнопок минимизации и максимизации. Привычный тип окна, используемый в большинстве случаев и устанавливаемый Visual Basic по умолчанию

3 – Fixed Dialog

Не допускает изменение размеров окна, кнопки минимизации и максимизации отсутствуют. Используется, например, для окон ввода пароля или других данных. Кнопка на панели задач будет отсутствовать

4 – Fixed ToolWindows

Подобно «3 – Fixed Dialog», но с более узкой строкой заголовка и уменьшенной кнопкой «Закрыть». Используется для плавающих панелей инструментов

5 – Sizable ToolWindows

Подобно «4 – Fixed ToolWindows», но допускает изменение размеров окна с помощью перетаскивания границ. Используется для таких окон, как окно «Properties» в Visual Basic

 

 

Для режимов «1 – Fixed Single» и «2 – Sizable» кнопки минимизации и максимизации можно включать и отключать по мере надобности. Для этого существуют специальные свойства «MinButton» и «MaxButton» соответственно. При их значении «False» кнопки исчезают, а при «True» проявляются. Для остальных режимов окна эти кнопки всегда недоступны.

Каждое окно также содержит в левом углу своего заголовка небольшой рисунок (иконка), характеризующий приложение или конкретное окно. Visual Basic устанавливает ее по умолчанию одинаковой для всех форм. Для изменения ее используется свойство «Icon», которое имеет каждая форма в отдельности. Для этого нужно щелкнуть по этому свойству в окне «Properties» и в открывшемся окне выбрать необходимый файл пиктограммы и щелкнуть по кнопке «Ok».

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

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

·        Unload – событие, происходящее при закрытии формы (кнопка «Закрыть» на заголовке окна, выполнение операторов «Unload» или «End»).

·        Resize – событие, возникающее при изменении размеров окна формы (перенос границ мышкой или использовании кнопок минимизации и максимизации). Используется, как правило, для изменения размеров и расположения элементов управления в окне формы при переносе ее границ. При загрузке формы с диска также генерируется.

 

Эти события всегда генерируются действиями над формой, поэтому в имени соответствующей процедуры всегда надо указывать слово «Form», независимо от имени самой формы:

Private Sub Form_Load( )

 

11.2. Создание меню

Любая программа, содержащая более пары примитивных функций, только выигрывает, если в нее добавить удобное меню. Основная цель программиста – максимально упростить работу с функциями программы. Эту цель помогает достичь правильно организованная система меню. Меню – наиболее заметная часть приложения. Хорошие меню существенно упрощают использование программы.

К программам, использующим стандартные возможности Windows, предъявляются дополнительные требования: они должны соответствовать стандартам, принятым для Windows-приложений. Цель Microsoft – сделать основные функции Windows стандартными для графического интерфейса пользователя (Graphical User Interface GUI).

 

Примечание

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

 

Отдельные элементы и соглашения типовых меню также стандартизованы и перечислены в табл. 24.

 

Таблица 24

Стандартные соглашения о меню в Windows

Элемент

Соглашение

Заголовок

Используется одно или два кратких характерных слова

Организация

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

Клавиши доступа

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

Быстрые клавиши

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

Флажок проверки

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

Скобки

За каждым пунктом меню, открывающим диалоговое окно, должно следовать многоточие (…)

 

В Visual Basic имеется встроенный редактор меню «Menu Editor» (см. рис. 8), который позволяет легко создавать строки меню и редактировать уже имеющиеся. Меню можно создавать в виде строки в верхней части формы с раскрывающимися подменю или же в виде всплывающего меню, к которому пользователь получает доступ, щелкнув кнопкой мыши.

Меню – это элемент управления со своим набором свойств и одним событием «Click». Наиболее часто используемые свойства объекта «Menu» представлены в табл. 25.

Рис. 8.  Окно редактора меню (Menu Editor)

 

Таблица 25

Часто используемые свойства объекта «Menu»

Свойство

Тип

Описание

Caption

String

Строка символов, представляющая название пункта меню

Checked

Boolean

Помещает флажок перед названием соответствующего пункта меню

Enabled

Boolean

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

Name

String

Имя пункта меню. Доступно только во время разработки приложения

Shortcut

Нет

Комбинация клавиш, позволяющая вызвать процедуру, связанную с этим пунктом меню. Его значение устанавливается в диалоговом окне «Menu Editor». Доступно во время разработки

WindowsList

Boolean

Создает в главном меню MDI-формы список окон, открытых в данной MDI-форме. Доступно только во время разработки

 

С объектом «Menu» связано лишь одно событие – «Click», генерирующееся при щелчке левой клавишей мыши по соответствующему пункту меню. Синтаксис процедуры обработки такого события следующий:

Private Sub MenuName_Click()

·        Private – область видимости процедуры в приложении;

·        MenuName – имя конкретного пункта меню (свойство «Name»), для которого программируется событие;

·        Click – название события.

 

Примечание

При использовании быстрых клавиш и клавиш доступа также будет запускаться процедура обработки события «Click».

 

Свойство «Caption» – это строка, которая будет отображена в названии пункта меню во время работы приложения. Если это свойство оставить пустым, то пункт будет представлен пустой строкой. Не забывайте включать знак амперсанта (&) в название пункта меню. Когда соответствующий пункт появится на экране, стоящий за ним символ будет подчеркнут (&File File). Подчеркнутый символ становится клавишей доступа, и пункт меню можно выбрать, нажав комбинацию этой клавиши с клавишей <Alt>. Например, в приведенном примере - <Alt + F>.

Использование быстрых клавиш – еще один способ оперативного доступа к функциям меню. Комбинации клавиш назначаются, по мере необходимости, для каждого пункта меню в раскрывающемся списке «Shortcur» диалогового окна «Menu Editor».

 

Примечание

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

 

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

Таким образом, система пунктов меню, имеющих разную степень вложенности, представленных в окне (Menu Editor), реально отображается в приложении в виде вложенных панелей подменю (см. рис. 9).

 

 

Рис. 9. Вложенное меню в окне «Menu Editor» и их реальное отображение

 

Как было сказано ранее, существуют два вида меню: строка и всплывающее меню. Любое меню можно заставить всплыть, воспользовавшись методом «PopupMenu»:

PopupMenu MenuName

·        PopupMenu – название самого метода.

·        MenuName – имя существующего объекта меню (пункт меню, за которым находится вложенное в него подменю).

 

Как запрограммировать всплывающего меню при нажатии на определенную клавишу мыши у нужного объекта см. п. «Программирование событий мыши».

Также иногда бывает полезно дополнительно разделить пункты одного подменю на группы. Для этого пользуются разделителями – специальной линией, которая делит панель меню на части. Чтобы добавить его в нужное место, надо внести между двумя разделяемыми строками дополнительный пункт, но его свойство «Caption» необходимо установить равным «-» (дефис). Реально такой пункт будет выглядеть как разделительная полоса, и он будет недоступен для щелчка мышью. На рисунке 10 приведен пример программирования разделителя в «Menu Editor» и то, как он выглядит в приложении.

 

 

Рис. 10. Программирование разделителей в меню

 

Примечание

Нельзя использовать разделители на нулевом уровне иерархии меню (т.е. в строке меню). Необходимо спуститься хотя бы на один уровень.

 

Для отображения выбора некоторого параметра или состояния используется свойство «Checked». Значение этого свойства можно установить как во время выполнения программы, так и во время разработки. Во время разработки это делается установкой флажка Checked в диалоговом окне «Menu Editor». Во время выполнения программы это делается следующим синтаксисом:

NameNenu.Checked = True

·        NameNenu – имя пункта меню у которого устанавливается флажок;

·        Checked – имя свойства.

 

Если это свойство установить равным «False», то флажок у этого пункта меню исчезнет. При этом свойство «Checked» не является исключительным. При необходимости это свойство может иметь значение «True» сразу для нескольких пунктов меню.

 

11.3. Создания многооконного приложения

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

Чтобы создать такое приложение, необходимо сначала создать проект и добавить в него необходимое вам количество форм. Для добавления новой формы нужно выбрать команду «Add Form» меню «Project».

 

Примечание

В открывшемся диалоговом окне «Add Form» присутствует универсальная заготовка формы (Form), а также множество других предопределенных форм, имеющих стандартный интерфейс и необходимый программный код. Сделано это для экономии времени при создании общепринятых окон.

 

Второй шаг при создании многооконного приложения – выбор загрузочного модуля, т.е. формы, которая будет отображена первой (по умолчанию таковой является форма, созданная в проекте первой). Для этого выбирается команда «Project Properties» меню «Project». В появившемся диалоговом окне на вкладке «General» в выпадающем списке «Startup Object» выбирается имя необходимой формы (см. рис. 11).

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

Load NameForm Number

·        Load – имя оператора.

·        NameForm – имя загружаемой формы (свойство «Name»).

·        Number – целое число, указывающее на характер открытия формы.

 

Параметр «Number» может принимать два значения: 0 (ноль) и 1. При значении 1 – форма открывается в модальном режиме относительно приложения. Если же возникает необходимость свободного переключения между формами, то этот параметр принимают равным 0.

Для закрытия формы используются оператор «Unload» и метод «Hide», имеющие следующий синтаксис:

Unload NameForm

NameForm.Hide

·        Unload – имя оператора;

·        Hide – имя метода;

·        NameForm – имя закрываемой формы (свойство «Name»).

 

 

 

Рис. 11. Выбор загрузочного модуля в диалоговом окне «Project Properties»

 

Оператор и метод закрывают форму по-разному. Метод закрывает форму, но все ее ресурсы (глобальные переменные, свойства этой формы и т.д.) остаются в приложении. Оператор же полностью выгружает их из памяти компьютера, делая их недоступными.

Другой их отличительной особенностью является то, что только при использовании оператора в момент закрытия формы генерируется событие «Unload», а при повторном открытии этой же формы происходит событие «Load».

Для обмена информацией между модулями используется специальное свойство «Tag», которое имеет любая форма. Смысл этого свойства – полноценная глобальная переменная типа «Variant»:

NameForm.Tag

·        NameForm – имя формы, свойство которой необходимо использовать;

·        Tag – имя свойства.

 

11.4. Создания MDI-приложения

MDI – это сокращение от «Multiple Document Interface» (многодокументный интерфейс). В MDI-приложении все окна сосредоточены в одном главном окне (материнская форма). Пример такого приложения приведен на рис. 12.

 

 

Рис. 12. Пример MDI-приложения

 

В  Visual Basic определен MDI-объект с именем «MDIForm». Каждое приложение может содержать только один такой объект, но множество других форм (одни из них называются дочерними окнами этого объекта, а другие независимыми отдельными окнами).

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

Для создания простого MDI-приложения необходимо сначала добавить в проект родительскую форму (пункт «Add MDI Form» меню «Project»). Именно эту материнскую форму необходимо сделать загрузочным модулем.

Затем необходимо добавить дочерние формы. Если заранее известно, сколько в приложении будет таких форм, то можно сразу добавить их в проект. Чтобы они стали дочерними нужно установить из свойства этих форм «MDIChild» в состояние «True», в противном случае они будут независимыми.

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

‘Объявляем еще одну новую форму

Dim NewForm As New NameForm

Загружаем новую форму

Load NewForm

·        NewForm – имя новой формы;

·        New – оператор создания нового объекта;

·        NameForm – имя существующей дочерней формы, копия которой создается.

 

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

Forms.Count

 

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

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

У MDI-объекта имеется полезный метод «Arrange», который автоматически располагает дочерние формы внутри родительского окна. Синтаксис метода следующий:

Arrange Value

·        Arrange – имя метода сортировки окон.

·        Value – аргумент, определяющий способ упорядочивания дочерних окон (см. табл. 26).

 

Таблица 26

Доступные способы упорядочивания окон

Константа

Значение

Описание

vbCascade

0

Располагает неминимизированные дочерние MDI-формы в виде каскада

vbTileHorizontal

1

Располагает неминимизированные дочерние MDI-формы по порядку слева направо

vbTileVertical

2

Располагает неминимизированные дочерние MDI-формы по порядку сверху вниз

vbArrangeIcons

3

Упорядочивает пиктограммы минимизированных MDI-форм

 

 

Контрольные вопросы для самопроверки

  1. Как можно настроить внешний вид окна приложения?
  2. Какие события связаны с работой именно формы приложения?
  3. Какую задачу решает применение меню команд?
  4. Какие требования предъявляются к меню команд?
  5. Какие режимы открытия окон существуют? Чем они отличаются?
  6. Что означает термин «MDI»?
  7. Какие формы называются:
  8. Как можно создать новую форму, заранее ее не описывая?
  9. Чем отличаются оператор «Unload» и метод «Hide»?
  10. Как задать загрузочный модуль приложения, если их несколько?