Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как прервать выполнение цикла ? [D7, WinXP]


kyn66 ©   (2006-03-16 12:12:00) 

Уважаемые мастера, внутри моего цикла выполняется проигрывание звукового файла, получаемого из ресурса. Как мне при необходимости прервать этот цикл. Кнопка, при клике по которой выполняется цикл блокируется, а хотелось при повторном клике по ней этот цикл прервать. ProcessMessage почему-то не помогает.

procedure TMainFrm.SayButtonClick(Sender: TObject);
Var
 i, j : Integer;
begin
 IsSay := not IsSay;
 Screen.Cursor := crHourGlass;
 Application.Processmessage;
 with SayStringGrid do
  for i := 0 to Pred(RowCount) do
   for j := 0 to Pred(ColCount) do
    if Cells[j, i] <> '' then
     begin
       SayDigit(Cells[j, i], 2);
       Delay(500);
       if not IsSay then
        Break;
     end;
 Screen.Cursor := crDEfault;
end;


kyn66   (2006-03-16 13:15:00) [1]

>>Сергей М
Спасибо за подсказку, помогло


kyn66   (2006-03-16 12:48:00) [2]

> Я думал у него Button.enabled:= false
Нет, форма вся блокируется. Для этого Processmessages и нужен....


balepa   (2006-03-16 12:38:00) [3]

p.s. Я думал у него Button.enabled:= false


balepa   (2006-03-16 12:34:00) [4]


> Как это "при чём"? Проигрывание же в основном потоке идёт.
> ..

Да проехали уже


Ega23   (2006-03-16 12:33:00) [5]


> А причем тут ProcessMessage?


Как это "при чём"? Проигрывание же в основном потоке идёт...


Сергей М.   (2006-03-16 12:29:00) [6]

procedure TMainFrm.SayButtonClick(Sender: TObject);
Var
i, j : Integer;
begin
If IsSay then
   IsSay := False
else begin
  IsSay := True;
  while IsSay do begin
// вот она, та самая итерация цикла !
    ...
      Application.ProcessMessages;
    ...    
  end;
end;
end;


kyn66   (2006-03-16 12:24:00) [7]

>Сергей М
> Его следует разместить в итерации цикла, а не перед входом в цикл.
Это как понять? Всмысле здесь?

with SayStringGrid do
 for i := 0 to Pred(RowCount) do
  for j := 0 to Pred(ColCount) do
   if Cells[j, i] <> '' then
    begin
      Application.Processmessage; <-- ???
      SayDigit(Cells[j, i], 2);
      Delay(500);
      if not IsSay then
       Break;
    end;


balepa   (2006-03-16 12:17:00) [8]

Сделай еще одну кнопку
А причем тут ProcessMessage?


Сергей М.   (2006-03-16 12:15:00) [9]

Ты не туда влупил Application.Processmessages.
Его следует разместить в итерации цикла, а не перед входом в цикл.


Наверх

Титульная страница Поиск, карта сайта Написать письмо