Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как удалить объект по ссылке. [D7, XP]


Страницы:   1 2

Б ©   (2010-04-12 18:51:00) 

Здрасти!

Задача такая: создаётся любой класс.
Есть указатель, которому передаётся адресс класса.
И теперь как зная только этот указатель (P) удалить сам класс, на который он указывает.


Var
 P: Pointer;            // Хотя класс это уже указатель.
 O: TObject;          // Любой класс.
begin
 O:= TObject.Create;
 P:= O;                // Присваиватся будут только классы.

 TObject(P).Free;  // Пытаемся удалить O через P.

 If Assigned(O) then Caption:= 'True'
 else                      Caption:= 'False';
End;


Пишет 'True'.
Вопрос: Как занилить O имея при себе только P?


Б   (2010-04-12 20:04:00) [21]

Для общей картинки:



Type
 TObjMan = class                        // Var Man: TObjMan.
 Private
   FList: TList;
 Public
   Function GetObj_1: TObj_1;
   Function GetObj_2(N1, N2: LongWord): TObj_2; overload;
   Function GetObj_2(const FileName: string): TObj_2; overload;
   Function GetObj_3...
   Function GetObj_4...
   . . . . .
 End;

Function TObjMan.GetObj_1: TObj_1;
begin
 Resulr:= TObj_1.Create;
 FList.Add(Result);
End;

Var
 O, A, B, X: TObj_2;

Procedure Init;
begin
 O:= Man.GetObj_2(10, 10);           // Как бы удобно.
 . . . . .
End;

Procedure Free;
begin
 (*
    O.Free // Не хочется так прописывать.

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

    Что скажете? ;)
 *)
End;


Б   (2010-04-12 19:51:00) [22]


> Демо ©   (12.04.10 19:40) [9]


Спасибо!
Достаточно замутно.


Демо   (2010-04-12 19:40:00) [23]

 pp: Pointer;
 o: TObject;
begin
 o := TObject.Create;
 pp := Addr(o);
 FreeAndnil(TObject(pp^));
 if Assigned(o) then ShowMessage('Ok');


Б   (2010-04-12 19:25:00) [24]


> в P и в O хранится один и тот же адрес


Ну дак понятно. P:= O.


_Юрий   (2010-04-12 19:23:00) [25]


> Вроде как в P хранится адрес O.


нет
в P и в O хранится один и тот же адрес


Б   (2010-04-12 19:22:00) [26]


> Anatoly Podgoretsky ©   (12.04.10 19:17) [5]
> И как тебе это поможет с О


Вроде как в P хранится адрес O.


Anatoly Podgoretsky   (2010-04-12 19:17:00) [27]

И как тебе это поможет с О


Б   (2010-04-12 19:11:00) [28]

Всё равно выводит 'True'.


Б   (2010-04-12 19:04:00) [29]

Ну да FreeAndNil (TObject(P))


Anatoly Podgoretsky   (2010-04-12 19:01:00) [30]

> Б  (12.04.2010 18:51:00)  [0]

А где хотя бы попытка "занилить"?


Игорь Шевченко   (2010-04-12 18:58:00) [31]

изучить freeandnil по справке ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо