Главная страница
    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.037 c
3-1081669851
ppcat
2004-04-11 11:50
2004.05.09
Проект, базы данных


3-1081854872
Andriano
2004-04-13 15:14
2004.05.09
1С-подобный генератор отчетов


14-1081877815
Zacho
2004-04-13 21:36
2004.05.09
Новосибирск


7-1079509984
Fuad
2004-03-17 10:53
2004.05.09
Как заменить файл используемый системой(Win2k, WinXP).


1-1082720979
WebErr
2004-04-23 15:49
2004.05.09
Father for Basic form





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский