gifts2017

"Сверхбыстрый" многофункциональный Прогресс-Индикатор в 1с7.

Опубликовал Алексей Сафонов (newold2) в раздел Программирование - Работа с интерфейсом

При каждом выводе на экран Индикатор рассчитывает следующий шаг вывода, поэтому не замедляет сам процесс (примерно в 10 раз быстрее известных мне).
Вывод в заданную текстовую строку или в поле "Состояние()" (сам решает куда).
Работает и при неизвестном полном количестве шагов (просто передаем номер шага).
В ходе процесса Индикатору можно передавать новые заголовки (2 параметром).
Выводит Заголовок, номер шага, %, прошедшее время, прогнозируемое время.

Несмотря на кажущуюся "громоздкость" программа работает исключительно быстро. Это достигается тем, что "медленная" процедура вывода на экран производиться не на каждом шаге, а на определенном, рассчитываемом при каждом выводе.
При неизвестном полном количестве шагов вывод производиться не менее чем через 1 секунду от прошлого вывода - на каждом шаге сравнивается ТекущееВремя() с рассчитанным. Данный подход позволяет не задавать индикатору , через какое количество шагов производить вывод.
Индикатор можно использовать для вывода сообщения - глИндикатор(СтрСообщения).

Индикатор прост в обращении - в ходе Процесса достаточно передавать только номер шага, или номер шага и, вторым параметром, Новый Заголовок (любое количество раз), если необходимо изменить Заголовок Индикатора.

Если в Форме предусмотрено текстовое поле "ПолеТекстИндикатор" - индикатор выводится в это поле; иначе - в строку "Состояние".


Возможны 3 режима вызова:

1. Если Парам1 не является числом - значит в переменной Парам1 передается заглавие линейки Индикатора, а в переменной Парам2 передается заранее вычисленное полное количество каких-либо действий (операций, шагов) процесса, отображаемого индикатором.
В таком режиме процедура вызывается один раз перед началом процесса. Если количество шагов неизвестно - режим необязательный.
В переменную "Конт" передается контекст текущей формы (для случая, когда индикатор расположен в глобальном модуле и в форме определено поле для вывода индикатора - "ПолеТекстИндикатор").

2. В переменную "Парам1" передается текущее количество шагов отображаемого процесса (>0), а в переменную "Парам2" можно передавать текущий заголовок Индикатора. В таком режиме процедура вызывается на каждом шаге процесса

3. Вызов без параметров ("глИндикатор()") - очистка поля (или строки "Состояние()" и всех сопутствующих переменных.

Для работы Индикатора необходимо задать переменные:

Перем ИндикаторЗагл; //Экспорт
Перем ИндикаторПолнКолич; //Экспорт
Перем ИндикаторВремяНач; //Экспорт
Перем ИндикаторТекКолич; //Экспорт
Перем ИндикаторКонтекст; //Экспорт //Нужна, если Индикатор расположен в глобальном модуле и в форме предусмотрено поле "ПолеТекстИндикатор";

Индикатор можно "как есть" вместе с назначением переменных переписывать в глобальный модуль - будет работать.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

В данной демонстрационной обработке для сравнения скорости работы использовались мои функции времени
(http://infostart.ru/public/128790/). Также использовались два Прогресс-Индикатора от ded00786 (http://infostart.ru/public/15740/).
Думаю, авторских прав не нарушил, так как в текст обработок не вносил изменений, кроме фиксации времени начала и завершения.
Есть ссылка на данные обработки. Автор, прошу пардону! У Вас почти все есть для многократного возрастания скорости.
Небольшие изменения программ...
Сами посмотрите? Или уже неинтересно?..

Скачать файлы

Наименование Файл Версия Размер
Форма демонстрации и сравнения Прогресс-Индикаторов 30
.zip 23,40Kb
06.06.12
30
.zip 23,40Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Александр Гнитка (smitti911) 06.06.12 00:10
Отличная работа ! Только замечен один баг(исправте меня если я ошыбаюсь). Поместил процедуру глИндикатор в глоб.модуль, сделал все переменные Экспорт. Индикатор работает на ура но только не очищается текстовое поле на форме "ПолеТекстИндикатор" после завершения цикла

Процедура глИндикатор(Парам1="",Парам2="",Конт="") Экспорт
Перем Ш,И1,И2,Ин,В1,В2,В3,С,ТекКолич,Стр,Н;
Если (Парам1="") и (Парам2="") тогда //Очистка
Сообщить("Очистка индикатора");
// ИндикаторЗагл="";ИндикаторПолнКолич=0;ИндикаторВремяНач=0;ИндикаторТекКолич=0; //ИндикаторКонтекст=""; Стр="";
ИндикаторЗагл="";ИндикаторПолнКолич=0;ИндикаторВремяНач=0;ИндикаторТекКолич=0; ИндикаторКонтекст=Конт; Стр="";
ИначеЕсли Число(Парам1)=0 тогда //передано заглавие и полное количество. Начальные установки.......

ИндикаторКонтекст=Конт; - вот так работает :)
2. Александр Гнитка (smitti911) 06.06.12 10:14
И тогда для очистки "ПолеТекстИндикатор" на форме вызов будет глИндикатор(,,Контекст)
3. Алексей Сафонов (newold2) 06.06.12 11:05
(2) smitti911,спасибо. Предлагаю при очистке переменную ИндикаторКонтекст вообще не очищать.
Тогда переназначение Контекста будет только при вызове Индикатора перед началом процесса, при прямом его (Конт) задании.
Более того, в этом случае для одной и той же формы Конт можно задавать только при первом вызове Индикатора.
Вот такие соображения. Попробуйте, я тоже посмотрю и выложу поправку.
4. Александр Гнитка (smitti911) 06.06.12 13:35
"Предлагаю при очистке переменную ИндикаторКонтекст вообще не очищать" - Попробывал, работает ;)

Меня еще интересует возможность вложенной индикации - есть например цикл в цикле и надо чтобы на форме отображался процес главного цикла одним индикатором а вложенного вторым. Етот второй индикатор может быть на форме или в состояние(). У меня есть обработка в которой документы реализации порождают док. калькуляции , хочется красиво отображать оба процесса ) Есть идеи по этому поводу ? ))
5. Алексей Сафонов (newold2) 06.06.12 14:20
(4) smitti911, еще раз спасибо, теперь за мысль о развитии! Есть соображения, как сделать каскад вложенных
индикаторов. Думаю, как бы сделать красивее. Многое придется доработать, но думаю в скорости потери не будет.
Скорее всего это будет отдельная разработка.
6. Александр Гнитка (smitti911) 06.06.12 14:26
7. Алексей Сафонов (newold2) 06.06.12 19:00
(6) smitti911,готово. Нашел поистине изумительное решение, как заставить на форме работать одновременно
любое(!) количество моих Индикаторов.В любых вложенных циклах, каскадом и в любых слоях формы.
Тебе, как активизатору, могу скинуть готовый вариант - говори куда. Индикатор вместе с переменными можно
"как есть" записывать в гл.модуль - будет работать. При одном индикаторе на форме - все, как в старом, только
Контекст идет теперь четвертым параметром. Третий параметр - Номер Индикатора (при одном Индикаторе не нужен).
Оформлять новую публикацию пока нет времени, да и Star Помощник Администратора Altair777 любит ставить мне (-)
за размытые Скриншоты.
8. Александр Гнитка (smitti911) 13.06.12 10:50
Все работает на УРА !!! Автору спасибо .