Есть простая форма с полем ввода и кнопкой. При нажатии на кнопку запускается обработчик ожидания и с периодичностью в 1 секунду изменяется цвет рамки формы, а так же свойство растягивания по горизонтали.
Для этого прописываю, допустим, вот такой простой код:
Все работает, но возникает проблема - если написать какой то текст в поле ввода над кнопкой и после этого выполняется "анимация", то текст пропадает, то есть значение свойства "ТекстРедактирования" у элемента поля формы очищается. Придумал 2 варианта:
1) сразу при вводе значения в текст редактирования запихивать данных текст в реквизит формы;
2) перед выполнением в обработчике анимации перетянуть текст редактирования в значение реквизита формы.
Выбрал второй вариант, но столкнулся с проблемой. Код:
Проблема (комментарий в коде): для получения данных о пути к данным нужно выполнить серверную контекстную процедуру, после форма обновиться. Естественно я ее смогу заполнить из "СоотвецтвиеНазанияЗначению", но если пользователь не только вводил текст в поля, а еще и прокрутил форму чуть выше, то форму дернет до самого верха в начальное положение, то есть серверные контекстные вызовы нужно исключить.
Как тогда можно в обработчике ожидания без серверных контекстных вызовов "перегрузить" данные с текста редактирования в реквизит формы что бы все тексты редактирования и положение в окне формы не изменилось?
Для этого прописываю, допустим, вот такой простой код:
&НаКлиенте
Процедура ВключитьАнимацию(Команда)
ПодключитьОбработчикОжидания("ВыполнитьАнимацию",1);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьАнимацию() Экспорт
Если Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,0,0) Тогда
Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,255,255);
Элементы.ВключитьАнимацию.РастягиватьПоГоризонтали=Истина;
Иначе
Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,0,0);
Элементы.ВключитьАнимацию.РастягиватьПоГоризонтали=Ложь;
КонецЕсли;
КонецПроцедуры
ПоказатьВсе работает, но возникает проблема - если написать какой то текст в поле ввода над кнопкой и после этого выполняется "анимация", то текст пропадает, то есть значение свойства "ТекстРедактирования" у элемента поля формы очищается. Придумал 2 варианта:
1) сразу при вводе значения в текст редактирования запихивать данных текст в реквизит формы;
2) перед выполнением в обработчике анимации перетянуть текст редактирования в значение реквизита формы.
Выбрал второй вариант, но столкнулся с проблемой. Код:
&НаКлиенте
Процедура ВключитьАнимацию(Команда)
ПодключитьОбработчикОжидания("ВыполнитьАнимацию",1);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьАнимацию() Экспорт
СоотвецтвиеНазанияЗначению=ПолучитьЭлементПамяти();
Для каждого ЭлементФормы Из ЭтаФорма.Элементы Цикл
//здесь для каждого "ЭлементФормы" необходимо было бы найти "Путь к данным" в котором хранится реквизит формы в который нужно было бы записать значение текста редактирования, который хранится в "СоотвецтвиеНазанияЗначению", но "Путь к данным" доступен только на сервере!!!
КонецЦикла;
Если Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,0,0) Тогда
Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,255,255);
Элементы.ВключитьАнимацию.РастягиватьПоГоризонтали=Истина;
Иначе
Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,0,0);
Элементы.ВключитьАнимацию.РастягиватьПоГоризонтали=Ложь;
КонецЕсли;
//ВосстановитьПамятьФормы(СоотвецтвиеНазанияЗначению);
КонецПроцедуры
&НаКлиенте
Функция ПолучитьЭлементПамяти()
СоотвецтвиеНазанияЗначению=Новый Соответствие;
Для каждого ЭлементФормы Из ЭтаФорма.Элементы Цикл
Попытка
Текст=ЭлементФормы.ТекстРедактирования;
СоотвецтвиеНазанияЗначению.Вставить(ЭлементФормы.Имя,Текст);
Исключение
Продолжить;
КонецПопытки;
КонецЦикла;
Возврат СоотвецтвиеНазанияЗначению;
КонецФункции
ПоказатьПроблема (комментарий в коде): для получения данных о пути к данным нужно выполнить серверную контекстную процедуру, после форма обновиться. Естественно я ее смогу заполнить из "СоотвецтвиеНазанияЗначению", но если пользователь не только вводил текст в поля, а еще и прокрутил форму чуть выше, то форму дернет до самого верха в начальное положение, то есть серверные контекстные вызовы нужно исключить.
Как тогда можно в обработчике ожидания без серверных контекстных вызовов "перегрузить" данные с текста редактирования в реквизит формы что бы все тексты редактирования и положение в окне формы не изменилось?
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3)
Спасибо. Нашел. То что нужно, не знал!
При выполнении такого кода и установке свойства "Обновление текста редактирования" в положение "При изменении значения" проблема исчезает. Текст можно продолжать набирать и он никуда не исчезает. Круто!)
П.С. (как писали выше): РастягиватьПоГоризонтали делает Серверный вызов;
Обновление текста редактирования
Спасибо. Нашел. То что нужно, не знал!
ОбновлениеТекстаРедактирования (EditTextUpdate)
Использование:
Чтение и запись.
Описание:
Тип: ОбновлениеТекстаРедактирования.
Управляет режимом обновления текста.
Значение по умолчанию Авто.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение(клиент), мобильное приложение(сервер).
Примечание:
В режиме совместимости конфигурации Версия8_2_13 не влияет на поведение поля ввода управляемой формы.
В остальных случаях влияет на то, в каких ситуациях будет обновляться текст в поле ввода при установке значения.
Использование:
Чтение и запись.
Описание:
Тип: ОбновлениеТекстаРедактирования.
Управляет режимом обновления текста.
Значение по умолчанию Авто.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение(клиент), мобильное приложение(сервер).
Примечание:
В режиме совместимости конфигурации Версия8_2_13 не влияет на поведение поля ввода управляемой формы.
В остальных случаях влияет на то, в каких ситуациях будет обновляться текст в поле ввода при установке значения.
При выполнении такого кода и установке свойства "Обновление текста редактирования" в положение "При изменении значения" проблема исчезает. Текст можно продолжать набирать и он никуда не исчезает. Круто!)
&НаКлиенте
Процедура ВключитьАнимацию(Команда)
ПодключитьОбработчикОжидания("ВыполнитьАнимацию",1);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьАнимацию() Экспорт
Если Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,0,0) Тогда
Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,255,255);
Элементы.ВключитьАнимацию.РастягиватьПоГоризонтали=Истина;
Иначе
Элементы.ВключитьАнимацию.ЦветРамки=Новый Цвет(255,0,0);
Элементы.ВключитьАнимацию.РастягиватьПоГоризонтали=Ложь;
КонецЕсли;
КонецПроцедуры
ПоказатьП.С. (как писали выше): РастягиватьПоГоризонтали делает Серверный вызов;
Прикрепленные файлы:
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот