Вывод в заданную текстовую строку или в поле "Состояние()" (сам решает куда).
Работает и при неизвестном полном количестве шагов (просто передаем номер шага).
В ходе процесса Индикатору можно передавать новые заголовки (2 параметром).
Выводит Заголовок, номер шага, %, прошедшее время, прогнозируемое время.
Несмотря на кажущуюся «громоздкость» программа работает исключительно быстро. Это достигается тем, что «медленная» процедура вывода на экран производиться не на каждом шаге, а на определенном, рассчитываемом при каждом выводе.
При неизвестном полном количестве шагов вывод производиться не менее чем через 1 секунду от прошлого вывода — на каждом шаге сравнивается ТекущееВремя() с рассчитанным. Данный подход позволяет не задавать индикатору , через какое количество шагов производить вывод.
Индикатор можно использовать для вывода сообщения — глИндикатор(СтрСообщения).
Индикатор прост в обращении — в ходе Процесса достаточно передавать только номер шага, или номер шага и, вторым параметром, Новый Заголовок (любое количество раз), если необходимо изменить Заголовок Индикатора.
Если в Форме предусмотрено текстовое поле «ПолеТекстИндикатор» — индикатор выводится в это поле; иначе — в строку «Состояние».
Возможны 3 режима вызова:
1. Если Парам1 не является числом — значит в переменной Парам1 передается заглавие линейки Индикатора, а в переменной Парам2 передается заранее вычисленное полное количество каких-либо действий (операций, шагов) процесса, отображаемого индикатором.
В таком режиме процедура вызывается один раз перед началом процесса. Если количество шагов неизвестно — режим необязательный.
В переменную «Конт» передается контекст текущей формы (для случая, когда индикатор расположен в глобальном модуле и в форме определено поле для вывода индикатора — «ПолеТекстИндикатор»).
2. В переменную «Парам1» передается текущее количество шагов отображаемого процесса (>0), а в переменную «Парам2» можно передавать текущий заголовок Индикатора. В таком режиме процедура вызывается на каждом шаге процесса
3. Вызов без параметров («глИндикатор()») — очистка поля (или строки «Состояние()» и всех сопутствующих переменных.
Для работы Индикатора необходимо задать переменные:
Перем ИндикаторЗагл; //Экспорт
Перем ИндикаторПолнКолич; //Экспорт
Перем ИндикаторВремяНач; //Экспорт
Перем ИндикаторТекКолич; //Экспорт
Перем ИндикаторКонтекст; //Экспорт //Нужна, если Индикатор расположен в глобальном модуле и в форме предусмотрено поле "ПолеТекстИндикатор";
Индикатор можно «как есть» вместе с назначением переменных переписывать в глобальный модуль — будет работать.
———————————————————————————————————————————————————————————
В данной демонстрационной обработке для сравнения скорости работы использовались мои функции времени
(//infostart.ru/public/128790/). Также использовались два Прогресс-Индикатора от ded00786 (//infostart.ru/public/15740/).
Думаю, авторских прав не нарушил, так как в текст обработок не вносил изменений, кроме фиксации времени начала и завершения.
Есть ссылка на данные обработки. Автор, прошу пардону! У Вас почти все есть для многократного возрастания скорости.
Небольшие изменения программ…
Сами посмотрите? Или уже неинтересно?..
Отличная работа ! Только замечен один баг(исправте меня если я ошыбаюсь). Поместил процедуру глИндикатор в глоб.модуль, сделал все переменные Экспорт. Индикатор работает на ура но только не очищается текстовое поле на форме «ПолеТекстИндикатор» после завершения цикла
Процедура глИндикатор(Парам1=»»,Парам2=»»,Конт=»») Экспорт
Перем Ш,И1,И2,Ин,В1,В2,В3,С,ТекКолич,Стр,Н;
Если (Парам1=»») и (Парам2=»») тогда //Очистка
Сообщить(«Очистка индикатора»);
// ИндикаторЗагл=»»;ИндикаторПолнКолич=0;ИндикаторВремяНач=0;ИндикаторТекКолич=0; //ИндикаторКонтекст=»»; Стр=»»;
ИндикаторЗагл=»»;ИндикаторПолнКолич=0;ИндикаторВремяНач=0;ИндикаторТекКолич=0; ИндикаторКонтекст=Конт; Стр=»»;
ИначеЕсли Число(Парам1)=0 тогда //передано заглавие и полное количество. Начальные установки…….
ИндикаторКонтекст=Конт; — вот так работает 🙂
И тогда для очистки «ПолеТекстИндикатор» на форме вызов будет глИндикатор(,,Контекст)
(2) smitti911,спасибо. Предлагаю при очистке переменную ИндикаторКонтекст вообще не очищать.
Тогда переназначение Контекста будет только при вызове Индикатора перед началом процесса, при прямом его (Конт) задании.
Более того, в этом случае для одной и той же формы Конт можно задавать только при первом вызове Индикатора.
Вот такие соображения. Попробуйте, я тоже посмотрю и выложу поправку.
«Предлагаю при очистке переменную ИндикаторКонтекст вообще не очищать» — Попробывал, работает 😉
Меня еще интересует возможность вложенной индикации — есть например цикл в цикле и надо чтобы на форме отображался процес главного цикла одним индикатором а вложенного вторым. Етот второй индикатор может быть на форме или в состояние(). У меня есть обработка в которой документы реализации порождают док. калькуляции , хочется красиво отображать оба процесса ) Есть идеи по этому поводу ? ))
(4) smitti911, еще раз спасибо, теперь за мысль о развитии! Есть соображения, как сделать каскад вложенных
индикаторов. Думаю, как бы сделать красивее. Многое придется доработать, но думаю в скорости потери не будет.
Скорее всего это будет отдельная разработка.
Ок, будем ждать 😉
(6) smitti911,готово. Нашел поистине изумительное решение, как заставить на форме работать одновременно
любое(!) количество моих Индикаторов.В любых вложенных циклах, каскадом и в любых слоях формы.
Тебе, как активизатору, могу скинуть готовый вариант — говори куда. Индикатор вместе с переменными можно
«как есть» записывать в гл.модуль — будет работать. При одном индикаторе на форме — все, как в старом, только
Контекст идет теперь четвертым параметром. Третий параметр — Номер Индикатора (при одном Индикаторе не нужен).
Оформлять новую публикацию пока нет времени, да и Star Помощник Администратора Altair777 любит ставить мне (-)
за размытые Скриншоты.
Все работает на УРА !!! Автору спасибо .