Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Удаление TDataModule

1
02 октября 2004 года
kot_
7.3K / / 20.01.2000
Возникла вот такая проблема. Есть некоторый TDateModule зосдающийся на этапе выполнения программы
 
Код:
if(dmLogin==NULL)
   dmLogin = new TdmLogin(Application);

По завершению функции выполняется delete dmLogin. В дебагере dmLogin равен NULL.
После мне необходимо проверить на равенство NULL в другой функции:
 
Код:
if(dmLogin!=NULL){
    if(dmLogin->dbRG->Connected)
       SetMenuItems(true);
    else SetMenuItems(false);
  }
  else{
    SetMenuItems(false);
  }

Воздесь то собственно бока и происходят - указатель оказывается не равен NULL. Где я ошибся?
368
02 октября 2004 года
rostyslav
629 / / 13.07.2004
Может где-то strcpy(), "переадресует" dmLogin. :)


1
02 октября 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by rostyslav
Может где-то strcpy(), "переадресует" dmLogin. :)



Да нет, проверил все вроде. Я так думаю, что скорее всего модуль необходимо привязывать к форме - при уделении формы, будет разрушатся и объект дата модуля, правда это не проверено. Я сейчас создаю в потоке дата модуль для главной формы, а потом просто проверяю - есть соединение или нет с базой. Тоже решение. И еще можно попробовать создать ДМ в потоке и обращаться к нему. Тогда по идее завершение потока должно привести к разрушению объекта - сейчас попробую напишу что получилось.

10
04 октября 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by kot_
Воздесь то собственно бока и происходят - указатель оказывается не равен NULL. Где я ошибся?


На этот случай у Борланда в SysUtils описана процедура FreeAndNil

5.7K
04 октября 2004 года
forw
47 / / 24.08.2004
Цитата:
Originally posted by kot_
Возникла вот такая проблема. Есть некоторый TDateModule зосдающийся на этапе выполнения программы
 
Код:
if(dmLogin==NULL)
   dmLogin = new TdmLogin(Application);

По завершению функции выполняется delete dmLogin. В дебагере dmLogin равен NULL.
После мне необходимо проверить на равенство NULL в другой функции:
 
Код:
if(dmLogin!=NULL){
    if(dmLogin->dbRG->Connected)
       SetMenuItems(true);
    else SetMenuItems(false);
  }
  else{
    SetMenuItems(false);
  }

Воздесь то собственно бока и происходят - указатель оказывается не равен NULL. Где я ошибся?



А так не получается?

 
Код:
delete dmLogin;
dmLogin = NULL;
1
04 октября 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by forw


А так не получается?
 
Код:
delete dmLogin;
dmLogin = NULL;


Именно так и необходимо делать, удаление объекта происходит, и указатель становится неопределенным - т.е. необходимо использовать аутоптр или ему подобное или не забывать обнулять. Но в конечном итоге, я коннект с базой вынес в отдельный поток - пользователь может войти и выйти но не может завершить программу. Это оказалось менее накладно, чем постоянно создавать и удалять классы и позволило более гибко отслеживать состояние коннекта и права пользователя. Необходимость разрушения объекта была вызвана необходимостью коннектится к базе как сисдба к системным таблицам для считывания списка пользователей. Теперь эта задача решается локально в конструкторе потока и там же объект и разрушается с очисткой памяти.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог