-
Доброго времени суток, товарищи по оружию! Подскажите пожалуйста, почему при показе 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;
-
к сожалению нет кнопочки редактирования вопроса, вставил через тим под убунтой... добавила кучу мусора к буферу
-
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;
-
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 ?
-
Игорь Шевченко © (12.02.17 20:04) [3]>> неа, не помогло. Тоже самое. При отладке пошаговой - всё отрабатывает - ошибок нет, но ни при скомпилином эхзешнике - тоже самое.
Попробовал по другому - дело в майнформе, закоментарил криэйт и обращение к ней - ошибка пропала. Т.е. при создании её ошибка происходить на этапе терминейта приложения. Не знаю почему.
-
>>Игорь Шевченко © (12.02.17 20:04) [3]
При такой реализации заходит в секцию онклозе - и крэшится при фришинге не созданных переменных. попробую сейчас закоментить.
-
*в процедуру formclose извиняюсь за жаргон
-
Всё! >>Игорь Шевченко © (12.02.17 20:04) [3] Заработал! Вставил проверочку на ассижн при фришинге в формклозе - и всё крэшится перестал там и вуаля ошибок нет.
Спасибо за помощь!
-
Всё! >>Игорь Шевченко © (12.02.17 20:04) [3] Заработал! Вставил проверочку на ассижн при фришинге в формклозе - и всё крэшится перестал там и вуаля ошибок нет.
Спасибо за помощь!
-
вообще для форм вместо Free в хелпе рекомендуют Release. использовал бы, и проверки бы стали не нужны, все бы переменные успело создать.
-
sniknik © (13.02.17 10:13) [9]
Release рекомендуют, когда из самой себя или из дочерних компонентов. В остальных случаях достаточно Free.
-
а мне кажется тут как раз тот случай, т.к. событие создания где у него переменные инициализируются это не функция прям тут же исполняющаяся, а все таки событие в очереди... явный вызов Free просто "влазит без очереди", отсюда и проблема. с Release такого бы не было, значит рекомендация "в тему".
-
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 ?
-
Зачем тут создавать форму раньше времени, да еще и наделять ее странными свойствами? Не делать этого и проблем меньше будет.
-
> Зачем тут создавать форму раньше времени, да еще и наделять > ее странными свойствами? > Не делать этого и проблем меньше будет.
Ты бы пояснил кодом свои мысли ?
-
Ну так зачем маинформ если логин не проходит? Вот и нужно ее создавать только после "входа". Выдылить сам вход в тдельную логику и оформить независимым кодом.
> TFormMain - создал но не показал - ибо там есть процедура > которая нужна для проверки ввода логина и пароля. вот это явно криво. Расписать небольшой ксласик-контроллер (манагер) входа. А в дпр создать его и запустить на проверку. FormMain.Decrypt_DM если я правильно понимаю то тоже тут лишнее.
-
> ухты © (17.02.17 13:10) [15] > > Ну так зачем маинформ если логин не проходит?
Абсолютно логично и единственно грамотно. Проверку логин-пароль следует выполнять в программе до первого вызова метода TApplication.CreateForm, кроме тех вызовов, в которых создаются классы типа TDataModule.
-
> ухты © (17.02.17 13:10) [15]
> Германн © (18.02.17 02:01) [16]
Вы не умничайте, код давайте.
-- Regards, LVT.
-
А какой там код.. что тот типа если (LoginController.Enter())
запуск тут как классовую функцию придумал, но не суть ) а вот проверки декриптов, окошко логина и все что надо внутри
-
> 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' ,
uLogin in 'ULogin.pas' ;
begin
if Tflogin.Create(nil).ShowModal = mrOK then begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TfMain, fMain);
Application.Run;
end;
end.
2 ухты Классовую функцию уже придумали в Лазарусе, насколько я знаю.
|