Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Нужно ли явно уничтожать ADODataSet, ... ?


Автор: Leklerk 25.3.2012, 18:51
Добрый день! Я вот мучаюсь вопросом, нужно ли явно закрывать компоненты ADODataSet, ADOCommand и т.д. и освобождать память (например, в событии Destroy формы), или при разрушении формы все само произойдет?
Код

ADODataSet1.Close();
ADODataSet1.Free();
 
ADOCommand1.Free();

Автор: DarkProg 25.3.2012, 20:56
Возможны варианты:
1. Если компонент лежит сам на форме, то ничего делать не надо, потому как сам закроется и сам "убъётся".
2. Если создали динамически, и на этапе создания у вас что-то типа Dataset:=TDataset.Create(nil), то надо убивать руками, и делать это при закрытии формы или ещё как-то - это уже ваше дело.
3. Если создали динамически, и на этапе создания у вас что-то типа Dataset:=TDataset.Create(MyForm), где MyForm - это та форма форма, которую вы сейчас вызываете, то можете не беспокоиться, см. п1.

Вроде всё, ну если что забыл коллеги дополнят.

Автор: Leklerk 26.3.2012, 09:32
Спасибо за ответ!

Автор: MetalFan 26.3.2012, 13:54
Цитата(DarkProg @  25.3.2012,  20:56 Найти цитируемый пост)
Возможны варианты

Стоит отметить, что все вышесказанное относится ко всем компонентам (наследникам TComponent)

Автор: БелАмор 26.3.2012, 16:00
Цитата(Leklerk @  25.3.2012,  18:51 Найти цитируемый пост)
нужно ли явно закрывать компоненты ADODataSet

Настоятельно рекомендую все датасеты (а также TADOConnection перед выходом из программы) всегда закрывать только ручками (открывать, кстати, тоже).
Причина: При уничтожении формы поочерёдно уничтожаются компоненты, принадлежащие форме. Когда дело доходит до датасета, перед уничтожением он сначала закрывается. При закрытии датасета может произойти событие, на которое назначен обработчик. При этом часть элементов уже уничтожена, и возможна ситуация, когда в обработчике произойдёт обращение к уже уничтоженному элементу.

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