Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Миникласс "Меню" (контекстное) (число прочтений - 29139 )
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Миникласс "Меню" (контекстное)
11. Октября 2010 :: 13:42
Печать  
Класс для создания многоуровневого контекстного меню.
Картинки к пунктам меню можно брать из файлов, содержащих ресурсы или из bmp-файлов.
Меню можно выводить шрифтом, заданным пользователем(привет Eprst' у  Подмигивание)

Из требований -  dynwrapx.dll
« Последняя редакция: 13. Октября 2010 :: 13:06 - chessman »  

menu.ZIP ( 42 KB | Загрузки )
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Миникласс "Меню" (контекстное)
Ответ #1 - 13. Октября 2010 :: 08:46
Печать  
Вот вот, спасибо!
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #2 - 13. Октября 2010 :: 13:09
Печать  
Eprst писал(а) 13. Октября 2010 :: 08:46:
Вот вот, спасибо!


Сделал рефакторинг кода.
Вынес вспомогательный класс ImageList для формирования списка картинок. В него же добавил возможность загружать картинки подобной этой.
  

IMAGECOL.BMP ( 59 KB | Загрузки )
IMAGECOL.BMP
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
смысл?
Ответ #3 - 14. Октября 2010 :: 02:21
Печать  
Может, я чего-то не понимаю, но чем данный класс отличается от формирования многоуровневого меню с иконками средствами класса Сервис, а именно функцией ВыбратьЗначение?
Уже довольно давно использую оный для контекстного меню...
Навскидку увидел только одно отличие - картинки не обязаны быть в одном файле, но разве это сложность?
Вложил картинку сравнения. Сверху меню от объекта Сервис, снизу из примера ... поясните, пожалуйста, в чем преимущество второго?
  

_____001.JPG ( 46 KB | Загрузки )
_____001.JPG
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #4 - 14. Октября 2010 :: 06:02
Печать  
Попробуй сделать следующее, ОткрытьПлавающуюФорму, закрыть ее, а потом ВыбратьЗначение.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #5 - 14. Октября 2010 :: 06:52
Печать  
chessman писал(а) 14. Октября 2010 :: 06:02:
Попробуй сделать следующее, ОткрытьПлавающуюФорму, закрыть ее, а потом ВыбратьЗначение.

Ну да. Нарушается режим привязки к объекту, но режим контекстного меню (без привязки к выделенному объекту, например по правой кнопке мыши - см. параметры 4 и 5 функции ВыбратьЗначение) от этого ни капли не страдает. А ведь именно про контекстное меню разговор затеян...
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #6 - 14. Октября 2010 :: 06:56
Печать  
А у тебя Контекстное меню появляется после открытия и закрытия плавающей формы?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #7 - 14. Октября 2010 :: 07:03
Печать  
chessman писал(а) 14. Октября 2010 :: 06:56:
А у тебя Контекстное меню появляется после открытия и закрытия плавающей формы?

Не понял вопроса. Оно появляется тогда, когда я вызываю ВыбратьЗначение класса Сервис ... но если я прошу его привязать меню к выделенному объекту, то это не работает после закрытия плавающей формы - меню висит посреди экрана.
Если же я прошу привязать меню к курсору - висит где надо!

P.S.: Никогда ранее не использовал плавающую форму - потому косяк не наблюдал ранее ... да и не вижу пока причин для ее использования...
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #8 - 14. Октября 2010 :: 07:08
Печать  
Попробуй ВыбратьЗначение после того, как ты закрыл ПлавающуюФорму.
  

___________004.ert ( 69 KB | Загрузки )
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #9 - 14. Октября 2010 :: 07:11
Печать  
chessman писал(а) 14. Октября 2010 :: 07:08:
Попробуй ВыбратьЗначение после того, как ты закрыл ПлавающуюФорму.

Все прекрасно выбирается, как я и писал выше.
О! В твоем примере даже привязка не слетает, - по кнопке меню привязана к кнопке ... надо подумать, почему у меня слетает...

P.S.: Ага! понял! - там нет привязки - она от мыши пляшет!

P.P.S.: Может у тебя устаревшая версия Сервиса?
  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #10 - 14. Октября 2010 :: 07:17
Печать  
Наконец смог посмотреть этот класс - мне очень понравился!

Но, к сожалению, недостаток Сервис::ВыбратьЗначение() в форме списка справочника (см. здесь) - не устранена. Мало того - после выбора пункта контекстного меню - курсор "бегает" за мышкой до первого щелчка.
  
Наверх
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #11 - 14. Октября 2010 :: 07:21
Печать  
Dmitry The Wing писал(а) 14. Октября 2010 :: 07:11:
P.P.S.: Может у тебя устаревшая версия Сервиса?


Сможешь выложить Formex, я гляну?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #12 - 14. Октября 2010 :: 07:23
Печать  
simply писал(а) 14. Октября 2010 :: 07:17:
Но, к сожалению, недостаток Сервис::ВыбратьЗначение() в форме списка справочника (см. здесь) - не устранена. Мало того - после выбора пункта контекстного меню - курсор "бегает" за мышкой до первого щелчка.

Однако, это проблема не объекта Сервис, а логики ловли нажатия правой кнопкой - форме необходимо сообщить о том, что кнопка отпущена, отправив соответствующее сообщение. (раньше много работал с "низкоуровневым" программированием отрисовки форм и вообще GUI).
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #13 - 14. Октября 2010 :: 07:25
Печать  
chessman писал(а) 14. Октября 2010 :: 07:21:
Dmitry The Wing писал(а) 14. Октября 2010 :: 07:11:
P.P.S.: Может у тебя устаревшая версия Сервиса?


Сможешь выложить Formex, я гляну?

У меня последняя версия из кладовочки Альфа, которая недавно совершенно неожиданно ко всеобщей радости ожила!
  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #14 - 14. Октября 2010 :: 07:26
Печать  
Dmitry The Wing писал(а) 14. Октября 2010 :: 07:23:
Однако, это проблема не объекта Сервис, а логики ловли нажатия правой кнопкой - форме необходимо сообщить о том, что кнопка отпущена, отправив соответствующее сообщение. (раньше много работал с "низкоуровневым" программированием отрисовки форм и вообще GUI).

Не спорю. А как? Есть опыт такого решения?
Я не стал заморачиваться. Через Svcsvc.Service работает без иконок и шрифта, да и ладно. Главное, что надежно
  
Наверх
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #15 - 14. Октября 2010 :: 07:34
Печать  
simply писал(а) 14. Октября 2010 :: 07:26:
Не спорю. А как? Есть опыт такого решения?
Я не стал заморачиваться. Через Svcsvc.Service работает без иконок и шрифта, да и ладно. Главное, что надежно

Обычный виндовый Send/PostMessage - какое сообщение - надо смотреть. Соответствующей документации под рукой нет ... первое что приходит в голову - сообщение WM_NCRBUTTONUP ... хотя туда скорее придется передать координаты, но их можно получить через GetCursorPos ... в общем, надо сесть и попробовать ... к сожалению, времени на такие пробы сейчас нет  Смущённый

P.S.: Сейчас на этом форуме висит две проблемы, которые в работе обнаружены, но подробно описать и состяпать тестовую базу времени нет ... вот и приходится жить с нерешенными проблемами 1С++. Благо, другие попадались не только мне, а те уже смогли выделить время на описание и тестовую, что привело к устранению проблем.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #16 - 14. Октября 2010 :: 07:52
Печать  
Dmitry The Wing писал(а) 14. Октября 2010 :: 07:25:
У меня последняя версия из кладовочки Альфа, которая недавно совершенно неожиданно ко всеобщей радости ожила!


Вспомнил в чем дело.
После закрытия Плавающей формы, ВыбратьЗначение продолжает работать, но на самом деле Плавающая форма не закрылась(попробуй ее открыть снова, вряд ли получится). Ее приходится убивать руками - и вот после этого ВыбратьЗначение уже не пашет.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #17 - 14. Октября 2010 :: 08:15
Печать  
chessman писал(а) 14. Октября 2010 :: 07:52:
Вспомнил в чем дело.
После закрытия Плавающей формы, ВыбратьЗначение продолжает работать, но на самом деле Плавающая форма не закрылась(попробуй ее открыть снова, вряд ли получится). Ее приходится убивать руками - и вот после этого ВыбратьЗначение уже не пашет.

Открывал форму несколько раз и, будешь смеяться, я не стал длать для этого кнопку - просто добавил в меню, вызываемое через сервис ... т.е. оно прекрасно работает после многократного открытия плавающих окон, однако теряет способность привязываться к объектам...

Офф: велосипедостроение - штука опасная и затягивающая ... до того, как научился рисовать дерево в ТП - использовал самописную ВК ... сколько же времени я потратил на отладку этой штуки ... а в итоге оказалось, что дерево сделать из ТП можно намного быстрее, чем реализовывать его же виндовыми средствами в ВК.  Подмигивание
На данный момент из той ВК используется всего лишь один класс - BinaryStream, т.к. существующие аналоги не смогли полноценно реализовать требуемых функционал ... а так - там были и дерево и прогресс и многое другое...
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #18 - 14. Октября 2010 :: 08:29
Печать  
Dmitry The Wing писал(а) 14. Октября 2010 :: 08:15:
Открывал форму несколько раз и, будешь смеяться, я не стал длать для этого кнопку - просто добавил в меню, вызываемое через сервис ... т.е. оно прекрасно работает после многократного открытия плавающих окон, однако теряет способность привязываться к объектам...


Выложи пример. Может я что не так делаю.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
пример простого меню через сервис
Ответ #19 - 14. Октября 2010 :: 08:55
Печать  
chessman писал(а) 14. Октября 2010 :: 08:29:
Выложи пример. Может я что не так делаю.

Вот наиболее простой пример (не стал выкладывать обработку, но сам ее опробовал - работает):
Код
Выбрать все
Процедура Сформировать()
    Сервис = СоздатьОбъект("Сервис");
    Меню = СоздатьОбъект("СписокЗначений");
    Меню.ДобавитьЗначение("ОткрытьПлавающуюФорму", "ОткрытьПлавающуюФорму");
    Выбор = "";
    Если Сервис.ВыбратьЗначение(Меню, Выбор, 0, 0, 2) <> 1 Тогда
        Возврат;
    КонецЕсли;
    Если Выбор = "ОткрытьПлавающуюФорму" Тогда
        Сервис.ОткрытьПлавающуюФорму("Справочник.Сотрудники");
    КонецЕсли;
КонецПроцедуры
 


P.S.: Оно позволило открыть даже не одно окно справочника, чего я не ожидал Улыбка

P.P.S.: В работе для отображения меню использую некоторую структурку классов, т.к. меню бывают разные ... например, один из них реализует замену стандартного МенюДействий, что есть в типовой практически в каждом документе. Это позволяет, например, добавлять и контролировать доступ к пунктам меню без изменения конфигурации...
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #20 - 14. Октября 2010 :: 12:26
Печать  
Хм...провел рад экспериментов, по ходу ты прав, все работает.
Получается, что я велосипед изобрел.
Единственный плюс тогда, что я для себя разобрался, как это работает изнутри  Подмигивание....

Зы:у меня только в одной обработке перестает работать Сервис:ВыбратьЗначение. Буду разбираться.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #21 - 15. Октября 2010 :: 00:46
Печать  
chessman писал(а) 14. Октября 2010 :: 12:26:
Получается, что я велосипед изобрел.
Единственный плюс тогда, что я для себя разобрался, как это работает изнутри  Подмигивание....

Повторюсь:
Dmitry The Wing писал(а) 14. Октября 2010 :: 08:15:
велосипедостроение - штука опасная и затягивающая ...

Сам на этом не раз обжигался Улыбка
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #22 - 19. Октября 2010 :: 14:01
Печать  
Dmitry The Wing писал(а) 14. Октября 2010 :: 08:15:
Офф: велосипедостроение - штука опасная и затягивающая ... до того, как научился рисовать дерево в ТП - использовал самописную ВК ... сколько же времени я потратил на отладку этой штуки ... а в итоге оказалось, что дерево сделать из ТП можно намного быстрее, чем реализовывать его же виндовыми средствами в ВК.  Подмигивание


Если не затруднит, дайте пример Вашего дерева на ТП. Заранее спасибо.
  
Наверх
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #23 - 20. Октября 2010 :: 00:47
Печать  
pvase писал(а) 19. Октября 2010 :: 14:01:
Если не затруднит, дайте пример Вашего дерева на ТП. Заранее спасибо.

Можно посмотреть или даже напрямую использовать Класс "ПоставщикДанных", однако мне он показался чересчур громоздким, потому реализовал свой попроще. Пример сделать будет непросто потому как он использует в работе некоторые другие мои специфичные классы, а времени на "выгрызание" только нужного сейчас нет - запарки ...
  
Наверх
 
IP записан
 
Igor YN
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 13. Мая 2011
Re: Миникласс "Меню" (контекстное)
Ответ #24 - 21. Июля 2011 :: 05:40
Печать  
Simly в октябре обращал внимание, что
"... Сервис::ВыбратьЗначение()...в форме списка справочника... после выбора пункта контекстного меню - курсор "бегает" за мышкой до первого щелчка."
Что-то подобное происходит и при вызове Сервис::ВыбратьЗначение() в ТП.
Нет чёткого решения, как "отпустить" кнопку мыши? ...мелочь, а неприятно)).
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #25 - 21. Июля 2011 :: 07:48
Печать  
Igor YN писал(а) 21. Июля 2011 :: 05:40:
Simly в октябре обращал внимание, что
"... Сервис::ВыбратьЗначение()...в форме списка справочника... после выбора пункта контекстного меню - курсор "бегает" за мышкой до первого щелчка."
Что-то подобное происходит и при вызове Сервис::ВыбратьЗначение() в ТП.
Нет чёткого решения, как "отпустить" кнопку мыши? ...мелочь, а неприятно)).


Про Сервис::ВыбратьЗначение() в ТП ничего сказать не могу.
Использую самописное меню  Круглые глаза и подобных проблем в ТП не замечал.
А Simly вроде там заморачивался с SendKeys, может из-за этого курсор "бегал"?

  
Наверх
 
IP записан
 
Igor YN
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 13. Мая 2011
Re: Миникласс "Меню" (контекстное)
Ответ #26 - 21. Июля 2011 :: 09:47
Печать  
Значит я его не так понял.
Спасибо, буду пробовать твой класс!
  
Наверх
 
IP записан
 
Igor YN
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 13. Мая 2011
Re: Миникласс "Меню" (контекстное)
Ответ #27 - 21. Июля 2011 :: 10:53
Печать  
Юзаю класс "Меню". А задавать цвета (как в Формексе, например) нельзя?
  
Наверх
 
IP записан
 
Igor YN
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 13. Мая 2011
Re: Миникласс "Меню" (контекстное)
Ответ #28 - 21. Июля 2011 :: 11:41
Печать  
я кое-что сам нарыл. вот кусочек кода
(Ц1 и Ц2 я подставил)
...
           |hDC = Wrap.GetDC(mWnd)
           //|Wrap.ReleaseDC "+ СокрЛП(hWnd) + ", hDC
           |
           |GREY            = "+Ц1+"
           |BLUE       = "+Ц2+"
           |hBrushGrey = Wrap.CreateSolidBrush(GREY)
           |hBrushBlue = Wrap.CreateSolidBrush(BLUE)
           |hPen            = Wrap.CreatePen(0, 0, "+Ц3+")
           |
...
и не пойму пака, что такое "hPen" и можно ли цвет текста задать?
  
Наверх
 
IP записан
 
Igor YN
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 13. Мая 2011
Re: Миникласс "Меню" (контекстное)
Ответ #29 - 21. Июля 2011 :: 11:59
Печать  
Вобщем Меню работаем, НО
Simply правильно говорил - мышь так же, как в Сервис::ВыбратьЗначение остается как бы не отжатой!!! при движении к тому месту, откуда в ТП было вызвано меню, оно показывается без нажатия кнопки! Как ЭТО побороть!?
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #30 - 21. Июля 2011 :: 12:09
Печать  
пример можешь выложить?
  
Наверх
 
IP записан
 
Igor YN
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 13. Мая 2011
Re: Миникласс "Меню" (контекстное)
Ответ #31 - 22. Июля 2011 :: 04:53
Печать  
Хотел сделать форму, похожую на 8-ку. При выборе пункта "по автору" выпадает Меню.  (В примере "Сервис::ВыбратьЗначение", но я пробовал и класс "Меню"). После выбора в меню оно закрывается и потом вновь активируется при попадании мыши на пункт "по автору" просто ПРИ ДВИЖЕНИИ! И между прочим в ТП перестает обводиться текст в колонке (при движении мыши).
  

___________________006.ert ( 171 KB | Загрузки )
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #32 - 22. Июля 2011 :: 05:22
Печать  
Не совсем понял, как это должно работать...для чего нужен таймер?
Не знаю, как ты планируешь использовать Меню, я использую его в событии ТП::ПриКонтекстномМеню()
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #33 - 22. Июля 2011 :: 05:29
Печать  
chessman писал(а) 22. Июля 2011 :: 05:22:
Не совсем понял, как это должно работать...для чего нужен таймер?
Не знаю, как ты планируешь использовать Меню, я использую его в событии ТП::ПриКонтекстномМеню()

Добавлю еще, что проверить код не представляется возможным, т.к. нет картинки "Картинка.Загрузить(КаталогИБ() + "РисЖурнЗаданий.bmp");"
нет и такой картинки "МенюКартинка.Загрузить("ДляМеню8_1");"
Так что до момента "потыкать и посмотреть дело не доходит. Можешь выкинуть лишнее, оставив только код, приводящий к некорректной работе меню, чтобы на пустой базе эту обработку можно было открыть, потестить, тогда можно будет чем-то реально помочь.
  
Наверх
ICQ  
IP записан
 
Igor YN
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 13. Мая 2011
Re: Миникласс "Меню" (контекстное)
Ответ #34 - 22. Июля 2011 :: 05:46
Печать  
Ладно, выкину лишнее.
А вооще был же на форуме в этой теме вопрос:
"Но, к сожалению, недостаток Сервис::ВыбратьЗначение() в форме списка справочника (см. здесь) - не устранена. Мало того - после выбора пункта контекстного меню - курсор "бегает" за мышкой до первого щелчка. ".
Было предположение:
"Однако, это проблема не объекта Сервис, а логики ловли нажатия правой кнопкой - форме необходимо сообщить о том, что кнопка отпущена, отправив соответствующее сообщение. "
Далее был совет:
"Обычный виндовый Send/PostMessage - какое сообщение - надо смотреть. Соответствующей документации под рукой нет ... первое что приходит в голову - сообщение WM_NCRBUTTONUP ... хотя туда скорее придется передать координаты, но их можно получить через GetCursorPos ... в общем, надо сесть и попробовать ... к сожалению, времени на такие пробы сейчас нет".
Может всего то и надо программно сообщить, что кнопка отпущена? Как сообщить ??? Плачущий
  
Наверх
 
IP записан
 
Igor YN
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 13. Мая 2011
Re: Миникласс "Меню" (контекстное)
Ответ #35 - 22. Июля 2011 :: 05:58
Печать  
Убрал картинки, должно работать автономно.
(выбираешь "по Автору", в появившемся меню выбираешь любой пункт, ползешь мышкой на пункт "по Автору" - и опять зачем-то выпадает меню)
  

___________________007.ert ( 171 KB | Загрузки )
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #36 - 22. Июля 2011 :: 06:32
Печать  
Зачем ты меню вызываешь в ПриАктивизацииЯчейки()?
  
Наверх
 
IP записан
 
Igor YN
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 13. Мая 2011
Re: Миникласс "Меню" (контекстное)
Ответ #37 - 22. Июля 2011 :: 06:57
Печать  
А это чему-то противоречит? или у меню есть ограничение - здесь можно вызывать, здесь нельзя?! МЕНЮ по жизни есть меню, где программисту по смыслу задачи нужно его вызывать, там и должно работать!!
я так думал...
блин, ТП это текущий пример, в форме списка тоже самое!!!
а что, трудно программно "отжать" кнопку мыши?
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #38 - 22. Июля 2011 :: 07:26
Печать  
Объясни тогда логику, как ты хочешь, чтоб это работало - для меня контекстное меню вызывается по правой кнопке мыши.
  
Наверх
 
IP записан
 
Igor YN
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 13. Мая 2011
Re: Миникласс "Меню" (контекстное)
Ответ #39 - 22. Июля 2011 :: 07:45
Печать  
Отбрось слово "контекстное".
Обычное это меню. Выпадающее!
Как в главном окне 1с - есть главное меню "Файл.. Действия.. Операции.....Сервис.. Помощь" (в этой роли у меня ТП из одной строки). При нажатии выпадает другое меню (в этой роли у меня Сервис::ВыбратьЗначение или твой класс "Меню"). Вот мне так хочется. Красиво можно сделать, с иконками, цветами и т.д.)
И не "контекстное" оно совсем))).
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #40 - 22. Июля 2011 :: 10:10
Печать  
Идею понял. Но "проблема выбора" относится не к Сервис::ВыбратьЗначение. Если бы у ТП было событие - левый клик мышкой, я думаю тебе бы это помогло.

Как вариант попробуй MSComctlLib.Toolbar
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #41 - 22. Июля 2011 :: 11:09
Печать  
Я кое-что вспомнил, может срастется....
  
Наверх
 
IP записан
 
Igor YN
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 13. Мая 2011
Re: Миникласс "Меню" (контекстное)
Ответ #42 - 22. Июля 2011 :: 11:22
Печать  
Не хочу MSComctlLib.Toolbar,  хочу ТП Улыбка
Поизвращаюсь ещё...
(если осенит чем-нибудь гениальным - выкладывай  Улыбка )
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #43 - 22. Июля 2011 :: 12:30
Печать  
Попробуй.
  

mouse_TP.ert ( 166 KB | Загрузки )
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Миникласс "Меню" (контекстное)
Ответ #44 - 22. Июля 2011 :: 13:03
Печать  
Улыбка
ну везде врапперикс..

Это, может проще в ложном закрытии формы сделать выбор из меню ?
Или отдать в другое событие по таймеру и там остановить его выполнение ?
Лень проверять.
Идея простая - "выкинуть" событие "наружу" из ПриАктивизацииЯчейки
  
Наверх
 
IP записан
 
Igor YN
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 13. Мая 2011
Re: Миникласс "Меню" (контекстное)
Ответ #45 - 22. Июля 2011 :: 13:19
Печать  
Про выкинуть - я тоже думал. Это заложено в слове "поизвращаюсь", только некогда было Улыбка
А новое "Меню" в выходные посмотрю.
Спасибо, други!)))
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #46 - 22. Июля 2011 :: 13:53
Печать  
Eprst писал(а) 22. Июля 2011 :: 13:03:
Улыбка
ну везде врапперикс..

Подмигивание

Кстати, разбираясь с этим примером я обнаружил, что оказывается можно программно ткунь мышкой где угодно, не двигая саму мышь, раньше-то я считал, что нужно сначала спозиционировать ее  Ужас

  
Наверх
 
IP записан
 
Igor YN
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 13. Мая 2011
Re: Миникласс "Меню" (контекстное)
Ответ #47 - 22. Июля 2011 :: 15:20
Печать  
Я подсмотрел твой ответ, адресованный Eprst,  - а программно "ототкнуть" мышь тоже можно? Никак ни от кого не добьюсь, КАК?))). Мозоль набил уже Улыбка
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Миникласс "Меню" (контекстное)
Ответ #48 - 22. Июля 2011 :: 15:21
Печать  
Igor YN писал(а) 22. Июля 2011 :: 15:20:
Я подсмотрел твой ответ, адресованный Eprst,  - а программно "ототкнуть" мышь тоже можно? Никак ни от кого не добьюсь, КАК?))). Мозоль набил уже Улыбка


Так я же пример выложил, там все есть.
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #49 - 22. Июля 2011 :: 15:21
Печать  
Eprst писал(а) 22. Июля 2011 :: 13:03:
Улыбка
ну везде врапперикс..

Это, может проще в ложном закрытии формы сделать выбор из меню ?
Или отдать в другое событие по таймеру и там остановить его выполнение ?
Лень проверять.
Идея простая - "выкинуть" событие "наружу" из ПриАктивизацииЯчейки

Пробовал - не помогло (использовал Сервис.ВнешнееСобытие). Скорее всего Сервис не "отпускает" что-то, а ТП - это что-то "ловит"
  
Наверх
ICQ  
IP записан
 
Igor YN
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 13. Мая 2011
Re: Миникласс "Меню" (контекстное)
Ответ #50 - 22. Июля 2011 :: 16:25
Печать  
Я проще сделал - в "ПриАктивизацииЯчейки()" запустил Таймер на 0.2 сек, а в обработчике таймера вызвал Сервис::ВыбратьЗначение. И всё рулит!
  
Наверх
 
IP записан
 
ziflex
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 76
Местоположение: Владивосток
Зарегистрирован: 05. Мая 2011
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #51 - 03. Ноября 2011 :: 03:23
Печать  
Прочитал полностью топик.. так и не понял как сделать, чтобы контекстное меню (Сервис.ВыбратьЗначение()) выпадало там где курсор находится?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #52 - 03. Ноября 2011 :: 04:20
Печать  
ziflex писал(а) 03. Ноября 2011 :: 03:23:
Прочитал полностью топик.. так и не понял как сделать, чтобы контекстное меню (Сервис.ВыбратьЗначение()) выпадало там где курсор находится?
Видимо, невнимательно прочитал...
Dmitry The Wing писал(а) 14. Октября 2010 :: 06:52:
см. параметры 4 и 5 функции ВыбратьЗначение
  
Наверх
 
IP записан
 
ziflex
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 76
Местоположение: Владивосток
Зарегистрирован: 05. Мая 2011
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #53 - 03. Ноября 2011 :: 05:02
Печать  
Dmitry The Wing писал(а) 03. Ноября 2011 :: 04:20:
ziflex писал(а) 03. Ноября 2011 :: 03:23:
Прочитал полностью топик.. так и не понял как сделать, чтобы контекстное меню (Сервис.ВыбратьЗначение()) выпадало там где курсор находится?
Видимо, невнимательно прочитал...
Dmitry The Wing писал(а) 14. Октября 2010 :: 06:52:
см. параметры 4 и 5 функции ВыбратьЗначение

Смущённый
упс. точно, спасибоУлыбка
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #54 - 04. Ноября 2011 :: 11:04
Печать  
Есть еще одно замечание по меню (это еще из Сервис.ВыбратьЗначение танется), как то можно сделать чтобы по меню перескакивать на пункты по первым символам? (как в стандартном меню 1С, нажал кнопку "К" и сразу перешел на пункт, начинающийся с "К").

А также, есть такое предложение чтобы привязка меню работала к положению курсора в Табличном поле, а не к положению мыши, потому как контекстное меню иногда вызывается и соответственной кнопкой на клавиатуре, и тогда меню появляется под курсором мыши а не по положению курсора в табличном поле.
  
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 851
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Миникласс "Меню" (контекстное)
Ответ #55 - 24. Октября 2014 :: 12:53
Печать  
Chessman, а в твоем классе-меню можно сделать так, чтобы возвращалось любое значение из выбираемого списка? Сейчас у тебя это только строка. Это одно пожелание.

И второе - можно ли неактивный пункт (тот, что у тебя отмечается с помощью *) - сделать невыбираемым? Он сейчас просто серым текст рисует. Но если сравнишь меню в Formex - там этот пункт цветом выделен и его выбрать нельзя.

  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Den Commander
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 9
Зарегистрирован: 23. Ноября 2016
Re: Миникласс "Меню" (контекстное)
Ответ #56 - 17. Декабря 2018 :: 14:56
Печать  
Уважаемый chessman, не работает почему-то скачанный пример.
Выплевывает ошибку "Возвращенное callback-функцией значение неприводимо к заданному типу"
Ошибка происходит в конструкторе:
Меню = СоздатьОбъект("Меню");
в момент выполнения vbscript. Винда 7ка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать