Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu

Post by buniak_a_h »

Здравствуйте!
Уже второй раз наталкиваюсь на проблему. Пишу обработчик события на открытие пользовательского МЕНЮ (пример здесь). В данном случае заменяется футер меню. Ещё у меня был аналогичный скрипт, скрывающий пункты МЕНЮ в зависимости от наличия файлов. Самое естественное было бы повесить соответствующий функционал на DN_INITDIALOG. Но, как оказалось, это сообщение не приходит в ивент; первое, которое приходит - DN_INPUT. Из-за этого наблюдается маленькое, но заметное (в четверть секунды примерно) замедление: сначала показывается "стандартное" (без обработки события) меню, затем - отрабатывает ивент и окно меня изменяется.
Точнее, так: при вызове UserMenu такое событие ловится, но при этом Area=Shell (!!!) А у диалога UserMenu не задан GUID, поэтому просто повесить обработку события INITDIALOG и ограничить именно этим диалогом, не получается!
Помогите, пожалуйста! Надо либо выставлять Area=UserMenu раньше, чем вызывается обработчик DN_INITDIALOG, либо присвоить GUID диалогу с пользовательским МЕНЮ.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu

Post by John Doe »

buniak_a_h wrote: Fri 04 Jun, 2021 16:52 Точнее, так: при вызове UserMenu такое событие ловится, но при этом Area=Shell (!!!) А у диалога UserMenu не задан GUID, поэтому просто повесить обработку события INITDIALOG и ограничить именно этим диалогом, не получается!
Столько слов, а вопрос простой совсем - назначить гуид.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu

Post by buniak_a_h »

John Doe wrote: Fri 04 Jun, 2021 19:34 Столько слов, а вопрос простой совсем - назначить гуид.
Эта мысль пришла не сразу. Пришлось дописывать тестовый скрипт, чтобы понять, куда уходит циркDN_INITDIALOG и почему я его не ловлю. И только когда я выяснил, что, оказывается, Area в этот момент не та, на которую я рассчитывал, пришла мысль, что UserMenu можно было бы отличить и по GUID-у. Ну а что проще - гуид назначить, или кусок кода перетащить - я же не знаю!
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu

Post by buniak_a_h »

Если сделаете GUID, это будет полезно и здесь
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu

Post by John Doe »

buniak_a_h wrote: Fri 04 Jun, 2021 16:52 куда уходит циркDN_INITDIALOG и почему я его не ловлю
Area и апи диалогов вообще слабо пересекаются, поэтому это ещё надо умудриться написать код который не поймает init dialog.
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu

Post by John Doe »

Гуид это конечно просто. Но не достаточно. Меню например может быть глобальным, локальным, и др.
Хотелось бы иметь простой доступ к дополнительной информации (например путь к файлу меню).

В связи с этим вопрос: а не было бы уместно для подобных целей использовать DM_GETDLGDATA?

Понятно, что таким образом можно получить только указатель, чтобы использовать который придётся ещё описать ffi структуры, и пр.

Альтернативно, можно было бы использовать некую стандартную структуру. Или способ описать свою структуру данных.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu

Post by buniak_a_h »

John Doe wrote: Fri 04 Jun, 2021 22:07 не было бы уместно для подобных целей использовать DM_GETDLGDATA
Я пробовал (для предотвращения повторного вызова ивента при 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.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu

Post by John Doe »

buniak_a_h wrote: Fri 04 Jun, 2021 22:49 Причём ещё на этапе инициализации диалога.
Могут же быть и другие кейсы, когда надо знать откуда диалог вызван.
https://t.me/FarManager — Telegram чат
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

Событие DN_INITDIALOG не ловится обработчиком событий класса DialogEvent для Area=UserMenu

Post by IgorZ »

buniak_a_h wrote: Fri 04 Jun, 2021 22:49
Post Reply

Return to “Нужна помощь”