Popup Menu

Тема в разделе "Lotus - Программирование", создана пользователем savl, 3 фев 2012.

Статус темы:
Закрыта.
  1. savl

    savl Lotus team
    Lotus team

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

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

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    795
    Симпатии:
    78
  3. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Спасибо. но это я уже читал :)
    Сейчас основная проблема это GetMenuString не записывает в буффер текст пункта меню.

    Код (LotusScript):
    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, права локального админа на машине есть.
     
  4. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    savl


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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    проходил, на этой строке:
    call GetMenuString(Me.hMenu, t, menuS, 0, 0)

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

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

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

    хрень :)
     
  6. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    так... исправил другим способом.

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

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

    susinmn Well-Known Member

    Регистрация:
    16 окт 2007
    Сообщения:
    530
    Симпатии:
    8

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

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.019
    Симпатии:
    8
    А почему размер буфера (предпосл. параметр) нулевой?
    ЗЫ. GetLastError не сработает, т.к. ошибку "забирает себе" движок Лотуса, обрабатывающий API-вызовы. Лучше написать свою DLL. А еще лучше, наверное, использовать JAVA... :)
     
  9. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Это я тогда не разбирался сильно :(
    Сейчас работает:
    Код (LotusScript):
    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)
    По поводу примера, могу дать библиотеку, но она не до конца дописана. Пары возможностей еще нет.
     
  10. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    а так работает ?
    Код (LotusScript):
    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
    обработчик апи ошибок

    Код (LotusScript):
    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
     
  11. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Kee_Keekkenen
    от этого варианта ушел, когда нашел структуру msgdata
    Да и вопрос уже решен.
     
Загрузка...
Похожие Темы - Popup Menu
  1. rrr
    Ответов:
    0
    Просмотров:
    472
  2. alexas
    Ответов:
    5
    Просмотров:
    1.208
  3. savl
    Ответов:
    1
    Просмотров:
    2.227
  4. VahaC
    Ответов:
    1
    Просмотров:
    3.327
  5. VahaC
    Ответов:
    2
    Просмотров:
    2.683
Статус темы:
Закрыта.

Поделиться этой страницей