![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Всем доброго времени суток.
Задача такая: В одной форме нажимается кнопка->Запускается ProgressBar ->он заканчивает и появляется скрытая кнопка, НО 1)нужно чтобы была возможность регулировать скорость PB из другой формы, а значит скорее всего глобальная переменная 2)нужно чтобы пользователь не мог что либо нажать до тех пор, пока PB не закончит Пробовал: Код:
procedure TForm1.Button1Click(Sender: TObject); begin for i:=i to Max do begin proc := ((i * 100) div Max); ProgressBar1.Position := proc; end; end; в таком случае, без Application.ProcessMessages, соблюдается пункт 2, но необходимо чтобы переменные i и max были локальными (а мне нужно менять max, а соответственно и скорость PB из другой формы) Пробовал ещё: Код:
procedure TForm5.Button1Click(Sender: TObject); begin Tmr1.Enabled:=true; end; procedure TForm5.tmr1Timer(Sender: TObject); begin i:=i+1; PB1.Position:=i; if i=100 then Tmr1.Enabled:=False; end; Тут вроде все здорово, можно менять скорость PB изменением интервала таймера, но пользователь может нажать на другие элементы формы пока PB выполняется, а это плохо. Команда sleep останавливает и таймер, да и корректировать ее под каждую скорость PB неудобно. Прошу, люди добрые, как это реализовать? Мб кто подкинет ещё более гениальную идею, либо исправит дефекты моих способов? Запарился искать в яндексе... =\ Последний раз редактировалось lmikle, 17.01.2013 в 02:42. |
Этот пользователь сказал Спасибо R3VeRSe за это полезное сообщение: | ||
OTVET (18.01.2013)
|
#2
|
|||
|
|||
![]() Ну, если 1й вариант в принципе устраивает, то переделай цикл на while и можешь переменные делать глобальными.
ЗЫ. Цикл for сначала вычисляет условие остановки, и потом начинает выполнять тело цикла, соответсвенно, изменять границы цикла внутри него нельзя. Цикл while проверяет условие остановки на каждой итерации. ЗЗЫ. Над более правильным решением лень думать. Надо знать конкретную задачу, что бы подсказать что-то дельное. |
#3
|
|||
|
|||
![]() Решил задачу таким образом:
Код:
procedure TForm1.Button1Click(Sender: TObject); begin i:=1; while i <> 10 do begin i:=i+1; ProgressBar1.Position:=i; sleep(s); end; end; Программа не юзабельна пока PB не закончит, а время выполнения регулируется переменной s. Спасибо за подсказку. |
#4
|
|||
|
|||
![]() в нормальных программах, если пользователь не должен чегото нажать до окончания процесса, то это чтото (кнопка,меню) выключается ,либо выводится модальная форма с прогрессом и кнопкой стоп, а завешивать процесс циклами со слипами (и вообще слип вне отдельного потока) это жесткий анал
|
#5
|
|||
|
|||
![]() делай через таймер ... а форму enable изменяй ...
|
#6
|
|||
|
|||
![]() Я заепусь, извините, выключать по 30+ элементов, на которые юзеру нельзя нажимать пока не закончится PB, а потом их включать снова =\
|
#7
|
|||
|
|||
![]() а что тебе мешает выключить всю форму ?
form1.Enabled:=false; |
#8
|
||||
|
||||
![]() Цитата:
Пишу программы за еду. __________________ |
#9
|
|||
|
|||
![]() или в крайнем случае через цикл пробежать по всем компонентам формы ...
вариантов короче куча как сделать норм и не через ж.... |
#10
|
|||
|
|||
![]() Цитата:
Цитата:
Впринципе задача выполнена, тему можно закрывать. |
#11
|
|||
|
|||
![]() с какого перепуга оно будет отключать таймер ? отключение формы не отключает компоненты ... доступ к компонентам отключит ... но они будут работать ... щас даже протестил .. запустил таймер на 1000 и ввел в него:
Код:
form5.Enabled:=not form5.Enabled; label1.Caption:=BoolToStr(form5.Enabled); |