www.map-info.ru :: Просмотр темы - Меню Mapinfo
                               РќР° главную страницу сайта

 
                                
ВходВход    РегистрацияРегистрация    ПрофильПрофиль    ПользователиПользователи    ГруппыГруппы    FAQFAQ    ПоискПоиск  

 
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Предыдущая тема :: Следующая тема  
Автор Сообщение
FedorinoFF



Зарегистрирован: 01.02.2007
Сообщения: 272
Откуда: Санкт-Петербург

СообщениеДобавлено: Вт Окт 13, 2009 10:47 pm    Заголовок сообщения: Меню Mapinfo Добавить ответ со ссылкой на данный текст

Дело было вечером, делать было чего...
Ковырялся с работой с меню. Из всей простоты MapBasic, самое сложное или недоделанное, на мой взгляд, это работа с меню... (может, конечно, попробовать RTFM, но мы не ищем легких путей).
В муках наткнулся на возможность создавать обработчики (хуки) для стандартных пунктов меню.

Тема такая:
---------------
Include "MENU.DEF"
Include "MAPBASIC.DEF"

Declare Sub CloseAllHandler
Declare Sub CloseHandler
Declare Sub OpenFileHandler
declare Sub EndHandler
declare sub Main
Declare Sub EndApp

Sub Main
Print "App starting..."
Alter Menu Item M_FILE_CLOSE_ALL Calling CloseAllHandler
Alter Menu Item M_FILE_CLOSE Calling CloseHandler
Alter Menu Item M_FILE_OPEN Calling OpenFileHandler

Alter Menu Bar Add "MB_Test"
Alter Menu "MB_Test" Add "Exit app" Calling EndApp
End Sub

Sub Endapp
End program
End sub

Sub CloseAllHandler
Print "Before Closeall"
Run Menu Command M_FILE_CLOSE_ALL
Print "After CloseAll"
' need to self-manage Menu state
Alter Menu Item M_FILE_CLOSE_ALL Disable
End Sub

Sub CloseHandler
Print "Before Close"
Run Menu Command M_FILE_CLOSE
Print "After Close"

' need to self-manage Menu state
If NumTables() = 0 Then
Alter Menu Item M_FILE_CLOSE Disable
Alter Menu Item M_FILE_CLOSE_ALL Disable
end if
End Sub

Sub OpenFileHandler
Print "Before OpenFile"
Run Menu Command M_FILE_OPEN
Print "After OpenFile"

' need to self-manage Menu state
Alter Menu Item M_FILE_CLOSE Enable
Alter Menu Item M_FILE_CLOSE_ALL Enable
End Sub

Sub EndHandler
' Restore Menu, otherwise Menu items disappered
Onerror Goto err_trap
' If MI_Rus
Create Menu "Файл" As Default
' If MI_Eng
Create Menu "File" As Default
Exit_sub:
Print "App finished."
Exit Sub
err_trap:
Resume Next
end sub
-------------------

В итоге имеем обработчики на пункт меню "Открыть", "Закрыть" и "Закрыть все", но:
1.кнопка "открыть" на тулбаре не ловится
2.приходится ручками манажить пункты меню (не смотря на вызов стандартных обработчиков, пункты не активируются/деактивируются)
3. при завершении приложения три пункта меню пропадают (понятно почему), но вернуть их можно только через восстановление default меню
4. если не делать возврат default menu и запустить приложени при его автривности, то пункты меню пропадают...

Кто что может сказать/поделиться/прокомментировать по данному вопросу?

Не проверял что будет, если несколько приложений повесят свои обработчики на пункты меню...

Тема интересна для "оживления" своих пунктов меню, когда происходит закрытие/открытие таблиц (или WOR). Закрытие окон ловится стандартным обработчиком.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Андрей Могильный



Зарегистрирован: 21.03.2006
Сообщения: 864

СообщениеДобавлено: Ср Окт 14, 2009 9:08 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Мы в Инструментарии вешаем обработчик на стандартный Сохранить рабочий набор. Путь полный граблей... Не раз нам пользователи сообщали, что иногда, при невыясненных причинах рабочий набор не сохранялся. Причем мы конечно же воспроизвести ну никак не могли. Каким-то чудесным образом, с помощью особо грамотных пользователей нам удалось немного локализовать и загнать ошибку в угол, вроде больше не появляется. Но лазить в это место уже никакого желания нет :)))

Когда вешаем обработчик, сохраняем все старое:
SaveWSName = MenuitemInfoByHandler(M_FILE_SAVE_WORKSPACE, MENUITEM_INFO_TEXT)
SaveWSHelpMsg = MenuitemInfoByHandler(M_FILE_SAVE_WORKSPACE, MENUITEM_INFO_HELPMSG)
Alter Menu ID 1 Remove M_FILE_SAVE_WORKSPACE
Alter Menu ID 1 Add SaveWSName HelpMsg SaveWSHelpMsg Calling PrepareSaveWorkspace

Для того, что восстановить при завершении приложения:
Sub EndHandler
Alter Menu ID 1 Remove PrepareSaveWorkspace
Alter Menu ID 1 Add SaveWSName HelpMsg SaveWSHelpMsg Calling M_FILE_SAVE_WORKSPACE
End Sub

Про кнопки - не знаю, возможно действительно так. Их ведь тоже наверное таким же образом можно перекрыть, не помню, не пробовал.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
FedorinoFF



Зарегистрирован: 01.02.2007
Сообщения: 272
Откуда: Санкт-Петербург

СообщениеДобавлено: Ср Окт 14, 2009 5:04 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

[quote="Андрей Могильный"]
Для того, что восстановить при завершении приложения:
Sub EndHandler
Alter Menu ID 1 Remove PrepareSaveWorkspace
Alter Menu ID 1 Add SaveWSName HelpMsg SaveWSHelpMsg Calling M_FILE_SAVE_WORKSPACE
End Sub
[/quote]

"Это и я так могу, а ты мурку давай..." :-)
Такой подход меня смутил тем, что порядок оригинальных пунктов меню нарушается...
Теоретически, как в доке написано, если кнопки и меню имеют один обработчик, то ведут себя похоже... Надо еще разок потыкать...
Спасибо.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
FedorinoFF



Зарегистрирован: 01.02.2007
Сообщения: 272
Откуда: Санкт-Петербург

СообщениеДобавлено: Ср Окт 14, 2009 5:11 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Но можно полность пересоздать меня в правильном порядке... как вариант.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Андрей Могильный



Зарегистрирован: 21.03.2006
Сообщения: 864

СообщениеДобавлено: Чт Окт 15, 2009 7:30 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Да, нарушается. Но это как раз вроде один из безболезненных путей. Смотрю в старые версии кода, вижу, что было так:
Alter Menu Item M_FILE_SAVE_WORKSPACE Calling PrepareSaveWorkspace
только как раз такой код и приводил к непонятным ошибкам.
P.S. А выстроить порядок конечно можно. Только нужно ли? :)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
FedorinoFF



Зарегистрирован: 01.02.2007
Сообщения: 272
Откуда: Санкт-Петербург

СообщениеДобавлено: Сб Окт 17, 2009 12:56 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

[quote="Андрей Могильный"]
P.S. А выстроить порядок конечно можно. Только нужно ли? :)[/quote]

Пользователи - народ очень пугливый... Особенно если это тетеньки..
Да и самому, если привык на автомате тыкать в середину списка пунктов меню, то оказывается что сохранить рабочий набор стал внизу...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Top.Mail.Ru