Главная страница
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.019 c
11-2830
Kirill
2002-08-26 01:10
2003.06.02
Снова меню


1-2909
bloodman
2003-05-18 20:59
2003.06.02
Материал про


7-3184
SiJack
2003-04-01 15:03
2003.06.02
Проблема - не дать отключится монитору!!!


3-2810
moore
2003-05-15 10:43
2003.06.02
как изобразить таблицу каталога?


14-3108
Vlad Oshin
2003-05-14 15:40
2003.06.02
Что я вижу в FAQ? :-о