Конференция "Начинающим" » 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 ухты
    Классовую функцию уже придумали в Лазарусе, насколько я знаю.
  • Leonid Troyanovsky © (19.02.17 17:40) [20]

    > Германн ©   (19.02.17 02:17) [19]

    > приведу в 100501 раз пример кода.

    Некошерно. Лучше уж по нашему, по дельфийски:

    type
     TFormMain = class(TFormMain)
     private
       { Private declarations }
     public
       { Public declarations }
       constructor Create(AOwner: TComponent); override;
     end;

    implementation

    {$R *.dfm}

    constructor TFormMain.Create;
    var
     InputString : String;
    begin
     InputString:= InputBox('Input Box', 'Prompt', 'Password');
     Assert(InputString = 'Password');
     inherited;
    end;

    --
    Regards, LVT.
  • Leonid Troyanovsky © (19.02.17 18:07) [21]

    > ухты ©   (18.02.17 12:33) [18]

    >   запусктут как классовую функцию придумал, но не суть )
    > а вот проверки декриптов, окошко логина и все что надо внутри

    Все уже придумано до нас.
    Работаем как обычно, а если что-то пошло не так - бросим исключение.

    --
    Regards, LVT.
  • Германн © (20.02.17 02:18) [22]

    >  Leonid Troyanovsky ©   (19.02.17 17:40) [20]
    >
    >
    > > Германн ©   (19.02.17 02:17) [19]
    >
    > > приведу в 100501 раз пример кода.
    >
    > Некошерно. Лучше уж по нашему, по дельфийски

    Ну может быть это и "по вашему, по дельфийски".
    На мой скус пофигиста широкого профиля нет никакой необходимости выполнять проверку "при создании" главной формы. На мой скус лучше эту проверку выполнять "до создания" главной формы. Ну хотя бы следуя логике программы.
  • Германн © (20.02.17 02:31) [23]
    P.S.
    Ну и ещё раз. Мне очень не нравится то, что мало кто из новичков не знает что такое файл проекта Дельфи. Пытаюсь в меру сил и возможностей донести до них на форумах для новичков, что сей файл и есть сама программа (основной/главный файл программы).  Иногда получается.
  • Leonid Troyanovsky © (20.02.17 09:58) [24]

    > Германн ©   (20.02.17 02:31) [23]

    > сей файл и есть сама программа (основной/главный файл программы)

    Допустим, что он основной/главный. Однако, навыки его потрошения
    новичкам потребны в самую последнюю очередь.

    --
    Regards, LVT.
 
Конференция "Начинающим" » Showmodal, application.terminate [D7, XP]
Есть новые Нет новых   [118656   +18][b:0][p:0.007]