Конференция "Начинающим" » Showmodal, application.terminate [D7, XP]
 
  • vegarulez © (12.02.17 19:49) [0]
    Доброго времени суток, товарищи по оружию!
    Подскажите пожалуйста, почему при показе showmodal формы и её закрытии в отладчике - нет ошибок - но в скомпилированном файле вываливаются ошибки при выполнении application.terminate.
    TFormMain  - создал но не показал - ибо там есть процедура которая нужна для проверки ввода логина и пароля. При пошаговой отлажке не возникает ошибок - но при том же самом действии в скомпилированном файле - вываливается сообщение что приложение будет закрыто - хотя оно и так уже получило команду терминаэйт. и таких сообщений выскакивает 3 штуки подряд. В главной форме происходит также инициализация тредов - может быть изза этого. но они не криэйтятся на криэте формы - а по сему в дестрое mainform не фришаться ибо не созданы. вообщем друзья, подскажите куда копать ибо в пошаговой отладке ошибки не появляются. как понять изза чего происходит сабж?

    begin
     Application.Initialize;
     Application.Title := 'MyProject';
     Application.CreateForm(TFormMain, FormMain);
     if (FormMain.Decrypt_DM = False) then
       with Tloginform.Create(nil) do
       try
         ShowModal;
         if ModalResult = mrOk then
           Application.Run
         else
          application.Terminate;
       finally
         Free;
       end
     else
       Application.Run;�������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ���������� ������
    end;

  • vegarulez © (12.02.17 19:51) [1]
    к сожалению нет кнопочки редактирования вопроса, вставил через тим под убунтой... добавила кучу мусора к буферу
  • vegarulez © (12.02.17 19:52) [2]
    begin
    Application.Initialize;
    Application.Title := 'MyProject';
    Application.CreateForm(TFormMain, FormMain);
    if (FormMain.Decrypt_DM = False) then
      with Tloginform.Create(nil) do
      try
        ShowModal;
        if ModalResult = mrOk then
          Application.Run
        else
         application.Terminate;
      finally
        Free;
      end
    else
      Application.Run;
    end;

  • Игорь Шевченко © (12.02.17 20:04) [3]
    Application.Initialize;
    Application.Title := 'MyProject';
    Application.CreateForm(TFormMain, FormMain);
    if (FormMain.Decrypt_DM = False) then
     with Tloginform.Create(nil) do
     try
       ShowModal;
       if ModalResult <> mrOk then
       begin
         Application.ShowMainForm := false;
         FormMain.Close;
      end;
     finally
       Free;
     end
     Application.Run



    ?
  • vegarulez © (12.02.17 20:31) [4]
    Игорь Шевченко ©   (12.02.17 20:04) [3]>>
    неа, не помогло. Тоже самое. При отладке пошаговой - всё отрабатывает - ошибок нет, но ни при скомпилином эхзешнике - тоже самое.

    Попробовал по другому - дело в майнформе, закоментарил криэйт и обращение к ней - ошибка пропала. Т.е. при создании её ошибка происходить на этапе терминейта приложения. Не знаю почему.
  • vegarulez © (12.02.17 20:35) [5]
    >>Игорь Шевченко ©   (12.02.17 20:04) [3]

    При такой реализации заходит в секцию онклозе - и крэшится при фришинге не созданных переменных. попробую сейчас закоментить.
  • vegarulez © (12.02.17 20:36) [6]
    *в процедуру formclose
    извиняюсь за жаргон
  • vegarulez © (12.02.17 20:43) [7]
    Всё!
    >>Игорь Шевченко ©   (12.02.17 20:04) [3]
    Заработал!
    Вставил проверочку на ассижн при фришинге в формклозе - и всё крэшится перестал там и вуаля ошибок нет.

    Спасибо за помощь!
  • vegarulez © (12.02.17 20:43) [8]
    Всё!
    >>Игорь Шевченко ©   (12.02.17 20:04) [3]
    Заработал!
    Вставил проверочку на ассижн при фришинге в формклозе - и всё крэшится перестал там и вуаля ошибок нет.

    Спасибо за помощь!
  • sniknik © (13.02.17 10:13) [9]
    вообще для форм вместо Free в хелпе рекомендуют Release. использовал бы, и проверки бы стали не нужны, все бы переменные успело создать.
  • Игорь Шевченко © (13.02.17 10:26) [10]
    sniknik ©   (13.02.17 10:13) [9]

    Release рекомендуют, когда из самой себя или из дочерних компонентов. В остальных случаях достаточно Free.
  • sniknik © (13.02.17 14:13) [11]
    а мне кажется тут как раз тот случай, т.к. событие создания где у него переменные инициализируются это не функция прям тут же исполняющаяся, а все таки событие в очереди... явный вызов Free просто "влазит без очереди", отсюда и проблема. с Release такого бы не было, значит рекомендация "в тему".
  • Игорь Шевченко © (13.02.17 14:23) [12]
    sniknik ©   (13.02.17 14:13) [11]

    "Any event handlers for the form or its children should use Release instead of Free (Delphi) or delete (C++). Failing to do so can cause a memory access error.
    "

    Ты где-то видишь Event Handler или children of Tloginform ?
  • ухты © (17.02.17 12:39) [13]
    Зачем тут создавать форму раньше времени, да еще и наделять ее странными свойствами?
    Не делать этого и проблем меньше будет.
  • Игорь Шевченко © (17.02.17 12:52) [14]

    > Зачем тут создавать форму раньше времени, да еще и наделять
    > ее странными свойствами?
    > Не делать этого и проблем меньше будет.


    Ты бы пояснил кодом свои мысли ?
  • ухты © (17.02.17 13:10) [15]
    Ну так зачем маинформ если логин не проходит? Вот и нужно ее создавать только после "входа". Выдылить сам вход в тдельную логику и оформить независимым кодом.

    > TFormMain  - создал но не показал - ибо там есть процедура
    > которая нужна для проверки ввода логина и пароля.
    вот это явно криво. Расписать небольшой ксласик-контроллер (манагер) входа. А в дпр создать его и запустить на проверку. FormMain.Decrypt_DM если я правильно понимаю то тоже тут лишнее.
  • Германн © (18.02.17 02:01) [16]

    > ухты ©   (17.02.17 13:10) [15]
    >
    > Ну так зачем маинформ если логин не проходит?

    Абсолютно логично и единственно грамотно. Проверку логин-пароль следует выполнять в программе до первого вызова метода TApplication.CreateForm, кроме тех вызовов, в которых создаются классы типа TDataModule.
  • Leonid Troyanovsky © (18.02.17 09:49) [17]

    > ухты ©   (17.02.17 13:10) [15]

    > Германн ©   (18.02.17 02:01) [16]

    Вы не умничайте, код давайте.

    --
    Regards, LVT.
  • ухты © (18.02.17 12:33) [18]
    А какой там код..
    что тот типа

    если (LoginController.Enter())
      запуск



    тут как классовую функцию придумал, но не суть ) а вот проверки декриптов, окошко логина и все что надо внутри
  • Германн © (19.02.17 02:17) [19]

    >  Leonid Troyanovsky ©   (18.02.17 09:49) [17]
    >
    >
    > > ухты ©   (17.02.17 13:10) [15]
    >
    > > Германн ©   (18.02.17 02:01) [16]
    >
    > Вы не умничайте, код давайте.

    Только из уважения к вам, Леонид, приведу в 100501 раз пример кода.
    program Project;

    uses
     Forms,
     uMain in 'uMain.pas' {fMain},
     uLogin in 'ULogin.pas' {Form20};

    {$R *.res}

    begin
     if Tflogin.Create(nil).ShowModal = mrOK then begin
       Application.Initialize;
       Application.MainFormOnTaskbar := True;
       Application.CreateForm(TfMain, fMain);
       Application.Run;
     end;
    end.


    2 ухты
    Классовую функцию уже придумали в Лазарусе, насколько я знаю.
 
Конференция "Начинающим" » Showmodal, application.terminate [D7, XP]
Есть новые Нет новых   [118241   +25][b:0][p:0.01]