* Используйте кнопку Отмена для форм, которые изменяют переменные или установки программы. После щелчка пользователя на кнопке Отмена диалоговое окно должно закрыться без записи таких изменений - все должно остаться так, как было до открытия диалогового окна. Такая форма должна также иметь кнопку ОК, щелчок на которой подтверждает изменения и вносит их.
Подобно любым другим кнопкам, для того чтобы отвечать на щелчки на них, кнопки Закрыть и Отмена требуют создания процедур обработки события Click. В большинстве случаев эти процедуры содержат всего один оператор, как в следующих двух примерах:
Private Sub cmdClose_Click ()
Hide здесь подразумевается ссылка на форму
End Sut
Private Sub cmdCancel_Click ()
Unload frmOptions
End Sub
Для любой кнопки можно использовать метод Hide или оператор Unload. Разница между этими двумя способами закрытия формы обсуждалась в разделах "Как скрыть видимую форму" и "Удаление формы из памяти".
Конечно, процедуры, связанные с кнопками Закрыть и Отмена, могут до закрытия формы сделать что-то еще, например отобразить диалоговое окно, в котором пользователю предлагают подтвердить (или не подтвердить) желание закрыть форму.
Private Sub cmdClose_Cl ick()
Message = "Вы действительно хотите закрыть " _
& "диалоговое окно и отменить все " _
& "внесенные вами изменения?"
If MsgBox(Message, vbYesNo) = vbYes Then
Hide ' закрыть, если пользователь ответил Да
End If ' иначе не делать ничего
End Sub
Не забудьте связать кнопку Закрыть и Отмена с клавишей <Esc>. Пользователи привыкли нажимать <Esc> для выхода из диалоговых окон, и вы не должны обманывать их ожиданий. Тем более, что в данном случае не придется создавать процедуру обработки события KeyPress-- просто установите для свойства Cancel значение True в окне свойств.
Представьте себе типичное диалоговое окно. Вы ожидаете, что после щелчка на кнопке ОК программа воспримет введенные в окно данные как окончательные и соответствующим образом изменит внешний вид, поведение или данные программы. После этого форма должна удалить себя с экрана.
В соответствии с этими ожиданиями вы должны создать и процедуру обработки события Click для кнопки ОК. Все, что должен сделать в данном случае программный код,- это передать значения от элементов управления переменным программы или использовать значения элементов управления в условных выражениях. Последняя строка процедуры должна содержать либо метод Hide, либо оператор Unload. В следующих примерах txtCName и txtCAddress представляют текстовые поля. Первых два оператора передают их значения соответствующим переменным программы. Затем программа проверяет состояние выключателя tglSend и, если он включен, выполняет процедуру SendBillToCustomer.
Наконец, она прячет форму:
Private Sub cmdOK_Click()
strCustomerName = txtCName.Value
strCustomerAddress = txtCAddress.Value
' проверка состояния выключателя
If tglSend.Value = True Then
SendBillToCustomer
End If
Hide
End Sub
Чаще всего в процедурах обработки событий приходится заниматься проверкой данных, введенных пользователем с помощью элементов управления, Обычно программа предполагает ввод данных определенного вида. Однако пользователь может ввести любой текст в текстовое поле или поле со списком и выбрать почти любое число с помощью кнопок прокрутки.
В таком случае в процедуру соответствующего элемента управления крайне желательно добавить программный код, проверяющий правильность ввода. Этот программный код должен введенные пользователем данные оценить с точки зрения удовлетворения заданным критериям. Если критерии удовлетворены, программный код сохраняет введенные значения или передает их другой части программы. В противном случае можно отобразить сообщение или как-то по-другому информировать пользователя о том, что возникла проблема (рис. 10.27).
Можно также с помощью этого программного кода конвертировать введенные данные в данные подходящего вида, например сделать все буквы прописными.
Рис. 10.27. Для проверки введенных данных в текстовом поле и отображения этого сообщения об ошибке использовалась процедура обработки события Change
Проверка значений элементов управления требует использования операторов
If. . .Then и Select Case. В следующем простом примере проверяется на допустимость значение элемента управления кнопками прокрутки:
Private Sub spnVolumeControl_Change()
If spnVolumeControl.Value = 13 Then
MsgBox "13 не является допустимым значением."
End If
End Sub
Проверка правильности вводимых данных имеет смысл в любой момент взаимодействия пользователя с формой. В зависимости от выбранного момента проверка осуществляется в различных процедурах обработки различных событий, относящихся к элементу управления или к форме в целом, как показано в следующей таблице.
Момент проверки данных
Используемая процедура
При нажатии любой клавиши
Процедура об работки события Key Press для элемента управления (для выяснения информации о нажатии отдельной клавиши)
При любом изменении значения элемента управления
Процедура обработки события Change (для оценки значения)
По окончании работы пользователя с элементом управления, непосредственно перед переходом к другому
Процедура обработки события Be Fore Update (позволяет отменить обновление данных и вернуть пользователя к текущему элементу управления)
При закрытии формы пользователем
Процедура обработки события click для кнопок ОК или Закрыть в форме
Вы сами должны выбрать подходящую для проверки процедуру, ответив на следующие вопросы.
* Насколько быстро должен выполняться программный код проверки?
* В какой момент нужно информировать об ошибке пользователя- в момент появления неправильного значения или уже после того, как пользователь закончит формирование вводимых данных?
* Основывается ли проверка на значениях, полученных от нескольких элементов управления?
Часть III Практикуемся в программировании на VBA
В этой части...
После того как вы познакомились с основами программирования на VBA и решили попробовать свои силы, вам пора изучить материал части III В главе 11 рассматриваются встроенные функции и операторы VBA; я не рекомендую вам создавать собственную процедуру, если встроенная функция сможет выполнить те же действия всего в одну строку. В главе 12 мы поговорим об использовании объектов. В главе 13 мы еще раз затронем тему управления данными, однако на этот раз речь будет идти о таких сложных вопросах, как использование массивов и коллекций.
Глава 11. Инструменты встроенного оркестра VBA.
В этой главе ...
~ Использование встроенных команд вместо нового изобретения программирования
~ Безопасное форматирование данных с помощью функции Format
~ Преобразование данных одних типов в другие
~ Работа с текстовыми строками
~ Забавы с датами и временем
~ Использование математических и финансовых функций
Прежде чем создавать свою собственную процедуру с чистого листа, убедитесь, что вы не изобретаете велосипед. Каждая версия VBA приходит с небольшим арсеналом встроенных команд, предназначенных для решения самых разнообразных часто возникающих задач. В этой главе предлагается обзор наиболее полезных из таких готовых к бою единиц вооружения. Кое-что в этот обзор не вошло и обсуждается среди прочего в других главах.
Знакомство со встроенными командами
Похоже, VBA немного не соответствует тому имиджу, который он себе создает. Ох, как отчаянно VBA хочет выглядеть истинным объектно-ориентированным языком программирования (об объектно-ориентированном программировании мы поговорим в главе 12). С другой стороны, следует признать, что есть кое-что, что вы хотели бы иметь в программе, но нельзя сказать, что это естественным образом умещается в матрицу объектно-ориентированного подхода.
В своем решении, достойном всех наших депутатов, VBA помещает в метод объекта как минимум одну команду, которую было бы естественнее оставить независимой, и в то же время оставляет независимыми другие действия, которые вполне подходят для связывания их с объектами.
В общем, учитывая, что некоторые действия могут оказаться в нелогичных для них категориях, вы получаете три типа встроенных VBA-команд, способных выполнять полезную работу.
* Операторы. Хотя термин оператор уже используется для обозначения целой программной директивы (см. главу 7), VBA называет операторами и отдельные ключевые слова, выполняющие специальные задачи. Некоторые из таких ключевых слов функционируют сами по себе как целые операторы. Например, оператор Веер заставляет динамик компьютера издавать звук. Другие же должны использоваться как составные части законченных операторов. Например, оператор ChDi r (перейти в каталог) бесполезен без аргумента, задающего каталог или папку, куда нужно перейти: