Руководство разработчика

Отложенная обработка изменения содержимого поля ввода

Задержка реакции на изменения в поле ввода нужна для тех случаев, когда обработка изменения занимает много времени. Например, когда происходит обращение к базе данных. Если такую обработку производить в ответ на каждое нажатие клавиши в поле ввода (в обработчике изменение), то ввод будет происходить с задержками и раздражать пользователя. Отложенная обработка изменений позволяет выполнить длительные действия после завершения активной фазы ввода, когда пользователь не нажимает клавиши, например, в течении 2-х секунд.

У всех элементов полей ввода имеется отложенная обработка события изменения его содержимого. За реализацию отложенной обработки отвечает обработчик после_изменения. В отличие от обработчика изменение обработчик после_изменения вызывается по таймеру через некоторый интервал времени. В качестве одного из параметров данный обработчик принимает вещественное значение, которое определяет время задержки в секундах. Пока указанная в параметрах обработчика величина задержки не будет достигнута, обработчик будет вызываться каждые 0.1 секунду. Если новые изменения вносятся во время задержки , то отсчет времени возобновляется с момента последнего изменения. При достижении величины задержки обработчик возвращает ДА и его вызов прекращается, иначе обработчик возвращает значение НЕТ, что указывает на продолжение его вызова.

Пример

В качестве примера рассматривается случай ввода кода объекта аналитики. По прошествии 3 секунд задержки после последнего изменения кода объекта аналитики в текстовое поле ввода выводится название указанного объекта аналитики.

ТИП Диалог_поля_ввода(ДИАЛОГ)
[
  ...
  ВВОД_КОДА: Ввод_кода1 = [ левый = 30,
                            верхний = 30,
                            ширина = 285,
                            высота = 45,
                            табиндекс = 1003,
                            приглашение = "выберите код объекта аналитики",
                            после_изменения = {Вывод_названия} ];
  РЕДАКТОР: Редактор1 = [ левый = 25,
                          верхний = 90,
                          ширина = 305,
                          высота = 85,
                          табиндекс = 1004,
                          только_чтение = ДА ];
  ...

  ФУНКЦИЯ ЛОГИКА: Вывод_названия(ПЕРЕМ ВВОД_КОДА: ввод; ЧИСЛО: прошло)
    ЕСЛИ прошло > 3 ТО // прошло более 3-х секунд
      Редактор1.текст = НАЗВ_ОБЪЕКТА(ввод.текст) // обращение к базе данных
      Редактор1.ОБНОВИТЬ
      РЕЗУЛЬТАТ = ДА // дождались, хватит вызывать обработчик
    ИНАЧЕ
      РЕЗУЛЬТАТ = НЕТ // не дождались, продолжить вызовы обработчика
    КОНЕЦ_ЕСЛИ
  КОНЕЦ_ФУНКЦИИ

]
ВЫЧИСЛИТЬ
  ПЕРЕМ Диалог_поля_ввода: д
  // д <- данные
  ЕСЛИ д.ПОКАЗАТЬ_МОДАЛЬНЫЙ <> "" ТО
    // д -> данные
  КОНЕЦ_ЕСЛИ
КОНЕЦ

См. также: