Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Завершение работы программы [D6, WinXP]


Страницы:   1 2

ИгорьК ©   (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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо