Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
Внизссылки в Delphi Найти похожие ветки
← →
MikePol (2004-11-23 13:31) [0]Есть объекты a и b типа TSomeClass.
Почему b не равно nil после кода :
a:=TSomeClass.Create;
b:=a;
a.Destroy;
А точнее как сделать так чтобы b=nil ?
Чем является b ? Ссылкой или чем то другим ?
← →
Pirat1 (2004-11-23 13:34) [1]
> Чем является b ?
Ссылкой на чтото, что уже не существует!
← →
Pirat1 (2004-11-23 13:36) [2]
> a.Destroy;
Я бы метод Free использовал бы.
← →
Skier © (2004-11-23 13:36) [3]
> Ссылкой или чем то другим ?
Ссылкой. Только недействительной, т.е. ссылается на объект, который уже был освобожден.
> А точнее как сделать так чтобы b=nil ?
Явно писать b := nil;
> a.Destroy;
И лучше писать a.Free; и использовать try-блок.
← →
clickmaker © (2004-11-23 13:41) [4]
> MikePol (23.11.04 13:31)
Для копирования объектов каждый класс обычно реализует свой метод Assign или AssignTo
← →
Mikepol (2004-11-23 13:42) [5]Мне нужно сделать так, чтобы после уничтожения А, значение В стало nil. Реально ли это ?
← →
Pirat1 (2004-11-23 13:44) [6]
> Мне нужно сделать так, чтобы после уничтожения А, значение
> В стало nil. Реально ли это ?
Да реально!a.Free;
b:=nil;
← →
MikePol (2004-11-23 13:47) [7]Хорошо.
Можно ли по значению В узнать о состоянии А ?
← →
Amoeba © (2004-11-23 14:08) [8]
> MikePol (23.11.04 13:47) [7]
> Хорошо.
> Можно ли по значению В узнать о состоянии А ?
Это как?
← →
clickmaker © (2004-11-23 14:09) [9]
> [7] MikePol (23.11.04 13:47)
> Хорошо.
> Можно ли по значению В узнать о состоянии А ?
нет. Только попыткой обращения и отлавливанием AV
← →
Pirat1 (2004-11-23 14:10) [10]
> MikePol (23.11.04 13:47) [7]
> Хорошо.
> Можно ли по значению В узнать о состоянии А ?
Чего чего?
Напиши подробнее что тебе надо.
← →
MikePol (2004-11-23 14:20) [11]Что такое AV ?
Значит после разрушения объекта ссылка не становиться nil ..
Это очень печально ... Придется все ручками делать.
А вообще по-моему логично было бы, что при невалидности объекта, ссылки на него устанавливались бы в nil ... Ну нет так нет :(
← →
Pirat1 (2004-11-23 14:21) [12]
> clickmaker © (23.11.04 14:09) [9]
Ты имеешь ввиду обработкой try ... except ?
← →
MikePol (2004-11-23 14:26) [13]У меня есть объект A.
И есть ссылка на него B.
Я хочу по ссылке B узнать существует ли еще А, или он уже разрушен.
← →
Amoeba © (2004-11-23 14:34) [14]
> MikePol (23.11.04 14:26) [13]
> У меня есть объект A.
> И есть ссылка на него B.
> Я хочу по ссылке B узнать существует ли еще А, или он уже
> разрушен.
Ответ уже был дан:
clickmaker © (23.11.04 14:09) [9]
> [7] MikePol (23.11.04 13:47)
> Хорошо.
> Можно ли по значению В узнать о состоянии А ?
нет. Только попыткой обращения и отлавливанием AV
← →
Pirat1 (2004-11-23 14:37) [15]
> MikePol (23.11.04 14:26) [13]
> У меня есть объект A.
Что ты имеешь ввиду под фразой "У меня есть объект A"?
Приведи код с твоим "обьектом" А
← →
MikePol (2004-11-23 14:37) [16]Ок. Спасибо.
Я так понял что AV -это исключительные ситуации ?
← →
Amoeba © (2004-11-23 14:54) [17]
> MikePol (23.11.04 14:37) [16]
> Ок. Спасибо.
> Я так понял что AV -это исключительные ситуации ?
Правильно понял! AV = Access Violation.
← →
jack128 © (2004-11-23 15:11) [18]clickmaker © (23.11.04 14:09) [9]
Только попыткой обращения и отлавливанием AV
Нет гарантии, что будет AV.
← →
icWasya © (2004-11-23 18:53) [19]Есть компромиссное решение для случая, когда TSomeClass is TComponent. В VCL сплошь и рядом компоненты ссылаются друг на друга, а создаются и уничтожаются независимо. Нужно переопределить метод Notification и в нем делать обнуление проблемного указателя.
Например
type
TSomeClass1=Class
FA:TSomeClass;
procedure SetA(AA:TSomeClass);
public
Procedure Notification(AComponent: TComponent; Operation: TOperation);Override;
public
property A:TSomeClass read FA write SetFA;
end;
implementation
procedure TSomeClass.SetA(AA:TSomeClass);
begin
if AA=FA then Exit;
FA:=AA;
if FA<>Nil then FreeNotification(FA);
end;
Procedure TSomeClass.Notification(AComponent: TComponent; Operation: TOperation);
begin
if Operation=opRemove then begin
if AComponent=FA then FA :=Nil;
end;
inherited;
end;
Тогда
procedure TForm1.Button1Click(Sender);
var
A,B:TSomeClass;
begin
A:=TSomeClass.Create(Self);
B:=TSomeClass.Create(Self);
A.A:=B;
FreeAndNil(B);
//A.A=Nil;
FreeAndNil(A);
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.042 c