Имя: Пароль:
1C
1C 7.7
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)