Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Чем заменить FreeAndNil, освобождает лишнее ???


Автор: LIND 27.9.2011, 11:39
Доброго времени суток!

Остро нуждаюсь в помощи! 
Проблема в следующем: При выполении FreeAndNil формы, освобождается и объект datamodule,  который использует эта форма(т.е. вызывается его метод Destroy). А вот этого мне как раз и не нужно. Этот datamodule используют и другие формы. Как освободить и обнулить ссылку ТОЛЬКО на конкретную форму, но не трогать при этом datamodule ?

Подскажите плз, кто в курсе этого вопроса....


Автор: Snowy 27.9.2011, 11:56
А ты датамодуль сам создаёшь, или он создаётся автоматически?
Если сам, то как? 

Автор: Frees 27.9.2011, 13:15
Цитата(LIND @  27.9.2011,  14:39 Найти цитируемый пост)
освобождается и объект datamodule,

почитай про FreeNotification

Автор: LIND 27.9.2011, 13:25
Цитата(Snowy @ 27.9.2011,  11:56)
А ты датамодуль сам создаёшь, или он создаётся автоматически?
Если сам, то как?

Датамодуль создается вручную. При создании формы, где используется данный датамодуль, стоит код:
Код

  if (not Assigned(dm_kart)) then
     dm_kart:= Tdm_kart.Create(Self);    

И что самое гадкое, при выдачи команды FreeAndNil для формы, хоть датамодуль уничтожается, указатель на объект datamodule не становится nil. Соответственно получается такая лажа: при повторной инициализации этой формы, да и не обязательно этой (любой другой, где используется данный датамодуль),  
Код
  (not Assigned(dm_kart))  
 выдает false, т.е. типа объект уже создан (хотя естественно просто не обнулена ссылка). 
А мне нужно просто освободить объект формы без закрытия datamodule.  
Вопрос как это сделать???

Автор: Frees 27.9.2011, 13:30
Цитата(LIND @  27.9.2011,  16:25 Найти цитируемый пост)
Tdm_kart.Create(Self);

Self - это владелец дата модуля, при освобождении владельца дата модуль тоже освободится!

делай 
Tdm_kart.Create(nil) или Tdm_kart.Create(Application)

Автор: Snowy 27.9.2011, 13:37
Правильно создавать
Код

  Application.CreateForm(Tdm_kart, dm_kart);
передавая конструктору форму, ты сообщаешь, что это owner.
А owner забирает с собой в могилку всю свою собственность.
Так что, если ты хочешь, чтобы датамодуль жил, пока не закроют приложение, то и owner'ом нужно делать приложение.

Автор: LIND 27.9.2011, 14:36
Спасибо огромное! Проблема сразу разрешилась. Объявление datamodule как Self это и была большая ошибка. 
Спасибо за оперативную помощь!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)