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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2008, 14:25   #11
ben95
Новичок
Джуниор
 
Аватар для ben95
 
Регистрация: 22.12.2007
Сообщений: 204
По умолчанию

Цитата:
Сообщение от AidarBik Посмотреть сообщение
Так он отправляет это сообщение главной форме, а ben95 - текущей. Она не обязательно главная, поэтому приложение не обязательно закроется.
ну почимо если на глвной фороме разместить бутон1 и прописать клосе то при клике бутон на главной форме закроется всё приложение
я всё это взял из книги библия дельфий Фленова
ben95 вне форума Ответить с цитированием
Старый 04.01.2008, 14:28   #12
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Цитата:
Так он отправляет это сообщение главной форме, а ben95 - текущей.
А, в этом смысле имелось в виду... Все равно тогда не ясно, почему не
Application.MainForm.Close, зачем извращаться над псевдопосылкой сообщения, чем это принципиально отличается, кроме как количеством букав

ben95, при закрытии главной формы - приложение завершится, с этим никто не спорит, но именно главной формы, а не любой. И написано это не в Библии Дельфи, а в более авторитетном источнике - исходниках VCL:
Код:
procedure TCustomForm.Close;
var
  CloseAction: TCloseAction;
begin
  if fsModal in FFormState then
    ModalResult := mrCancel
  else
    if CloseQuery then
    begin
      if FormStyle = fsMDIChild then
        if biMinimize in BorderIcons then
          CloseAction := caMinimize else
          CloseAction := caNone
      else
        CloseAction := caHide;
      DoClose(CloseAction);
      if CloseAction <> caNone then
        if Application.MainForm = Self then Application.Terminate   // <-- здесь
        else if CloseAction = caHide then Hide
        else if CloseAction = caMinimize then WindowState := wsMinimized
        else Release;
    end;
end;

Последний раз редактировалось Ins; 04.01.2008 в 14:32.
Ins вне форума Ответить с цитированием
Старый 04.01.2008, 14:36   #13
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию

Еще один способ - PostQuitMessage(0);
AidarBik вне форума Ответить с цитированием
Старый 04.01.2008, 14:52   #14
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Просто почему я вписал такой метод, потому что большенство присутствующих методов обрывают то процесс или получения сообщений )) таким образом возможен не корректный выход программы и соответственно не срабатывание некоторых событий форм.
BOBAH13 вне форума Ответить с цитированием
Старый 04.01.2008, 15:00   #15
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Вообще, строго говоря, хоть способов и много, но они между собой отличаются, и выбрать тот или другой нужно в зависимости от ситуации:

1. ExitProcess или TerminateProcess самое "грубое" завершение. Процесс немедленно завершается, никакая финализация не производится, никаких возможностей прервать завершение процесса либо сохранить данные после вызова нет.
2. Halt - чуть более мягкое завершение. Перед завершением выполняется финализационный код юнитов, также вызывается ExitProc.
3. PostQuitMessage - еще более мягкое. Сообщение о завершении кладется в очередь, но выполнение кода не прерывается, он продолжает выполнение с того же места. Перед закрытием обрабатываются все сообщения из очереди (кроме очереди виртуального ввода, сообщений WM_PAINT и WM_TIMER из-за их низкого приоритета) и вызывается Halt
4. Application.Terminate - еще мягче. Вызывается CallTerminateProcs, затем - PostQuitMessage. При этом есть возможность прервать завершение процесса из одной из TerminateProcs, вернув в ней False, а также выполнить некоторые действия.
5. Закрытие главной формы - еще мягче. Есть возможность прервать закрытие из обработчика OnCloseQuery и выполнить очистку/сохранение результатов. Если закрытие разрешено - вызывается Application.Terminate

Последний раз редактировалось Ins; 04.01.2008 в 15:22.
Ins вне форума Ответить с цитированием
Старый 04.01.2008, 16:30   #16
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Ну надо же, какое бурное обсуждение простого вопроса! Кстати, вопрос был о завершении приложения, которое может быть и просто консольным, без всяких форм.

Ins, огромное спасибо за подробности.
Jeni вне форума Ответить с цитированием
Старый 05.01.2008, 15:23   #17
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию

Если консольное, то Exit.
AidarBik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Завершение действия SunKnight Общие вопросы Delphi 3 12.02.2008 18:25
Завершение процесса Terran Win Api 3 04.01.2008 12:09
Делаю сайты, пишу маленькие/большие скрипты. Пишу веб-приложения и приложения под Windows. SkyM@n Фриланс 3 29.12.2007 16:21
Завершение проги Washington Общие вопросы Delphi 15 20.09.2007 15:14
Завершение приложения, вместе с ОС John_chek Общие вопросы Delphi 5 08.06.2007 16:00