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