Страница 1 из 1

Popup на форме

Добавлено: 04 янв 2009, 15:45
heisnod
Подскажите как можно создать свой попап для формы. Есть ли такой в VBA или прийдется создавать класс?

Re: Popup на форме

Добавлено: 04 янв 2009, 18:26
EducatedFool
Класс создавать не надо. Microsoft его уже создал :)

Вот один из вариантов: (проверено в Excel 2003)

В код формы пишем следующее:

Код: Выделить всё

Private Sub UserForm_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If Button = 2 Then СозданиеМеню_ЗаполнениеЭтогоМенюЭлементами_и_ЕгоОтображение
End Sub
Создаём модуль, и вставляем в него такой код:

Код: Выделить всё

Sub [B]СозданиеМеню_ЗаполнениеЭтогоМенюЭлементами_и_ЕгоОтображение[/B]()
    On Error Resume Next: Application.CommandBars.Add "Моё контекстное меню", msoBarPopup
    
    Dim p As CommandBar: Set p = Application.CommandBars("Моё контекстное меню")
    'p.Reset - почему-то не работает ' очистка меню от прежних пунктов (если каждый раз добавляем разные пункты)
    For Each ctrl In p.Controls: ctrl.Delete: Next    ' а вот так пункты меню удаляются


    AddItemIntoPopup p, 1, 161, "Make_Netflow_Report", "Обработка результатов запроса"
    AddItemIntoPopup p, 4, -1, "SearchNumber", "Поиск номеров"


    Set NewMenu = p.Controls.Add(Type:=msoControlPopup)    ' подменю Additional Tools
    With NewMenu: .Caption = "&Additional Tools": .BeginGroup = True: End With

    AddItemIntoPopup NewMenu, 1, IIf(DemoMode, 232, 231), "ToggleDemoMode", IIf(DemoMode, "В&ыключить безопасный режим", "&Включить безопасный режим"), True, "Demo3"
    AddItemIntoPopup NewMenu, 1, 3, "Save_AddIn_Copy_in_Settings", "Сохранить копию программы в папке Settings", True
    AddItemIntoPopup NewMenu, 1, 749, "Save_AddIn_Copy", "Сохранить копию программы с указанием даты и времени"
    AddItemIntoPopup NewMenu, 1, 2936, "PrepareAddInForUpdate", "Создать файл обновления", False
    AddItemIntoPopup NewMenu, 1, 964, "Write_MainSettingsFile", "Перезаписать файл Main.ini", True
    AddItemIntoPopup NewMenu, 1, 161, "MakeSummaryPage", "Создание сводной таблицы", False

    AddItemIntoPopup NewMenu, 1, 3, "WriteDefaultRegistryValuesOnFirstRun", "Применить настройки по умолчанию", True
    AddItemIntoPopup p, 1, 1088, "SetIsAddinTrue", "Скрыть листы файла программы", True
    AddItemIntoPopup p, 1, 1087, "SetIsAddinFalse", "Отобразить листы файла программы", False
    AddItemIntoPopup p, 1, 1809, "Install_Update_Local", "Install_Update_Local", True

    p.ShowPopup
End Sub

[B]Function AddItemIntoPopup[/B](ByRef Comm_Bar, ByVal B_Type As Integer, ByVal B_Face As Integer, _
                          ByVal On_Action As String, ByVal B_Caption As String, Optional ByVal Begin_Group As Boolean = False, Optional Tag As String = "") As CommandBarControl
' добавляет контролы в меню Comm_Bar ' type=1 - это кнопка, type=4 - это комбобокс, 10 - popup
    On Error Resume Next
    Set Add_Control = Comm_Bar.Controls.Add(Type:=B_Type)
    With Add_Control
        If B_Face > 0 Then .FaceId = B_Face:
        .Tag = Tag: .OnAction = On_Action: .Caption = B_Caption: If Begin_Group Then .BeginGroup = True
        'If надо_сделать_пункт_недоступным Then .Enabled = False
    End With
End Function
Потом запускаем форму, и щелкаем на ней правой кнопкой мыши.

Re: Popup на форме

Добавлено: 07 янв 2009, 15:22
heisnod
Спасибо. А как можно этот пример переделать в главное меню для формы?

Re: Popup на форме

Добавлено: 07 янв 2009, 15:30
EducatedFool
Цитата с сайта www.visual.2000.ru:
Напомним, что формы UserForms в VBA — это не то же самое, что VB-формы (Ruby Forms).
VBA UserForms являются экземплярами ActiveX-конструктора Microsoft Forms 2.0 (FM20.dll), который входит в состав как VB, так и VBA.
Более того, все элементы управления, представленные в нем по умолчанию, являются не встроенными, а ActiveX-компонентами (то есть при желании их можно подключить и к VB-форме). Чтобы убедиться в этом, откройте окно Tools|Additional Controls.

К сожалению, эти два вида форм различаются не только форматом их модулей. Каждая из них использует свой собственный набор встроенных элементов управления. Проблема же заключается в том, что эти наборы не только не совпадают функционально, но даже для одинаковых по значению элементов управления используются разные наименования свойств, событий и методов. MS Forms 2.0 не поддерживают ряд очень полезных встроенных элементов управления VB (Timer, FileListBox, PictureBox, DriveListBox, DirListBox, Menu, Shape и Line), но при этом включают другие полезные компоненты (TabStrip, MultiPage) и команды проектирования формы (TabOrder).
Сделать меню на форме VBA теоретически возможно, но достаточно сложно.
Проще найти другой вариант решения задачи.

Re: Popup на форме

Добавлено: 15 янв 2009, 08:28
heisnod
Столкнулся с такой проблемой: не знаю как добавить контрол к подменю, зная лишь caption и tag. Findcontrol ищет только в заданном меню, а не в его подменю. Тогда что делать? Перебирать все меню вообще или находить все подменю. Может есть более правильные способы?

Re: Popup на форме

Добавлено: 08 фев 2009, 21:27
Naeel Maqsudov
придется рекурсивно обойти все меню

Кстати, FindControl должен сам уметь это делать

Syntax
expression.FindControl(Type, Id, Tag, Visible, Recursive)

Re: Popup на форме

Добавлено: 09 окт 2014, 19:20
Chinock
Добрыйдень

Будьте добры подскажите пожалуйста каким образом можно прикрепить событие к выпадающему списку, созданному по принципу приведённому выше.
Данное меню появляется на при правом клике на текст бокс, находящийся на форме Excel.
Меню содержит три вида действия: Вырезать, копировать и вставить.
Kод создания меню находится в классе TextBox

Собственно необходимо, что бы происходила реакция при левом клике на определённом действии.

Спасибо

Re: Popup на форме

Добавлено: 09 окт 2014, 22:35
Chinock
Всем спасибо. Разобрался.