-
Доброго времени суток, товарищи по оружию!
Подскажите пожалуйста, почему при показе 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 ухты
Классовую функцию уже придумали в Лазарусе, насколько я знаю.
-
> Германн © (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.
-
> ухты © (18.02.17 12:33) [18]
> запусктут как классовую функцию придумал, но не суть )
> а вот проверки декриптов, окошко логина и все что надо внутри
Все уже придумано до нас.
Работаем как обычно, а если что-то пошло не так - бросим исключение.
--
Regards, LVT.
-
> Leonid Troyanovsky © (19.02.17 17:40) [20]
>
>
> > Германн © (19.02.17 02:17) [19]
>
> > приведу в 100501 раз пример кода.
>
> Некошерно. Лучше уж по нашему, по дельфийски
Ну может быть это и "по вашему, по дельфийски".
На мой скус пофигиста широкого профиля нет никакой необходимости выполнять проверку "при создании" главной формы. На мой скус лучше эту проверку выполнять "до создания" главной формы. Ну хотя бы следуя логике программы.
-
P.S.
Ну и ещё раз. Мне очень не нравится то, что мало кто из новичков не знает что такое файл проекта Дельфи. Пытаюсь в меру сил и возможностей донести до них на форумах для новичков, что сей файл и есть сама программа (основной/главный файл программы). Иногда получается.
-
> Германн © (20.02.17 02:31) [23]
> сей файл и есть сама программа (основной/главный файл программы)
Допустим, что он основной/главный. Однако, навыки его потрошения
новичкам потребны в самую последнюю очередь.
--
Regards, LVT.