![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Не раз сталктваюсь с проблемой, что объект, разрушенный при помощи такого:
object.free после при проверки на nul выдаёт false, но при попытке к нему обратиться тоже assecc denied или тому подобное. Поэтому подскажите, пожалуйста, как дополнить код: If object<>nul then object.property:=value чтобы не возникало ошибок? -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 14 Всего: 48 |
для освобождения используй: FreeAndNil(object);
-------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Или делай
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Гы... дело не в том, как выгрузить (это я знаю), а как узнать, выгружен ли!!! Очень хочется знать!
-------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 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. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
А можно сделать так
|
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
а можно так
try object1.SomeMethod except // объект выгружен end; -------------------- С уважением, г-н Посол. |
|||
|
||||
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Почти то что нужно (cully и dsergey предлагали не способ определить, nul или нет, а установки nul), но хотелось бы чтобы не было исключений! Есть ли способ типа: if что_то(object) then showmessage('объект не создан!'); Может, можно посмотреть размер памяти, занимаемый объектом и емли он ноль, то он выгружен? Как-нибудь это можно сделать? -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
| altarasjuk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 7.5.2003 Где: Харьков Репутация: 1 Всего: 1 |
а не проще ли
? Метод assigned вернёт true если объект существует и false если его уже кто-то "убил". -------------------- Правда - изобретение маньяков: колет глаза и режет уши. |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 14 Всего: 48 |
Illusion Dolphin все дело в объектной модели дельфи -- объект и указатель на него ни как между собой не связаны, т.е. по сути две следующие записи эквивалентны:
а как можно по указателю на область памяти узнать действительно ли это те данные которые нужны? да ни как Как решение проблемы можно посоветовать использование COM-объектов -- они сами выгружаются когда на них нет больше ни одной ссылки. -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 14 Всего: 48 |
по поводу Assigned:
-------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
еще вариант: первые 4 байта = адресу класса объекта. Если ты знаешь класс объекта то можно узнать, инициализирован ли объект, правда все равно существует возможность ложного определения. А с памятью тут ничего не придумать - я смотрел, в Delphi память выделяется кусками, а в одном куске может сидеть несколько объектов. Не зная начального адреса выделенной памяти ничего не узнать...
-------------------- С уважением, г-н Посол. |
|||
|
||||
| stab |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 14 Всего: 48 |
т.е. просто делать:
-------------------- 6, 6, 6 - the number of the beast. |
||||
|
|||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Ну можно и is использовать, правда is проверяет, является ли object классом TMyObjectClass или наследником этого класса. Поэтому если класс известен, то лучше использовать равенство, если не известен, то is класс, от которого наследуются классы объектов, которые ты проверяешь, в крайнем случае, TObject.
вызов: if not CheckObject(YourObject, TObject) then // неинициализирован Это сообщение отредактировал(а) p0s0l - 31.8.2003, 16:22 -------------------- С уважением, г-н Посол. |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Вместо 4 лучше юзать AClass.InstanceSize.
А is вообще не работает, т.к. если объект указывает на какую-нибудь чушь, то is пытается отследить предков класса этого объекта, а класс объекта вообще не существует (т.к. объект указывает на мусор, а первые 4 байта, как я уже говорил - это указатель на класс)... -------------------- С уважением, г-н Посол. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |