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

Вниз

Завершение работы программы   Найти похожие ветки 

 
ИгорьК   (2002-12-24 14:10) [0]

Привет!
При входе в программу спрашиваю login и password у юзера в отдельной форме. Если юзер нажимает кноку "Отмена", то прога должна завершить свою работу. Делаю так:
procedure TbtnCancel.OnClick(Sender: TObject);
begin
Application.Terminate;
end;

Но программа продолжает работать дальше, как будто я нажал ОК!!!
Смотре отладчиком, заходит сюда, отрабатывает, но все равно идет дальше! Что не правильно?


 
прохожий   (2002-12-24 14:11) [1]

вместо Application.Terminate; надо написать close;

p.s. мне бы ваши проблемы... :(((


 
Reindeer Moss Eater   (2002-12-24 14:14) [2]

>Прохожий
и что изменится?


 
BALU1111   (2002-12-24 14:17) [3]

Вообще-то, насколько знаю, application.terminate закрывает программу безприкословно. Но в данном случае я не пойму почему.
Можно попробывать Close с проверкой на Closequery. Может прога просто подвисает.


 
viper   (2002-12-24 14:17) [4]

if log.ShowModal= mrOk then SetForegroundWindow(CoresForm.Handle);
else coresform.Close


 
Reindeer Moss Eater   (2002-12-24 14:19) [5]

Вообще-то, насколько знаю, application.terminate закрывает программу безприкословно

А не догадываешься, каким образом у ИгорьК на экране появилась форма с вводом пароля?
:)


 
ИгорьК   (2002-12-24 14:22) [6]

BALU1111: Нет, прога именно продолжает работать, т.е. доходит до коннекта к базе, но т.к. login и password не заданы там ругается на коннект и все, но запускается и показывает главную форму.


 
Юрий Зотов   (2002-12-24 14:35) [7]

Application.Terminate не сработает до вызова Application.Run, а этот вызов происходит ПОСЛЕ создания главной формы.

Судя по всему, причина в этом и есть. Используйте Halt или Exit - смотря где и как Вы показываете форму логина.



 
ИгорьК   (2002-12-24 14:42) [8]

to Юрий Зотов: Да, эта форма/модуль создается в dpr-файле до команды Run. Я пробовал Halt, но в этом случае программа не освобождает память (процесс остается) и выдает кучу Ексепшнов. Попробую еще Exit.


 
Переяслов Григорий   (2002-12-24 14:42) [9]

В главной форме

If FormPassword.ShowModal = mrCancel then Close;

и все!!!


 
OlDemon   (2002-12-24 14:49) [10]

2 ИгорьК> Я в этом просто Close основную форму с флагом для всяких там CanClose. Думаю что и тебе поможет.


 
ИгорьК   (2002-12-24 15:07) [11]

OldDemon: А не закрывается главная форма! Т.е. просто ничего не происходит!


 
Anatoly Podgoretsky   (2002-12-24 15:09) [12]

Так не стоит и делать Application.Run вообще, по описанию видно, что это модальный диалог


 
ИгорьК   (2002-12-24 15:40) [13]

to Anatoly Podgoretsky: Да, диалог модальный. Так а как тогда?


 
Avsam   (2002-12-24 15:51) [14]

Ну в самом DPR проверяй условие ModalResult и остальное, что ты хочешь.
Если не выполняется - не делай Application.Run


 
Игорь Шевченко   (2002-12-24 16:02) [15]

Перед Application.Terminate вставить строчку Application.ShowMainForm := false;


 
Reindeer Moss Eater   (2002-12-24 16:08) [16]

Не трогать файл dpr.
В модуле формы с вводом пароля реализовать функцию, создающую экземпляр формы, и показывающую её модально. Возвратить из функции булево значение Result := ShowModal = mrOk
В OnCreate главной формы :
if not MyPasswordFunction then Application.Terminate;


 
Ipx   (2002-12-24 16:14) [17]

Попробуй
procedure TbtnCancel.OnClick(Sender: TObject);
begin
Halt(0);
end;
По-моему это надежней


 
ИгорьК   (2002-12-24 17:11) [18]

to Ipx: Я уже пробовал - программа-то завершается, но вылетает куча Acces Violation... и прога процесс из памяти не выгружается!


 
Anatoly Podgoretsky   (2002-12-24 17:13) [19]

Просмотри примеры по разным Splash Screen там подобное часто встречается, форма запускается до запуска системы, а в блоке if CreateForm и Application.Run, иначе пропуск и автовыход


 
Skier   (2002-12-24 17:27) [20]

>ИгорьК
Можно сделать ещё вот как (не лучший способ...) :
делаешь форму для ввода пароля - главной формой приложения и
если пользователь нажимает отмену,то делаешь ей Close и тем
самым закрываешь всё приложение...если пользователь всё ввёл
правильно,то скрываешь форму для ввода пароля и показывашь
другую форму (которая тебе нужна...)


 
drin   (2002-12-24 17:55) [21]

<CODE}
project Proj;
...
label
Over;
begin
if Cancel GOTO Over;
...
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;

Over:
end;


 
Clickmaker   (2002-12-24 17:58) [22]

> drin ©

:)))


 
Roma   (2002-12-24 18:58) [23]

День добрый...

В Project1.dpr:


begin
Application.Initialize;

try
with TLoginDialogForm.Create(Application) do
try
if ShowModal <> mrOk then
begin
Application.Terminate;
Application.Run;
Exit;
end; // if ShowModal <> mrOk then
finally
Free;
end; // finally
except
on E: Exception do
MessageDlg(E.Message, mtError, [mbOk], 0);
end; // except
Application.ProcessMessages; // ;-)

Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.


Форма аутентификации (LoginDialog) должна делать проверку на валидность (не важно, чего) и, если все в порядке, возвращать mrOk (она ж модальная), в противном случае mrCancel (или mrAbort, или другое что, в зависимости от результатов проверки). И ничего она не должна ни закрывать, ни терминэйтить! Что такое диалоговое модальное окно? Это способ получения обратной связи от пользователя. А главный объект приложения - Application, вот он и будет решать, когда ему какие формы создавать, а когда закрываться, а решать он будет на основании обратной связи, полученной от пользователя при помощи различных диалоговых окон (в частности, с помощью LoginDialog"а).

А про то, что Terminate без Run не работает, еще Юрий Зотов говорил...


 
Юрий Зотов   (2002-12-24 22:54) [24]

Ну, наконец-то! Через несколько часов бурных дискуссий проблема выеденного яйца все же разрешилась. Спасибо, Roma! Естественно, модальная форма должна всего лишь вернуть результат, остальное - не ее задача.

Народ, ну нельзя же так смешить людей в течение всего дня. Ведь это совершенно стандартное и совершенно очевидное решение. Все, что нужно добавить к приведенному выше коду - это убрать из него лишнее :о)

begin
Application.Initialize;
with TLoginDialogForm.Create(nil) do
try
if ShowModal <> mrOk then Exit;
finally
Free
end;

Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.

Как видите, к стандартному коду Delphi нужно было всего лишь добавить 6 простейших строчек (которые выделены жирным). И ВСЕ!!!

Только не нужно рассказывать, что этот код приводит к куче ошибок, незавершению программы и прочим чудесам. ЭТОТ код ни к чему подобному не приводит, а если такое все же происходит, то к нему приводит ДРУГОЙ код. Где его искать, наверное, догадываетесь?


 
Моджахед, что-ли   (2002-12-24 23:16) [25]

Единственное, что можно добавить к вышеприведенному коду, это то, что человеку нужно напомнить о пределе действия для Exit :)
Но с этим справится и стандартный хелп.


 
OlDemon   (2002-12-25 08:59) [26]

2 ИгорьK> А ну да... У меня то форма с паролем главная, поэтому все работает :((
Спасибо Игорь Зотов и ROMA. Возьму на вооружение :)))


 
Roma   (2002-12-25 12:33) [27]

;) Помашу кулаками после драки... ;)

Код, что я привел, выдран из достаточно старого (т.е., проверенного временем ;) ) проекта и содержит немного лишнего (например, ProcessMessages в данном контексте выглядит нелепо, но никто ничего не сказал ;) )... Так, для примера просто... Поэтому "на вооружение" лучше брать сам прием, т.е. то, что привел Юрий. А если там еще Initialize перенести на после проверки, то получится вот такой пример для FAQ:

// Project Source File
begin
with TLoginDialogForm.Create(nil) do
try
if ShowModal <> mrOk then
Exit;
finally
Free;
end;
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.



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

Форум: "Основная";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.008 c
14-15245
BlackTiger
2002-12-12 21:07
2003.01.06
Кто-нибудь РЕАЛЬНО работает с Kylix?


14-15281
BlackTiger
2002-12-17 00:21
2003.01.06
Не про Дельфи, а про PHP, но может кто подскажет.


8-15167
BOA_KAA
2002-09-19 19:00
2003.01.06
Скроллинг TImage


1-14974
ruslanyd
2002-12-18 15:56
2003.01.06
MDI Child ShowModal


1-15038
trotski
2002-12-24 06:37
2003.01.06
Самые быстрые парни





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский