Как сделать всплывающее по правой кнопке меню?
frm.PopupMenu(MyMenu)
End sub
Вроде должно работать, но он выдает "type mismatch"
Как правильно делать контекстные меню???
sub Form_MouseUp(...)
frm.PopupMenu(MyMenu)
End sub
Вроде должно работать, но он выдает "type mismatch"
Как правильно делать контекстные меню???
Я умею это делать в Экселе. Возможно, в ВБ все делается аналогично. Сейчас несколькими постами зашлю.
Во-первых, в обычном модуле твоей программы должно быть это:
'Это должно быть в модуле
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
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
На всякий случай для примера даю еще процедуру, в которой показано, как делать в контекстном меню подменю и как делать в подменю нажатую/отжатую "галочку".
'Должно быть в модуле листа
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
Я умею это делать в Экселе. Возможно, в ВБ все делается аналогично. Сейчас несколькими постами зашлю.
Не, ни фига вариант с XL не прокатывает :(((
Не, ни фига вариант с XL не прокатывает :(((
А что происходит? Может, ты забыл какие-то чисто экселевские фишки поменять. Помни основную идею: когда нажимается правая кнопка, никакого меню еще не существует (поэтому и BeforeClick, а не After). Ты создаешь его сразу перед демонстрацией пользователю.
Лично я делаю так :
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
Извени за мой русский...
Если будут вопросы....
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
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, про скобки я допер сам. все заработало:)))
Thanks, про скобки я допер сам. все заработало:)))
ya do etogo doperal 2 nedeli kogda nachinal
programite :D :D :D mozes shitate seba
"genialnim programmerom".V buduushem. ;)