powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с AddressOf
9 сообщений из 9, страница 1 из 1
Проблема с AddressOf
    #39889920
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.
Суть такова. На форме при запуске программы создается сверху строка меню. В нее добавляются выпадающие пункты меню
Ниже код. Пока макрос сделан в Excel VBA. Хочу сделать обработку пунктов менюю Читал , что делается через субклассирование.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
Const My = &H100&
Const MF_STRING = &H0&
Const MF_POPUP = &H10&
Const MF_SEPARATOR = &H800&
Const MF_BYCOMMAND = &H0&
Const MF_DISABLED = &H2&
Const MF_GRAYED = &H1&
Const MF_ENABLED = &H0&
Const NN = -4


Private Declare Function CreateMenu Lib "user32" () As Long
Private Declare Function CreatePopupMenu Lib "user32" () As Long
Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wflags As Long, ByVal wIDNewItem As Long, ByVal lpnewitem As String) As Long
Private Declare Function EnableMenuItem Lib "user32" (ByVal hMenu As Long, ByVal wIDEnableItem As Long, ByVal wEnable As Long) As Long
Private Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wflags As Long, ByVal x As Long, ByVal y As Long, ByVal nreserved As Long, ByVal hwnd As Long, lprc As Rect) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpclassname As String, ByVal lpwindowname As String) As Long
Private Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Boolean
Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Private Declare Function SetMenu Lib "user32" (ByVal hwnd As Long, ByVal hMenu As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Dim OldWndProc As Long
Dim hwnd As Long

Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lReturn As Long

  '??????? ???????? ?????????? ????????? ??????????? ??????? ????????? ?????????, ? ????? ????
  lReturn = CallWindowProc(OldWndProc, hwnd, Msg, wParam, lParam)
'  Select Case Msg '????????? ?????????
'    Case WM_MENUSELECT '???? ?????? ???, ?? ????????? ????????? ???????? (??????
'                       'WM_MENUSELECT ????? ???? ????? ?????? ?????????, ?????????)
'   ...
'    ...
'  End Select
  WindowProc = lReturn '?????? ???????? ???????
End Function

Private Sub UserForm_Activate()
  Dim hMenu As Long
  Dim hPopupMenu As Long
  Dim hwnd As Long
  Dim j As Long
  
  hwnd = FindWindow(vbNullString, "UserForm1")
  hMenu = CreateMenu()
  hPopupMenu = CreatePopupMenu()
  AppendMenu hMenu, MF_STRING Or MF_POPUP, hPopupMenu, "File"
  AppendMenu hMenu, MF_STRING, 600, "Help"
  AppendMenu hPopupMenu, MF_STRING, 600, "New..."
  AppendMenu hPopupMenu, MF_STRING, 600, "Open..."
  AppendMenu hPopupMenu, MF_SEPARATOR, 600, ""
  AppendMenu hPopupMenu, MF_STRING, 600, "Exit..."
  SetMenu hwnd, hMenu
  'j = VBA.Int(AddressOf WindowProc)
  OldWndProc = SetWindowLong(hwnd, NN, AddressOf WindowProc)
End Sub

Private Sub UserForm_Deactivate()
  SetWindowLong hwnd, NN, OldWndProc
End Sub


Выдает ошибку "Invalid use of AddressOf operator"
Не могу понять в чем дело. Может и другие способы есть определить , какие пункты меню выбрал пользователь. Пока только этот нашел. Но на AddressOf постоянно ругается
...
Рейтинг: 0 / 0
Проблема с AddressOf
    #39889927
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AddressOf работает только на уровне модулей.
В классах и формах использовать нельзя
...
Рейтинг: 0 / 0
Проблема с AddressOf
    #39889996
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!. Перенес весь код в отдельный модуль, заработало
...
Рейтинг: 0 / 0
Проблема с AddressOf
    #39890029
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня еще один небольшой вопрос сейчас появился.
Я написал следующие процедуры

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Function LowOrd(DbleWord As Long) As Integer
    If DbleWord And &H8000& Then
        LowOrd = &H8000 Or (DbleWord And &H7FFF&)
    Else
        LowOrd = DbleWord And &HFFFF&
    End If
End Function

Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lReturn As Long

  
  lReturn = CallWindowProc(OldWndProc, hwnd, Msg, wParam, lParam)
  Select Case Msg
    Case WM_MENUSELECT
      Select Case LowOrd(wParam)
        Case 2
          MsgBox "About"
        Case 10
          MsgBox "New..."
        Case 20
          MsgBox "Open..."
        Case 30
          MsgBox "Exit..."
      End Select
  End Select
  WindowProc = lReturn
End Function


В предыдущем коде я тоже изменил ID пунктов меню. Я хотел сделать набросок, просто чтобы при выборе того или иного пункта появлялось сообщение, чтобы посмотреть как работает. Пункт меню "About..." не имеет выпадающего меню, а пункт "File" имеет, и содержит подпункты "New","Open","Exit". Если я выбираю пункт "About..." то все нормально , он показывает правильное сообщение, но стоит нажать на пункт "File", чтобы выбрать тот или иной пункт из выпадающего списка, то сразу выходит случай Case 10: "New"
И сколько бы не нажимал остальные выбрать не получается. Как обрабатывать пункты из выпадающего списка? Может другое сообщение посылается, не WM_MENUSELECT?
...
Рейтинг: 0 / 0
Проблема с AddressOf
    #39890052
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заменил WM_MENUSELECT на WM_COMMAND, заработало). Оказывается WM_COMMAND определяет конечные пункты меню.
WM_MENUSELECT видимо только на верхнем уровне работает
...
Рейтинг: 0 / 0
Проблема с AddressOf
    #39890057
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если я вместо MsgBox вызываю открытие какой либо формы то форма новая открывается , но потом почему то выходит сообщение
RunTime Error(28) (вроде с цифрой 28):

Код: vbnet
1.
2.
3.
4.
...
  Case 10
     UserForm2.Show vbModal
...


, то нужно ли в новой форме также делать ссылку на новую процедуры обработки сообщений вместо стандартных (т.е писать WindowProc или ссылаться на ту, которую я описал уже в модуле), или нужно как то временно отключать свой обработчик сообщений, примерно так:

Код: vbnet
1.
2.
3.
4.
5.
6.
...
  Case 10
    SetWindowLong...'Временно выбрать родной обработчик сообщений окна, из которого вызывается форма UserForm2 
    UserForm2.Show vbModal

...
...
Рейтинг: 0 / 0
Проблема с AddressOf
    #39891043
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня такая проблема: На форме создается меню верхнего уровня При открытии формы в НЕМОДАЛЬНОМ режиме, форма зависает. Не могу понять в чем дело. Если форма открывается в модальном режиме, все работает , пункты меню вызывают нужные функции. Но мне какрас форма нужна в немодальном режиме,т.к пользователь должен выбирать объекты вне формы.
...
Рейтинг: 0 / 0
Проблема с AddressOf
    #39891120
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.show vbModeless
...
Рейтинг: 0 / 0
Проблема с AddressOf
    #39891123
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при UserForm.Show vbModa - не зависает
при UserForm.Show vbModeless - зависает. А мне нужен именно этот режим. Я уже свойства формы установил ShowModal=False.
Может при модальном режиме, форма принимает все сообщения и обрабатывает потому что активна, а при немодальном впадат в ступор
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с AddressOf
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]