Диалоговые окна служат для обмена информацией между пользователем и документом. При открытии формы с заранее спроектированными свойствами элементов управления и после ее инициализации пользователь попадает в мир ее объектов. В этом мире он может выполнять разные действия, вводя требуемые данные, выбирая нужные ему опции и щелкая те или иные командные кнопки. В ответ на изменения, совершаемые пользователем, могут вызываться обработчики событий, которые в свою очередь производят изменения свойств объектов, как самой формы, так и объектов документа. Во многих случаях, изменения, сделанные в результате взаимодействия должны быть сохранены перед тем, как форма будет закрыта, с тем, чтобы их можно было восстановить при последующих открытиях формы. Для этого можно использовать рабочую память самого приложения (ячейки рабочих листов в Excel, записи БД в Access, текст документа в Word), внешние дисковые файлы или переменные уровня модуля.
Приведем сейчас пример уже знакомой нам формы, дополненной командными кнопками Save и Reset, обработчики события Click которых позволяют сохранить текущее состояние элементов управления и восстановить его в нужный момент. Для хранения информации используется память документа Excel. Вот как выглядит лист Excel, в ячейках которого хранятся данные о состоянии формы:
Пять ячеек листа SavedData рабочей книги BookOne12 хранят нужную информацию. Заметьте, ячейка A1 именована. Ее имя "Данные" будет использовано в обработчиках событий. На этом же листе расположена командная кнопка "Вызов Формы". Ее обработчик события очень прост, ѕ он вызывает форму:
Private Sub CommandButton1_Click() frmInit.Show End Sub
А вот как выглядит сама форма в момент ее открытия:
Эта форма уже использовалась в наших примерах. Ранее она была связана с документом Word, а теперь мы перетащили ее в рабочую книгу Excel, используя операции Export - Import.
После чего форма была слегка модифицирована добавлением в нее новых командных кнопок ѕ Save, Reset и Cancel. Прежде, чем рассказать о них подробнее, приведем уже встречавшиеся обработчики событий. Наша форма одинаково реагирует на два события Initialize и Activate. Первое из них возникает, когда форма открывается после того, как она была выгружена. Если же форма удаляется с экрана методом Hide, то при ее повторном открытии событие Initialize не возникает. Поскольку мы хотим, чтобы и в этом случае происходила инициализация свойств формы, то определен и обработчик события Activate, выполняющий те же действия. Поскольку оба обработчика эквивалентны, то приведем текст только одного из них:
Private Sub UserForm_Activate() With frmInit .Caption = "Окно после инициализации" ' заголовок диалогового окна .CurrDate.Caption = "Сегодня " & Format(Date, "dd/mm/yy") 'метка - текущая дата .MyText.Text = "Любимый цвет:" 'начальный текст в редакторе .chkGood.Value = True 'включение флажка .chkGood.Caption = " Хороший день" ' заголовок флажка With.lstColors 'задание элементов списка: .AddItem "белый" .AddItem "черный" .AddItem "синий" .AddItem "красный" .AddItem "зеленый" .AddItem "желтый" .AddItem "голубой" .ListIndex = 4 'выбор 5-го элемента в списке ("зеленый") End With End With
End Sub
Этот обработчик задает начальные свойства элементов управления ѕ объектов формы в момент ее открытия. После чего с формой работает пользователь. Форма простая, поэтому возможностей у него не много, тем не менее, он может выбрать из списка понравившийся ему цвет, отключить флажок, щелкнуть по командной кнопке "Change". В ответ на последнее действие будет вызван соответствующий обработчик, который программно изменит состояние объектов формы. Текст этого обработчика уже приводился ранее, напомним его:
Private Sub CommandButton1_Click() ChangeForm End Sub Public Sub ChangeForm() With Me .MyText.Text = "Нелюбимый цвет:" 'новый текст .lstColors.ListIndex = 1 'черный .chkGood.Value = False 'отключение флажка End With
End Sub
Нам осталось рассмотреть действие новых командных кнопок. Обработчик события Click кнопки Save позволяет сохранить текущее состояние элементов управления формы. Затем это состояние может быть проанализировано, например, для того, чтобы выдать психологический портрет пользователя. Цель сохранения может быть и другая, ѕ иметь возможность вернуться к текущему состоянию при повторном открытии формы. С чисто программистской точки зрения задача сохранения состояния решается просто, главный вопрос это, где и в какой форме хранить состояние элементов управления. В данном случае мы выбрали ячейки листа Excel. Вот текст этого обработчика:
Private Sub cmdSave_Click() 'Сохранение данных формы в ячейках листа SavedData книги BookOne12 Dim Beg As Range Set Beg = Range("[BookOne12.xls]SavedData!Данные") With frmInit Beg.Offset(1, 0) =.CurrDate.Caption 'дата Beg.Offset(1, 1) =.lstColors.ListIndex 'индекс в списке Beg.Offset(1, 2) =.lstColors.Value 'цвет Beg.Offset(1, 3) =.chkGood.Value 'состояние флажка Beg.Offset(1, 4) =.MyText.Text 'текст в окне ввода 'Форма прячется .Hide End With
End Sub
Обратите внимание, при работе с ячейками Excel используется техника, основанная на смещении Offset. Вначале фиксируется начальная ячейка, имеющая имя "Данные", и уже относительно ее выполняются действия над остальными ячейками.
Командная кнопка Reset позволяет восстановить сохраненное состояние элементов управления формы. Обработчик события Click для этой кнопки выполняет действия, обратные тем, что делаются при сохранении состояния. Вот текст этого обработчика:
Private Sub cmdReset_Click() 'Восстановление данных формы из ячеек листа SavedData книги BookOne12 Dim Beg As Range Set Beg = Range("[BookOne12.xls]SavedData!Данные") With frmInit .CurrDate.Caption = Beg.Offset(1, 0) .lstColors.ListIndex = Beg.Offset(1, 1) .lstColors.Value = Beg.Offset(1, 2) .chkGood.Value = Beg.Offset(1, 3) .MyText.Text = Beg.Offset(1, 4) End With End Sub
Обработчик события Click для кнопки Cancel просто закрывает форму без сохранения состояния элементов:
Private Sub cmdCancel_Click() frmInit.Hide End Sub