Форум: "Основная";
Текущий архив: 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