IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Вопрос по Delphi (https://www.imho.ws/showthread.php?t=47251)

SpacerV 29.12.2003 18:34

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

Код:

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

// Так вот, IsSomeObjectNil всегда равен False.

Если кому-то необходимо знать для чего это конкретно - объясню.

RaZEr 29.12.2003 18:47

А SomeObject := nil не катит ?

SpacerV 29.12.2003 19:06

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

Код:

if Assigned(FChildForm) then FChildForm.Free;
А проблема возникает тогда, когда дочернее окно закрывается собственными кнопками (exmpl: Self.Close), FChildForm в Nil не устанавливается, тогда приведенный код - ошибочен (access violation).

RaZEr 29.12.2003 19:09

fchildform.handle проверяй.

SpacerV 29.12.2003 19:37

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

Добавлено через 21 минуту:
RaZEr
Фу-у-у-ух. А я уж думал, что я плохо ООП учил. Специально проверил совет. Объясняю: если объект уничтожен, то в переменной (фактически, указатель) "мусор", не Nil, но и не объект, достать поле или метод такого объекта - ошибка "Access violation". Совет не работает. Может чего другое?

RaZEr 29.12.2003 19:50

Раз мусор, то fchildform.handleallocated вернет false.

SpacerV 29.12.2003 20:48

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

theQUE 30.12.2003 20:21

FreeAndNil(SomeObject)

SpacerV 30.12.2003 20:48

theQUE
Да я ж писал уже, что если сам объект уничтожаю, то и Nil присвоить могу (даже без фа-а-а-нтасти-и-и-ической процедуры FreeAndNil). Но проблема, если объект (форма, например) уничтожается встроенными классами, а не моими (имеются ввиду классы, поставляемые с Delphi), тогда я не могу присвоить Nil и, следственно, определить есть этот объект (форма) или его уже нет давно.

xpman2002 14.01.2004 15:26

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


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

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