20.10.2024, 19:57 | #1 |
Участник
|
AX 2009 ProgressBar из нескольких полос. Отображение времени
Есть два прогресс-бара. 1-й отображает основные операции (расчёт того, расчёт сего и экспорт в Эксель), а при экспорте в Эксель формируется 2-й прогресс-бар.
И получается, что в 1-м - TotalCount = 4, а во 2-м - TotalCount допустим 5000. Первый дошел до последнего пункта и отображает, что осталось 10 секунд, а потом сидишь и смотришь как 4-6 часов продвигается нижний прогресс-бар. При этом отображает, что осталось те же 10 секунд. Можно ли это как-то пофиксить? Рисую их через стандартный SysOperationProgress X++: void run() { simpleProgress = SysOperationProgress::newGeneral(#aviUpdate, this.caption(), 4); simpleProgress.setText("Операция 1"); simpleProgress.incCount(); simpleProgress.update(true); this.calc1(); ..... simpleProgress.setText("Экспорт в Эксель"); simpleProgress.incCount(); simpleProgress.update(true); this.exportExcel(); } void exportExcel() { excelProgress = SysOperationProgress::newGeneral('', '', totalRows); while select inventTable { excelProgress.setText(strFmt("Номенклатура %1", inventTable.ItemId)); excelProgress.incCount(); excelProgress.update(true); .... } } Последний раз редактировалось SuperStar88; 20.10.2024 в 20:01. |
|
21.10.2024, 01:06 | #2 |
Administrator
|
Что-то по коду не вижу, чтобы использовался ProgressBar из двух полос. Если делать progressBar из двух полос, то тогда и метод newGeneral должен получить параметр 2 (количество полос) и у incCount-а должно быть 2 параметра - один - приращение (=1), а другой (второй) - номер полосы. Ну и это очевидно должен быть один объект (т.е. в методе экспорта в Excel не должен инициализироваться второй экземпляр ProgressBar
__________________
Возможно сделать все. Вопрос времени |
|
21.10.2024, 10:56 | #3 |
Участник
|
Я имел ввиду, что когда я в другом методе добавляю ещё один ProgressBar, то он же прикрепляется к первому второй строкой, если ещё один - то третей и т.д.
Пробовал делать и сразу двойной SysOperationProgress::newMultiBar(...), но количество элементов для второго я сразу не знаю, а только после расчётов. И как-то оно получилось без второй полосы, а только текст добавился |
|
21.10.2024, 12:19 | #4 |
Участник
|
progress.setTotal() - установка общего количества элементов. Можно это делать и в процессе работы
progress.setCount() - это установка количества выполненных шагов, если оно отлично от приращения 1 через progress.incCount(). Тоже бывает полезно X++: excelProgress.setTotal(totalRows, 2); // Установить общее количество для полосы 2 excelProgress.setCount(0, 2); // Установить количество пройденных шагов 0 для полосы 2 excelProgress.update(true); // обновить картинку немедленно while select inventTable { excelProgress.setText(strFmt("Номенклатура %1", inventTable.ItemId)); excelProgress.incCount(1,2); } Ну, и так, для справки... progress.update() - это обновление "картинки". Этот метод вызывается автоматически внутри метода incCount(), поэтому специально его вызывать не надо. Обновление "картинки" делается с некоторой периодичностью, чтобы не тормозить процесс обработки. Но если "картинку" надо обновить "вот прям счаз", то вызывают метод update() с параметром true. В общем случае, такая необходимость возникает только при изменении настроек прогресса. Например, когда вызвали setTotal(). А внутри цикла это делать не надо.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
21.10.2024, 17:41 | #5 |
Administrator
|
Цитата:
Сообщение от SuperStar88
Я имел ввиду, что когда я в другом методе добавляю ещё один ProgressBar, то он же прикрепляется к первому второй строкой, если ещё один - то третей и т.д.
Пробовал делать и сразу двойной SysOperationProgress::newMultiBar(...), но количество элементов для второго я сразу не знаю, а только после расчётов. И как-то оно получилось без второй полосы, а только текст добавился
__________________
Возможно сделать все. Вопрос времени |
|
|
|