Учебно-методические материалы для студентов кафедры АСОИУ

Тема 2.9 Формы и компоненты управления. Обработка событий

Визуальное программирование

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

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

Компоненты могут быть:

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

Пользовательские формы

Пользовательская форма в VBA создается добавлением в проект объекта UserForm, являющегося основой пользовательского диалогового окна. Объект UserForm – это пустое диалоговое окно. Настройку диалогового окна можно выполнить добавлением к объекту UserForm элементов управления. Каждому объекту UserForm присущи определенные свойства, методы и события, которые он наследует от класса объектов UserForm. Каждый объект UserForm включает и модуль класса, в который можно добавлять собственные методы и свойства или код обработки событий формы.

Для добавления к проекту новой формы используется команда редактора VBA "Вставка/UserForm". По умолчанию новой форме присваивается имя UserForm1 и далее используется порядковая нумерация пользовательских форм.

Рис. 8 Объект UserForm в режиме конструирования
Как правило, если активизирована форма или один из ее элементов управления, на экране появляется Панель элементов (Toolbox), с помощью которой можно добавлять к форме элементы управления.

Переименовать объект UserForm можно так же, как стандартный модуль или модуль класса. Для этого надо задать значение свойства Name этого объекта.

Каждая добавляемая в проект форма наследует свойства и методы объекта UserForm. Все процедуры и функции, написанные в разделе General (общий) модуля класса формы, становятся дополнительными методами для этой формы. Форме можно придать и новые свойства, добавив в ее модуль класса описания Property Get и Property Let. Копии новой формы можно создавать программно с помощью оператора Dim и опции New.

Все формы VBA являются модальными (modal). Это означает, что вы не сможете выполнить какое-либо другое действие в приложении до тех пор, пока форма диалога не будет закрыта (методами Hide или UnLoad).

Свойства объекта UserForm

Форма как объект имеет некоторые встроенные свойства, которые можно устанавливать двумя способами:
  • программно;
  • в окне свойств (Properties Window) редактора VBA.
Программным способом свойства форм устанавливаются путем присвоения свойству нового значения. В таб. 12 перечислены наиболее часто используемые свойства объекта UserForm.

Таблица 12. Основные свойства объекта UserForm

Свойство Описание
ActiveControl Возвращает объектную ссылку на элемент управления, находящийся в фокусе в данный момент. Свойство только для чтения
BackColor Возвращает целое значение типа Long, которое определяет цвет фона формы
BorderStyle Устанавливает тип границы
Caption Возвращает текст, отображаемый в строке заголовка формы
Controls Возвращает коллекцию всех элементов управления формы. Только для чтения
Cycle Определяет, должно ли нажатие клавиши табуляции вызывать последовательный выбор всех элементов управления во всех группах и на каждой странице многостраничных элементов управления или только в пределах текущей группы или страницы. Может принимать значение одной из встроенных констант: fmCycleAllForms или fmCycleCurrentForms
Enabled Содержит значение типа Boolean, указывающее, доступна ли форма. Если его значение равно False, ни один из элементов управления формы не доступен
Font Позволяет выбрать параметры шрифта формы или элемента управления
ForeColor То же самое, что и свойство BackColor, но устанавливает цвет, используемый для переднего плана (обычно это цвет текста) объекта формы
Height и Width Возвращают высоту и ширину формы в пунктах
Left и Top Возвращают местоположение левого верхнего угла формы в пунктах
Name Возвращает имя пользовательской формы
Picture Указывает рисунок, отображаемый как фон формы
StartUpPosition Возвращает значение, определяющее положение формы при ее первом отображении на экране. Допустимые значения:

  • Manual – начальное значение не устанавливается;
  • CenterOwner – выравнивание по центру объекта, которому принадлежит форма;
  • CenterScreen – выравнивание по центру экрана;
  • Windows Default – положение верхнего левого угла экрана

Методы объекта UserForm

Исходный объект UserForm обладает рядом методов, наиболее часто используемые из которых приведены в таб. 13. Эти методы доступны для каждой формы, добавляемой в проект.

Таблица 13. Основные методы объекта UserForm

Метод Назначение
Copy Копирует выделенный в элементе управления текст в буфер обмена Windows
Cut Вырезает выделенный в элементе управления текст и помещает его в буфер обмена Windows
Hide Скрывает форму, не выгружая ее из памяти, сохраняя значения элементов управления формы и всех переменных, объявленных в модуле класса формы
Move Изменяет положение и размер формы
Paste Вставляет содержимое буфера обмена Windows в текущий элемент управления
PrintForm Выводит на используемый в Windows по умолчанию принтер изображение формы, включая все данные, введенные в элементы управления
Repaint Перерисовывает форму, выведенную на экран. Используйте этот метод, если хотите перерисовать форму, не ожидая, когда она будет перерисована через обычный период времени
Show Выводит форму на экран. Если форма еще не загружена в память, то данный метод сначала ее загружает

События объекта UserForm

Событие (event) – это факт, связанный с изменением состояния формы или элемента управления, требующий выполнения некоторых действий (обработки события). Каждому событию может быть сопоставлена процедура, выполняющая необходимые действия - обработчик события. Обработчики событий могут быть назначены программно или в процессе визуального проектирования формы. При визуальном проектировании заготовка обработчика вида:
Private Sub UserForm_Click() 

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

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

Таблица 14. Основные события объекта UserForm

Событие Описание
Activate Происходит, когда окно формы становится активным. Используйте это событие для обновления содержимого диалоговых элементов управления, чтобы отразить любые изменения, которые произошли, пока окно формы было неактивным
Click Происходит при щелчке мышью по форме (любой ее части, не занятой элементами управления)
DblClick Происходит при двойном щелчке мышью по форме (любой ее части, не занятой элементами управления)
Deactivate Происходит, когда форма перестает быть активной
Initialize Происходит, когда форма впервые загружается в память посредством выполнения оператора Load или с помощью метода Show. Используйте это событие для инициализации элементов управления формы при ее появлении на экране
Resize Происходит при изменении размеров формы
Terminate Происходит при закрытии формы, т.е. когда форма выгружается из памяти. Используйте это событие для осуществления специальных задач, которые необходимо выполнить прежде, чем переменные формы будут выгружены
В дополнение к методам, свойствам и событиям, встроенным в объект UserForm, VBA предоставляет два оператора, которые особенно полезны при работе с объектами форм: Load и Unload.

Синтаксис операторов Load и Unload:

Load Object Unload Object 

Здесь Object представляет любую допустимую ссылку на объект UserForm.

Оператор Load загружает в память объект UserForm и запускает метод формы Initialize, но не выводит форму на экран. Когда форма загружена, можно использовать написанную на VBA программу для работы с объектом UserForm.

Оператор Unload удаляет из памяти объект UserForm, а также все переменные формы. После того, как форма выгружена, она перестает быть доступной для VBA-кода.

Элементы управления

Объект UserForm может содержать те же элементы управления, что и находящиеся в диалоговых окнах Word, Excel или других приложений Windows. Элементы управления (controls) – это элементы диалогового окна, которые дают возможность пользователю взаимодействовать с программой. Используя этот набор и редактор форм не трудно создать любой пользовательский интерфейс, который будет удовлетворять всем требованиям, предъявляемым к интерфейсу в среде Windows. Элементы управления являются объектами. Поэтому, как любые объекты, они обладают свойствами, методами и событиями. Как и для формы, их содержащей, свойства элементов управления можно устанавливать программным путем или с помощью окна свойств (Properties Window) редактора VBA. В программе можно присваивать или восстанавливать значения свойств элементов управления так же, как и для любых других объектов. Элементы управления создаются при помощи панели инструментов Toolbox (Панели элементов).

Создание элементов управления на рабочем листе, в документе или в форме, как правило, происходит на начальном этапе конструирования приложения. Иногда используется программное создание элементов управления в процессе работы приложения. Но этот подход применяется реже. Большинство элементов управления можно располагать как в документе или на рабочем листе, так и в форме. Но существуют такие элементы, как Набор страниц и Набор вкладок, которые можно располагать только в форме. В таб. 15 приведен список стандартных элементов управления, включенных в VBA, и соответствующих кнопок панели инструментов Toolbox, а также описано назначение каждого элемента. Как видно из этой таблицы, к стандартным относятся практически все элементы управления, которые встречаются в приложениях Windows.

Таблица 15. Стандартные элементы управления, включенные в VBA

Элемент управления Назначение
Label (надпись, метка) Позволяет создавать заголовки элементов управления, которые не имеют собственных встроенных заголовков
TextBox (текстовое поле) Окно редактируемого текста свободной формы для ввода данных. Может быть одно- и многострочным
ComboBox (поле со списком) Объединяет окно редактирования и окно списка
ListBox (список) Отображает список значений, из которых пользователь может сделать выбор
CheckBox (флажок) Стандартный флажок, который используется для выбора вариантов, не являющихся взаимоисключающими
OptionButton (переключатель) Стандартная кнопка-переключатель. Используется, когда пользователю необходимо сделать выбор между "включено/выключено"
ToggleButton (выключатель) Выключатели служат для той же цели, что и флажки, но выводят установки в виде кнопки, находящейся в "нажатом" или "отжатом" состоянии
Frame (рамка) Визуально и логически объединяет некоторые элементы управления (особенно флажки, переключатели и выключатели)
CommandButton (кнопка) Используется для выполнения таких действий, как Cancel (Отмена), Save (Сохранить), Ok и т.д. Когда пользователь щелкает по кнопке, выполняется VBA-процедура, закрепленная за данным элементом управления
TabStrip (набор вкладок) Состоит из области, в которую следует помещать другие элементы управления (такие, как текстовые поля, флажки и т.д.)
MultiPage (набор страниц) Состоит из нескольких страниц. Можно выбрать любую из них, щелкнув по соответствующей вкладке
ScrollBar (полоса прокрутки) Позволяет выбирать линейное значение, аналогичное тому, как это можно сделать при помощи счетчика
SpinButton (счетчик) Специальная разновидность текстового поля. Используется для ввода последовательных величин, которые заведомо находятся в определенном интервале значений (число, дата и т.п.)
Image (рисунок) Выводит на форме графическое изображение любом из следующих форматов: *.bmp, *.cur, *.gif, *.ico, *.jpg, *.wmf
Для удобства работы с элементами управления в период их конструирования в приложениях Microsoft Office введен режим конструктора, который активизируется нажатием кнопки Режим конструктора (Designe Mode) панели инструментов. В режиме конструктора отключена реакция элемента управления на события. Поэтому при включенном режиме конструктора можно видоизменять элемент управления и задавать его свойства. Размещенный на форме элемент управления можно перемещать, изменять его размеры, копировать в буфер обмена и вставлять из буфера обмена. Отключается режим конструктора той же кнопкой Режим конструктора (Designe Mode).

Свойства элементов управления

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

Таблица 16. Основные свойства стандартных элементов управления

Свойство Описание
Accelerator Содержит символ, используемый в качестве клавиши быстрого вызова элемента управления. При нажатии Alt+<клавиша быстрого вызова> происходит выбор элемента управления
AutoSize Значение типа Boolean. Если равно True – устанавливает режим автоматического изменения размеров элемента управления так, чтобы на нем полностью помещался текст, присвоенный свойству Caption
BackColor Устанавливает цвет фона элемента управления
BorderColor Устанавливает цвет границы элемента управления
BorderStyle Устанавливает тип границы элемента управления. Допустимые значения:

fmBorderStyleSingle – граница в виде контура;

fmBorderStyleNone – граница невидима

Caption Надпись, отображаемая при элементе управления
Cancel Задает кнопку отмены диалогового окна. Используется для элемента управления CommandButton. При нажатии на эту кнопку или клавишу Esc диалоговое окно исчезает
ControlTopText Определяет текст, который отображается в виде всплывающей подсказки, когда указатель мыши помещается на элемент управления. В следующем примере элементу управления CommandButton1 назначен текст всплывающей подсказки "Это кнопка":

CommandButton1. ControlTopText = "Это кнопка" 
Default Используется для элемента управления CommandButton. Определяет заданную по умолчанию кнопку. При нажатии на клавишу Enter эта кнопка ведет себя так, как если бы по ней щелкнули мышью
Enabled Определяет, доступен элемент управления (значение True) или нет (значение False)
ForeColor Устанавливает цвет для переднего плана элемента управления – как правило, символов текста
Height и Width Устанавливают геометрические размеры объекта (высоту и ширину).
Left и Top Устанавливают координаты верхнего левого угла элемента управления, определяющие его местоположение в форме
List Представляет список, содержащийся в элементе управления (массив типа Variant). Используется для элементов управления ComboBox и ListBox
Max Переменная типа Long – определяет максимальное значение счетчика или значение, при котором полоса прокрутки находится в самом верху (для вертикальной полосы) или справа (для горизонтальной). Используется для элементов управления ScrollBar и SpinButton
Min Переменная типа Long – определяет минимальное значение счетчика или значение, при котором полоса прокрутки находится в самом низу (для вертикальной полосы) или слева (для горизонтальной). Используется для элементов управления ScrollBar и SpinButton
Name Содержит имя элемента управления
Picture (создание картинки) Внедряет картинку на элемент управления. Например, на поверхности кнопки картинка отображается с помощью следующей инструкции:

CommandButto1.Picture = LoadPicture("c:\my_doc\Круг.bmp") 

Функция LoadPicture (Полное имя файла) считывает графическое изображение

Picture (удаление картинки) После того, как картинка создана на элементе управления, иногда возникает необходимость ее удалить. Это легко достигается присвоением свойству Picture значения LoadPicture("")
RowSource Задает источник, из которого ComboBox или ListBox "берет" список объекта
SpecialEffect Устанавливает тип границы. Отличается от свойства BorderStyle тем, что позволяет установить несколько типов, но одного цвета. BorderStyle позволяет установить только один тип, но различных цветов
TabIndex Определяет число, указывающее положение элемента управления в порядке табуляции. Может иметь значение от 0 до значения, равного количеству элементов управления на форме
TabStop Значение типа Boolean, которое указывает, может ли элемент управления быть выбран клавишей Tab.
Tag Используется для хранения дополнительной информации о форме или элементе управления, которая может быть в последующем востребована в программе
Value Значение текущих установок элемента управления: текст в текстовом поле, какие выбраны флажки и переключатели, индекс выбранного раздела списка или число, указывающее текущее положение полосы прокрутки или счетчика
Visible Значение типа Boolean, указывающее, является ли элемент управления видимым
Рассмотрим подробнее использование свойства Tag.

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

Листинг 29. Использование свойства Tag

Private Sub UserForm_Initialize() Dim Элемент As Object CommandButton1.Tag = "Показать" CommandButton2.Tag = "Спрятать" CommandButton3.Tag = "Показать" TextBox1.Tag = "Показать" For Each Элемент In Controls If Элемент.Tag = "Показать" Then Элемент.Visible = True Else Элемент.Visible = False End If Next Элемент End Sub 

В результате выполнения данной процедуры на форме будут отображены первая и третья кнопки, а также поле.

Методы и события элементов управления

В таб. 17 перечислены основные общие методы элементов управления.

Таблица 17. Основные общие методы элементов управления

Метод Описание
Add Позволяет добавить элемент управления во время выполнения программы
Move Перемещает элемент управления
SetFocus Устанавливает фокус на вызвавшем этот метод элементе управления. Часто применяется в программах обработки ошибок
Zorder Помещает объект до или после всех пересекающихся с ним объектов
В таб. 18 приведены события элементов управления, для которых можно создать процедуры обработки событий. Каждый элемент управления, который вы добавите в свою форму, будет иметь доступ к этим событиям.

Таблица 18. Наиболее часто используемые события объектов управления

Событие Описание
Click Происходит, когда пользователь выбирает элемент управления с помощью одинарного щелчка кнопкой мыши
DblClick Происходит, когда пользователь выбирает элемент управления с помощью двойного щелчка кнопкой мыши
KeyDown Происходит при нажатии пользователем какой-либо клавиши в тот момент, когда форма выполняется и имеет фокус
KeyPress Происходит, когда пользователь нажимает любую клавишу на клавиатуре, кроме функциональных и клавиш управления курсором
KeyUp Происходит, когда пользователь отпускает клавишу
Change Происходит при изменении значения элемента управления
GotFocus Происходит, когда элемент управления получает фокус
LostFocus Происходит, когда элемент управления теряет фокус
Error Используется при уведомлении об ошибке
MouseDown Происходит при нажатии кнопки мыши
MouseUp Происходит при отпускании кнопки мыши
MouseMove Происходит при перемещении указателя мыши
BeforeDragOver Происходит, пока совершается операция перемещения (drag-and-drop) элемента управления
BeforeDropOrPaste Происходит перед завершением операции перемещения (drag-and-drop) элемента управления
AfterUpdate Происходит после обновления значения элемента управления
BeforeUpdate Происходит после того, как было изменено значение элемента управления, но перед тем, как был обновлен сам элемент управления
Enter Происходит, когда выделяется элемент управления
Exit Происходит, когда с элемента управления снимается выделение
SpinDown Происходит, когда пользователь щелкает стрелку "вниз" ("влево") кнопки счетчика
SpinUp Происходит, когда пользователь щелкает стрелку "вверх" ("вправо") кнопки счетчика

Пример создания формы

Пусть требуется создать форму для ввода информации о студенте (для работы с ранее созданным классом CStudent). Такая форма может содержать несколько элементов управления, связанных с соответствующими свойствами объектной переменной класса CStudent. Кроме того, имеет смысл разместить на форме пару кнопок: подтверждение добавления и отмена операции. Такая форма может быть создана следующим образом:

  1. После добавления заготовки формы (меню "Вставка/UserForm"), ее имя (свойство Name) изменено на frmAddStudent.
  2. На форму были добавлены следующие элементы управления: TextBox, Label, OptionButton, CommandButton. Элементам TextBox, предназначенным для ввода данных пользователем, заданы имена (свойство Name) txtLName, txtFName, txtMName, txtContacts, txtBDay. Элементам Label заданы надписи (свойство Caption) "Фамилия:", "Имя:", "Отчество" и т.д. Элементы OptionButton, используемые для указания пола студента, получили имена optMale и optFemale. Эти элементы сгрупппированы с помощью рамки (Frame). Для подтверждения ввода или отмены действий на форму добавлены 2 кнопки (CommandButton). Первой из них задано имя (свойство Name) btnAdd и надпись (свойство Caption) "Принять", второй - btnCancel и "Отмена" соответственно.
  3. Далее, размещенные элементы были спозиционированы путем изменения размеров и положения через указание значений свойств Left, Top, Width и Height.
  4. В завершении были созданы (двойной клик на соответствующем элементе) заготовки обработчиков событий для кнопки btnAdd и btnCancel. Заготовка обработчика события инициализации формы была создана путем выбора этого события из списка доступных методов ("Редактор формы/Declarations/initialize")
  5. В проект был добавлен дополнительный модуль с именем General (листинг 30), где описаны общие данные проекта, в частности переменная stud (CStudent) и макрос sample33, из которого вызывается форма frmAddStudent.
  6. В созданные обработчики событий добавлен функциональный код, приведенный и прокомментированный в листинге 31.

Листинг 30. Модуль General

Option Explicit ' явное описание переменных Public stud As New CStudent ' экземпляр класса CStudent Public Const AppName = "БД Деканат" Sub sample32() frmAddStudent.Show ' Показать форму End Sub 

Листинг 31. Модуль формы frmAddStudent

' Событие происходит в момент первого вызова формы Private Sub UserForm_Initialize() Caption = AppName & ": Добавление студента" ' Заголовок формы ' Задаем значение по умолчанию в поле ввода даты рождения txtBDay = Format(Date, "DD.MM.YYYY") End Sub ' Событие происходит по клику на кнопке "Принять" (btnAdd) Private Sub btnAdd_Click() With stud ' Записываем значения полей ввода в свойства объекта stud .LastName = txtLName.Value .FirstName = txtFName.Value .MiddleName = txtMName.Value .BirthDay = CDate(txtBDay.Value) .Contacts = txtContacts.Value ' Проверяем значения элементов OptionButton ' Если установлен optMale, то в свойство stud.Gender пишем "муж",... If optMale.Value Then .Gender = "муж" ElseIf optFemale.Value Then '... иначе - "жен" .Gender = "жен" End If Debug.Print .FullInfo ' отображаем информацию о студенте в отладчике End With ' Уведомляем пользователя о добавлении записи и ждем дальнейших указаний ' Если пользователь нажмет "Отмена", то скрываем форму (метод Hide) msg = "Запись добавлена." & vbCrLf & "Продолжить?" If MsgBox(Prompt:=msg, Title:=AppName, Buttons:=vbOKCancel + vbInformation) = vbCancel Then Hide End Sub ' Событие происходит при выборе кнопки "Отмена" (btnCancel) Private Sub btnCancel_Click() Hide ' скрываем форму End Sub 

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

CC-BY-CA Анатольев А.Г., 22.04.2014