Отказ от модальности - Где, Что и Как?В общем виде задача отказа от модальности заключается в том, чтобы заменить модальные методы их асинхронными аналогами. Старая процедура, открывавшая модальное окно и обрабатывавшая полученные им данные, могла выглядеть так: ![](https://helpf.pro/uploads/imp/a64e0b4534cfe3434b6f16000fd5484b.png)
В новом варианте для формы ФормаВводТекста (которая будет открываться в блокирующем окне) нужно установить свойство РежимОткрытияОкна в значение БлокироватьВесьИнтерфейс. Это обеспечит модальность для пользователя: ![](https://helpf.pro/uploads/imp/64aedc39b9932a953c605563fa74e953.png)
А программный код вместо одной процедуры, как раньше, будет содержать уже две процедуры: ![](https://helpf.pro/uploads/imp/c8193df2f0fc4c3f31765a364079469e.png)
В первой процедуре открываем форму. При этом в последнем параметре мы передаём ей местонахождение второй процедуры, которая будет выполнена после того, как пользователь закроет окно. В данном случае эта процедура расположена в этом же модуле, но вообще может находиться и в другом. Когда пользователь введёт данные и закроет форму, они будут обработаны в указанной нами второй процедуре, в которую мы просто перенесли "старый" код, обрабатывающий полученные данные. Кроме форм, которые разработчик может открыть в модальном режиме (по своему желанию), существуют методы встроенного языка, которые всегда, независимо от желания разработчика, открывали модальные формы для ввода или выбора данных. Например, метод ВвестиЗначение(). Использовать такие методы в немодальном режиме ещё проще. Для всех таких методов в платформе сделаны методы-дублёры, при вызове которых нужно так же указать местонахождение процедуры, которая будет выполнена после того, как пользователь закроет окно. Например, ниже показано использование старого метода ВвестиЗначение() и его нового метода-дублёра ПоказатьВводЗначения(): ![](https://helpf.pro/uploads/imp/6ad907b476853c5009fb436a5abc5306.png)
В 8.3.5 можно выполнить автоматическое преобразование Модальных вызововТеперь в простых, и в не очень простых, случаях вы можете сделать это автоматически (команда Модальные вызовы - Преобразовать модальный вызов): ![](https://helpf.pro/uploads/imp/12a92d9a968d73c9efa74ab4676f0dfb.png)
Если вы преобразуете модальную функцию, то платформа добавит инициализацию переменной, в которую возвращается значение функции. Потому что в общем случае эта переменная может использоваться далее в той же процедуре: ![](https://helpf.pro/uploads/imp/d5841a646f528620c34213d006197407.png)
Другой случай. Например, фрагмент, который вы преобразуете, содержит две ветки исполнения, одна из которых включает в себя модальный код, а другая нет. Платформа преобразует такой фрагмент в две процедуры: ![](https://helpf.pro/uploads/imp/79110890d8a9f6e0294a37d1c6fba783.png)
Однако если вы преобразуете код, который находится, например, в модуле управляемого приложения, то полностью автоматическое преобразование вам выполнить не удастся: ![](https://helpf.pro/uploads/imp/52d5affa9a5c7a310ed2fc92894cb688.png)
Дело в том, что у глобального контекста нет свойства, позволяющего сослаться на него самого (ЭтотОбъект). А значит процедуру, обрабатывающую оповещение, нельзя разместить тут же, в модуле управляемого приложения. Её можно разместить, например, в каком-нибудь общем модуле. Эти действия вам нужно будет выполнить вручную: ![](https://helpf.pro/uploads/imp/ee93c852b1ec534f76fc1f8688476cbb.png)
Опубликовано на сайте: https://HelpF.pro Прямая ссылка: https://HelpF.pro/faq82/view/1583.html
|