Тема 2.9 Формы и компоненты управления. Обработка событий
Визуальное программирование
В конце ХХ века широкое распространение получило визуальное программирование – технология, предоставляющая программисту наглядные средства конструирования интерфейса. Объектно-ориентированное программирование удачно использует концепцию визуального программирования.
VBA – это интегрированная среда разработки, которая предоставляет программисту возможность создания форм, на которых размещают компоненты (в терминах VBA - controls, элементы управления), имеющиеся в библиотеке VBA или созданные пользователем. Все компоненты (формы, элементы управления, меню и панели инструментов) являются объектами со своими свойствами и методами и способны реагировать на определенные события.
Компоненты могут быть:
- визуальными – т.е. видимыми при работе приложения; немедленно отображаются на экране при проектировании в таком же виде, в каком их увидит пользователь во время выполнения приложения;
- не визуальными – отображаются на форме в процессе проектирования в виде значка, но пользователю во время выполнения программы не видны; выполняют некоторые служебные функции.
- можно легко изменять размеры и расположение компонентов на форме (с помощью простых манипуляций мышью);
- в процессе проектирования постоянно виден результат – изображение формы и расположенных на ней компонентов (не надо запускать приложение для проверки внешнего вида окна и последующего изменения программного кода для подбора более удачного размера и расположения компонентов);
- (основное) во время проектирования формы и размещения на ней компонентов редактор кода автоматически генерирует код программы, включая в нее фрагменты, описывающие данный компонент (далее можно изменять свойства компонентов и писать обработчики событий).
- создание пользовательской формы;
- размещение на созданной форме нужных компонентов (элементов управления);
- задание определенных свойств этих компонентов;
- написание, при необходимости, обработчиков событий.
Пользовательские формы
Пользовательская форма в VBA создается добавлением в проект объекта UserForm, являющегося основой пользовательского диалогового окна. Объект UserForm – это пустое диалоговое окно. Настройку диалогового окна можно выполнить добавлением к объекту UserForm элементов управления. Каждому объекту UserForm присущи определенные свойства, методы и события, которые он наследует от класса объектов UserForm. Каждый объект UserForm включает и модуль класса, в который можно добавлять собственные методы и свойства или код обработки событий формы.Для добавления к проекту новой формы используется команда редактора VBA "Вставка/UserForm". По умолчанию новой форме присваивается имя UserForm1 и далее используется порядковая нумерация пользовательских форм.
Переименовать объект UserForm можно так же, как стандартный модуль или модуль класса. Для этого надо задать значение свойства Name этого объекта.
Каждая добавляемая в проект форма наследует свойства и методы объекта UserForm. Все процедуры и функции, написанные в разделе General (общий) модуля класса формы, становятся дополнительными методами для этой формы. Форме можно придать и новые свойства, добавив в ее модуль класса описания Property Get и Property Let. Копии новой формы можно создавать программно с помощью оператора Dim и опции New.
Все формы VBA являются модальными (modal). Это означает, что вы не сможете выполнить какое-либо другое действие в приложении до тех пор, пока форма диалога не будет закрыта (методами Hide или UnLoad).
Свойства объекта UserForm
Форма как объект имеет некоторые встроенные свойства, которые можно устанавливать двумя способами:- программно;
- в окне свойств (Properties Window) редактора VBA.
Таблица 12. Основные свойства объекта UserForm
Свойство | Описание |
---|---|
ActiveControl | Возвращает объектную ссылку на элемент управления, находящийся в фокусе в данный момент. Свойство только для чтения |
BackColor | Возвращает целое значение типа Long, которое определяет цвет фона формы |
BorderStyle | Устанавливает тип границы |
Caption | Возвращает текст, отображаемый в строке заголовка формы |
Controls | Возвращает коллекцию всех элементов управления формы. Только для чтения |
Cycle | Определяет, должно ли нажатие клавиши табуляции вызывать последовательный выбор всех элементов управления во всех группах и на каждой странице многостраничных элементов управления или только в пределах текущей группы или страницы. Может принимать значение одной из встроенных констант: fmCycleAllForms или fmCycleCurrentForms |
Enabled | Содержит значение типа Boolean, указывающее, доступна ли форма. Если его значение равно False, ни один из элементов управления формы не доступен |
Font | Позволяет выбрать параметры шрифта формы или элемента управления |
ForeColor | То же самое, что и свойство BackColor, но устанавливает цвет, используемый для переднего плана (обычно это цвет текста) объекта формы |
Height и Width | Возвращают высоту и ширину формы в пунктах |
Left и Top | Возвращают местоположение левого верхнего угла формы в пунктах |
Name | Возвращает имя пользовательской формы |
Picture | Указывает рисунок, отображаемый как фон формы |
StartUpPosition | Возвращает значение, определяющее положение формы при ее первом отображении на экране. Допустимые значения:
|
Методы объекта 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 | Происходит при закрытии формы, т.е. когда форма выгружается из памяти. Используйте это событие для осуществления специальных задач, которые необходимо выполнить прежде, чем переменные формы будут выгружены |
Синтаксис операторов 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 |
Свойства элементов управления
Обращение к элементам управления выполняется, в основном, через их свойства и с помощью процедур обработки событий, написанных для каждого элемента. В таб. 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, указывающее, является ли элемент управления видимым |
В следующем примере (листинг 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. Наиболее часто используемые события объектов управления
Событие | Описание |
---|---|
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. Кроме того, имеет смысл разместить на форме пару кнопок: подтверждение добавления и отмена операции. Такая форма может быть создана следующим образом:
- После добавления заготовки формы (меню "Вставка/UserForm"), ее имя (свойство Name) изменено на frmAddStudent.
- На форму были добавлены следующие элементы управления: TextBox, Label, OptionButton, CommandButton. Элементам TextBox, предназначенным для ввода данных пользователем, заданы имена (свойство Name) txtLName, txtFName, txtMName, txtContacts, txtBDay. Элементам Label заданы надписи (свойство Caption) "Фамилия:", "Имя:", "Отчество" и т.д. Элементы OptionButton, используемые для указания пола студента, получили имена optMale и optFemale. Эти элементы сгрупппированы с помощью рамки (Frame). Для подтверждения ввода или отмены действий на форму добавлены 2 кнопки (CommandButton). Первой из них задано имя (свойство Name) btnAdd и надпись (свойство Caption) "Принять", второй - btnCancel и "Отмена" соответственно.
- Далее, размещенные элементы были спозиционированы путем изменения размеров и положения через указание значений свойств Left, Top, Width и Height.
- В завершении были созданы (двойной клик на соответствующем элементе) заготовки обработчиков событий для кнопки btnAdd и btnCancel. Заготовка обработчика события инициализации формы была создана путем выбора этого события из списка доступных методов ("Редактор формы/Declarations/initialize")
- В проект был добавлен дополнительный модуль с именем General (листинг 30), где описаны общие данные проекта, в частности переменная stud (CStudent) и макрос sample33, из которого вызывается форма frmAddStudent.
- В созданные обработчики событий добавлен функциональный код, приведенный и прокомментированный в листинге 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