AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.07.2006, 12:37   #1  
murick is offline
murick
Участник
Аватар для murick
 
59 / 10 (1) +
Регистрация: 10.04.2006
->
День добрый всем.

Есть кнопка на форме, которая вызывает определённый код. Этот код производит различные проверки в таблицах, кое-чего добавляет и т. д. Процесс выполнения этого кода немного долгий - мин. 5-6. Хочется, чтобы форма в это время как-то давала понять пользователю, что навижн не завис, а обрабатывает данные. Установил прогресс-бар на форму, связал её с переменной Progress. В самом коде я прохожусь по всем записям в таблице и поочерёдно обрабатываю каждую запись. после перехода на новую запись увеличиваю значение переменной Progress на определённое число и обновляю контролы этой формы.

Код:
step:=ROUND(100/WOList.COUNT,1,'=');			//WOList - список записей для обработки
REPEAT
...
сам обработчик записей
...

WOList.MODIFY;
progress:=progress+step;
CurrForm.UPDATECONTROLS;
UNTIL WOList.NEXT=0;
Однако никакого обновления не происходит. Нашёл на форуме похожие темы. Там советовали произвести обновление в триггере OnOpen формы и OnValidate самого прогресс-бара, однако всё равно ничего не выходит. Форма просто молча обрабатывает записи, временами выводя какие-то системные сообщения, а шкала прогресса стоит на нуле. По завершению выполнения кода шкала "подскакивает" сразу до конца.
Подскажите, пожалуйста, в чём ошибка . Спасибо всем.
Старый 25.07.2006, 15:04   #2  
UGT is offline
UGT
Участник
 
45 / 10 (1) +
Регистрация: 08.06.2005
Если я правильно понял из хелпа, то UPDATECONTROLS щбновляет только Caption у контролов:

UPDATECONTROLS (Form)
Use this function to reload the captions of all controls on the current form. This is necessary when the user changes the caption class of a control after the form has been loaded.

Думаю, надо использовать currform.Update
Старый 25.07.2006, 16:00   #3  
murick is offline
murick
Участник
Аватар для murick
 
59 / 10 (1) +
Регистрация: 10.04.2006
CurrForm.Update я тоже пробовал - не помогает. Можно как альтернативу использовать Dialog, но тогда диалоговое окно будет перекрываться системными сообщениями навижна.
Старый 25.07.2006, 16:15   #4  
randrews is offline
randrews
Участник
Аватар для randrews
 
312 / 10 (1) +
Регистрация: 06.12.2004
100/WOList.COUNT

замени на 10000/WOList.COUNT

Цитата:
Сообщение от Neovision Посмотреть сообщение
CurrForm.Update я тоже пробовал - не помогает. Можно как альтернативу использовать Dialog, но тогда диалоговое окно будет перекрываться системными сообщениями навижна.
UPDATECONTROLS (Form) и прочее не причем. Смотри причину в начале сообщения.

Пример:
i := 0;
num := r.count;
r.find('-');
repeat
i := i+1;
Progress := ROUND(i /num * 10000,1);
ProgressBox.UPDATE(2,Progress);
until r.next = 0;
Старый 25.07.2006, 16:36   #5  
randrews is offline
randrews
Участник
Аватар для randrews
 
312 / 10 (1) +
Регистрация: 06.12.2004
Да и вообще step:=ROUND(100/WOList.COUNT,1,'='); это неправильно.
Если у тебя будет количество записей 100000, то твой шаг будет равен 0 !!!!!!!
Как правильно - смотри выше !!!

Прошу прощения. Не понял, что речь идет о control, а не диалоге.

Цитата:
Сообщение от randrews Посмотреть сообщение
UPDATECONTROLS (Form) и прочее не причем. Смотри причину в начале сообщения.
Беру свои слова обратно.

А причина, как и писал - шаг задается неверно. Действовать надо:
Цитата:
Пример:
i := 0;
num := r.count;
r.find('-');
repeat
i := i+1;
Progress := ROUND(i /num * 10000,1);
ProgressBox.UPDATE(2,Progress);
until r.next = 0;
Старый 25.07.2006, 16:44   #6  
murick is offline
murick
Участник
Аватар для murick
 
59 / 10 (1) +
Регистрация: 10.04.2006
Спасибо всем за ответы. Всё получилось.

2randrews: да, вместо CurrForm.Update надо было просто написать CurrForm.ProgressBar.UPDATE Где ProgressBar - имя контрола.
Цитата:
Да и вообще step:=ROUND(100/WOList.COUNT,1,'='); это неправильно.
Если у тебя будет количество записей 100000, то твой шаг будет равен 0 !!!!!!!
Сглупил, согласен. Но изящней всё-таки, если шкала будет заполняться от 0 до 100%, а не до какого-либо значения, в зависимости от количества записей.
Старый 25.07.2006, 17:01   #7  
murick is offline
murick
Участник
Аватар для murick
 
59 / 10 (1) +
Регистрация: 10.04.2006
Цитата:
Но изящней всё-таки, если шкала будет заполняться от 0 до 100%, а не до какого-либо значения, в зависимости от количества записей.
Оказывается всё проще, чем я думал Просто после каждой изменённой записи в цикле увеличиваем значение счётчика. Далее подсчитываем значение переменной Progress как отношение счётчика к общему числу записей и обновляем контрол:

Код:
...
WOList.MODIFY;
step:=step+1;
progress:=ROUND(100*step/counter);   // counter:=WOlist.COUNT
CurrForm.ProgBar.UPDATE;
Ещё раз спасибо всем
Старый 20.11.2007, 14:04   #8  
TRIgor is offline
TRIgor
Участник
 
45 / 10 (1) +
Регистрация: 19.10.2007
Ребята, есть еще один вопрос в тему! Если нет кол-ва записей? Например, у меня идет передача данных между КПК и Навижином - как привязать прогресс-бар к выполнению этой операции - фактически привязка ко времени выполнения операции?
Старый 20.11.2007, 14:18   #9  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от TRIgor Посмотреть сообщение
Ребята, есть еще один вопрос в тему! Если нет кол-ва записей? Например, у меня идет передача данных между КПК и Навижином - как привязать прогресс-бар к выполнению этой операции - фактически привязка ко времени выполнения операции?
Насколько я правильно понимаю - Progess-Bar это % выполняния от чего-то. Если у Вас нет конечного значения, от которого нужно считать, то как можно посчитать %?

Мое мнение - сначала определите конечную точку от чего считать (для передачи данных между 2 системами - кол-во строк, символов в файле передачи, бит и т.д.), а потом считайте %.
Старый 20.11.2007, 14:26   #10  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Цитата:
Сообщение от TRIgor Посмотреть сообщение
Ребята, есть еще один вопрос в тему! Если нет кол-ва записей? Например, у меня идет передача данных между КПК и Навижином - как привязать прогресс-бар к выполнению этой операции - фактически привязка ко времени выполнения операции?
Вместо прогрессбара в данном случае я бы поставил диалогиовое окно, которое бы говорило пользователю, что сейчас передается (какой блок данных, например). Можно еще при этом крутить слэш (как в DOS ), что б пользователь знал, что передача идет, а не зависла.
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:28.