Popup Menu

Статус
Закрыто для дальнейших ответов.

savl

Lotus Team
28.10.2011
2 624
314
BIT
541
Ситуация такая, необходимо написать popup меню, для win машин.
Наткнулся на пару глюков с клиентом 8,5:
1. GetActiveWindow не работает. зато работает GetFocus
2. GetMenuString не возвращает выбранную строку меню.
3. TrackPopupMenu или TrackPopupMenuEx работают как-то попеременно... Но тут я мог ошибиться ;)
4. Как использывать GetLastError? не получается :( не возвращает ничего

Никто не занимался переносом меню с 7ки на 8ку?
Мне ее с нуля писать, так что советы и предложения с удовольствием выслушаю.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
541
Спасибо. но это я уже читал :)
Сейчас основная проблема это GetMenuString не записывает в буффер текст пункта меню.

Код:
Dim menuS As String*128
t = TrackPopupMenu(Me.hMenu, 256, Me.p.x, Me.p.y, 0, Me.hWnd, Me.r)
call GetMenuString(Me.hMenu, t, menuS, 0, 0)

Вот что может быть?

win7 + Lotus 8.5.2, права локального админа на машине есть.
 

Cleric-Lviv

Well-known member
03.01.2008
603
0
BIT
6
savl


Так пройдитесь в дебагере. посмотрите есть ли все данные.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
541
проходил, на этой строке:
call GetMenuString(Me.hMenu, t, menuS, 0, 0)

menuS до вызова - пустая

после вызова - пустая.

Если menuS до вызова забить чем-то, то она не меняется после вызова. А должна!

хрень :)
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
541
так... исправил другим способом.

Сделал для меню постоянный ID (число 8-значное ) когда добавляю элемент из этого ID вычитаю 1. Хватит надолго.
TrackPopUpMenu возвращает ID item'а.
Затем вычитаю из ID меню ID этого Item'а и получаю порядковый номер элемента, затем выбираю элемент из массива.

Что за фигня с GetMenuString так и не понял :) Так что тема открыта.
 
S

susinmn

так... исправил другим способом.

Сделал для меню постоянный ID (число 8-значное ) когда добавляю элемент из этого ID вычитаю 1. Хватит надолго.
TrackPopUpMenu возвращает ID item'а.
Затем вычитаю из ID меню ID этого Item'а и получаю порядковый номер элемента, затем выбираю элемент из массива.

Что за фигня с GetMenuString так и не понял :( Так что тема открыта.


Можете выложить базу с примером?
 

Мыш

Lotus Team
12.02.2008
1 228
30
BIT
137
call GetMenuString(Me.hMenu, t, menuS, 0, 0)
А почему размер буфера (предпосл. параметр) нулевой?
ЗЫ. GetLastError не сработает, т.к. ошибку "забирает себе" движок Лотуса, обрабатывающий API-вызовы. Лучше написать свою DLL. А еще лучше, наверное, использовать JAVA... :)
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
541
Это я тогда не разбирался сильно :(
Сейчас работает:
Код:
Call SetForegroundWindow(Me.hWnd)
If Me.p.x < 0 Or Me.p.y < 0 Then Call GetCursorPos(Me.p)
Call TrackPopupMenu(Me.hMenu, &H0, Me.p.x, Me.p.y, 0, me.hwnd, Me.r)
ret = GetMessage(msgdata, me.hwnd, 0, 0)
i = Abs(msgdata.message)
If i <> 273 Then GoTo endh
show = me.MenuArr(msgdata.wParam)
По поводу примера, могу дать библиотеку, но она не до конца дописана. Пары возможностей еще нет.
 
K

Kee_Keekkenen

Спасибо. но это я уже читал :(
Сейчас основная проблема это GetMenuString не записывает в буффер текст пункта меню.

Код:
Dim menuS As String*128
t = TrackPopupMenu(Me.hMenu, 256, Me.p.x, Me.p.y, 0, Me.hWnd, Me.r)
call GetMenuString(Me.hMenu, t, menuS, 0, 0)

Вот что может быть?

win7 + Lotus 8.5.2, права локального админа на машине есть.

а так работает ?
Код:
t=TrackPopupMenu (hMenu, 256, x, y, 0, GetFocus(), 0)

l=GetMenuString (hMenu, t, menuS, 0, 0)+1	'l as long
Call GetMenuString (hMenu, t, menuS, l, 0)
Call PostMessage(hWnd, 0, 0, 0)
For i=1 To l-1
s=Mid(MenuString,i,1)
Show=Show+s 'название выбранного пункта
Next

обработчик апи ошибок

Код:
Private Function GetAPIError (errorCode As Integer) As String
On Error Goto errHandler
Const FuncName = "iStub. GetAPIError ()"

Dim errorString As String * 256
Dim returnErrorString As String
Dim resultStringLength As Long
Dim errorCodeTranslated As Integer

errorCodeTranslated = (errorCode And ERR_MASK) 'Const ERR_MASK = &H3fff
resultStringLength = OSLoadString(0, errorCodeTranslated, errorString, Len(errorString) - 1)

If Instr(errorString, Chr(0)) > 0 Then
returnErrorString = Left(errorString, Instr(errorString, Chr(0)) - 1)
Else
returnErrorString = errorString
End If

GetAPIError = returnErrorString

Goto endH
errHandler:
Error Err, FuncName & ", стр." & Erl & Chr (10) & Error$
endH:
End Function
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
541
Kee_Keekkenen
от этого варианта ушел, когда нашел структуру msgdata
Да и вопрос уже решен.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!