Работа с диалогами

Одно из железных правил проектирования интерфейсов – пользователь не должен чувствовать себя покинутым. Он может нажать кнопку, подождать 5 секунд (максимум!), но если не видит реакцию системы – начинается паника. Для этих случаев в Navision есть диалоги, спец.окошки для вывода текущего состояния системы. В них можно выводить счетчики, проценты, прогресс-бары – все, что угодно.

Есть одно НО. Dialog.UPDATE работает очень медленно :-) Одна и та же функция с включенным и выключенным диалогом может отличаться по быстродействию в разы, особенно если нужно обрабатывать тысячи или десятки тысяч операций.

Есть ли золотая середина? Да, конечно :)
Для пользователя будет достаточным, если обновлять окошко диалога хотя бы раз в секунду. А мы сохраним при этом быстродействие:

intCurrent := 0;
intTotal := 1000000;
d.OPEN('@1@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\', intProgress);
timeProgress := TIME;

REPEAT
  // Прогресс-бар
  intCurrent += 1;
  IF timeProgress < TIME - 1000 THEN BEGIN// Отрабатываем каждую секунду
    timeProgress := TIME;
    intProgress := ROUND(intCurrent / intTotal * 10000, 1);
    d.UPDATE;
  END;
  // Еще какая-то обработка
UNTIL intCurrent = intTotal;

Кстати, переменную Dialog лучше объявлять локальной (если возможно). Иначе, при возникновении ошибки – а у кого их не бывает – диалог останется висеть на экране.

Автор:

В области Navision - с 2003 года. Профессиональные интересы: NAV, MS SQL, .NET, BPMN, IT-менеджмент. Предметная область: логистика, финансы, склады, 3PL.

Количество статей, опубликованных автором: 86.

Добавить комментарий