|
v7: Пятничный вопрос про модальность окон | ☑ | ||
---|---|---|---|---|
0
MadDAD
30.03.18
✎
10:51
|
Суть задачи:
Надо открыть форму обработки так, чтобы она не была развернута на все окно MDI (т.е. так как это делает ОткрытьФормуМодально()) и при этом она не был бы модальной, т.к. из неё вызывается еще одна обработка - КомментарийВыполняемыхДействий, и в режиме модально окна она нне отображает таблицу формы. В целом проблему решает Сервис.ОткрытьПлавающуюФорму(), но при этом после закрытия плавающей формы ломается выбор из выпадающего списка - выбор происходит не по координатам мыши а в месте где в плавающей форме была нажата последняя кнопка. Решил проблему отключения модальности у открытого модального окна при помощи DynWrapX + WinApi. EnableWindow( GetParent(HWND)). Т.е. форма перестает быть модальной, но дочерние окна все равно открываются в модальном режиме. Нужна помощь коллективного разума. |
|||
1
VoditelKobyly
30.03.18
✎
11:18
|
Начнем с начала.
Почему нельзя открыть форму командой ОткрытьФорму()? Почему нужно открывать именно модально? |
|||
2
Злопчинский
30.03.18
✎
11:26
|
ОткрытьФормуМодально не разворачивает форму на весь экран.
|
|||
3
Злопчинский
30.03.18
✎
11:28
|
"и в режиме модально окна она нне отображает таблицу формы."
ну сделай таблицу на другом слое главной модальной формы и переключайся на нее когда надо. если комментарий должен заполнятьяс во время какой-то длительной программной работы - или ТЗ на этой же форме или модально вызови вторую форму и пусть показывает комменты пок аидет расчет |
|||
4
MadDAD
30.03.18
✎
12:00
|
(3) О, кстати. Возможно вариант - вызвать форму с таблицей её до вызова модальной формы.
|
|||
5
MadDAD
30.03.18
✎
12:01
|
Если надо - вот код для снятия модальности.
Вызывать в ПослеОткрытия() Процедура ОтключитьМодальность(ФормаКонтекст = "") Если ПустоеЗначение(ФормаКонтекст) = 1 Тогда Сервис = СоздатьОбъект("Сервис"); ТекущийКонтекст = ""; Сервис.АктивныйКонтекст(ТекущийКонтекст); Если ТипЗначенияСтр(ТекущийКонтекст) = "ГрупповойКонтекст" Тогда ФормаКонтекст = ТекущийКонтекст.Форма; КонецЕсли; КонецЕсли; Если ПустоеЗначение(ФормаКонтекст) = 0 Тогда РасширениеФормы = СоздатьОбъект("РасширениеФормы"); РасширениеФормы.УстановитьФорму(ФормаКонтекст); Хэндл = РасширениеФормы.Дескриптор; DWX = СоздатьОбъект("DynamicWrapperX"); DWX.Register("User32", "EnableWindow", "i=hl", "r=l"); DWX.Register("User32", "GetForegroundWindow","r=h"); DWX.Register("User32", "SetForegroundWindow", "i=h", "r=l"); DWX.Register("User32", "GetParent", "i=h", "r=h"); Окно1C = DWX.GetParent(Хэндл); Если ПустоеЗначение(Окно1C) = 0 Тогда DWX.EnableWindow(Окно1C, 1); DWX.SetForegroundWindow(Окно1C); КонецЕсли; КонецЕсли; |
|||
6
MadDAD
30.03.18
✎
12:07
|
(4) Так тоже не работает.
|
|||
7
Злопчинский
30.03.18
✎
12:10
|
так нихрена и не понятно.
тебе что НАДО? выводить куда-то комментирующие действия? чьи действия комментируются? - короткие интерактивные действия пользователя и "реакция" системы на них? или комментируются какие-то программные действия обработки? насколько важны эти комментирующие сообщения? они для чего? посмотреть на них? |
|||
8
MadDAD
30.03.18
✎
12:19
|
(7) Есть типовая обработка "КомментарийВыполняемыхДействий" в параметры передается список комментариев, при открытии вываливает эти комментарии в свою таблицу - таблица типа как в режиме ввода данных.
Если её открыть в модальном режиме - то таблица не отображается. Эта обработка у нас используется как стандартный способ вывода информации о некорректных данных для пользователя. Задача в том чтобы из модальной обработки показать эти комментарии. |
|||
9
ikea
30.03.18
✎
12:30
|
(8) В пункте (3) все написано, что делать. Обработку "КомментарийВыполняемыхДействий" не получиться заставить работать в штатном режиме при вызове из модального окна.
|
|||
10
MadDAD
30.03.18
✎
12:39
|
Победил.
Заглянул в исходники Formex. Вот допиленная процедура из (5) Все работает. //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Процедура ОтключитьМодальность(ФормаКонтекст = "") Если ПустоеЗначение(ФормаКонтекст) = 1 Тогда Сервис = СоздатьОбъект("Сервис"); ТекущийКонтекст = ""; Сервис.АктивныйКонтекст(ТекущийКонтекст); Если ТипЗначенияСтр(ТекущийКонтекст) = "ГрупповойКонтекст" Тогда ФормаКонтекст = ТекущийКонтекст.Форма; КонецЕсли; КонецЕсли; Если ПустоеЗначение(ФормаКонтекст) = 0 Тогда РасширениеФормы = СоздатьОбъект("РасширениеФормы"); РасширениеФормы.УстановитьФорму(ФормаКонтекст); Хэндл = РасширениеФормы.Дескриптор; DWX = СоздатьОбъект("DynamicWrapperX"); DWX.Register("User32", "EnableWindow", "i=hl", "r=l"); DWX.Register("User32", "GetForegroundWindow","r=h"); DWX.Register("User32", "SetForegroundWindow", "i=h", "r=l"); DWX.Register("User32", "GetParent", "i=h", "r=h"); DWX.Register("Seven.dll:?SetModalMode@@YAHH@Z", "SetModalMode", "i=l", "r=l"); Окно1C = DWX.GetParent(Хэндл); Если ПустоеЗначение(Окно1C) = 0 Тогда DWX.EnableWindow(Окно1C, 1); DWX.SetForegroundWindow(Окно1C); КонецЕсли; DWX.SetModalMode(0); КонецЕсли; КонецПроцедуры |
|||
11
MadDAD
30.03.18
✎
12:41
|
(10) Если не нужно отключать модальность, а просто вызывать дочерние окна в немодальном режиме, достатчоно оставить вызов SetModalMode(0)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |