25.07.2006, 12:37 | #1 |
Участник
|
День добрый всем.
Есть кнопка на форме, которая вызывает определённый код. Этот код производит различные проверки в таблицах, кое-чего добавляет и т. д. Процесс выполнения этого кода немного долгий - мин. 5-6. Хочется, чтобы форма в это время как-то давала понять пользователю, что навижн не завис, а обрабатывает данные. Установил прогресс-бар на форму, связал её с переменной Progress. В самом коде я прохожусь по всем записям в таблице и поочерёдно обрабатываю каждую запись. после перехода на новую запись увеличиваю значение переменной Progress на определённое число и обновляю контролы этой формы. Код: step:=ROUND(100/WOList.COUNT,1,'='); //WOList - список записей для обработки REPEAT ... сам обработчик записей ... WOList.MODIFY; progress:=progress+step; CurrForm.UPDATECONTROLS; UNTIL WOList.NEXT=0; Подскажите, пожалуйста, в чём ошибка . Спасибо всем. |
|
25.07.2006, 15:04 | #2 |
Участник
|
Если я правильно понял из хелпа, то 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 |
Участник
|
CurrForm.Update я тоже пробовал - не помогает. Можно как альтернативу использовать Dialog, но тогда диалоговое окно будет перекрываться системными сообщениями навижна.
|
|
25.07.2006, 16:15 | #4 |
Участник
|
100/WOList.COUNT
замени на 10000/WOList.COUNT Цитата:
Пример: 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 |
Участник
|
Да и вообще step:=ROUND(100/WOList.COUNT,1,'='); это неправильно.
Если у тебя будет количество записей 100000, то твой шаг будет равен 0 !!!!!!! Как правильно - смотри выше !!! Прошу прощения. Не понял, что речь идет о control, а не диалоге. Цитата:
А причина, как и писал - шаг задается неверно. Действовать надо: Цитата:
Пример:
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 |
Участник
|
Спасибо всем за ответы. Всё получилось.
2randrews: да, вместо CurrForm.Update надо было просто написать CurrForm.ProgressBar.UPDATE Где ProgressBar - имя контрола. Цитата:
Да и вообще step:=ROUND(100/WOList.COUNT,1,'='); это неправильно.
Если у тебя будет количество записей 100000, то твой шаг будет равен 0 !!!!!!! |
|
25.07.2006, 17:01 | #7 |
Участник
|
Цитата:
Но изящней всё-таки, если шкала будет заполняться от 0 до 100%, а не до какого-либо значения, в зависимости от количества записей.
Код: ... WOList.MODIFY; step:=step+1; progress:=ROUND(100*step/counter); // counter:=WOlist.COUNT CurrForm.ProgBar.UPDATE; |
|
20.11.2007, 14:04 | #8 |
Участник
|
Ребята, есть еще один вопрос в тему! Если нет кол-ва записей? Например, у меня идет передача данных между КПК и Навижином - как привязать прогресс-бар к выполнению этой операции - фактически привязка ко времени выполнения операции?
|
|
20.11.2007, 14:18 | #9 |
Участник
|
Цитата:
Мое мнение - сначала определите конечную точку от чего считать (для передачи данных между 2 системами - кол-во строк, символов в файле передачи, бит и т.д.), а потом считайте %. |
|
20.11.2007, 14:26 | #10 |
Участник
|
Вместо прогрессбара в данном случае я бы поставил диалогиовое окно, которое бы говорило пользователю, что сейчас передается (какой блок данных, например). Можно еще при этом крутить слэш (как в DOS ), что б пользователь знал, что передача идет, а не зависла.
|
|