Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.04.2011, 17:43
Аватар для Lothlorien
Lothlorien Lothlorien вне форума
Новичок
 
Регистрация: 06.04.2011
Адрес: Солнечная система
Сообщения: 69
Версия Delphi: 7.0
Репутация: 12
Вопрос Тупой вопрос от новичка ))

Сравнительно недавно перешёл на ООП, вроде бы усвоил объектно-ориентированную философию. Только вот есть элементарная проблемка, не знаю, как её решить по-умному:

как определить, создан ли объект? Я пишу так:

if (Obj <> nil) then {...}

но это вызывает Access Violation, если объект не был создан.

Пробовал и так:

if Assigned(Obj) then {...}

та же фигня.

Посоветуйте, как можно решить эту проблему. Возможно, нужно с указателями оперировать?
Ответить с цитированием
  #2  
Старый 06.04.2011, 17:59
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ну так-то правильно, что проверять на nil.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 06.04.2011, 19:38
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Очень важно, где был определён Obj. Если это поле формы, то оно при создании формы получает значение nil. Если это локальная переменная функции / процедуры, то там мусор и перед созданием объекта надо эту ссылку инициализировать:
Код:
Obj:= nil;
Obj:= <тип>.Create();
(прочитайте справку по Delphi. Компилятор инициализирует поля сложных типов (record, class) и глобальные переменные. Локальные переменные функций всегда содержат мусор.)

Если объект уничтожается, но ссылка будет повторно использоваться, то после уничтожения объекта надо принудительно её привести к nil:
Код:
Obj.Free;
Obj:= nil;
Есть хороший совет вместо Free использовать только FreeAndNil.

А ваши варианты тогда будут работать. (Я использую Assigned).

Последний раз редактировалось AlexSku, 06.04.2011 в 19:43.
Ответить с цитированием
  #4  
Старый 06.04.2011, 20:43
Аватар для Lothlorien
Lothlorien Lothlorien вне форума
Новичок
 
Регистрация: 06.04.2011
Адрес: Солнечная система
Сообщения: 69
Версия Delphi: 7.0
Репутация: 12
По умолчанию

AlexSku, большое спасибо за совет
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:44.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter