Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 210

/ вопрос открыт /

Доброе время суток, господа программисты. Как связать ProgressBar с каким-нибудь процессом,
допустим у меня есть кнопка, по нажатию которой происходит долговремненный процесс. Заранее благодарен.

Geron Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Geron (статус: 1-ый класс)
Вопрос отправлен: 22 декабря 2006, 15:48
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Разобём ваш вопрос на 2 части.
1) как работать с ProgressBar. Для этого вам надо знать о таких свойствах.
Max и min - задают значения максимума и минимума, который отображает компонент.
Position - "позиция" должна находиться между min и Max (по значению). Только не советую часто устанавливать свойство position, так как компонент пересоздаёт себя (если так можно сказать) - а это отбирает много времени.
Проще написать что то в виде
if PB1.Position<>CPos then PB1.Position:=CPos;
Но также не стоит забывать, что если прогрессбар занимает 50 пикселей, а разница max-min равна 100, то пользователь не заметит изменения position на еденицу (правда в половине случаев).
Также есть интересные свойства
Smooth - сделать прогресс соцельным, без разбиения на "кубики"
Orientation - вертикальный или горизонтальный он у вас будет.
Step - это свойсво указывает, на скоко поменяется position при вызове метода StepIt; (типа "сделать шаг")
2)теперь разбирём как делать длиные расчёты.
Обычно тут есть два подхода - просто цикл, который ужасно тормозит интерфейс и поток, в котором тот же цикл, но интерфейс в поряде. Но как минус, нужно делать обновления через синхронизацию.
Покажу пример с циклом
PB1.max:=MyMax;
PB1.Position:=0;
for i:=1 to MyMax do
begin
//Делаем полезную работу
PB1.Position:=i;
Application.ProcessMessage;
end;
С потоком почти аналогично.
Но самая большая проблема возникает тогда, когда конец сложно определить. Например вы выполняете поиск по диску. Тут можно сделать следующее.
Классический майкрософтовский - прогресс бар бегает по кругу и от процесса слабо зависит.
Второй тоже майкрософтовский (в броузере используется) - за каждый шаг прогресс продвигается на половину (третью часть) незаполненного пространства справа. Таким образом он никогда не дойдёт до конца. А когда процесс будет завершён - мы можем вручную его "додвинуть"

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 22 декабря 2006, 17:07

Ответ #2. Отвечает эксперт: Новаковский Юрий Аврамович

Здравствуйте, Geron!
От себя могу добавить, если у Вас есть цикл обработки Вашего процесса вызвайте в нем

ProgressBar1.StepIt;

Полоска переместиться на ProgressBar1.Step позиций, по умолчанию ProgressBar1.Step:=10;.

Удачи Вам.

Ответ отправил: Новаковский Юрий Аврамович (статус: 4-ый класс)
Время отправки: 25 декабря 2006, 09:30


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:48
Выполнено за 0.02 сек.