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

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 человек.
Рекламное место пустует