Отложенная обработка изменения содержимого поля ввода
Задержка реакции на изменения в поле ввода нужна для тех случаев, когда обработка изменения занимает много времени. Например, когда происходит обращение к базе данных. Если такую обработку производить в ответ на каждое нажатие клавиши в поле ввода (в обработчике изменение), то ввод будет происходить с задержками и раздражать пользователя. Отложенная обработка изменений позволяет выполнить длительные действия после завершения активной фазы ввода, когда пользователь не нажимает клавиши, например, в течении 2-х секунд.
У всех элементов полей ввода имеется отложенная обработка события изменения его содержимого. За реализацию отложенной обработки отвечает обработчик после_изменения. В отличие от обработчика изменение обработчик после_изменения вызывается по таймеру через некоторый интервал времени. В качестве одного из параметров данный обработчик принимает вещественное значение, которое определяет время задержки в секундах. Пока указанная в параметрах обработчика величина задержки не будет достигнута, обработчик будет вызываться каждые 0.1 секунду. Если новые изменения вносятся во время задержки , то отсчет времени возобновляется с момента последнего изменения. При достижении величины задержки обработчик возвращает ДА и его вызов прекращается, иначе обработчик возвращает значение НЕТ, что указывает на продолжение его вызова.
Пример
В качестве примера рассматривается случай ввода кода объекта аналитики. По прошествии 3 секунд задержки после последнего изменения кода объекта аналитики в текстовое поле ввода выводится название указанного объекта аналитики.
ТИП Диалог_поля_ввода(ДИАЛОГ) [ ... ВВОД_КОДА: Ввод_кода1 = [ левый = 30, верхний = 30, ширина = 285, высота = 45, табиндекс = 1003, приглашение = "выберите код объекта аналитики", после_изменения = {Вывод_названия} ]; РЕДАКТОР: Редактор1 = [ левый = 25, верхний = 90, ширина = 305, высота = 85, табиндекс = 1004, только_чтение = ДА ]; ... ФУНКЦИЯ ЛОГИКА: Вывод_названия(ПЕРЕМ ВВОД_КОДА: ввод; ЧИСЛО: прошло) ЕСЛИ прошло > 3 ТО // прошло более 3-х секунд Редактор1.текст = НАЗВ_ОБЪЕКТА(ввод.текст) // обращение к базе данных Редактор1.ОБНОВИТЬ РЕЗУЛЬТАТ = ДА // дождались, хватит вызывать обработчик ИНАЧЕ РЕЗУЛЬТАТ = НЕТ // не дождались, продолжить вызовы обработчика КОНЕЦ_ЕСЛИ КОНЕЦ_ФУНКЦИИ ] ВЫЧИСЛИТЬ ПЕРЕМ Диалог_поля_ввода: д // д <- данные ЕСЛИ д.ПОКАЗАТЬ_МОДАЛЬНЫЙ <> "" ТО // д -> данные КОНЕЦ_ЕСЛИ КОНЕЦ