Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.031 c
14-1081686789
Thor
2004-04-11 16:33
2004.05.09
самоубийство.


1-1082382179
Ruslan
2004-04-19 17:42
2004.05.09
Как поместить картинку в заголовок ListView?


3-1081851727
CyBeR
2004-04-13 14:22
2004.05.09
Как вставить результат запроса Query в таблицу???.


14-1082558962
Frozzen
2004-04-21 18:49
2004.05.09
Объявление процедуры


1-1082437216
Learner
2004-04-20 09:00
2004.05.09
stdcall Есть ли принципиальная разница ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский