Из OnCreate главной формы создаётся дата-модуль. При создании дата-модуля вызывается форма запроса пользователя/пароля. При правильном вводе открываются таблицы, при неудачном — необходимо прекратить выполнение программы.
Логика примерно такая:
1. MainForm.OnCreate вызывает CreateDataModule;
2. DataModule.OnLoaded вызывает AskPassword и если неправильно — завершить программу;
3. MainForm.OnCreated открывает таблицы SqlQuery из DataModule.
Если использую Application.Terminated, программа продолжает выполнение других операторов OnCreated главной формы, т.е. пытается открыть SqlQuery, и, конечно, завершается с ошибкой.
Halt, насколько я помню, не рекомендуется использовать.
Как правильно завершить программу в случае неправильного ввода пароля?
Halt или Application.Terminated в OnCreate?
Модератор: Модераторы
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
t-ea, а если стандартно... MainForm.Hide ?
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Halt, насколько я помню, не рекомендуется использовать.
Да, после создания RTTI-объектов категорически не рекомендуется.
Я такие дела (вывод логин формы,..) делаю прямо из PROGRAM-файла, а не из юнита основной формы - то есть до "Application.Run". В этом случае можно халтить. Вот рабочий код :
Код: Выделить всё
program podpiska;
{$ifdef FPC}{$mode objfpc}{$h+}{$INTERFACES CORBA}{$endif}
{$ifdef FPC}
{$ifdef mswindows}
// {$apptype console}
{$apptype gui}
{$endif}
{$endif}
uses
{$ifdef FPC}{$ifdef linux}cthreads,{$endif}{$endif}msegui,mseforms,
main,dmmain,dmprint, dmacnt1, dmf18,
dmrefs,
dmspf6,
connsetupform,mseconsts,mseconsts_ru,mseconsts_uzcyr,loginform,mseglob;
{$ifdef mswindows}
{$R podpiska-icon.res}
{$endif}
begin
setlangconsts('ru');
application.createdatamodule(tdmmainmo,dmmainmo);
// если не автологин админом -
// вывести логин-форму и, если логин неуспешен - завершить программу
if not dmmainmo.fldAdminLogin.asboolean then begin
application.createform(tloginfo,loginfo);
// выйти из программы, если
if (loginfo.show(true) <> mr_ok) // логин отменен
and
// повторная проверка, так как fldAdminLogin может быть изменено
// в loginfo (выбор режима админа)
(not dmmainmo.fldAdminLogin.asboolean)
then begin
halt; // application.terminate before application.run causes exitcode=217
end;
end;
application.createdatamodule(tdmprintmo, dmprintmo);
application.createform(tmainfo,mainfo);
application.run;
end.
Внимание ! С недавних OnCreate файрится после OnLoaded - пришлось это сделать чтобы решить проблему с визуальным наследованием форм.
Try to use "abort" in DataModule.onloaded in case of an error. The exception
could be caught by a try-except block around the application.createform()
call.
Posted after 41 minute 31 second:
@debi12345: Try
could be caught by a try-except block around the application.createform()
call.
Posted after 41 minute 31 second:
@debi12345: Try
Код: Выделить всё
application.createdatamodule(tdmmainmo,dmmainmo);
if tloginfo.create(application).show(ml_application) = mr_ok then begin
//tloginfo.options fo_freeonclose = true
//...
application.createform(tmainfo,mainfo);
application.run;
end;
