Проверить существование объекта
От: eiNtiel  
Дата: 03.10.04 02:00
Оценка:
Привет

Есть некий объект некоего класса, перед использованием объекта необходимо вызвать конструктор, т.е. создать объект. Как проверить создан уже объект или нет?
if ( obj = nil )...
не выходит
... << RSDN@Home 1.1.3 stable >>
Re: Проверить существование объекта
От: eiNtiel  
Дата: 03.10.04 02:32
Оценка:
уточню, имеется ввиду локальный объект
... << RSDN@Home 1.1.3 stable >>
Re: Проверить существование объекта
От: vitorg Россия  
Дата: 03.10.04 08:13
Оценка:
Здравствуйте, eiNtiel, Вы писали:

N>Привет


N>Есть некий объект некоего класса, перед использованием объекта необходимо вызвать конструктор, т.е. создать объект. Как проверить создан уже объект или нет?

N>
N>if ( obj = nil )...
N>
не выходит


А так: obj.HandleAllocated?
Jabber: vitorg@jabber.org
Re[2]: Проверить существование объекта
От: eiNtiel  
Дата: 03.10.04 09:41
Оценка:
Здравствуйте, vitorg, Вы писали:

V>А так: obj.HandleAllocated?


Так тоже, класс обычный class( TObject ), там нет этого метода
... << RSDN@Home 1.1.3 stable >>
Re[3]: Проверить существование объекта
От: IRaven Ниоткуда  
Дата: 03.10.04 09:57
Оценка:
Здравствуйте, eiNtiel, Вы писали:


V>>А так: obj.HandleAllocated?

N>Так тоже, класс обычный class( TObject ), там нет этого метода

if Assigned(Obj) then

Ну и так далее
Re[4]: Проверить существование объекта
От: vitorg Россия  
Дата: 03.10.04 10:37
Оценка: 1 (1)
Здравствуйте, IRaven, Вы писали:

IR>Здравствуйте, eiNtiel, Вы писали:



V>>>А так: obj.HandleAllocated?

N>>Так тоже, класс обычный class( TObject ), там нет этого метода

IR>
IR>if Assigned(Obj) then
IR>

IR>Ну и так далее

А вроде как Assigned(p) это то же самое что p<>nil (указатель) и @p<>nil (процедурная переменная), так что скорее всего не прокатит, к тому же:

Note: Assigned can't detect a dangling pointer--that is, one that isn't nil but no longer points to valid data. For example, in the code example for Assigned, Assigned won't detect the fact that P isn't valid.

[ RSDN@Home 1.1.4 beta 3 rev. 185 ]
Jabber: vitorg@jabber.org
Re: Проверить существование объекта
От: crazibill  
Дата: 03.10.04 11:07
Оценка: +1
Здравствуйте, eiNtiel, Вы писали:

N>Привет


N>Есть некий объект некоего класса, перед использованием объекта необходимо вызвать конструктор, т.е. создать объект. Как проверить создан уже объект или нет?

N>
N>if ( obj = nil )...
N>
не выходит


Используй функццию
SysUtils.FreeAndNil
она вызывает деструктор и устанавливает указательв nil
после чего будет работать и
N>if ( obj = nil )...
и
Assigned
Re[5]: Проверить существование объекта
От: IRaven Ниоткуда  
Дата: 03.10.04 12:33
Оценка:
Здравствуйте, vitorg, Вы писали:

IR>>
IR>>if Assigned(Obj) then
IR>>

IR>>Ну и так далее

V>А вроде как Assigned(p) это то же самое что p<>nil (указатель) и @p<>nil (процедурная переменная), так что скорее всего не прокатит, к тому же:


V>

V>Note: Assigned can't detect a dangling pointer--that is, one that isn't nil but no longer points to valid data. For example, in the code example for Assigned, Assigned won't detect the fact that P isn't valid.


Тогда никак. Нужно самому отслеживать работу с объектами. Эта тема тут уже не раз поднималась. Однозначного решения предложено не было. К сожалению
Re[4]: Проверить существование объекта
От: eiNtiel  
Дата: 03.10.04 12:40
Оценка:
Здравствуйте, IRaven, Вы писали:

IR>
IR>if Assigned(Obj) then
IR>

IR>Ну и так далее

Как уже сказали, только если он уже об'nil'ен
... << RSDN@Home 1.1.3 stable >>
Re[2]: Проверить существование объекта
От: eiNtiel  
Дата: 03.10.04 12:40
Оценка: +1
Здравствуйте, crazibill, Вы писали:

C>Используй функццию

C>SysUtils.FreeAndNil
C>она вызывает деструктор и устанавливает указательв nil
C>после чего будет работать и
N>>if ( obj = nil )...
C>и
C>Assigned

Да, все верно, и опять же придется в начеле функции obj := nil делать, думал может есть более правильное решение. Хотя это видимо и правильно, ведь локальные переменные обязаны быть вручную инициализированы
... << RSDN@Home 1.1.3 stable >>
Re: Проверить существование объекта
От: Dimonka Верблюд  
Дата: 04.10.04 08:38
Оценка:
Здравствуйте, eiNtiel, Вы писали:

N>Есть некий объект некоего класса, перед использованием объекта необходимо вызвать конструктор, т.е. создать объект. Как проверить создан уже объект или нет?

N>
N>if ( obj = nil )...
N>
не выходит


Способов масса, но все связаны с проектированием:
1. создать оповещение обьектов о своей смерти (чтобы другие обьекты почистили ссылки на него).
2. хранить ссылку на обьект в известном месте и всем остальным обьектам смотреть в это место, зачищать его после уничтожения (не очень хорошо)
3. Сделать обьект частью другого долгоживущего обекта и повесить на тот обект ответственность за его создание/уничтожение
итд
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.