Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];

Вниз

Странности 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.014 c
14-3094
Мазут Береговой
2003-05-14 03:35
2003.06.02
Пока вы тута все спите у меня вопрос появился. Асаблива к хакерам


1-2900
ikis
2003-05-22 13:42
2003.06.02
ActionMainMenuBar - построить на лету!


3-2797
yuribas
2003-05-14 08:24
2003.06.02
Компоненты для Oracle


1-2976
zeppelin
2003-05-21 14:02
2003.06.02
Подсчет русских символов в тексте


8-3020
handra
2003-02-17 13:45
2003.06.02
DSPack





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский