Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.035 c
4-1098281613
UnDISCOvery
2004-10-20 18:13
2004.12.05
Не могу связать 2 компа через COM-порт. Помогите!


6-1096520266
Slonco
2004-09-30 08:57
2004.12.05
Как заставить сетевой комп запустить приложение командой сервера?


1-1100630052
Fantasist
2004-11-16 21:34
2004.12.05
Sharemem


1-1101107330
LOL
2004-11-22 10:08
2004.12.05
Печать


1-1101094265
zzTop
2004-11-22 06:31
2004.12.05
Подключение баз KAV к воей программе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский