Halt или Application.Terminated в OnCreate?

Вопросы программирования и использования MSEide + MSEgui.

Модератор: Модераторы

Halt или Application.Terminated в OnCreate?

Сообщение t-ea » 30.05.2013 16:12:29

Из OnCreate главной формы создаётся дата-модуль. При создании дата-модуля вызывается форма запроса пользователя/пароля. При правильном вводе открываются таблицы, при неудачном — необходимо прекратить выполнение программы.

Логика примерно такая:
1. MainForm.OnCreate вызывает CreateDataModule;
2. DataModule.OnLoaded вызывает AskPassword и если неправильно — завершить программу;
3. MainForm.OnCreated открывает таблицы SqlQuery из DataModule.

Если использую Application.Terminated, программа продолжает выполнение других операторов OnCreated главной формы, т.е. пытается открыть SqlQuery, и, конечно, завершается с ошибкой.
Halt, насколько я помню, не рекомендуется использовать.

Как правильно завершить программу в случае неправильного ввода пароля?
t-ea
новенький
 
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

Re: Halt или Application.Terminated в OnCreate?

Сообщение Лекс Айрин » 30.05.2013 17:39:10

t-ea, а если стандартно... MainForm.Hide ?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Halt или Application.Terminated в OnCreate?

Сообщение debi12345 » 30.05.2013 18:39:20

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 - пришлось это сделать чтобы решить проблему с визуальным наследованием форм.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Halt или Application.Terminated в OnCreate?

Сообщение mse » 09.08.2013 08:53:46

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
Код: Выделить всё
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;
mse
новенький
 
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31


Вернуться в MSEide + MSEgui

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28

Рейтинг@Mail.ru