![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ссылки в Delphi [D6]
MikePol © (2004-11-23 13:31:00)Есть объекты a и b типа TSomeClass.
Почему b не равно nil после кода :
a:=TSomeClass.Create;
b:=a;
a.Destroy;
А точнее как сделать так чтобы b=nil ?
Чем является b ? Ссылкой или чем то другим ?
icWasya (2004-11-23 18:53:00) [1]Есть компромиссное решение для случая, когда TSomeClassis 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;
jack128 (2004-11-23 15:11:00) [2]clickmaker © (23.11.04 14:09) [9]
Только попыткой обращения и отлавливанием AV
Нет гарантии, что будет AV.
Amoeba (2004-11-23 14:54:00) [3]
> MikePol (23.11.04 14:37) [16]
> Ок. Спасибо.
> Я так понял что AV -это исключительные ситуации ?
Правильно понял! AV = Access Violation.
MikePol (2004-11-23 14:37:00) [4]Ок. Спасибо.
Я так понял что AV -это исключительные ситуации ?
Pirat1 (2004-11-23 14:37:00) [5]
> MikePol (23.11.04 14:26) [13]
> У меня есть объект A.
Что ты имеешь ввиду под фразой "У меня есть объект A"?
Приведи код с твоим "обьектом" А
Amoeba (2004-11-23 14:34:00) [6]
> 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
MikePol (2004-11-23 14:26:00) [7]У меня есть объект A.
И есть ссылка на него B.
Я хочу по ссылке B узнать существует ли еще А, или он уже разрушен.
Pirat1 (2004-11-23 14:21:00) [8]
> clickmaker © (23.11.04 14:09) [9]
Ты имеешь ввиду обработкой try ... except ?
MikePol (2004-11-23 14:20:00) [9]Что такое AV ?
Значит после разрушения объекта ссылка не становиться nil ..
Это очень печально ... Придется все ручками делать.
А вообще по-моему логично было бы, что при невалидности объекта, ссылки на него устанавливались бы в nil ... Ну нет так нет :(
Pirat1 (2004-11-23 14:10:00) [10]
> MikePol (23.11.04 13:47) [7]
> Хорошо.
> Можно ли по значению В узнать о состоянии А ?
Чего чего?
Напиши подробнее что тебе надо.
clickmaker (2004-11-23 14:09:00) [11]
> [7] MikePol (23.11.04 13:47)
> Хорошо.
> Можно ли по значению В узнать о состоянии А ?
нет. Только попыткой обращения и отлавливанием AV
Amoeba (2004-11-23 14:08:00) [12]
> MikePol (23.11.04 13:47) [7]
> Хорошо.
> Можно ли по значению В узнать о состоянии А ?
Это как?
MikePol (2004-11-23 13:47:00) [13]Хорошо.
Можно ли по значению В узнать о состоянии А ?
Pirat1 (2004-11-23 13:44:00) [14]
> Мне нужно сделать так, чтобы после уничтожения А, значение
> В стало nil. Реально ли это ?
Да реально!
a.Free;
b:=nil;
Mikepol (2004-11-23 13:42:00) [15]Мне нужно сделать так, чтобы после уничтожения А, значение В стало nil. Реально ли это ?
clickmaker (2004-11-23 13:41:00) [16]
> MikePol (23.11.04 13:31)
Для копирования объектов каждый класс обычно реализует свой метод Assign или AssignTo
Skier (2004-11-23 13:36:00) [17]
> Ссылкой или чем то другим ?
Ссылкой. Только недействительной, т.е. ссылается на объект, который уже был освобожден.
> А точнее как сделать так чтобы b=nil ?
Явно писать b := nil;
> a.Destroy;
И лучше писать a.Free; и использовать try-блок.
Pirat1 (2004-11-23 13:36:00) [18]
> a.Destroy;
Я бы метод Free использовал бы.
Pirat1 (2004-11-23 13:34:00) [19]
> Чем является b ?
Ссылкой на чтото, что уже не существует!