Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.01.2013, 01:33
R3VeRSe R3VeRSe вне форума
Прохожий
 
Регистрация: 17.01.2013
Сообщения: 4
Репутация: 10
По умолчанию Стоп пока progressbar не закончит и PB с глобальной переменной

Всем доброго времени суток.
Задача такая:
В одной форме нажимается кнопка->Запускается 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  
Старый 17.01.2013, 02:47
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, если 1й вариант в принципе устраивает, то переделай цикл на while и можешь переменные делать глобальными.

ЗЫ. Цикл for сначала вычисляет условие остановки, и потом начинает выполнять тело цикла, соответсвенно, изменять границы цикла внутри него нельзя. Цикл while проверяет условие остановки на каждой итерации.

ЗЗЫ. Над более правильным решением лень думать. Надо знать конкретную задачу, что бы подсказать что-то дельное.
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо lmikle за это полезное сообщение:
OTVET (18.01.2013), R3VeRSe (17.01.2013)
  #3  
Старый 17.01.2013, 11:29
R3VeRSe R3VeRSe вне форума
Прохожий
 
Регистрация: 17.01.2013
Сообщения: 4
Репутация: 10
По умолчанию

Решил задачу таким образом:

Код:
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  
Старый 17.01.2013, 11:55
my33oh my33oh вне форума
Новичок
 
Регистрация: 17.12.2012
Сообщения: 93
Репутация: -579
По умолчанию

в нормальных программах, если пользователь не должен чегото нажать до окончания процесса, то это чтото (кнопка,меню) выключается ,либо выводится модальная форма с прогрессом и кнопкой стоп, а завешивать процесс циклами со слипами (и вообще слип вне отдельного потока) это жесткий анал
Ответить с цитированием
  #5  
Старый 17.01.2013, 13:02
caHek-2x caHek-2x вне форума
Прохожий
 
Регистрация: 14.12.2010
Сообщения: 31
Репутация: 11
По умолчанию

делай через таймер ... а форму enable изменяй ...
Ответить с цитированием
  #6  
Старый 17.01.2013, 13:37
R3VeRSe R3VeRSe вне форума
Прохожий
 
Регистрация: 17.01.2013
Сообщения: 4
Репутация: 10
По умолчанию

Я заепусь, извините, выключать по 30+ элементов, на которые юзеру нельзя нажимать пока не закончится PB, а потом их включать снова =\
Ответить с цитированием
  #7  
Старый 17.01.2013, 13:40
caHek-2x caHek-2x вне форума
Прохожий
 
Регистрация: 14.12.2010
Сообщения: 31
Репутация: 11
По умолчанию

а что тебе мешает выключить всю форму ?
form1.Enabled:=false;
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо caHek-2x за это полезное сообщение:
OTVET (18.01.2013), R3VeRSe (17.01.2013)
  #8  
Старый 17.01.2013, 13:42
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от R3VeRSe
Я заепусь, извините, выключать по 30+ элементов, на которые юзеру нельзя нажимать пока не закончится PB, а потом их включать снова =\
кинуть их на панель и выключать панель.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо NumLock за это полезное сообщение:
OTVET (18.01.2013), R3VeRSe (17.01.2013)
  #9  
Старый 17.01.2013, 13:43
caHek-2x caHek-2x вне форума
Прохожий
 
Регистрация: 14.12.2010
Сообщения: 31
Репутация: 11
По умолчанию

или в крайнем случае через цикл пробежать по всем компонентам формы ...
вариантов короче куча как сделать норм и не через ж....
Ответить с цитированием
  #10  
Старый 17.01.2013, 13:58
R3VeRSe R3VeRSe вне форума
Прохожий
 
Регистрация: 17.01.2013
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от caHek-2x
а что тебе мешает выключить всю форму ?
form1.Enabled:=false;
Я так понял она выключает ещё и все таймеры в форме, что мне не очень подходит. Но команда полезная, спасибо.
Цитата:
Сообщение от NumLock
кинуть их на панель и выключать панель.
Более подходящий вариант, спасибо.

Впринципе задача выполнена, тему можно закрывать.
Ответить с цитированием
  #11  
Старый 17.01.2013, 14:25
caHek-2x caHek-2x вне форума
Прохожий
 
Регистрация: 14.12.2010
Сообщения: 31
Репутация: 11
По умолчанию

с какого перепуга оно будет отключать таймер ? отключение формы не отключает компоненты ... доступ к компонентам отключит ... но они будут работать ... щас даже протестил .. запустил таймер на 1000 и ввел в него:
Код:
form5.Enabled:=not form5.Enabled;
label1.Caption:=BoolToStr(form5.Enabled);
и раз в секунду мне форма включалась и выключалась .. .и значение в лэйбл менялись ... что говорит о том что выключение формы не выключает таймер итд ...
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо caHek-2x за это полезное сообщение:
OTVET (18.01.2013), R3VeRSe (17.01.2013)
Ответ


Delphi Sources

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

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

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

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


Часовой пояс GMT +3, время: 14:46.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025