Форум: "Основная";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];
ВнизПеременные Найти похожие ветки
← →
Piroman (2003-07-19 11:36) [0]Есть цикл, который выполняется очень долго. На форме кнопка (Прервать), в которой OnClick:
IsExit:=true;
В цикле проверяюif IsExit then break;
Переменную IsExit необходимо объявить с каким-то параметром, каким?
Или есть другие способы прервать запущенный цикл?
← →
Palladin (2003-07-19 11:38) [1]у переменных нет никаких параметров
Application.ProcessMessages вставь в цикл
← →
Anatoly Podgoretsky (2003-07-19 11:41) [2]Написано правильно, другие пути искать не нужно.
← →
Piroman (2003-07-19 12:00) [3]Если в цикле стоит Application.ProcessMessages, это не спасает от "старого" значеня переменной, которое было при запуске процедуры.
← →
Palladin (2003-07-19 12:04) [4]поясни
← →
Anatoly Podgoretsky (2003-07-19 12:13) [5]Так ты что не присваиваешь начальное значение при запуске, ты это зря.
← →
Palladin (2003-07-19 12:18) [6]Ах, так вот что это значит :) Чет я сразу не сообразил...
Ужас какой...
← →
Piroman (2003-07-19 12:46) [7]>Так ты что не присваиваешь начальное значение при запуске, ты это зря.
Нет, я не это имел в виду.
Поясняю:
В начале процедуры, в которой цикл, естественно IsExit:=false;
Потом, если даже в другой процедуре выполняется IsExit:=true;, в цикле остается false.
В CBuilder это решалось, если перед описанием переменной написать static (вроде). Т.е. изменяя значение переменной в одной процедуре оно изменялось во всех, даже запущенных до этого.
← →
Palladin (2003-07-19 12:54) [8]код давай
← →
Piroman (2003-07-19 13:13) [9]На этом компе Delphi нет, поэтому, приблизительно:
...
var
IsExit:boolean;
...
procedure TForm1.OnButton1Click(Sender:TObject);
begin
IsExit:=false;
repeat //Очень долгий по времени цикл
...
if IsExit then break;
Application.ProcessMessages;
...
until false; //для простоты
if IsExit then
ShowMessage("Прервано пользователем.");
...
end;
procedure TForm1.OnStopClick(Sender:TObject);//нажатие кнопки "Прервать"
begin
IsExit:=true;
end;
← →
Palladin (2003-07-19 13:17) [10]ну и что?
все верно написано
где у тебя что не сохраняется? или остается?
← →
Piroman (2003-07-19 13:18) [11]Ну, дык, не прерывается!
← →
Palladin (2003-07-19 13:20) [12]не может такого быть...
← →
jack128 (2003-07-19 14:59) [13]2 варианта
либо у тебя или в OnStopClick или в OnButton1Click обявлна локальная пременная IsExit
либо там где у тебя многоточия значение IsExit меняет...
если убратьиз кода многоточия, то все работает
Да, есть еще один вариант: нас подкалывают ;-)
← →
WarLord (2003-07-19 21:14) [14]
> var
> IsExit:boolean;
> ...
>
> procedure TForm1.OnButton1Click(Sender:TObject);
> begin
> IsExit:=false;
> repeat //Очень долгий по времени цикл
> ...
Application.ProcessMessages; //сначала проверяем очередь сообщений
> if IsExit then break;
> ...
> until false; //для простоты
> if IsExit then
> ShowMessage("Прервано пользователем.");
> ...
> end;
>
> procedure TForm1.OnStopClick(Sender:TObject);//нажатие кнопки
> "Прервать"
> begin
> IsExit:=true;
> end;
← →
Del (2003-07-20 03:07) [15]Проще Thread сделать!
← →
Piroman (2003-07-21 10:13) [16]Все! Пора Delphi сносить. У меня не работает, а у друга работает.
Спасибо, Palladin.
← →
Immortal_Death (2003-07-21 14:58) [17]так если для каждого большого и среднего цикла липить новый поток...
нафига усложнять?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c