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

Вниз

ссылки в 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.026 c
1-1100755828
main
2004-11-18 08:30
2004.12.05
Файловая система и TREEVIEW


1-1100002576
Checist [root]
2004-11-09 15:16
2004.12.05
Событие скрола мыши


14-1100512864
dron-s
2004-11-15 13:01
2004.12.05
Где мне взять картинки?


1-1100981104
James007
2004-11-20 23:05
2004.12.05
Меню и картинки


1-1101137379
hgd
2004-11-22 18:29
2004.12.05
Как отследить