Описанную проблему можно воспроизвести в Delphi 7, следуя вашим инструкциям.Причиной нарушения прав доступа является то, что Form2
автоматически создается в файле .dpr
(и это делает приложение владельцем формы), но вы также пытаетесь контролировать его время жизни, вызывая FreeAndNil(Form2)
в OnDestroy
событие Form1
.Когда вы пытаетесь освободить форму, она уже освобождается приложением.
Не совсем понятно, почему вы пытаетесь освободить Form2
, когда приложение (предположительно) собирается завершить работу (так какосновная форма разрушается).Поскольку приложение является владельцем, вы можете спокойно позволить приложению позаботиться о его обязанностях.
Вам необходимо решить, кем вы хотите стать владельцем Form2
.
- Если это вы, вы должны удалить
Form2
из списка автоматически созданных форм (см. Project - Options - Forms
и переместить Form2
в Available forms
). - Если вы хотите, чтобы приложение было владельцемпросто не
Free
форму, используйте методы hide
и show
для контроля ее видимости, если это необходимо, но оставьте это для приложения, чтобы уничтожить его в соответствии с его дизайном.
Кстати, код, который вы имеете в TForm1.FormCreate()
, не имеет ничего общего с AV, который вы видели.То, что Form2
является отдельным экземпляром, и если намерение состоит в том, чтобы показать форму всплеска, все в порядке, как показано ниже:
procedure TForm1.FormCreate(Sender: TObject);
var
form2 : TForm2;
begin
form2 := TForm2.Create(nil);
try
form2.ShowModal;
finally
form2.Free;
end;
end;
Форма не нуждается в владельце, поэтому nil
вCreate
.Поскольку переменная form2
является локальной, нет нужды ее обнулять.