![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Завершение работы программы [D6, WinXP]
ИгорьК © (2002-12-24 14:10:00)Привет!
При входе в программу спрашиваю login и password у юзера в отдельной форме. Если юзер нажимает кноку "Отмена", то прога должна завершить свою работу. Делаю так:
procedure TbtnCancel.OnClick(Sender: TObject);
begin
Application.Terminate;
end;
Но программа продолжает работать дальше, как будто я нажал ОК!!!
Смотре отладчиком, заходит сюда, отрабатывает, но все равно идет дальше! Что не правильно?
Roma (2002-12-25 12:33:00) [1];) Помашу кулаками после драки... ;)
Код, что я привел, выдран из достаточно старого (т.е., проверенного временем ;) ) проекта и содержит немного лишнего (например, 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.
OlDemon (2002-12-25 08:59:00) [2]2 ИгорьK> А ну да... У меня то форма с паролем главная, поэтому все работает :((
Спасибо Игорь Зотов и ROMA. Возьму на вооружение :)))
Моджахед, что-ли (2002-12-24 23:16:00) [3]Единственное, что можно добавить к вышеприведенному коду, это то, что человеку нужно напомнить о пределе действия для Exit :)
Но с этим справится и стандартный хелп.
Юрий Зотов (2002-12-24 22:54:00) [4]Ну, наконец-то! Через несколько часов бурных дискуссий проблема выеденного яйца все же разрешилась. Спасибо, 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 простейших строчек (которые выделены жирным). И ВСЕ!!!
Только не нужно рассказывать, что этот код приводит к куче ошибок, незавершению программы и прочим чудесам. ЭТОТкод ни к чему подобному не приводит, а если такое все же происходит, то к нему приводит ДРУГОЙкод. Где его искать, наверное, догадываетесь?
Roma (2002-12-24 18:58:00) [5]День добрый...
В 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 не работает, еще Юрий Зотов говорил...
Clickmaker (2002-12-24 17:58:00) [6]> drin ©
:)))
drin (2002-12-24 17:55:00) [7]<CODE}
project Proj;
...
label
Over;
begin
if Cancel GOTO Over;
...
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
Over:
end;
Skier (2002-12-24 17:27:00) [8]>ИгорьК
Можно сделать ещё вот как (не лучший способ...) :
делаешь форму для ввода пароля - главной формой приложения и
если пользователь нажимает отмену,то делаешь ей Close и тем
самым закрываешь всё приложение...если пользователь всё ввёл
правильно,то скрываешь форму для ввода пароля и показывашь
другую форму (которая тебе нужна...)
Anatoly Podgoretsky (2002-12-24 17:13:00) [9]Просмотри примеры по разным Splash Screen там подобное часто встречается, форма запускается до запуска системы, а в блоке if CreateForm и Application.Run, иначе пропуск и автовыход
ИгорьК (2002-12-24 17:11:00) [10]to Ipx: Я уже пробовал - программа-то завершается, но вылетает куча Acces Violation... и прога процесс из памяти не выгружается!
Ipx (2002-12-24 16:14:00) [11]Попробуй
procedure TbtnCancel.OnClick(Sender: TObject);
begin
Halt(0);
end;
По-моему это надежней
Reindeer Moss Eater (2002-12-24 16:08:00) [12]Не трогать файл dpr.
В модуле формы с вводом пароля реализовать функцию, создающую экземпляр формы, и показывающую её модально. Возвратить из функции булево значение Result := ShowModal = mrOk
В OnCreate главной формы :
if not MyPasswordFunction then Application.Terminate;
Игорь Шевченко (2002-12-24 16:02:00) [13]Перед Application.Terminate вставить строчку Application.ShowMainForm := false;
Avsam (2002-12-24 15:51:00) [14]Ну в самом DPR проверяй условие ModalResult и остальное, что ты хочешь.
Если не выполняется - не делай Application.Run
ИгорьК (2002-12-24 15:40:00) [15]to Anatoly Podgoretsky: Да, диалог модальный. Так а как тогда?
Anatoly Podgoretsky (2002-12-24 15:09:00) [16]Так не стоит и делать Application.Run вообще, по описанию видно, что это модальный диалог
ИгорьК (2002-12-24 15:07:00) [17]OldDemon: А не закрывается главная форма! Т.е. просто ничего не происходит!
OlDemon (2002-12-24 14:49:00) [18]2 ИгорьК> Я в этом просто Close основную форму с флагом для всяких там CanClose. Думаю что и тебе поможет.
Переяслов Григорий (2002-12-24 14:42:00) [19]В главной форме
If FormPassword.ShowModal = mrCancel then Close;
и все!!!
ИгорьК (2002-12-24 14:42:00) [20]to Юрий Зотов: Да, эта форма/модуль создается в dpr-файле до команды Run. Я пробовал Halt, но в этом случае программа не освобождает память (процесс остается) и выдает кучу Ексепшнов. Попробую еще Exit.