Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Object = nul ??? 
:(
    Опции темы
Illusion Dolphin
Дата 29.8.2003, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Не раз сталктваюсь с проблемой, что объект, разрушенный при помощи такого:
object.free
после при проверки на nul выдаёт false, но при попытке к нему обратиться тоже assecc denied или тому подобное. Поэтому подскажите, пожалуйста, как дополнить код:
If object<>nul then
object.property:=value
чтобы не возникало ошибок?


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
stab
Дата 29.8.2003, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



для освобождения используй: FreeAndNil(object);


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
<Spawn>
Дата 29.8.2003, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Или делай
Код
Object.Free;
Object:=nil;



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Illusion Dolphin
Дата 29.8.2003, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Гы... дело не в том, как выгрузить (это я знаю), а как узнать, выгружен ли!!! Очень хочется знать!


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
stab
Дата 29.8.2003, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



ну дык, FreeAndNil(object); делает так:

object.Free;
object := nil;

равенство object nil'у и есть признак его выгружености, а если делать просто Free то object сохраняет указатель на объект, а объекта самого нет уже и тогда и появляеться Access violation... короче везде где у тя стоит object.Free замени на FreeAndNil(object);


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Akella
Дата 29.8.2003, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



А можно сделать так
Код
Form1:=TForm1.Crerate(self);
if Form1.ShowModal=mrOK then begin
...
end;
//вместо Form1.Free ставим
FreeAndNil(Form1);

PM MAIL   Вверх
p0s0l
Дата 29.8.2003, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



а можно так
try
object1.SomeMethod
except
// объект выгружен
end;



--------------------
С уважением, г-н Посол.
PM   Вверх
Illusion Dolphin
Дата 29.8.2003, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Цитата
а можно так
try
object1.SomeMethod
except
// объект выгружен
end;


Почти то что нужно (cully и dsergey предлагали не способ определить, nul или нет, а установки nul), но хотелось бы чтобы не было исключений! Есть ли способ типа:

if что_то(object) then showmessage('объект не создан!');

Может, можно посмотреть размер памяти, занимаемый объектом и емли он ноль, то он выгружен? Как-нибудь это можно сделать?


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
altarasjuk
Дата 30.8.2003, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



а не проще ли
Код

 if Assigned(obj) then
   obj.Foo();

?
Метод assigned вернёт true если объект существует и false если его уже кто-то "убил".


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
stab
Дата 30.8.2003, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



Illusion Dolphin все дело в объектной модели дельфи -- объект и указатель на него ни как между собой не связаны, т.е. по сути две следующие записи эквивалентны:

Код

type
TMyClass = class
 f1: Integer;
 procedure Inc;
end;

......

procedure Inc;
begin
Self.f1 := Self.f1 + 1;
end;

......

var
o1: TMyClass;

o1 := TMyClass.Create;
o1.Inc;
o1.Free;

///////////////////////////////////

type
TMyClassRecord = record
 f1: Integer;
end;
TMyClass = ^TMyClassRecord;

procedure Inc(Self: TMyClass);
begin
Self.f1 := Self.f1 + 1;
end;

.........

var
o1: TMyClass;

New(o1);
Inc(o1);
Dispose(o1);



а как можно по указателю на область памяти узнать действительно ли это те данные которые нужны? да ни как smile.gif конечно есть вариант, что указатель указывает на уже НЕвыделенную память тогда будет эксепшен, но скорее всего указатель будет указывать на память, которая уже используется под данные другого объекта, т.е. просто в полях объекта будут левые значения и вместо ожидаемых действий при вызове методов будет получаться что-то совсем не то.

Как решение проблемы можно посоветовать использование COM-объектов -- они сами выгружаются когда на них нет больше ни одной ссылки.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
stab
Дата 30.8.2003, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



по поводу Assigned:

Цитата
Assigned returns false if P is nil, true otherwise.
© Delphi Help


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
p0s0l
Дата 31.8.2003, 02:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



еще вариант: первые 4 байта = адресу класса объекта. Если ты знаешь класс объекта то можно узнать, инициализирован ли объект, правда все равно существует возможность ложного определения. А с памятью тут ничего не придумать - я смотрел, в Delphi память выделяется кусками, а в одном куске может сидеть несколько объектов. Не зная начального адреса выделенной памяти ничего не узнать...



--------------------
С уважением, г-н Посол.
PM   Вверх
stab
Дата 31.8.2003, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



Цитата
еще вариант: первые 4 байта = адресу класса объекта. Если ты знаешь класс объекта то можно узнать, инициализирован ли объект...


т.е. просто делать:
Код

if object is TMyObjectClass then
begin
...
end;



--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
p0s0l
Дата 31.8.2003, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Ну можно и is использовать, правда is проверяет, является ли object классом TMyObjectClass или наследником этого класса. Поэтому если класс известен, то лучше использовать равенство, если не известен, то is класс, от которого наследуются классы объектов, которые ты проверяешь, в крайнем случае, TObject.
Код
function CheckObject(ob : TObject; AClass : TClass) : boolean;
begin
 Result := false;
 if IsBadReadPtr(pointer(ob), 4) then exit; // можно ли читать эту память
 if ob.ClassType = AClass then Result := true; // можно так
//  if ob is AClass then Result := true; // можно и так
end;

вызов: if not CheckObject(YourObject, TObject) then // неинициализирован

Это сообщение отредактировал(а) p0s0l - 31.8.2003, 16:22


--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 31.8.2003, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Вместо 4 лучше юзать AClass.InstanceSize.
А is вообще не работает, т.к. если объект указывает на какую-нибудь чушь, то is пытается отследить предков класса этого объекта, а класс объекта вообще не существует (т.к. объект указывает на мусор, а первые 4 байта, как я уже говорил - это указатель на класс)...



--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0966 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.