Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.02;
Скачать: CL | DM;

Вниз

Странности Application.Terminate (или может мои? :)   Найти похожие ветки 

 
Pavor   (2003-05-21 07:42) [0]

Приветствую, профессионалы.

Столкнулся с таким вот странным явлением. Для начала кусок начала кода программы.

procedure Form1.OnCreate (Sender: TObject);

begin

if FindFirst("Путь1", Rez)<>0 then if FindFirst("Путь1", Rez)<>0 then
FindClose(Rez);
MessageDlg("Невозможно продолжать работу" {ну тут еще параметры});
Application.Terminate;
end;

{...типа "вычисления"}
ShowMessage("Промежуточный результат 1");

{...}
ShowMessage("Промежуточный результат 2");

{...}
ShowMessage("Промежуточный результат 3");



Теперь собственно явление. Если выполняются оба условия, появляется окно "Невозможно продолжать...", с этим все нормально. После нажатия на [OK] программа должна вырубиться. Теоритически. В конце-концов она так и делает, но перед этим проскакивают (и тут же закрываются сами)все окна ShowMessage, которые стоят после Application.Terminate;. Вот этого никак понять не могу. Если вместо Application.Terminate; поставить Exit; - срабатывает нормально. Но как все-таки закрывать программу?
Это самое ее начало, больше почти ничего написать не успел :) На форме еще компонент ICS есть. SMTP. Но его я в вышеприведенном коде никаким образом не трогаю.
Помогите, плиз...


 
Pavor   (2003-05-21 07:44) [1]

После then упустил begin, sorry.


 
Романов Р.В. ©   (2003-05-21 07:59) [2]


> Странности Application.Terminate


:)


 
Pavor   (2003-05-21 08:11) [3]

Я понимаю, что смешно :)
Но вопрос-то остается!!!


 
KoluChi ©   (2003-05-21 09:03) [4]

Application.Terminate лучше не пользоваться, а заменить на Application.MainForm.Close()
и еще добавить Exit;


 
KSergey ©   (2003-05-21 09:25) [5]

На сколько я понимаю, Application.Terminate не рубит буквально тут же приложение, а просто посылает себе сообщение о том, что не плохо бы выключиться. А потому весь последующий код продолнает спокойно работать.


 
mrcat ©   (2003-05-21 09:33) [6]

>Если выполняются оба условия, появляется окно "Невозможно продолжать...", с этим все нормально. После нажатия на [OK] программа должна вырубиться

Откуда известно, что выполняются оба условия?

if (FindFirst("Путь1", Rez) <> 0) and
(FindFirst("Путь1", Rez)<> 0) then
begin
FindClose(Rez);
MessageDlg("Невозможно продолжать работу", ...);
Application.Terminate;
end;

{...типа "вычисления"}
ShowMessage("Промежуточный результат 1");

{...}
ShowMessage("Промежуточный результат 2");

{...}
ShowMessage("Промежуточный результат 3");

end;


Работает.


 
Lord Warlock ©   (2003-05-21 09:34) [7]

procedure Form1.OnCreate (Sender: TObject);

begin

if FindFirst("Путь1", Rez)<>0 then if FindFirst("Путь1", Rez)<>0 then
FindClose(Rez);
MessageDlg("Невозможно продолжать работу" {ну тут еще параметры});
Application.Terminate;
end;

if not Application.Terminated then
begin
{...типа "вычисления"}
ShowMessage("Промежуточный результат 1");

{...}
ShowMessage("Промежуточный результат 2");

{...}
ShowMessage("Промежуточный результат 3");
...
end;




 
Lord Warlock ©   (2003-05-21 09:40) [8]

Или очень просто - процедура Halt;


 
Юрий Зотов ©   (2003-05-21 09:56) [9]

А еще надо бы убрать утечку памяти. Каждый вызов FindFirst требует своего FindClose.


 
Pavor   (2003-05-21 10:53) [10]

Всем большое спасибо.

2 KSergey: да, кажется так оно и есть..

2 mrcat: я такое пробовал. результат аналогичный. но проверю. (про условия известно точно: я путь1 и путь2 убирал -переименовывал)

2 Lord Warlock: Halt ведь не рекомендуют использовать? Или я ошибаюсь?





 
Pavor   (2003-05-22 09:07) [11]

Это снова я.
Если кому-то интересно, то результаты моих изысканий следующие.
Мгновенно завершить программу позволяет только Halt,
как и следовало ожидать. На нем пока и остановился, смущает то, что в хелпе о нем написано, что вызывает "abnormal program termination".
Переделка 2-х условных операторов в один с использованием and, а также использование в последующей части программы if not Application.Terminated then... видимых изменений не дает (т.е. проблема остается).
Application.MainForm.Close; почему-то вообще вызывает исключительную ситуацию...

Вот такие дела. Еще раз всем спасибо. Желаю всем корректного завершения программ :)



 
Hint ©   (2003-05-22 10:43) [12]

Halt лучше не пользоваться: Initiates abnormal termination of a program

Может лучше ExitProcess: This function provides a clean process shutdown.


 
Holy ©   (2003-05-22 10:44) [13]

Не проще ли перенести эту проверку в dpr перед Application.CreateForm(); или еще раньше. Тогда если нельзя запускаться, то формы не будут созданы и ты спокойно завершишь работу.



Страницы: 1 вся ветка

Текущий архив: 2003.06.02;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
1-2876
delfin
2003-05-22 12:55
2003.06.02
Подскажите как в TListView иконки засовывать.


9-2735
VikKo
2002-12-17 22:54
2003.06.02
Дым, взрывы и fps


14-3134
Jackson
2003-05-07 21:51
2003.06.02
TestTypes!Где взять?


11-2830
Kirill
2002-08-26 01:10
2003.06.02
Снова меню


1-2970
Azbul
2003-05-21 10:26
2003.06.02
запись шестнадцатиричного значения в файл