Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Пятничный вопрос про модальность окон

v7: Пятничный вопрос про модальность окон
Я
   MadDAD
 
30.03.18 - 10:51
Суть задачи:

Надо открыть форму обработки так, чтобы она не была развернута на все окно MDI (т.е. так как это делает ОткрытьФормуМодально()) и при этом она не был бы модальной, т.к. из неё вызывается еще одна обработка - КомментарийВыполняемыхДействий, и в режиме модально окна она нне отображает таблицу формы.

В целом проблему решает Сервис.ОткрытьПлавающуюФорму(), но при этом после закрытия плавающей формы ломается выбор из выпадающего списка - выбор происходит не по координатам мыши а в месте где в плавающей форме была нажата последняя кнопка.

Решил проблему отключения модальности у открытого модального окна при помощи DynWrapX + WinApi. EnableWindow( GetParent(HWND)). Т.е. форма перестает быть модальной, но дочерние окна все равно открываются в модальном режиме.

Нужна помощь коллективного разума.
 
 
   VoditelKobyly
 
1 - 30.03.18 - 11:18
Начнем с начала.
Почему нельзя открыть форму  командой ОткрытьФорму()?
Почему нужно открывать именно модально?
   Злопчинский
 
2 - 30.03.18 - 11:26
ОткрытьФормуМодально не разворачивает форму на весь экран.
   Злопчинский
 
3 - 30.03.18 - 11:28
"и в режиме модально окна она нне отображает таблицу формы."
ну сделай таблицу на другом слое главной модальной формы и переключайся на нее когда надо.

если комментарий должен заполнятьяс во время какой-то длительной программной работы - или ТЗ на этой же форме или модально вызови вторую форму и пусть показывает комменты пок аидет расчет
   MadDAD
 
4 - 30.03.18 - 12:00
(3) О, кстати. Возможно вариант - вызвать форму с таблицей её до вызова модальной формы.
   MadDAD
 
5 - 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);
        КонецЕсли;
    КонецЕсли;
   MadDAD
 
6 - 30.03.18 - 12:07
(4) Так тоже не работает.
   Злопчинский
 
7 - 30.03.18 - 12:10
так нихрена и не понятно.
тебе что НАДО?
выводить куда-то комментирующие действия?
чьи действия комментируются? - короткие интерактивные действия пользователя и "реакция" системы на них? или комментируются какие-то программные действия обработки?
насколько важны эти комментирующие сообщения? они для чего? посмотреть на них?
   MadDAD
 
8 - 30.03.18 - 12:19
(7) Есть типовая обработка "КомментарийВыполняемыхДействий"  в параметры передается список комментариев, при открытии вываливает эти комментарии в свою таблицу - таблица типа как в режиме ввода данных.

Если её открыть в модальном режиме - то таблица не отображается.

Эта обработка у нас используется как стандартный способ вывода информации о некорректных данных для пользователя.

Задача в том чтобы из модальной обработки показать эти комментарии.
   ikea
 
9 - 30.03.18 - 12:30
(8) В пункте (3) все написано, что делать. Обработку "КомментарийВыполняемыхДействий" не получиться заставить работать в штатном режиме при вызове из модального окна.
   MadDAD
 
10 - 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);
    КонецЕсли;
    
КонецПроцедуры
 
 Рекламное место пустует
   MadDAD
 
11 - 30.03.18 - 12:41
(10) Если не нужно отключать модальность, а просто  вызывать дочерние окна в немодальном режиме, достатчоно оставить вызов SetModalMode(0)

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует