Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.05.2015, 10:21
shtrih shtrih вне форума
Прохожий
 
Регистрация: 30.04.2015
Сообщения: 7
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию Не закрывается форма

Добрый день!

Есть программа, которая запускает по Speedbutton. Когда она выполняется, я нажимаю на крестик формы, но форма закрывается только, когда программа полностью отработает. Почему? И как сделать, чтобы она прерывалась? (Каждый раз делать проверки на Close мне кажется не правильно)
Код:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Application.Terminate;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
 SpeedButton1.Enabled := False;

 ProgressBar1.Position:=0;

 ProgressBar1.Position:=ProgressBar1.Position+1;
 ProgressBar1.Update;
...................................................
 ProgressBar1.Position:=ProgressBar1.Position+1;
 ProgressBar1.Update;
.................................
end;
Админ: пользуемся тегами для формления кода!

Последний раз редактировалось Admin, 06.05.2015 в 19:28.
Ответить с цитированием
  #2  
Старый 06.05.2015, 16:18
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
форма закрывается только, когда программа полностью отработает
Так оно и есть.
Цитата:
И как сделать, чтобы она прерывалась?
Каждый раз делать проверки (увы и ах)
Например так

Код:
ProgressBar1.Position:=ProgressBar1.Position+1;
ProgressBar1.Update;
if ModalResult<>0 then Exit;
.................................................. .
ProgressBar1.Position:=ProgressBar1.Position+1;
ProgressBar1.Update;
if ModalResult<>0 then Exit;
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
shtrih (12.05.2015)
  #3  
Старый 07.05.2015, 04:49
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Наверное лучше делать так, хотя общий смысл данного действа остался не понятен
Код:
while ProgressBar1.Position < ProgressBar1.Max do
begin
 ProgressBar1.Position:=ProgressBar1.Position+1;
 ProgressBar1.Update;
 if ModalResult<>0 then Exit;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
shtrih (12.05.2015)
  #4  
Старый 07.05.2015, 10:01
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Наверно у человека вместо многоточий какие-то полезные вычисления делаются. И каждый раз разные. Но - автора - в студию!
Ответить с цитированием
  #5  
Старый 07.05.2015, 15:30
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от icWasya
Наверно у человека вместо многоточий какие-то полезные вычисления делаются...
Тогда ему такой вариант не подойдёт, проверку нужно производить совместно с вычислениями
Ответить с цитированием
  #6  
Старый 12.05.2015, 14:57
shtrih shtrih вне форума
Прохожий
 
Регистрация: 30.04.2015
Сообщения: 7
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
Так оно и есть.

Каждый раз делать проверки (увы и ах)
Например так

Код:
ProgressBar1.Position:=ProgressBar1.Position+1;
ProgressBar1.Update;
if ModalResult<>0 then Exit;
.................................................. .
ProgressBar1.Position:=ProgressBar1.Position+1;
ProgressBar1.Update;
if ModalResult<>0 then Exit;
Спасибо. Видимо на протяжении всего кода, придётся делать так.
Ответить с цитированием
  #7  
Старый 12.05.2015, 17:03
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Кроме того, Вы даже кнопку нажать не сможете.
Ведь цикл обработки происходит так:
1) ждётся появление очередного сообщения Windows,(например нажатия SpeedButton1)
2) если есть сообщение, Выбрать его из очереди и
3) обработать.Например запустить SpeedButton1Click)
4) после обработки сообщения
5) Перейти к пункту 1)

То есть если во время выполнения длительной процедуры будете нажимать какие-нибудь кнопки на форме, их обработчики будут вызваны только после того, как эта процедура закончится.
Для того, что бы не "замораживать" интерфейс намертво, можно внутри этой длинной процедуры вызывать Application.ProcessMessages(); которая содержит внутри себя собственный цикл обработки сообщений.
[Щас закидают тухлыми помидорами ]
По этому более точный код должен быть таким
Код:
ProgressBar1.Position:=ProgressBar1.Position+1;
ProgressBar1.Update;
Application.ProcessMessages();
if ModalResult<>0 then Exit;
.................................................. .
ProgressBar1.Position:=ProgressBar1.Position+1;
ProgressBar1.Update;
Application.ProcessMessages();
if ModalResult<>0 then Exit;
И желательно на время выполнения этой длительной процедуры заблокировать (например Enabled:=false; ) те элементы интерфейса, которые могут привести к вызовам таких длительных процедур.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:57.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025