imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 29.12.2003, 18:34     # 1
SpacerV
Guest
 
Сообщения: n/a

Question Вопрос по Delphi

Как в Delphi заставить переменную удаленного (Destroyed)объекта "уходить" в Nil? Пример:

Код:
...
SomeObject:=TSomeObject.Create;
...
SomeObject.Free;
IsSomeObjectNil:=(SomeObject=Nil);

// Так вот, IsSomeObjectNil всегда равен False.
Если кому-то необходимо знать для чего это конкретно - объясню.
 
Старый 29.12.2003, 18:47     # 2
RaZEr
МОД-Оператор ЭВМ
 
Аватар для RaZEr
 
Регистрация: 18.04.2002
Адрес: Питер
Сообщения: 4 343

RaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех Гуру
А SomeObject := nil не катит ?
RaZEr вне форума  
Старый 29.12.2003, 19:06     # 3
SpacerV
Guest
 
Сообщения: n/a

RaZEr
Так надеялся, что объяснять не буду (долго просто) но не выйдет .
Итак, для приложений многооконных (многофрейменных) есть такая проблема: если одно окно зависит от другого (кнопка одного открывает другое), то желательно перед созданием дочернего окна проверить, а нет ли его уже:

Код:
if Assigned(FChildForm) then FChildForm.Free;
А проблема возникает тогда, когда дочернее окно закрывается собственными кнопками (exmpl: Self.Close), FChildForm в Nil не устанавливается, тогда приведенный код - ошибочен (access violation).
 
Старый 29.12.2003, 19:09     # 4
RaZEr
МОД-Оператор ЭВМ
 
Аватар для RaZEr
 
Регистрация: 18.04.2002
Адрес: Питер
Сообщения: 4 343

RaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех Гуру
fchildform.handle проверяй.
RaZEr вне форума  
Старый 29.12.2003, 19:37     # 5
SpacerV
Guest
 
Сообщения: n/a

Еще, прошу не матюкать за двойную проверку.

Добавлено через 21 минуту:
RaZEr
Фу-у-у-ух. А я уж думал, что я плохо ООП учил. Специально проверил совет. Объясняю: если объект уничтожен, то в переменной (фактически, указатель) "мусор", не Nil, но и не объект, достать поле или метод такого объекта - ошибка "Access violation". Совет не работает. Может чего другое?
 
Старый 29.12.2003, 19:50     # 6
RaZEr
МОД-Оператор ЭВМ
 
Аватар для RaZEr
 
Регистрация: 18.04.2002
Адрес: Питер
Сообщения: 4 343

RaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех Гуру
Раз мусор, то fchildform.handleallocated вернет false.
RaZEr вне форума  
Старый 29.12.2003, 20:48     # 7
SpacerV
Guest
 
Сообщения: n/a

RaZEr
Попробовал. С первого раза сработало - у меня чуть шок не случился, ведь HandleAllocated не метод класса. Я уж чуть было не полез за учебником по ООП. Потом же при детальном рассмотрении такая вещь вылезла: по непонятному (может только мне) стечению обстоятельств, первая переменная типа TForm1 видимо указывает на сам класс - все работает ОК, но вторая переменная в моем случае была Nil, 3ая - Nil, 4ая - Access Violation. Так что я не уверен, что это хороший способ. По крайней мере, он противоречит ООП (хотя, может, я чего не понял).
 
Старый 30.12.2003, 20:21     # 8
theQUE
Guest
 
Сообщения: n/a

FreeAndNil(SomeObject)
 
Старый 30.12.2003, 20:48     # 9
SpacerV
Guest
 
Сообщения: n/a

theQUE
Да я ж писал уже, что если сам объект уничтожаю, то и Nil присвоить могу (даже без фа-а-а-нтасти-и-и-ической процедуры FreeAndNil). Но проблема, если объект (форма, например) уничтожается встроенными классами, а не моими (имеются ввиду классы, поставляемые с Delphi), тогда я не могу присвоить Nil и, следственно, определить есть этот объект (форма) или его уже нет давно.
 
Старый 14.01.2004, 15:26     # 10
xpman2002
Guest
 
Сообщения: n/a

Попробуй вместо неявного уничтожения объекта через посылку Perform(CM_УБЕЙ_САМ_СВОЮ_FChildForm, ..., ...)
 


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 04:16.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.