Как в Делфи завершить приложение из середины процедуры?
От: demidov2  
Дата: 21.09.07 13:00
Оценка:
Привет.

Как в Делфи завершить приложение из середины процедуры? Это надо сделать при исключении. Сейчас сделано Application.Terminate. Это не подходит, т.к надо еще выгрузить длл. Заменить на raise и т.д.? Если ставлю MainForm.Close, то потом процедура продолжается.


procedure
begin
...
try
...
except
  Application.Terminate
  //MainForm.Close;
end;
...
except
...
end;
Re: Как в Делфи завершить приложение из середины процедуры?
От: OdesitVadim Украина  
Дата: 21.09.07 13:15
Оценка:
Здравствуйте, demidov2, Вы писали:


D>Если ставлю MainForm.Close, то потом процедура продолжается.


а если слудующей строкой добавить exit? это даст выход с процедуры.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Re[2]: Как в Делфи завершить приложение из середины процедур
От: demidov2  
Дата: 21.09.07 13:20
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

OV>Здравствуйте, demidov2, Вы писали:


D>>Если ставлю MainForm.Close, то потом процедура продолжается.


OV>а если слудующей строкой добавить exit? это даст выход с процедуры.


Спасибо. Да, это выход, но в проге ОЧЕНЬ много таких кусков и заменять одну строку на две долго. Часто надо будет begin — end вставлять.
Re[2]: Как в Делфи завершить приложение из середины процедур
От: demidov2  
Дата: 21.09.07 13:22
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

OV>Здравствуйте, demidov2, Вы писали:



D>>Если ставлю MainForm.Close, то потом процедура продолжается.


OV>а если слудующей строкой добавить exit? это даст выход с процедуры.


Чего же Борланд OnTerminate для Application не сделал?!
Re[3]: Как в Делфи завершить приложение из середины процедур
От: OdesitVadim Украина  
Дата: 21.09.07 13:31
Оценка:
Здравствуйте, demidov2, Вы писали:

D>Здравствуйте, OdesitVadim, Вы писали:


OV>>Здравствуйте, demidov2, Вы писали:


D>>>Если ставлю MainForm.Close, то потом процедура продолжается.


OV>>а если слудующей строкой добавить exit? это даст выход с процедуры.


D>Спасибо. Да, это выход, но в проге ОЧЕНЬ много таких кусков и заменять одну строку на две долго. Часто надо будет begin — end вставлять.

можно и по другому. Генерить ошибку с помощью Raise.
А также поставить на форму ApplicationEvents (Additional) и там перехватывать. Только для полного счастья можно генерить не обычное исключение, а наследоваться.
type EMyExc = EExcepion;

...
procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception);
begin
  if e is EMyExc then halt;//ну можно и не так жестоко выходить
end;

потом можно и фильтровать свои
... << RSDN@Home 1.2.0 alpha rev. 745>>
Re[3]: Как в Делфи завершить приложение из середины процедур
От: SeLarin Россия http://selarin.livejournal.com
Дата: 21.09.07 19:58
Оценка:
Здравствуйте, demidov2, Вы писали:

D>Чего же Борланд OnTerminate для Application не сделал?!

А нафига оно, если есть OnMessage, в котором можно обработать WM_QUIT? Я задал себе этот вопрос и полез экспериментировать. Оказалось, что WM_QUIT в OnMessage не ловится (и я, кажется, понял почему).
Если честно мне кажется, что обрабатывать экстренное завершение надо перед вызовом Application.Terminate или вообще плюнуть на такую обработку, понадеявшись на нормальное завершение с очисткой используемых ресурсов самой средой выполнения.
... << RSDN@Home 1.2.0 alpha rev. 756>>
Re: Как в Делфи завершить приложение из середины процедуры?
От: Leonid Troyanovsky  
Дата: 22.09.07 09:45
Оценка:
Здравствуйте, demidov2, Вы писали:

D>Как в Делфи завершить приложение из середины процедуры? Это надо сделать при исключении. Сейчас сделано Application.Terminate. Это не подходит, т.к надо еще выгрузить длл. Заменить на raise и т.д.? Если ставлю


Не очень понятно, чем не подходит, и что препятствует выгрузке длл.
Это ж не TerminateProcess

Но, если очень хочется, можно использовать AddTerminateProc —
они выполняются до обработки WM_QUIT.
--
С уважением, LVT
Re[4]: Как в Делфи завершить приложение из середины процедур
От: Leonid Troyanovsky  
Дата: 22.09.07 09:49
Оценка:
Здравствуйте, SeLarin, Вы писали:

SL>А нафига оно, если есть OnMessage, в котором можно обработать WM_QUIT? Я задал себе этот вопрос и полез экспериментировать. Оказалось, что WM_QUIT в OnMessage не ловится (и я, кажется, понял почему).


А чего там может показаться, см. Forms.pas TApplication.ProcessMessage
    if Msg.Message <> WM_QUIT then
    begin
      Handled := False;
      if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
--
С уважением, LVT
Re[5]: Как в Делфи завершить приложение из середины процедур
От: SeLarin Россия http://selarin.livejournal.com
Дата: 22.09.07 11:57
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT>А чего там может показаться, см. Forms.pas TApplication.ProcessMessage

Ну да, я так и подумал. Просто в исходники VCL было лень залезать.
... << RSDN@Home 1.2.0 alpha rev. 756>>
Re: Как в Делфи завершить приложение из середины процедуры?
От: Суслик Россия http://www.vkkb.ru
Дата: 29.09.07 20:48
Оценка:
Здравствуйте, demidov2.

я делал так (до сих пор стыдно)

TerminateProcess(GetCurrentProcess, 0);
Re[2]: Как в Делфи завершить приложение из середины процедур
От: AngeL B. Россия  
Дата: 30.09.07 11:22
Оценка:
Здравствуйте, Суслик, Вы писали:

С>
С>TerminateProcess(GetCurrentProcess, 0);
С>


Вообще есть более мягкая процедура ExitProcess(<код возврата>)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.