2.8.Создание меню
2.8.1.Создание меню


В предыдущих главах было приведено огромное количество примеров соз­дания приложений, позволяющих автоматизировать и существенно упростить работу в MS Office. Одной из наиболее важных задач при разработке приложения является создание собственного интерфейса, при этом необходимо исключить ненужные панели инструментов, создать пользовательские панели инструментов и преобразовать строку меню под нужды приложения. Как раз одним из достоинств MS Office является то, что его интерфейс лег­ко настроить под конкретное приложение, создавая и настраивая панели инструментов и строки меню. Панели инструментов, строки меню и контекстные меню (вызываемые щелчком правой кнопки мыши) фактически являются одинаковыми объектами, для которых в интерфейсе пользователя существует термин панели инструментов, а в VBA — термин панели команд (command bar). Данные о них инкапсулируются в объектах CommandBar, которые в своей совокупности образуют семейство CommandBars. В этой главе вы узнаете, как конструируется строка меню, как определить имена всех меню, а также все используемые в них значки, как создать меню с флажками, как добавить пункт в уже существующее меню, как построить панель инструментов и добавить в нее раскрывающийся список, как в меню используются поля ввода, как конструируется контекстное меню, как оно свя­зывается с элементами управления и как в него добавляются шпионы.

 

В качестве примера создадим строку меню, имеющую простую структуру: Два выпадающих меню: Файл и Справка. В выпадающем меню Файл имеются три пункта меню: Создать, Сохранить и Выход. В выпадающем меню Справка имеется единственный пункт — Об авторе. При выборе каждой из команд меню, за исключением Выход, для подтверждения действий пользователя выполняются процедуры-заглушки, которые лишь обозначают присутствие кода. Выбор же команды Выход действительно производит закрытие приложения. Пункт Об авторе имеет не только текст, но и значок.

 

  

 

В данном проекте код набирается в двух модулях: ЭтаКнига и стандартном.

 

В модуле ЭтаКнига (листинг 2.1, а) имеются две процедуры. Первая из них обрабатывает событие Open объекта workbook. Эта процедура вызывает процедуру MenuBuilder, в которую помещен весь код, и создает строку меню, которая в коде получает имя МояСтрокаМеню. Для того чтобы методом Add семейства commandBars была создана строка меню, а не панель инструмен­тов, значение параметра MenuBar должно быть установлено равным True. Так как значение параметра Temporary метода Add установлено равным True, то строка меню является временной и удаляется при закрытии всего приложения. Но это не всегда удобно. Лучше бы было, если бы строка меню удалялась при закрытии книги. Для этого в коде и обрабатывается событие BeforeClose объекта workbook. В процедуре обработки этого события как раз и удаляется пользовательская строка меню. Если в пункте меню надо кроме заголовка вывести и значок, то у него следует установить значение свойства style равным msoButtonIconAndCaption, а в качестве значения свойства FaceId — идентификатор стандартного значка, используемого в MS Office. Для конструирования разделительной линии у пункта, перед которым она создается, надо установить значение свойства BeginGroup равным True.

 

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

 

Листинг 2.1.а. Строка меню. Модуль ЭтаКнига

 

Private Sub Workbook_Open()

    MenuBuilder

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    MenuKiller

End Sub

Private Sub MenuBuilder()

    Dim cbMenuBar As CommandBar

    Set cbMenuBar = Application.CommandBars.Add( _

                                        Name:="МояСтрокаМеню", _

                                        Position:=msoBarTop, _

                                        MenuBar:=True, _

                                        Temporary:=True)

    With cbMenuBar

        .Visible = True

        With .Controls

            With .Add(Type:=msoControlPopup)

                .Caption = "Файл"

                With .Controls

                    With .Add(Type:=msoControlButton)

                        .Caption = "Создать"

                        .OnAction = "NewDoc"

                    End With

                    With .Add(Type:=msoControlButton)

                        .Caption = "Сохранить"

                        .OnAction = "SaveDoc"

                    End With

                    With .Add(Type:=msoControlButton)

                        .Caption = "Выход"

                        .OnAction = "ExitApp"

                    End With

                End With

            End With

            With .Add(Type:=msoControlPopup)

                .Caption = "Справка"

                With .Controls

                    With .Add(Type:=msoControlButton)

                        .Caption = "Об авторе"

                        .OnAction = "AboutAuthor"

                        .Style = msoButtonlconAndCaption

                        .FaceId = 463

                    End With

                End With

            End With

        End With

    End With

End Sub

 

Sub MenuKiller()

    On Error Resume Next

    Application.CommandBars("МояСтрокаМеню").Delete

    On Error GoTo 0

End Sub

 

Листинг 2.2.б. Строка меню. Стандартный модуль

 

Public Sub NewDoc()

MsgBox "New"

End Sub

 

Public Sub SaveDoc()

MsgBox "Save"

End Sub

 

Public Sub ExitApp()

Application.Quit

End Sub

 

Public Sub AboutAuthor()

MsgBox "James Bond", vblnformation, "About Author"

End Sub

 

Типичные ошибки, возникающие при создании пользовательских панелей инструментов

Независимо от приложения и того, как оно хранит пользовательские панели, в VBA-программах нельзя выполнять следующие действия (попытка приводит к ошибке приложения):

  • удалить панель, которая в этот момент не существует;

  • создать новую панель, причем ее имя совпадает с именем уже сущест­вующей панели;

  •  любым способом обратиться к элементам или свойствам несуществую­щей панели.

 

Конструктивный вывод из этих печальных фактов — до выполнения таких действий мы должны убедиться в наличии или отсутствии панели. Так как это требуется довольно часто, напишем библиотечную функцию, например, такую, как в листинге 2.3.

 

Листинг 2.3. Библиотечная функция

Function CommandBarExists(CommandBarName As String) As Boolean On Error Resume Next

CommandBarExists = _

          Not Application.CommandBars(CommandBarName) Is Nothing

On Error GoTo 0

End Function

 



  

ПОИСК
МОЯ КНОПКА
Контакты
МБОУ "Лицей им.Атякшева"

628260 г. Югорск, ул. Ленина 24,
ХМАО-Югра, Тюменская область
Телефон: 8 (34675)2-48-30
Факс: 8 (34675)2-48-30



89222596815 nady_er@mail.ru
Карта
sample map