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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2015, 14:34   #1
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
Вопрос Закрытие модальной формы при выполняющимся цикле

На модальной форме есть долгий цикл. Как организовать выход из цикла и закрытие формы при клике на "X" в правом вернем углу формы? Есть какие-нибудь способы?
garuna вне форума Ответить с цитированием
Старый 08.02.2015, 14:36   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от garuna Посмотреть сообщение
На модальной форме есть долгий цикл. Как организовать выход из цикла и закрытие формы при клике на "X" в правом вернем углу формы? Есть какие-нибудь способы?
Вставить в тело цикла строку
Код:
Application.ProcessMessages;
northener вне форума Ответить с цитированием
Старый 08.02.2015, 14:38   #3
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

northener, пробовал, не помогло
garuna вне форума Ответить с цитированием
Старый 08.02.2015, 14:40   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от garuna Посмотреть сообщение
northener, пробовал, не помогло
Покажи как пробовал. И уточни что в том цикле делается.
northener вне форума Ответить с цитированием
Старый 08.02.2015, 14:54   #5
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

northener,

В цикле (тут несколько циклов) делается подсчет сколько раз каждое слово встречается в ListView1. Результат выводится в ListView2.
Если форма вызывается НЕ модально, то всё отлично закрывается. А вот если модально, тогда форма не закрывается пока не выполнится процедура.

Код:
begin
  FreeAndNil(_tmpIMGL);
  ListView2.Clear;
  ListView2.Items.BeginUpdate; 
  with TStringList.Create do
  try
   for i := 0 to ListView1.Items.Count-1 do
   if (Pos('.', ListView1.Items[i].SubItems[1]) > 0) and (Pos('http', ListView1.Items[i].SubItems[1]) > 0)
   then
   begin
    Add(ListView1.Items[i].SubItems[1]);
    if Application.Terminated  // проверка на закрытие
    then
    begin
     ListView2.Items.EndUpdate;
     Exit;
    end;
   end;
   Sorted:= True;
   CurrentValue:= Strings[0];
   C := 1;
   for i := 1 to Count -1 do
   if Strings[i] = CurrentValue then inc(C)
   else
   begin
    newList:= ListView2.Items.Add();
    newList.Caption:= CurrentValue;
    newList.SubItems.Add(IntToStr(C));
    CurrentValue := Strings[i];
    C:= 1;
    Application.ProcessMessages;
    if Application.Terminated // проверка на закрытие
    then
    begin
     ListView2.Items.EndUpdate;
     Exit;
    end;
   end;
   newList:= ListView2.Items.Add();
   newList.Caption:= CurrentValue;
   newList.SubItems.Add(IntToStr(C));
  finally
   Free;
  end;
  ListView2.SortType := stNone;
  ListView2.CustomSort(@LVCompareEx, 0);
  for i:=0 to ListView2.Items.Count-1 do
  begin
   for j:= ListView1.Items.Count-1 downto 0 do
   begin
    if Pos(listView2.Items[i].Caption, ListView1.Items[j].SubItems[1]) > 0 then
    begin
     if Application.Terminated // проверка на закрытие
     then
     begin
      ListView2.Items.EndUpdate;
      Exit;
     end;
     ListView2.Items[i].SubItems.Add(ListView1.Items[j].Caption);
     ListView2.Items[i].SubItems.Add(ListView1.Items[j].SubItems[1]);
     Break;
    end;
   end;
  end;
  _tmpIMGL:= TImageList.Create(nil);
  _tmpIMGL.AllocBy:= ListView2.Items.Count;
  ListView2.SmallImages:= _tmpIMGL;
  for i:=0 to ListView2.Items.Count-1 do
  begin
   bm:= nil;
   try
    bm:= GetICO(ListView2.Items[i].Caption, True);
    ListView2.Items[i].ImageIndex:= _tmpIMGL.Add(bm, nil);
   finally
    FreeAndNil(bm);
   end;
   if Application.Terminated // проверка на закрытие
   then
   begin
    ListView2.Items.EndUpdate;
    Exit;
   end;
  end;
  ListView2.Items.EndUpdate;
 end;

Последний раз редактировалось garuna; 08.02.2015 в 14:58.
garuna вне форума Ответить с цитированием
Старый 08.02.2015, 15:06   #6
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

заменил
Код:
 if Application.Terminated // проверка на закрытие
 then
на
Код:
if sCancel // sCancel переменная, которая установливил в True на событии OnCloseQuery
then

но всё равно закрывается только после того как выполнится процедура
garuna вне форума Ответить с цитированием
Старый 08.02.2015, 15:12   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
  while True do begin
    //здесь тело цикла
    Application.ProcessMessages;
    if ModalResult<>mrNone then Break;  // или Exit если послецикла нет
  end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.02.2015, 15:22   #8
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Аватар,

Благодарю! Теперь всё ОК
garuna вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрытие модальной формы в другом потоке m9yt C# (си шарп) 6 19.04.2013 18:37
Закрытие формы при потере фокуса werrey Общие вопросы Delphi 11 19.11.2011 14:08
Уничтожение модальной формы AndreyK Общие вопросы Delphi 3 15.03.2011 01:24
Закрытие формы при работе с SelectDirectory Shouldercannon Общие вопросы Delphi 5 14.07.2010 19:51
Проблема при использовании модальной формы a1ias Помощь студентам 10 14.11.2008 17:29