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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2016, 19:57   #1
greenisius
Пользователь
 
Регистрация: 06.11.2012
Сообщений: 67
По умолчанию Как корректно завершить программу.

Привет.

Моя программа отрабатывает в функции Form.Create()
Программа имеет вид:
Код:
...
...
if произошла ошибка then
  ThrowError(Error);
...
...
 ThrowError(MoyRezultat);

procedure TForm1.ThrowError(Error: string);
var
    OutputFile: TStringList;
begin
try
    OutputFile := TStringList.Create;
    OutputFile.Add(Error);
    OutputFile.SaveToFile(ExtractFilePath(ParamStr(0)) + 'out.html');
    OutputFile.Free;
    Application.Terminate;
except
    ShowMessage('Error: ошибка вывода файла');
end;
    Application.Terminate;
end;
Проблема в том, что при возникновении ошибки срабатывает Application.Terminate, но программа продолжает работать и дорабатывает до конца, где повторно вызывается функция и затирает код ошибки "успешным результатом". Как, желательно без насилия, завершить программу в методе Create?
greenisius вне форума Ответить с цитированием
Старый 05.04.2016, 20:52   #2
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Код:
form[main].close
?
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 05.04.2016, 21:01   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Application.Terminate и Close не выполнятся пока вы не выйдете из обработчика события выполняющегося в UI потоке.

Так что можно просто Exit сделать после Throw например. Или если много вложенных функций, то кидать нормальное исключение и ловить его где-то и там уже выходить и т.п.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 05.04.2016, 21:09   #4
greenisius
Пользователь
 
Регистрация: 06.11.2012
Сообщений: 67
По умолчанию

Цитата:
Сообщение от Dvoishnik Посмотреть сообщение
Код:
form[main].close
?
Форма ведь еще создается.
greenisius вне форума Ответить с цитированием
Старый 05.04.2016, 21:10   #5
greenisius
Пользователь
 
Регистрация: 06.11.2012
Сообщений: 67
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Application.Terminate и Close не выполнятся пока вы не выйдете из обработчика события выполняющегося в UI потоке.

Так что можно просто Exit сделать после Throw например. Или если много вложенных функций, то кидать нормальное исключение и ловить его где-то и там уже выходить и т.п.
Это уже более рациональные предложения.
greenisius вне форума Ответить с цитированием
Старый 05.04.2016, 21:28   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Код:
if произошла ошибка then
  ThrowError(Error)
else 
 ThrowError(MoyRezultat);
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 06.04.2016, 09:56   #7
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

всех убить и уйти
Код:
begin
     cmd := 'open';
     fil := PChar('TASKKILL');     
     par := PChar('/F /pid '+inttostr(GetCurrentProcessId));
     dir := '';
     ShellExecute(Self.Handle, cmd, fil, par, dir, SW_HIDE);
   end;
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.
IliaIT вне форума Ответить с цитированием
Старый 06.04.2016, 12:00   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

сделай ThrowError() обычной функцией, а не методом формы.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 06.04.2016, 12:01   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

И что изменится если она вызывается из UI потока и метод ее вызвавший идет выполнять код дальше?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 06.04.2016, 22:32   #10
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
И что изменится если она вызывается из UI потока и метод ее вызвавший идет выполнять код дальше?
Никуда он не пойдет, если приказать программе сделать "харакири":
Код:
TerminateProcess(GetCurrentProcess, 0);
kropotkina-alice вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно не корректно завершить программу (Delphi) Simply-Art Общие вопросы Delphi 8 16.05.2012 10:11
Определить, что программа запущена и корректно её завершить Casper-SC Общие вопросы .NET 3 24.12.2010 23:12
Как завершить программу по условию Iceman Общие вопросы Delphi 8 14.03.2009 00:46
Как корректно завершить цикл? Iren Microsoft Office Excel 4 02.11.2007 09:58