Я тут обнаружил, что если создать форму через Application.CreateForm(TForm1, Form1), то ссылка на эту форму помещается в private-свойство TApplication.FFormList. Периодически объект Application по этому списку проходит и перебирает формы, не делая при этом никаких проверок. То есть если я уничтожу такую форму, то с большой вероятностью словлю AV (ловил уже много раз), а самое грустное - что я так и не понял, в каких случаях это происходит (иногда AV удается избежать). В связи с этим вопрос:
1) Чем мне грозит создание всех форм через Form1:=TForm1.Create(Application)?
2) Есть какие-то предусмотренные способы уничтожения форм, созданных через Application.CreateForm(TForm1, Form1)?
Свойство TApplication.FFormList и как с ним бороться
Модератор: Модераторы
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Метод Application.CreateForm нужен только для того, чтобы глобальная переменная Form1 присваивалась до вызова FormCreate, и соответственно в FormCreate можно было писать что-то вроде Form1.Width=100. Скажем еще раз спасибо M$ с ее VisualBasic, где в свое время было принято делать именно так.
Больше различий между Application.CreateForm и Form1 := TForm.Create(Application) нет. В обоих случаях владельцем (owner) формы становится объект Application. При вызове деструктора формы у ее владельца вызывается метод Notification, в котором он должен обнулить все ссылки на уничтожаемый объект, в том числе убрать форму из FFormList. Если этого не происходит - значит имеет место баг, о котором нужно сообщить.
Больше различий между Application.CreateForm и Form1 := TForm.Create(Application) нет. В обоих случаях владельцем (owner) формы становится объект Application. При вызове деструктора формы у ее владельца вызывается метод Notification, в котором он должен обнулить все ссылки на уничтожаемый объект, в том числе убрать форму из FFormList. Если этого не происходит - значит имеет место баг, о котором нужно сообщить.
