|
Вопрос # 210/ вопрос открыт / |
|
Доброе время суток, господа программисты. Как связать ProgressBar с каким-нибудь процессом,
допустим у меня есть кнопка, по нажатию которой происходит долговремненный процесс. Заранее благодарен.
 |
Вопрос задал: 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;.
Удачи Вам.
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|