Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2011, 21:40   #1
men232
Пользователь
 
Регистрация: 11.05.2011
Сообщений: 59
По умолчанию Как выскочить из цикла for при закрытии формы?

Доброго времени суток, случилась ситуация когда нужно прервать цикл for при закрытии формы. А то приходится ждать пока цикл завершится, сразу форма не закрывается. Знаю что за это отвечает exit, но вот извилин не хватает для решения проблемы.

Последний раз редактировалось men232; 07.10.2011 в 21:43.
men232 вне форума Ответить с цитированием
Старый 07.10.2011, 22:03   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

завести глобальную переменну closing:boolean;
затем в начале нужного вам цикла поставить: if cloosing then exit;
А при завершении программы поставить closing:=true;
Человек_Борща вне форума Ответить с цитированием
Старый 07.10.2011, 22:04   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Application.ProcessMessages; - важно
Код:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var i: Integer;
begin
  lEnd:=False;
  for i:=1 to 100000000 do begin
    Label1.Caption:=IntToStr(i);
    Application.ProcessMessages;
    if lEnd then Exit;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  lEnd:=True;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.10.2011, 22:04   #4
devote
Пользователь
 
Регистрация: 06.10.2011
Сообщений: 38
По умолчанию

while( true ) do
begin
if application.terminated then break;
end;
devote вне форума Ответить с цитированием
Старый 07.10.2011, 22:12   #5
men232
Пользователь
 
Регистрация: 11.05.2011
Сообщений: 59
По умолчанию

Человек_Борща, Аватар
Такой способ я пробовал, не помог.
devote
не сработал!
men232 вне форума Ответить с цитированием
Старый 07.10.2011, 22:14   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Такой способ я пробовал, не помог.
Я его только что сочинил, прекрасно закрывается
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.10.2011, 22:16   #7
men232
Пользователь
 
Регистрация: 11.05.2011
Сообщений: 59
По умолчанию

Возможно то что цикл не на главной формы, и цикл в функции.

вот сама процедура:
Код:
procedure GetUpdateFile(LB1, LB2 :TlistBox);
var ClPH, ClPA, ClPB:string;
I: Integer;
begin
CLOSING:=false;
for I := 0 to MainForm.ListBox1.Count -1 do
  begin
    ClPH:= copy(LB1.Items[I], 0, pos(':', LB1.Items[I]) - 1);
    ClPA:= copy(LB1.Items[I], pos(':', LB1.Items[I]) + 1, Length(LB1.Items[I]));

    MainForm.LAB_STATUS_DOWN.Caption:=DW_PATCHLIST + ClPH;
    if FileExists(Dir+ClPH) then
    ClPB:= MD5DigestToStr(MD5File(Dir+ClPH));
    // = - = - = - = - = -

    if not ( FileExists(Dir+ClPH) ) or ( ClPA <> ClPB ) then
    begin
      LB2.Items.Add(ClPH);
      MainForm.LAB_STATUS_DOWN.Caption:=DW_OUTDATE + ClPH;
      SendMessage(LB2.Handle, WM_VSCROLL, 1, 0);
    end;

    Application.ProcessMessages;
    if CLOSING then exit;
    
  end;
  MainForm.LAB_STATUS_DOWN.Caption:=DW_DONE;
end;
И вот что у меня в on close:
Код:
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CLOSING:=true;
//LoadForm.Free;
end;
Получается так что в событии OnClose, код не выполняется пока цикл не завершится.

Последний раз редактировалось Stilet; 08.10.2011 в 11:32.
men232 вне форума Ответить с цитированием
Старый 07.10.2011, 22:23   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А откуда она вызывается? Возможно там особенности есть?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.10.2011, 22:31   #9
men232
Пользователь
 
Регистрация: 11.05.2011
Сообщений: 59
По умолчанию

в событии формы OnActive
men232 вне форума Ответить с цитированием
Старый 07.10.2011, 22:44   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Добавил в свой код. Никаких проблем нет
Код:
procedure TForm1.FormActivate(Sender: TObject);
begin
  SpeedButton1Click(SpeedButton1);
end;
вы бы в лог последовательность событий и действий выгружали, и можно сделать какие-то выводы - где теряется обработка закрытия
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 07.10.2011 в 22:49.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка при закрытии формы TotKtoNado Общие вопросы Delphi 3 03.07.2011 19:20
Как в C# при закрытии главной формы не завершать программный поток? Mixim Общие вопросы .NET 3 01.09.2010 21:32
Уничтожать созданные формы при закрытии? Как? TwiX Общие вопросы Delphi 4 09.04.2010 09:49
запуск процесса при закрытии формы RUSlan48 Общие вопросы Delphi 3 29.03.2010 21:49
Сворачивание в трей при закрытии формы xxxsas Общие вопросы C/C++ 0 22.01.2009 08:11