Отрытие модального окна из модального окна

Автор p18, 26 мая 2025, 18:09

« назад - далее »

vladmenleo

Цитата: MWW_Ruza от 29 мая 2025, 09:49С новым ФормЕкс естественно.
Вот блин, опять я загрузил старую длл. Я делаю какие-то правки, потом вроде кажется, что работает, меняю мдшник на старый, вношу свои исправления, а путь у формекса прежний dll\  :'(

Злоп

Может отказаться от модальности если совсем уж никак, можно сделать псевдомодальномть

p18

Кастрировал криво. Да. Извините. Мне казалось основное показать путь по которому возникает ошибка.
Чтобы исправить зависший процесс 1С. Надо в Глобальнике
Строка 47. Вместо ОткрытьФормуМодально("Обработка.ПланПомещения");
Написать
         Если Темп <> "Завершить" Тогда
            ОткрытьФормуМодально("Обработка.ПланПомещения");
         иначе
            ЗавершитьРаботуСистемы(0);     
            Возврат;
         КонецЕсли;

И если уж совсем душа праздника требует то в Модуле Обработка.ПланПомещения процедуру Закрытие() переписать на
Процедура Закрытие()   
   Темп = "Завершить";
   ЗавершитьРаботуСистемы(0);
   Форма.Закрыть(0);
КонецПроцедуры 

На рабочем модуле - при закрытии плана опять идёт авторизация - а тут будет просто происходить выход из программы. Опять таки - не думаю, что это критично для теста зависания формэкс.

Попутно вспомнил, что тот формэкс, что использую начисто обрубал вшитую в 1С - ОбработкаОжидания(). Хотя может он её и заменял на свою. Хз. Документации в тот момент, когда писали эту конфу - не было. Была только библиотека. И пример конфы.

Djelf

Господа, пишите не "Новая версия" и не "Старая версия", а конкретную версию FormEx, именно это и поможет отыскать проблему.

p18

У меня всё работает на FormEx.dll версии 1.9.0.1 от 15.12.2003 время 8:40 размер файла 136 килобайт.
На любых других версиях - всё становится колом.
Использую ещё Hide1C.dll- версия 1.0.0.2 от 09.12.2002 время 23:28 размер файла 44 килобайта

MWW_Ruza

Цитата: p18 от 29 мая 2025, 19:45Использую ещё Hide1C.dll- версия 1.0.0.2 от 09.12.2002

Как уже выяснили, она тут ни при чем.
Комментировал ее загрузку, поведение меняется - главное окно не прячется, но в остальном работае все точно так-же. На 1.9.0.1 работает, на версиях 198 - 199 зависает.

Arbuz

Так, я тоже посмотрел. Ну, у меня не виснет на 199 (и в памяти не висит, и ошибок нет), но у меня патченная wirth'ом. Просто не работают (и не транслируются в глобальник) события мыши/клавы на второй модальной форме (действия). Закрываю эту форму по esc или убираю в форме ФормаРасш.ЗапретЗакрытияФормыКнопкой(1) и без проблем её закрываю.
Потом давно известный факт — не надо открывать окна из ПриНачалеРаботыСистемы(). Если запускать из, например, ОбработкиОжидания, то и курсор мыши становится нормальным, но события не идут всё равно.

Харлампий Дымба

#36 Просто демо-база настолько не демо, что непонятно в каком конкретно месте надо смотреть, что не работает. Как я понял - один из вариантов проверки "неработоспособности" ткнуть во втором после авторизации окошке (план зала) на кружочке с номером стола и попробовать ввести число клиентов - тут виснет наглухо с формексом 199.
Тоже пробовал открывать все через ОбработкуОжидания, убирал из ПриОткрытии, вставлял Паузы, делал "Если Форма.МодальныйРежим()=1 Тогда ОткрытьФормуМодально", добавлял # в ОткрытьФормуМодально, убирал Hide1C, бил в бубен, но что-то так и не сработало ничего...

1ex

Давняя тема. Много седых волос добавила.
В свое время натолкнулся на такое... научился, не спрашивая разрешения - всегда выходить из обработчиков событий формекса в модальных окнах.

пример обсуждения тут:
https://www.1cpp.ru/forum/YaBB.pl?num=1392388281/5
Хотя тестовый пример - уже рабочий на последней версии (проверил).


Накидал два варианта решения:
1. Вариант 1 сделал в Обработке "ПланПомещения"
Процедура ПриОтжатииЛевойКнопки(сост,х,у,ФСО)   
	Фсо = 0;
	Сообщить("Главное окно");
	ФормаРасш = СоздатьОбъект("РасширениеФормы"); 
	ФормаРасш.УстановитьФорму(Форма);	         
	Атр = ФормаРасш.ПолучитьАтрибутПоКоординатам(х,у);
	Если ТипЗначенияСтр(Атр) = "АтрибутФормы" Тогда
		Если Атр.Идентификатор = "Выход" Тогда Закрытие(); КонецЕсли;
		Если Атр.Идентификатор = "Обновить" Тогда ИнитСтолов(); КонецЕсли;
		Если Атр.Идентификатор = "кнСтопЛист" Тогда СтопЛист(); КонецЕсли;
		Если (Атр.Идентификатор = "кнВыплатаДенег")  Тогда Выплата(); Возврат; КонецЕсли;
		Если (Атр.Идентификатор = "кнВнесениеДенегВКассу")  Тогда Внесение(); Возврат; КонецЕсли;
		Если (Атр.Идентификатор = "вклСкидка")  Тогда ИзменениеКонстанты(1); КонецЕсли;
		Если (Атр.Идентификатор = "выклСкидка")  Тогда ИзменениеКонстанты(0); КонецЕсли;
		Если (Атр.Идентификатор = "Списание")  Тогда Списание(); КонецЕсли;
		Если (Атр.Идентификатор = "Сигма")  Тогда Сигма(); КонецЕсли;
		Если Число(Сред(Атр.Идентификатор,5)) = 0 Тогда Возврат; КонецЕсли; 
		
		 
		
		//ОткрытиеСчетаСтола(Число(Сред(Атр.Идентификатор,5))); 
		
		лсСерв = СоздатьОбъект("Сервис");
		лсСерв.ВнешнееСобытие("1С","ОткрытиеСчетаСтола",Сред(Атр.Идентификатор,5));

	КонецЕсли;	
	Фсо = 1;
КонецПроцедуры        


Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)  
	Если (Источник = "1С")и(Событие = "ОткрытиеСчетаСтола") тогда
		                               
		Сообщить("Открыть стол");
		ОткрытиеСчетаСтола(Число(Данные)); 
	КонецЕслИ;
	
КонецПроцедуры
Через внешнее событие.

Но во втором модальном окне уже такое не прокатило. НЕ запускается Второе "Внешнее событие". Есть гипотеза - что это также связано с тем, что модальность окна "останавливает" дальнейшее выполнение "одинаковых" функций... Опять же имхо.

Поэтому кинул "ТекстНеУдалять" на форму.
В обработке "Счет"
....
Процедура OnLButtonUp(сост,х,у,ФСО) // извиняюсь за мой английский - проверял гипотезу "одинаковых функций"
                                    // но такое не прокатило.  
.......
		Если Атр.Идентификатор = "Закрыть" Тогда   
			Сообщить("Закрытие?");  
			Если ффСтарыйРежим = 0 тогда 
				Сообщить("Так работает!");
				Форма.Обновить(0);
				ФлагВызова = "ВыборЗакрытия";
			иначе                         
				Сообщить("Так НЕ работает!");
				ВыборЗакрытия();		
			КонецЕслИ;
            Возврат;
		КонецЕсли;   

......

Функция ОбработчикФормы()
	Сообщить("Ловим");      
	Сообщить("ФлагВызова");
	Если ФлагВызова = "ВыборЗакрытия" тогда  
		ФлагВызова = "";
		Сообщить("Словили");
		ВыборЗакрытия();
	КонецЕслИ;
	Возврат "";
КонецФункции
Трейс теста.
1. Карта официанта. Мышкой - 0, ОК.
2. План зала. Мышкой, кружок 32.
3. Ввод числового значения (ввод клиентов за столом). Мышкой - 1, ОК (почему-то два раза надо кликать - надо FIX)
4. Счет. Мышкой - Бар, Коньяк :). Закрыть
5. Тестовое окно со стеком вызова. ОК. Не сохранять.  Должно быть таким: https://disk.yandex.ru/i/8JiA8HEI2FyoGQ

Замечание: Это мой "условно" рабочий вариант. Потому что бывает так... и что это за странный стек такой, я не понял... https://disk.yandex.ru/i/V0XdcypHQn2eXg

6. Возврат в план зала.
7. План зала. Мышкой, кружок 32.
8. Ввод числового значения (ввод клиентов за столом). Мышкой - 1, ОК (все еще - два раза надо кликать)
9. Счет. Мышкой - Бар, Коньяк.
10. Счет. Клавиатурой CTRL+SHIFT+F2. "Переключаем на вызов модального окна из обработчика событий"
11. Закрыть.
12. Тестовое окно со стеком вызовов. НЕ Работает, функция обработчика болтается в стеке... https://disk.yandex.ru/i/uRwt8bscbQW8xQ
13. Действия. Кнопка мыши не перехватывается. ЧТД... (ESC у меня работает)
Версия formex 2.0.5.199

Тестовая база с моими похабными правками - тут.
https://disk.yandex.ru/d/qhVKmDTIBY2c0A



Djelf

Аааа... А я эту конфу уже видел, присылали на попытку фикса!
Не осилил. Извините. Красиво, но работает только с очень старыми версиями formex.

p18

(почему-то два раза надо кликать - надо FIX

ДЕМО - оно такое демо. ) Обрабатывается каждое второе нажатие. Это связано с тем - что работает это все на Посифлексах с тачскрином. И как я не бился с ними - на более или менее новых моделях - почему-то нажатие на тачскрин - обрабатывается как два нажатия. Уже и скорость кликов с свойствах мыши под виндой замедлял и с бубном прыгал - но видимо не тот бубен. Поэтому под настоящей мышью - одно нажатие тупо пропускаю. а вот по тачу - одно нажатие - одно действие.

Arbuz

Ну, в целом, надо делать либо "менеджер событий" куда кидать в очередь формы и пусть он открывает только по одному модальному окну, либо делать псевдомодальные окна (неразвёрнутые, следить за потерей фокуса, нажатиями вне окна и передним планом)

p18

Цитата: Arbuz от 05 июня 2025, 17:48Ну, в целом, надо делать либо "менеджер событий" куда кидать в очередь формы и пусть он открывает только по одному модальному окну, либо делать псевдомодальные окна (неразвёрнутые, следить за потерей фокуса, нажатиями вне окна и передним планом)
А варианта - без лыж, гамака и акваланга - для 1с не бывает? ) Просто иногда хочется - хотя бы без лыж.

Злоп

ну, делаешь модальную форму, ОДНУ.
а на ней на куче слоев весь функционал нужный,
переключайся и отрабатывай что надо...
;-)
.
я так пробовал на заааареее... голосаааа зовууут...
очень неудобно. перешел на диспетчер обработок, каждая модальная форма - некое "атомарное" действие. это позволяет быстро вязать процессы ы виде нужной последовательности форм и переходов между ними...

Arbuz

Цитата: p18 от 10 июня 2025, 13:58А варианта - без лыж, гамака и акваланга - для 1с не бывает? )
Дык, это ж 1С — либо страдать, либо расслабиться и получать удовольствие ))
Тащемто, модальность это одно из самых проблемных мест в клюшках. Я вот всё мечтаю сделать псевдомодальные окна, но никак не могу выработать концепцию — вот бы можно было сделать в окне прозрачные области (чтобы не заморачиваться с максимизированными окнами).