Проектирование интерфейса. Диалоговые окна
Использование Me в качестве имени текущего диалогового окна
Для упрощения написания кода процедур VBA позволяет в качестве имени текущего диалогового окна применять ключевое слово Me (это похоже на использование указателя текущего объекта This в С++). В частности, в предыдущем примере вместо оператора:
With frmInit
можно было использовать:
With Me
Модификация управляющих элементов во время работы
Устанавливать программно новые значения свойств элементов управления можно не только при инициализации диалогового окна, но и во время работы пользователя (и системы) в нем. В любой процедуре обработки события, связанного со всем диалоговым окном или его отдельным элементом, можно присвоить значение свойству или вызвать метод любого управляющего элемента. Например, эти команды изменяют текст в окне редактора и снимают флажок в окне предыдущего примера:
Public Sub ChangeForm() With Me .MyText.Text = "Нелюбимый цвет:" 'новый текст в редакторе .lstColors.ListIndex = 1 'черный .chkGood.Value = False 'отключение флажка End With End Sub
Благодаря возможности подобных изменений система может гибко реагировать на действия пользователя и использовать одно диалоговое окно для решения нескольких связанных или однотипных задач.
Управление доступом к элементу
Все элементы управления обладают свойством Enabled (Доступен), позволяющим управлять их доступностью. В результате действий пользователя или системы доступный элемент может стать активным - получить фокус клавиатуры. Если свойству Enabled присвоить False, элемент управления становится недоступен ("сереет") и не может попасть в фокус. Управление доступностью производится динамически и зависит от задач, решаемых в диалоговом окне. Типичный случай - запрет на доступ к окну поля ввода (TextBox) после того, как система поместила в него данные, которые не должны далее изменяться пользователем (например, текст справки, которую можно только прочесть и распечатать). Другой случай - отключение/включение доступа к группам переключателей или кнопок зависимого выбора (OptionButton) или отдельным таким кнопкам в зависимости от состояния флажка (CheckBox). При этом действия по изменению доступа надо проводить в процедуре, обрабатывающей событие Change (Изменение), автоматически вызываемой в тот момент, когда флажок меняет свое состояние, т. е. становится неотмеченным или отмеченным.
Выполните следующие действия:
- Создайте новое диалоговое окно (UserForm) и включите в него флажок (CheckBox), управляющий элемент Frame (Рамка), и командную кнопку (ComandButton). Поместите в рамку еще 4 флажка (CheckBox). Заголовки управляющих элементов (значения свойства Caption ) задайте как на рисунке:
- Дважды щелкните верхний флажок, чтобы вывести окно с кодом процедур, выберите в списке объектов слева вверху CheckBox1 (это имя присвоила флажку система), затем в списке процедур обработки событий справа вверху щелкните событие Change. Дополните появившуюся заготовку процедуры CheckBox1_Change:
Private Sub CheckBox1_Change() With Me If.CheckBox1.Value Then 'отключение опций .CheckBox4.Enabled = False .CheckBox5.Enabled = False Else 'включение опций .CheckBox4.Enabled = True .CheckBox5.Enabled = True End If End With End Sub
- Создайте стандартный модуль и напишите в нем две процедуры:Процедура SetOptions открывает нашу форму, предоставляя пользователю возможность включать или выключать те или иные флажки. Установив нужные значения, он может затем щелкнуть кнопку "Проверка". Обработчик этого события будет вызывать функцию CheckOptions, которая и производит проверку состояния каждого из четырех флажков группы. Заметьте, что проверка свойства Value не зависит от состояния свойства Enabled. Если даже флажок недоступен, но включен ( Value = True ), то появится сообщение о выполнении проверки. Недоступный флажок не позволяет пользователю изменить его состояние, но программно ѕ все в Ваших руках. Сделаем еще одно замечание. Реально, верхний флажок, управляющий проверкой, должен находиться в другой форме, более высокого уровня, но мы уже не стали усложнять задачу.
Public Sub CheckOptions() 'Проверка на дорогах Dim Msg As String Msg = "Выполняю проверку на " With frmChecking If.CheckBox2.Value Then Msg = Msg & vbCrLf & "корректность дат" If.CheckBox3.Value Then Msg = Msg & vbCrLf & "согласованность данных" If.CheckBox4.Value Then Msg = Msg & vbCrLf & "правильность расходов" If.CheckBox5.Value Then Msg = Msg & vbCrLf & "правильность доходов" MsgBox (Msg) .Hide End With End Sub Public Sub SetOptions() frmChecking.Show End Sub
- Напишите обработчик события командной кнопки:
Private Sub CommandButton1_Click() CheckOptions End Sub
- Теперь, если выполнить процедуру SetOptions, (по правилам, ее следовало бы вызывать в одном из обработчиков событий), то на экране появится форма. В ней можно установить флажки, например, следующим образом:
- Если в этом состоянии окна щелкнуть командную кнопку "Проверка", то будет выведено сообщение о двух выполняемых проверках: