Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как сделать всплывающее по правой кнопке меню?

518
14 февраля 2003 года
Andreika
101 / / 14.02.2003
sub Form_MouseUp(...)
frm.PopupMenu(MyMenu)
End sub

Вроде должно работать, но он выдает "type mismatch"

Как правильно делать контекстные меню???
267
14 февраля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by Andreika
sub Form_MouseUp(...)
frm.PopupMenu(MyMenu)
End sub

Вроде должно работать, но он выдает "type mismatch"

Как правильно делать контекстные меню???



Я умею это делать в Экселе. Возможно, в ВБ все делается аналогично. Сейчас несколькими постами зашлю.

267
14 февраля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Заранее извиняюсь если будут глючить русские буквы в именах переменных.

Во-первых, в обычном модуле твоей программы должно быть это:
Код:
Option Explicit
'Это должно быть в модуле
Public Const ComBarName = "MyBestBar"
Public ComBar As CommandBar, But(10) As CommandBarButton
Public Pop As CommandBarPopup

'Это должно быть в модуле
'Это для удобства формирования меню
Sub AddToBar(НомерКнопки As Integer, Название As String, Иконка As Integer, _
         ПослеЧерты As Boolean, ИмяМакроса As String)
    'Создает на панели ComBar кнопку с указанными свойствами
    Set But(НомерКнопки) = ComBar.Controls.Add(msoControlButton, 1)
    But(НомерКнопки).Caption = Название
    But(НомерКнопки).FaceId = Иконка
    But(НомерКнопки).BeginGroup = ПослеЧерты
    But(НомерКнопки).OnAction = ИмяМакроса
    But(НомерКнопки).Style = msoButtonIconAndCaption
    But(НомерКнопки).Enabled = True
End Sub

'Это должно быть в модуле
'Это пример процедуры, которая будет запускаться из контекстного меню
Private Sub Analis()
    Set ComBar = Application.CommandBars(ComBarName)
   
    Select Case CommandBars.ActionControl.Index
        Case 1 '
            MsgBox "1"
        Case 2 '
            MsgBox "2"
        Case 3 '
            MsgBox "3"
        Case 4 '
            MsgBox "4"
   
    End Select
    ComBar.Delete
End Sub
267
14 февраля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Это располагается в модуле листа (соответственно твоей формы):
Код:
'Это должно быть в модуле листа
Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean)

    Cancel = True

    On Error Resume Next
    Application.CommandBars(ComBarName).Delete
    On Error GoTo 0

    Set ComBar = Application.CommandBars.Add(ComBarName, msoBarPopup, False, True)

    Call AddToBar(1, "Быстрее!", 481, False, "Analis")
    Call AddToBar(2, "Выше!", 482, False, "Analis")
    Call AddToBar(3, "Сильнее!", 483, False, "Analis")
    Call AddToBar(4, "Выход", 484, True, "Analis")

    ComBar.ShowPopup

End Sub
267
14 февраля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Скорее всего, тебе вышеизложенного хватит для создания контекстных меню.
На всякий случай для примера даю еще процедуру, в которой показано, как делать в контекстном меню подменю и как делать в подменю нажатую/отжатую "галочку".

Код:
'А это все пример работы с подменю в контекстном меню и кнопками вкл/выкл
'Должно быть в модуле листа
Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean)
Dim NewBut As CommandBarButton, i As Integer

    Cancel = True
   
    On Error Resume Next
    Application.CommandBars("MyBestBar").Delete
    On Error GoTo 0
    Set ComBar = Application.CommandBars.Add("MyBestBar", msoBarPopup, False, True)

    Call AddToBar(1, "Сегодня воскресенье", 1, False, "Analis")
    Call AddToBar(2, "Взять пивка...", 59, False, "GetBeer")

    If WeekDay(Date, vbMonday) = vbSunday Then
        But(1).State = msoButtonDown
     Else
        But(1).State = msoButtonUp
     End If

    Set Pop = ComBar.Controls.Add(msoControlPopup, 1)
    Pop.Caption = "Сорта пива"
    Pop.BeginGroup = True
    Pop.Enabled = True
   
    i = 1
    While ThisWorkbook.Worksheets("Марки пива").Cells(i, 1).Value <> ""
        Set NewBut = Pop.Controls.Add(msoControlButton, 1)
        NewBut.Caption = ThisWorkbook.Worksheets("Марки пива").Cells(i, 1).Value
        NewBut.FaceId = 1
        NewBut.Style = msoButtonIconAndCaption
        If i = ThisWorkbook.Worksheets("Марки пива").Range("A2").Value Then
            NewBut.State = msoButtonDown
         Else
            NewBut.State = msoButtonUp
         End If
        NewBut.OnAction = "GetBeer"
        i = i + 1
    Wend
   
    ComBar.ShowPopup

End Sub

Public Sub GetBeer()
   
    Application.StatusBar = "Идет поиск нужного пива..."
    Application.Cursor = xlWait
    Application.ScreenUpdating = False

    ThisWorkbook.Worksheets("Марки пива").Range("A2").Value = _
            CommandBars.ActionControl.Index
    Application.StatusBar = ThisWorkbook.Worksheets("Марки пива"). _
            Cells(CommandBars.ActionControl.Index, 1).Value
   
    CommandBars("MyBestBar").Delete
   
    Application.StatusBar = False
    Application.Cursor = xlDefault
    Application.ScreenUpdating = True

End Sub
267
14 февраля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Забыл сказать! Если чего не понятно - спрашивай!
518
16 февраля 2003 года
Andreika
101 / / 14.02.2003
Цитата:
Originally posted by Cutty Sark


Я умею это делать в Экселе. Возможно, в ВБ все делается аналогично. Сейчас несколькими постами зашлю.


Не, ни фига вариант с XL не прокатывает :(((

267
18 февраля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by Andreika

Не, ни фига вариант с XL не прокатывает :(((



А что происходит? Может, ты забыл какие-то чисто экселевские фишки поменять. Помни основную идею: когда нажимается правая кнопка, никакого меню еще не существует (поэтому и BeforeClick, а не After). Ты создаешь его сразу перед демонстрацией пользователю.

3.4K
22 февраля 2003 года
Rude Shock
6 / / 22.02.2003
Цитата:
Originally posted by Cutty Sark

Лично я делаю так :

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
'проверяем: если нажата была правая кнопка, то цепляем к форме myPopup-меню, как PopUp
If Button = vbRightButton Then
Me.PopupMenu mnuPopup, , X, Y, mnuDefult
End If
End Sub

Теперь объясню строку :
Me.PopupMenu mnuPopup, , X, Y, mnuExit

Во-первых, вот синтаксис:
object.PopupMenu menuname, flags, x, y, boldcommand

object-объект, к которому цепляем меню.
menuname-имя меню, которое хоти прицепить
flags-константа, описывающая место появление меню
x-расположение меню по иксу
y-расположение меню по игрику
boldcommand-пункт меню, который должен быть выделен жирным (только один пункт!)

Не забудь прописать исчезновение меню:

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'при каждом нажатии контестное меню спрятывается
Me.mnuPopup.Visible = False
End Sub

Извени за мой русский...
Если будут вопросы....

1.9K
22 февраля 2003 года
Putch
64 / / 22.02.2003
Цитата:
Originally posted by Andreika
sub Form_MouseUp(...)
frm.PopupMenu(MyMenu)
End sub

Вроде должно работать, но он выдает "type mismatch"

Как правильно делать контекстные меню???




BLIN VO ZAGRUZAUT NAROD
TEBE PROSTO NUZNO SKOBKI UBRATE
VOT TAK:

Me.PopupMenu MyMenu

Menu sozday cherez menu editor
ne budet nikakogo type mismatch

vse prosto do uzasa

518
23 февраля 2003 года
Andreika
101 / / 14.02.2003
Цитата:
Originally posted by Putch



BLIN VO ZAGRUZAUT NAROD
TEBE PROSTO NUZNO SKOBKI UBRATE
VOT TAK:

Me.PopupMenu MyMenu

Menu sozday cherez menu editor
ne budet nikakogo type mismatch

vse prosto do uzasa



Thanks, про скобки я допер сам. все заработало:)))

1.9K
24 февраля 2003 года
Putch
64 / / 22.02.2003
Цитата:
Originally posted by Andreika


Thanks, про скобки я допер сам. все заработало:)))




ya do etogo doperal 2 nedeli kogda nachinal
programite :D :D :D mozes shitate seba
"genialnim programmerom".V buduushem. ;)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог