Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизНужно выйти из цикла по нажатии кнопки ... как? Найти похожие ветки
← →
rams (2004-04-21 10:26) [0]Здравствуйте! Помогите в очередной раз пожалуйста.
На главной форме две кнопки : Button1 (Start) и Button2 (Stop).
По нажатию Button1 и Button2 выполняется
procedure TForm1.Button1Click(Sender: TObject);
begin
flag:=true;
repeat
Memo1.Lines.Add(TimeToStr(Time));
until flag;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
flag:=false;
end;
Так вот эта программа зацикливается на выводе текущего времени, и не обрабатывает нажатие других кнопок. А требуется, чтобы этот цикл прекратился по нажатию кнопки Button2(Stop)
Как это делается по уму?
← →
rams (2004-04-21 10:26) [0]Здравствуйте! Помогите в очередной раз пожалуйста.
На главной форме две кнопки : Button1 (Start) и Button2 (Stop).
По нажатию Button1 и Button2 выполняется
procedure TForm1.Button1Click(Sender: TObject);
begin
flag:=true;
repeat
Memo1.Lines.Add(TimeToStr(Time));
until flag;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
flag:=false;
end;
Так вот эта программа зацикливается на выводе текущего времени, и не обрабатывает нажатие других кнопок. А требуется, чтобы этот цикл прекратился по нажатию кнопки Button2(Stop)
Как это делается по уму?
← →
Рамиль © (2004-04-21 10:28) [1]По уму вот эта строчка вешается на таймер
Memo1.Lines.Add(TimeToStr(Time));
А по нажатию на кнопку Timer.Enabled := false;
← →
Рамиль © (2004-04-21 10:28) [1]По уму вот эта строчка вешается на таймер
Memo1.Lines.Add(TimeToStr(Time));
А по нажатию на кнопку Timer.Enabled := false;
← →
Reindeer Moss Eater © (2004-04-21 10:28) [2]until flag;
flag:=false;
Даже если программа и будет обрабатывать нажатие кнопки, то такой цикл все равно не прекратится.
← →
Reindeer Moss Eater © (2004-04-21 10:28) [2]until flag;
flag:=false;
Даже если программа и будет обрабатывать нажатие кнопки, то такой цикл все равно не прекратится.
← →
Гаврила (2004-04-21 10:31) [3]Application.ProcessMessages в теле цикла
при этом программа будет обрабатывать нажатия кнопок
по нажатию кнопки выставляем флаг, в теле цикла проверяем флаг
если флаг выставлен - Break;
← →
Гаврила (2004-04-21 10:31) [3]Application.ProcessMessages в теле цикла
при этом программа будет обрабатывать нажатия кнопок
по нажатию кнопки выставляем флаг, в теле цикла проверяем флаг
если флаг выставлен - Break;
← →
Рамиль © (2004-04-21 10:35) [4]
> то такой цикл все равно не прекратится
Прекратится
procedure TForm1.Button1Click(Sender: TObject);
begin
flag := false;
repeat
Memo1.Lines.Add(TimeToStr(Time));
Application.ProcessMessages;
until flag;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
flag := true;
end;
Но это некрасиво.
Только я понял как цикл у него работал с flag:=true :)
← →
Рамиль © (2004-04-21 10:35) [4]
> то такой цикл все равно не прекратится
Прекратится
procedure TForm1.Button1Click(Sender: TObject);
begin
flag := false;
repeat
Memo1.Lines.Add(TimeToStr(Time));
Application.ProcessMessages;
until flag;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
flag := true;
end;
Но это некрасиво.
Только я понял как цикл у него работал с flag:=true :)
← →
vengo (2004-04-21 10:37) [5]В цикле Application.ProcessMessages.
В обработчике Button2Click: flag := true;
← →
vengo (2004-04-21 10:37) [5]В цикле Application.ProcessMessages.
В обработчике Button2Click: flag := true;
← →
rams (2004-04-21 10:39) [6]
> Reindeer Moss Eater © (21.04.04 10:28) [2]
> until flag;
>
> flag:=false;
Конечно же имел в виду flag:=true
> Гаврила (21.04.04 10:31) [3]
> Application.ProcessMessages в теле цикла
> при этом программа будет обрабатывать нажатия кнопок
> по нажатию кнопки выставляем флаг, в теле цикла проверяем
> флаг
> если флаг выставлен - Break;
А можно поподробнее - как должно выглядеть тело цикла?
← →
rams (2004-04-21 10:39) [6]
> Reindeer Moss Eater © (21.04.04 10:28) [2]
> until flag;
>
> flag:=false;
Конечно же имел в виду flag:=true
> Гаврила (21.04.04 10:31) [3]
> Application.ProcessMessages в теле цикла
> при этом программа будет обрабатывать нажатия кнопок
> по нажатию кнопки выставляем флаг, в теле цикла проверяем
> флаг
> если флаг выставлен - Break;
А можно поподробнее - как должно выглядеть тело цикла?
← →
rams (2004-04-21 10:41) [7]Пока спрашивал - ответили.
Попробую.
Спасибо.
← →
rams (2004-04-21 10:41) [7]Пока спрашивал - ответили.
Попробую.
Спасибо.
← →
Anatoly Podgoretsky © (2004-04-21 11:01) [8]Если не обращать внимание true/false то из этого цикла он бы выскочил с ошибкой еще не успев отпустить палец от кнопки, но ето он еще успеет проверить, как только устранит ошибки.
← →
Anatoly Podgoretsky © (2004-04-21 11:01) [8]Если не обращать внимание true/false то из этого цикла он бы выскочил с ошибкой еще не успев отпустить палец от кнопки, но ето он еще успеет проверить, как только устранит ошибки.
← →
vl_chel © (2004-04-21 11:15) [9]Запускать цикл в отдельном потоке
и если надо то Suspend или terminate
← →
vl_chel © (2004-04-21 11:15) [9]Запускать цикл в отдельном потоке
и если надо то Suspend или terminate
← →
PVOzerski © (2004-04-21 11:33) [10]Если просто "прибить" поток из другого, можно много мусора наделать и даже порушить какие-то динамические структуры. Так что это можно делать только в некоторых случаях. Обычно же "прибиваемый" поток сначала должен быть об этом оповещен, чтобы успеть сделать некие действия (закрыть файлы, высвободить выделенную динамическую память, вызвать деструкторы объектов...)
← →
PVOzerski © (2004-04-21 11:33) [10]Если просто "прибить" поток из другого, можно много мусора наделать и даже порушить какие-то динамические структуры. Так что это можно делать только в некоторых случаях. Обычно же "прибиваемый" поток сначала должен быть об этом оповещен, чтобы успеть сделать некие действия (закрыть файлы, высвободить выделенную динамическую память, вызвать деструкторы объектов...)
← →
vl_chel © (2004-04-21 13:51) [11]destrucror Destroy; override;
и
FreeOnTerminate := True;
← →
vl_chel © (2004-04-21 13:51) [11]destrucror Destroy; override;
и
FreeOnTerminate := True;
← →
WebErr © (2004-04-21 13:59) [12]Поставь таймер и по малому(!) интервалу обрабатывай событие Button1Click, а вместо flag можно Interval > 0.
т.е.
Button1Click -> Timer1.Interval := 100;
Button2Click -> Timer1.Interval := 0;
Timer1Timer -> Memo1.Lines.Add(TimeToStr(Time));
Программеру голова дана не только для того, чтобы в олимпиадах участвовать! :))))
← →
WebErr © (2004-04-21 13:59) [12]Поставь таймер и по малому(!) интервалу обрабатывай событие Button1Click, а вместо flag можно Interval > 0.
т.е.
Button1Click -> Timer1.Interval := 100;
Button2Click -> Timer1.Interval := 0;
Timer1Timer -> Memo1.Lines.Add(TimeToStr(Time));
Программеру голова дана не только для того, чтобы в олимпиадах участвовать! :))))
← →
rams (2004-04-21 15:53) [13]Всем спасибо.
Попробовал [4] - вполне устроило. Далее поглядим.
← →
rams (2004-04-21 15:53) [13]Всем спасибо.
Попробовал [4] - вполне устроило. Далее поглядим.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.037 c