Created attachment 859 [details] Тест открытия форм в обычном или модальном режиме в 1С wine@etersoft 1.0.8, 1.0.9; gnome, xfce4, без управления менеджером окон; 1c 7.7 Разбираясь с http://bugs.etersoft.ru/show_bug.cgi?id=2729 сделал тестовую обработку к 1С, которая запускает сама себя в обычном или монопольном режиме и выводит в каком режиме форма была запущена, что позволило определить различие в текущей реализации модальных окон. В WinXP после открытия модальной формы любые формы начинают открываются модально, вне зависимости от режима в котором их вызвали, что позволяет сохранять логику в последовательном открытии форм (ООМОМОО->ООМММММ /О-обычная,М-модальная/). В Wine это правило распространяется только на одну форму открытую после модальной, все последующие (даже модальные формы и служебные) открываются в обычном режиме, что позволяет нарушать логику в заполнении форм, в некоторых случаях игнорировать ошибки, вопросы и предупреждения 1С, выводить несколько предупреждений и вопросов и т.п. (ООМОМОО->ООММООО).
Похоже что, после открытия второй модальной формы, все последующие создаются дочерними по отношению к первой. В результате, блокируется только переход на первую форму, а переключение между всеми остальными проходит. Проблема в том, что родителя для модальной формы задает сама 1С и не совсем понятно как она это делает. Во всяком случае, wine только делает то что говорит ему 1C. Хотя возможно что 1С ориентируется на какие-нибудь параметры модальных окон, которые wine задает не так как windows.
Странно, что 1с вызывает CreateDialogIndirectParamA для создания модальных окон. В MSDN говориться: The CreateDialogIndirectParam function creates a modeless dialog box from a dialog box template in memory. Т.е. эта функция, как раз, создает немодальное окно. Хотя, в Windows это окно не передает фокус, пока не будет уничтожено. Возможно, фокусом управляет сам 1с.
В результате тестирования не в 1с, а на WinAPI выяснилось, что wine ведет себя так же как windows в следующих случаях: Если модальное окно является owner'ом нескольких не модальных окон - переключение между ними возможно. Если модальное окно является owner'ом нескольких модальных окон - переключение между ними возможно. Если модальное окно является owner'ом не модального окона - переключение на окно-owner возможно. Если модальное окно является owner'ом модального окона - переключение на окно-owner не возможно.
В общем, возникает два вопроса: 1. Почему 1С создает не модальные окна, называя их модальными (ф-ция CreateDialogIndirectParamA)? 2. Почему 1С задает одного и того же родителя всем "модальным окнам"?
(In reply to comment #4) > В общем, возникает два вопроса: > > 1. Почему 1С создает не модальные окна, > называя их модальными (ф-ция > CreateDialogIndirectParamA)? Есть мысль, что это оптимизация - загрузить в память шаблоны (они слишком часто используются), создавать окно по шаблону из памяти и потом колдовать над стилями, чтобы оно было похоже на модальное. Для 1с 7.7 такое поведение может считаться нормальным. > 2. Почему 1С задает одного и того же > родителя всем "модальным окнам"? > 1. Возможно так делает MFC в MDI режиме, надо проверить. 2. Чтобы фокус гарантированно возвращался главному окну 1с (предположение).
Решение проблемы пока откладываем. Если есть или появятся критические проблемы связанные с поведением модальных окон в стандартных конфигурациях, просьба написать здесь и переоткрыть багу. Желательно привести примеры.
Для тех, кто не пользуется багзиллой или не умеет пользоваться групповым редактированием при поиске, закрываем задачи, которые они должны были принять.