Форум: "Начинающим";
Текущий архив: 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.063 c