Здравствуйте!
Уже второй раз наталкиваюсь на проблему. Пишу обработчик события на открытие пользовательского МЕНЮ (пример здесь). В данном случае заменяется футер меню. Ещё у меня был аналогичный скрипт, скрывающий пункты МЕНЮ в зависимости от наличия файлов. Самое естественное было бы повесить соответствующий функционал на DN_INITDIALOG. Но, как оказалось, это сообщение не приходит в ивент; первое, которое приходит - DN_INPUT. Из-за этого наблюдается маленькое, но заметное (в четверть секунды примерно) замедление: сначала показывается "стандартное" (без обработки события) меню, затем - отрабатывает ивент и окно меня изменяется.
Точнее, так: при вызове UserMenu такое событие ловится, но при этом Area=Shell (!!!) А у диалога UserMenu не задан GUID, поэтому просто повесить обработку события INITDIALOG и ограничить именно этим диалогом, не получается!
Помогите, пожалуйста! Надо либо выставлять Area=UserMenu раньше, чем вызывается обработчик DN_INITDIALOG, либо присвоить GUID диалогу с пользовательским МЕНЮ.
Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu
- buniak_a_h
- Posts: 4270
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
- John Doe
- Бюрократ
- Posts: 13867
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu
Столько слов, а вопрос простой совсем - назначить гуид.buniak_a_h wrote: ↑Fri 04 Jun, 2021 16:52 Точнее, так: при вызове UserMenu такое событие ловится, но при этом Area=Shell (!!!) А у диалога UserMenu не задан GUID, поэтому просто повесить обработку события INITDIALOG и ограничить именно этим диалогом, не получается!
https://t.me/FarManager — Telegram чат
- buniak_a_h
- Posts: 4270
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu
Эта мысль пришла не сразу. Пришлось дописывать тестовый скрипт, чтобы понять, куда уходит циркDN_INITDIALOG и почему я его не ловлю. И только когда я выяснил, что, оказывается, Area в этот момент не та, на которую я рассчитывал, пришла мысль, что UserMenu можно было бы отличить и по GUID-у. Ну а что проще - гуид назначить, или кусок кода перетащить - я же не знаю!
- buniak_a_h
- Posts: 4270
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu
Если сделаете GUID, это будет полезно и здесь
- John Doe
- Бюрократ
- Posts: 13867
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu
Area и апи диалогов вообще слабо пересекаются, поэтому это ещё надо умудриться написать код который не поймает init dialog.
https://t.me/FarManager — Telegram чат
- John Doe
- Бюрократ
- Posts: 13867
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu
Гуид это конечно просто. Но не достаточно. Меню например может быть глобальным, локальным, и др.
Хотелось бы иметь простой доступ к дополнительной информации (например путь к файлу меню).
В связи с этим вопрос: а не было бы уместно для подобных целей использовать DM_GETDLGDATA?
Понятно, что таким образом можно получить только указатель, чтобы использовать который придётся ещё описать ffi структуры, и пр.
Альтернативно, можно было бы использовать некую стандартную структуру. Или способ описать свою структуру данных.
Хотелось бы иметь простой доступ к дополнительной информации (например путь к файлу меню).
В связи с этим вопрос: а не было бы уместно для подобных целей использовать DM_GETDLGDATA?
Понятно, что таким образом можно получить только указатель, чтобы использовать который придётся ещё описать ffi структуры, и пр.
Альтернативно, можно было бы использовать некую стандартную структуру. Или способ описать свою структуру данных.
https://t.me/FarManager — Telegram чат
- buniak_a_h
- Posts: 4270
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu
Я пробовал (для предотвращения повторного вызова ивента при DN_INPUT я пытался послать после обработки через DM_SETDLGDATA единицу, а потом в condition проверять). Увы, единица не записывалась. Когда-то я уже поднимал этот вопрос. Ответ был какой-то специализированный (заточенный на полный доступ к диалогу. Т.е. на случай, когда диалог создаётся в этом же скрипте). Поэтому в упомянутых скриптах (задание футера, сокрытие пунктов МЕНЮ) я присваивал единицу в 12-ю позицию элемента диалога (UserData структуры FarDialogItem). Причем, присваивать пришлось пер-анально (через DM_GETDLGITEM - DM_SETDLGITEM), т.к. заявленный DM_SETITEMDATA - DM_GETITEMDATA я тоже не смог победить.
Остальное, что Вы там написали - это, видимо, не мне.
Пока хотелось бы главное - различать Area.MainMenu, Area.Menu, Area.UserMenu и Area.Dialog. Причём ещё на этапе инициализации диалога. Для этого вполне хватило бы GUID-а. Ну да, отличать 3 вида UserMenu (локальное, глобальное и пользовательское) было бы полезно. Имя файла при этом можно просто вычислить (если только меню не вызвано из mf.UserMenu).
Last edited by buniak_a_h on Fri 04 Jun, 2021 22:50, edited 1 time in total.
- John Doe
- Бюрократ
- Posts: 13867
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu
Могут же быть и другие кейсы, когда надо знать откуда диалог вызван.
https://t.me/FarManager — Telegram чат