Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Как удалить объект по ссылке.   Найти похожие ветки 

 
Б   (2010-04-12 18:51) [0]

Здрасти!

Задача такая: создаётся любой класс.
Есть указатель, которому передаётся адресс класса.
И теперь как зная только этот указатель (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 18:58) [1]

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


 
Anatoly Podgoretsky ©   (2010-04-12 19:01) [2]

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

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


 
Б   (2010-04-12 19:04) [3]

Ну да FreeAndNil (TObject(P))


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

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


 
Anatoly Podgoretsky ©   (2010-04-12 19:17) [5]

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


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


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


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


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


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


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


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


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


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


 
Демо ©   (2010-04-12 19:40) [9]

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


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


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


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


 
Б   (2010-04-12 20:04) [11]

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



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 20:23) [12]


>  Что скажете? ;)


Посмотри в справке TObjList вместо TList.


 
Б   (2010-04-12 20:32) [13]


> Посмотри в справке TObjList вместо TList.


Если посмотреть исходники, то от TList почти ни чем не отличается.


 
Игорь Шевченко ©   (2010-04-12 20:34) [14]


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


Если твой знакомый сменил номер телефона, должен ли этот номер автоматически измениться в твоей записной книжке ?


 
Б   (2010-04-12 20:53) [15]

TButton.WordWrap:= True. Не?


 
Б   (2010-04-12 20:53) [16]

Не туда запостил. ;)


 
Демо ©   (2010-04-12 22:11) [17]


> Б   (12.04.10 20:32) [13]
> > Посмотри в справке TObjList вместо TList.Если посмотреть
> исходники, то от TList почти ни чем не отличается.


Ключевое слово -"Почти".
TObjectList самостоятельно уничтожает объекты при удалении из списка.


 
Б   (2010-04-12 22:28) [18]

Вот так получилось:


Constructor TManaged.Create;
begin
 inherited;
 FList:= TList.Create;
End;

Destructor TManaged.Destroy;
Var
 i: LongWord;
begin
 For i:= FList.Count to 0 do
   TObject(FList.Items[i]).Free;
 FList.Free;
 inherited;
End;

Function TManaged.GetTexture(const FileName: string): TTex;
begin
 Result:= TTex.Create;
 Result.Load(FileName);
 FList.Add(Result);
End;


 
Amoeba_   (2010-04-12 22:42) [19]


> Б   (12.04.10 18:51)  

Сказка про белого бычка? На колу мочало?

Вам ведь уже 2 дня назад все разжевали и в рот положили здесь:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=76466


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

И что там предложили?

Привести указатель к TObject и вызвать Free. Объект то не занилится.
Так не получилось. - Б   (12.04.10 19:04) [3]
Ещё про Assigned рассказали и про overload.

Не следи за мной. ;)


 
_Юрий ©   (2010-04-12 22:55) [21]


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


Ну да. А потом ты записываешь в P nil, и ожидаешь, что почему то nil окажется и в O/


>  For i:= FList.Count to 0 do
>    TObject(FList.Items[i]).Free;
>


просто прелестно.
И сколько раз пройдет цикл?)


 
Amoeba_   (2010-04-12 22:55) [22]


> Привести указатель к TObject и вызвать Free. Объект то не
> занилится.

Так ведь и вручную, без FreeAndNil можно было после этого занилить.


 
Б   (2010-04-12 23:03) [23]


> _Юрий ©   (12.04.10 22:55) [21]
> Ну да. А потом ты записываешь в P nil, и ожидаешь, что почему
> то nil окажется и в O/


Имея адресс O, можно им манипулировать.

> просто прелестно.

Там down to.


 
Игорь Шевченко ©   (2010-04-12 23:03) [24]


> Там down to.


какая хрен разница ?


 
Б   (2010-04-12 23:05) [25]


> Amoeba_   (12.04.10 22:55) [22]


Так что ли? "True" - итог.


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



 
Б   (2010-04-12 23:08) [26]


> какая хрен разница ?


Мне Mbo, когда я тут вопрос про списки задавал, так посоветовал.


 
Игорь Шевченко ©   (2010-04-12 23:18) [27]


> Мне Mbo, когда я тут вопрос про списки задавал, так посоветовал.


не верю. не мог он такого посоветовать. первая же команда выдаст List index out of bounds


 
Б   (2010-04-12 23:24) [28]

Давно было. Не помню.
Вот нашёл.
http://www.delphimaster.net/view/2-1232025231

P.S. Как было написано, так и пишу. ;)


 
TAX   (2010-04-12 23:51) [29]

Нет повести печальнее на свете...Ладно вернемся к началу:

> Задача такая: создаётся любой класс.Есть указатель, которому
> передаётся адресс класса.И теперь как зная только этот указатель
> (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?

[b]Внимание ответ[/b]: никак.


 
Б   (2010-04-12 23:54) [30]

> TAX   (12.04.10 23:51) [29]

Все разборки на том форуме. ;)


 
Игорь Шевченко ©   (2010-04-13 00:07) [31]


> Все разборки на том форуме. ;)


А ты когда-нибудь книгу по программированию видел живьем ? Увидишь - ты ее читай. А не по форумам сотню мудрецов напрягай.



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.05 c
15-1270931403
Юрий
2010-04-11 00:30
2010.08.27
С днем рождения ! 11 апреля 2010 воскресенье


2-1271328693
vasya
2010-04-15 14:51
2010.08.27
Создание "компилятора" e-book


15-1273530236
Фд
2010-05-11 02:23
2010.08.27
Привязать домены


15-1264517700
Nucer
2010-01-26 17:55
2010.08.27
Proxy сервер на 1000+ соединений на Delphi с исходным кодом


15-1267445916
Piter
2010-03-01 15:18
2010.08.27
Форматирование HTML кода из Delphi