Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2009, 18:58   #1
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию Как проверить создан ли класс конструктором?

Как проверить создан ли класс конструктором?
Вадим Буренков вне форума Ответить с цитированием
Старый 01.07.2009, 19:13   #2
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Я так понимаю есть переменная - ссылка на объект.
При инициализации присвойте ей nil.
При создании объекта она примет некоторое значение (адрес) не nil.
После уничтожения объекта присвойте ей снова nil.
В итоге: если nil- объекта нет, иначе есть.

P.S. Возможно, я неверно вас понял. Можете уточнить.
И создан не класс, а объект.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 01.07.2009, 19:27   #3
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

Assigned
Evgeniy26 вне форума Ответить с цитированием
Старый 01.07.2009, 19:30   #4
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

У меня в игре есть класс TShip и переменные класса Ship
Код:
Ship: array [0..100] of TShip;
Я создаю переменные в OnCreate собственным конструктором
Код:
Ship[0]:=TShip.CreateFromINI('PlayerShip.ini');
, в таймере они обрабатывается
Код:
for n:=0 to 100 do Ship[n].Processing;
а в OnClose очищаются:
Код:
for n:=0 to 100 do Ship[n].Free;
Но проблема в том что какое количество кораблей создастся заранее неизвестно(определяется текстовым файлом). Например в OnCreate создастся 15 кораблей, а в таймере будет попытка обработать 100, что вызовет ошибку. Если бы я знал какие переменные класса созданы, то я бы только их и обрабатывал:
Код:
for n:=0 to 100 do if Ship[n].(был создан)=true then Ship[n].Processing;
Эту проблему можно было бы обойти, но создабтся переменные не по порядку (Ship[0],Ship[1],Ship[2]), а случайным образом (Ship[14],Ship[67],Ship[5]).


Цитата:
Assigned
Что-то не понял как использовать. Можешь привести пример на классах?

Последний раз редактировалось Вадим Буренков; 01.07.2009 в 19:35.
Вадим Буренков вне форума Ответить с цитированием
Старый 01.07.2009, 19:35   #5
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

Код:
for n:=0 to 100 do 
  if  Assigned(Ship[n]) then 
    Ship[n].Processing;
Evgeniy26 вне форума Ответить с цитированием
Старый 01.07.2009, 19:38   #6
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Assigned и проверяет значение переменной на nil.
Это тоже самое, о чем я писал во 2-ом посте.
Аналогично:
Код:
for n:=0 to 100 do 
  if  Ship[n] <> nil then 
    Ship[n].Processing;
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 01.07.2009, 19:39   #7
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Как ни странно я тоже так подумал, но ошибка осталась?!
Тогда я изменил с True на False:
for n:=0 to 100 do
if Assigned(Ship[n])=false then
Ship[n].Processing;
Теперь все работает.
Вадим Буренков вне форума Ответить с цитированием
Старый 01.07.2009, 20:46   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

какой ужас... а не пришло ли к вам в голову, что просто сделать динамический массив, или вообще, использовать TList - что есть корректный метод, для хранения списка ваших классов ?
TList даст вам и кол-во элементов, и редактирование, типа удалить, переместить и т.п... а вообще сделать класс на основе TList, который бы интерпритировал каждый элемент как
Код:
property Items[Index: Integer]: TShip read GetItem; default;
ну и остальные всякие Add, Delete, Clear и Count, а так же для ваших нужд, типа Porcessing или как там. Тогда и код основного модуля чище, и все более организованней, а вот
Код:
if Assigned(Ship[n])=false then 
Ship[n].Processing;
Полная ерунда. Честное слово. Без обид.
BOBAH13 вне форума Ответить с цитированием
Старый 01.07.2009, 20:54   #9
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Код:
if Assigned(Ship[n])=false then 
Ship[n].Processing;
Этот код обязан приводить к AV
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 01.07.2009, 21:26   #10
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Значит у меня Delphi заглючил. Когда я перезапустил проэкт то работать стало только в как в примере Daramant'a.

Цитата:
какой ужас... а не пришло ли к вам в голову, что просто сделать динамический массив, или вообще, использовать TList - что есть корректный метод, для хранения списка ваших классов ?
Я никогда им не пользовался и не знаю как.Какие он имеет преимущества? И зачем мне его использовать если у меня и так все работает?
Вадим Буренков вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как Как проверить кнопки мыши без OnMouseDown? Вадим Буренков Общие вопросы Delphi 3 22.05.2009 15:08
Проверить создан ли уже массив slips Общие вопросы C/C++ 2 19.04.2009 18:31
Как узнать когда был изменен (создан) интерфейс версии IPv6. Crazyman Работа с сетью в Delphi 0 15.12.2008 00:51
Как обратиться к объекту который был только что создан Arassir Помощь студентам 5 24.10.2008 20:42
массив объектов с конструктором копии pu4koff Общие вопросы C/C++ 6 18.06.2008 17:33