Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
Б   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.062 c
15-1266563892
12
2010-02-19 10:18
2010.08.27
Работа. Что бы Вы выбрали?


15-1264109427
Юрий
2010-01-22 00:30
2010.08.27
С днем рождения ! 22 января 2010 пятница


2-1268205413
Вася
2010-03-10 10:16
2010.08.27
TCategoryPanel


2-1272622374
slay64
2010-04-30 14:12
2010.08.27
Хранимая процедура


15-1273161371
Jalevis
2010-05-06 19:56
2010.08.27
ни один проект не запускается из Дельфей





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский