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

Вниз

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

 
ИгорьК   (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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.024 c
1-15088
Артём К.
2002-12-22 11:46
2003.01.06
Нужен небольшой ликбез по созданию, удалению файлов и папок


6-15183
Nick N A
2002-10-30 07:57
2003.01.06
TNMPOP3 Прием почты.


4-15351
Pars2
2002-11-18 17:51
2003.01.06
Как запретить запуск программы?


4-15367
vic_774N
2002-11-19 17:57
2003.01.06
Shutdown - Вопрос избитый но дело не в этом .


4-15376
Diamond Cat
2002-11-18 00:17
2003.01.06
чем можно заменить сообщение BM_SETIMAGE