Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ссылки в 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 ?

Ссылкой на чтото, что уже не существует!


Наверх

Титульная страница Поиск, карта сайта Написать письмо