Свойство TApplication.FFormList и как с ним бороться

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Свойство TApplication.FFormList и как с ним бороться

Сообщение Climber » 21.01.2010 10:58:34

Я тут обнаружил, что если создать форму через Application.CreateForm(TForm1, Form1), то ссылка на эту форму помещается в private-свойство TApplication.FFormList. Периодически объект Application по этому списку проходит и перебирает формы, не делая при этом никаких проверок. То есть если я уничтожу такую форму, то с большой вероятностью словлю AV (ловил уже много раз), а самое грустное - что я так и не понял, в каких случаях это происходит (иногда AV удается избежать). В связи с этим вопрос:
1) Чем мне грозит создание всех форм через Form1:=TForm1.Create(Application)?
2) Есть какие-то предусмотренные способы уничтожения форм, созданных через Application.CreateForm(TForm1, Form1)?
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Свойство TApplication.FFormList и как с ним бороться

Сообщение alexs » 21.01.2010 20:33:18

Climber писал(а):Form1:=TForm1.Create(Application)?

О!
а я всю жизнь дочерние формы именно так и создаю...
надо посмотреть исходники.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Свойство TApplication.FFormList и как с ним бороться

Сообщение Sergei I. Gorelkin » 21.01.2010 21:28:50

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


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

Рейтинг@Mail.ru