Вниз
Скачать: CL | DM;

Нужно выйти из цикла по нажатии кнопки ... как?   Найти похожие ветки 

← →
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;


← →
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: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;


← →
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]

Пока спрашивал - ответили.
Попробую.
Спасибо.


← →
Anatoly Podgoretsky ©   (2004-04-21 11:01) [8]

Если не обращать внимание true/false то из этого цикла он бы выскочил с ошибкой еще не успев отпустить палец от кнопки, но ето он еще успеет проверить, как только устранит ошибки.


← →
vl_chel ©   (2004-04-21 11:15) [9]

Запускать цикл в отдельном потоке
и если надо то Suspend или terminate


← →
PVOzerski ©   (2004-04-21 11:33) [10]

Если просто "прибить" поток из другого, можно много мусора наделать и даже порушить какие-то динамические структуры. Так что это можно делать только в некоторых случаях. Обычно же "прибиваемый" поток сначала должен быть об этом оповещен, чтобы успеть сделать некие действия (закрыть файлы, высвободить выделенную динамическую память, вызвать деструкторы объектов...)


← →
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));

Программеру голова дана не только для того, чтобы в олимпиадах участвовать! :))))


← →
rams   (2004-04-21 15:53) [13]

Всем спасибо.
Попробовал [4] - вполне устроило. Далее поглядим.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.03 c
14-1079149696
LiLa Ananda
2004-03-13 06:48
2004.04.11
Откровенные шуточки о Знаках Зодиака...


9-1065284888
m2003
2003-10-04 20:28
2004.04.11
Как через OpenGL вывести BMP на экран?


14-1079088621
Странник Вселенной
2004-03-12 13:50
2004.04.11
О выздоровлении от РАКА


1-1080046283
Ш-К
2004-03-23 15:51
2004.04.11
Set


3-1079360091
unvisible
2004-03-15 17:14
2004.04.11
Сортировка таблицы




   Наверх