Основы офисного программирования и язык VBA

       

Диалоговые окна и элементы управления


Диалоговые окна (формы) и элементы управления составляют основу современного визуального интерфейса. Все эти элементы и технология работы с ними в основном стандартизованы и являются похожими для разных платформ и программных сред. Поэтому не удивительно, что приложения Excel, Word и PowerPoint разделяют единые объекты, задающие диалоговые окна и элементы управления. Эти объекты помещены в специальную библиотеку MSForms. Несколько особняком стоит Access. И здесь все доступно, но по-своему.

В этом параграфе мы дадим краткий обзор основных объектов библиотеки MSForms и остановимся лишь на некоторых моментах работы с ними. Изложение, принятое здесь, предполагает, что читатель, так или иначе, уже работал с диалоговыми окнами и элементами управления. С другой стороны, этот материал можно рассматривать, как вводный, дающий общее представление о проблеме. Далее в этой лекции он рассмотрен более подробно со многими деталями и примерами.

Выделим некоторые основные моменты, которые следует иметь в виду при создании визуального интерфейса:

Все загруженные диалоговые окна представляют коллекцию UserForms. Формально, это глобальная внутренняя переменная, - Вы не найдете UserForms в окне просмотра объектов. Тем не менее, это нормальная коллекция со стандартными методами и свойствами, - метод Item позволяет по имени или номеру добраться до любого ее элемента, а метод Add добавляет новое диалоговое окно (форму) в коллекцию. Элемент коллекции - объект класса UserForm задает отдельное окно.

Для каждого типа элементов управления в библиотеке MSForms имеется класс объектов, имя которого совпадает с именем элемента управления (его типа). Например, есть классы SpinButton и TextBox.

Конечно, диалоговые окна создаются, как правило, не программно, а визуально. Вначале создается само окно, а затем оно заселяется элементами управления. Этот этап называется этапом проектирования и его следует отличать от этапа выполнения, когда приложение выполняется и конечный пользователь взаимодействует с приложением, в частности, через диалоговые окна и их элементы управления.
Важно понимать, что как только Вы визуально создали диалоговое окно, как только Вы визуально поместили в него тот или иной элемент управления, - в этот же самый момент автоматически в программе появляется объект соответствующего класса и с этим объектом можно работать, вызывая его методы и изменяя его свойства.

На этапе проектирования, используя окно свойств, можно задать большинство свойств, как самого диалогового окна, так и всех элементов управления, помещенных в это окно. Автоматически, конечно же, меняются и свойства соответствующего объекта. Заметьте, что есть еще две возможности изменения свойств этих объектов. Свойства может менять конечный пользователь. Заметьте, что элементы управления именно для этого и существуют, чтобы конечный пользователь мог определять некоторые (но не все) свойства, например, пользователю разрешается вводить текст в окна редактирования. Но есть и третья возможность - изменение свойств программным путем. Как правило, все свойства, доступные конечному пользователю, либо доступные на этапе проектирования, доступны для изменения программным путем.

Никаких проблем с программированием не возникает, - есть обычные объекты, у которых можно менять или проверять некоторые свойства и вызывать некоторые из их методов. Единственно следует помнить, что объекты могут создаваться автоматически (но могут и программно) и имеют видимое отображение на экране дисплея.

Есть все-таки одна проблема: куда помещать программный код? Ведь методы объектов жестко запрограммированы и не подлежат изменениям. К счастью есть у объектов события и обработчики событий надо программировать самому. Именно сюда и помещают код. Обработчик события может быть достаточно сложным и по ходу своей работы может вызывать десяток, другой локальных процедур и функций. Как правило, события задают реакцию на действия конечного пользователя, - ответом может быть изменение свойств объектов, вызов их методов, появление новых элементов управления и переход к новым диалоговым окнам.

Поговорим об отладке.


Написание обработчиков событий следует относить, по-видимому, к этапу проектирования. Когда этот этап закончен, - окно создано и заселено элементами, их свойства установлены, обработчики событий написаны, - возникает естественный вопрос " А будет ли все это правильно работать?" Чтобы вести отладку, можно, конечно, перейти в режим выполнения приложения. Однако это не эффективно, лучше вести локальную отладку - для этого достаточно выбрать команду Run Sub/UserForm из меню Run в VBA редакторе. Заметьте, что для отображения формы в режиме выполнения должен быть вызван ее метод Show.

Несколько слов следует сказать о методах Show, Hide и Load объекта UserForm. Метод Load загружает диалоговое окно и делает его доступным для программирования (объект определен). Но окно не отображается на экране дисплея и конечный пользователь не может работать с ним и его элементами. Чтобы окно сделать видимым, нужно вызвать его метод Show, чтобы видимое окно спрятать - метод Hide.

Можно прятать не только само окно, но и отдельные его элементы управления. Возможен, например, такой способ, - в одну половину "большого" окна поместить одни элементы управления, в другую - другие. Затем, в режиме выполнения динамически задать размеры окна так, чтобы они определяли только одну половину окна - тогда и видимы будут элементы только этой половины. Затем можно организовать переключение так, чтобы видимой была та или другая половина окна со своими элементами.

В предыдущем пункте мы говорили о том, как сделать некоторые элементы управления невидимыми, а, следовательно, и недоступными для изменений. Чаще, однако, применяется другая стратегия - видимые элементы можно сделать недоступными для изменений. Практически все элементы имеют булево свойство Enabled. Если дать ему значение True, то элемент считается включенным и доступен для изменения. Чтобы "выключить" его и сделать недоступным, достаточно изменить значение свойства Enabled на False. Обычно, программным путем проверяются контекстные условия, при выполнении которых элемент включается и является доступным для изменений.



Объекты, отвечающие за диалоговое окно и элементы управления, определены в период загрузки диалогового окна. Окно можно выгрузить, вызвав метод UnLoad, и тогда сам объект UserForm и все объекты, соответствующие вложенным в него элементам управления, становятся недоступны для программирования, - их свойства теряются. Важно понимать, что, зачастую, необходимо сохранять информацию о свойствах элемента управления долговременно в файлах постоянной памяти, - это и ввод, сделанный пользователем, и полученные в процессе работы результаты. В этих случаях в программу вводятся переменные, предназначенные для хранения значений тех или иных свойств элементов управления. Их срок жизни другой и не связан с загруженной формой. Поэтому перед применением UnLoad следует запомнить значения нужных свойств в переменных программы с возможной записью их в файл перед окончанием работы. Аналогично, при повторном сеансе свойства устанавливаются, используя сохраненные в файле значения.

Еще несколько слов о методах Load и UnLoad. Понятно, что это не совсем обычные методы, особенно Load - он не может быть методом, так как до его выполнения объект UserForm не существует, а не существующий объект не может вызывать никаких методов. Поэтому Load является оператором, синтаксис которого:

Load <объект класса UserForm>.

За компанию и UnLoad является оператором с аналогичным синтаксисом.

Диалоговые окна всегда модальные. Поэтому, когда пользователь заканчивает с ним работу и щелкает соответствующую кнопку выхода, то в обработчике этой кнопки должен быть предусмотрен оператор UnLoad.

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

Созданное диалоговое окно в одном приложении можно экспортировать в другие приложения Office 2000. Но нужно быть осторожным - для корректной работы должны использоваться только средства VBA, не содержащие специфических для приложения объектов.



Если Вы спроектировали диалоговое окно, которое предполагается использовать и в последующих разработках, то можно на основе окна создать шаблон - для чего достаточно выполнить операцию, обратную проектированию, - перетащить созданное окно на инструментальную панель, содержащую элементы управления.

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

Близким по духу к MultiPage является элемент управления TabStrip. Если первый задает несколько страниц с разнородным составом элементов управления, то второй определяет несколько страниц с одинаковым набором элементов. Типичная ситуация применения TabStrip - диалоговое окно отвечает за обработку данных нескольких отделов. Все формы представления данных по каждому отделу одинаковы и отличаются только содержащейся в этих формах информацией. TabStrip для каждого из отделов создает свою вкладку.

До сих пор мы говорили, что ActiveX и элементы управления можно располагать в диалоговых окнах. Эти окна представляют некоторый способ группирования элементов и придают структуру пользовательскому интерфейсу. Можно, однако, размещать все эти элементы и вне диалогового окна непосредственно на документе Word, рабочем листе или листе диаграмм Excel или на слайде презентации PowerPoint. Иногда, особенно когда число элементов невелико, так поступать удобнее - есть данные, а рядом - кнопка, щелчок которой обрабатывает эти данные. Злоупотреблять такой возможностью мы, правда, не рекомендуем.


Содержание раздела