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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление объектов из большого кол-ва списков 
:(
    Опции темы
GePo
Дата 17.3.2006, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



У меня при выполнении программы есть много объектов и списков этих объектов. Если я захочу удалить какой-нибудь объект, то мне придется искать его во всех списках, чтобы удалить и из них, но этого делать крайне не хочется.
Что сделал я: создал что-то наподибие итератора из С++, которые безопасно перебирал бы все объекты списка. Т.е., просматривая очередной объект списка, смотреть - а существует ли он? Если нет, то сразу перейти к следующему объекту, удалив фиктивный. Тогда, мне достаточно просто удалить объект один раз, а из списков он удалиться автоматически.
Загвоздка вышла в том, а как определить, существует ли объект? Т.е., например у меня есть ссылка на объект obj : TMyClass, как определить, что объект в obj сущетсвует? Что сделал я:
Код

TMyClass = class
.........
                     function Noop : Boolean; virtual;
                  end;
..............

function TMyClass.Noop : Boolean;
begin
  result := true;
end;


и проверяю соотвественно так:
Код

try
  ....
  if obj.Noop then
    break;
except
  continute;
end;


Так вот, проблема в том, что даже если obj не существует, Noop все равно может вызываться, возвращать значение и не генерировать исключение.
Как тогда проверить, существует объект или нет? Либо есть другой способ простого удаления объекта из всех списков?
--------------------
PM MAIL WWW   Вверх
Snowy
Дата 17.3.2006, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Удаляй объект по FreeAndNil(obj)
После этого проверить элементарно: if Assign(obj) then существует
PM MAIL   Вверх
GePo
Дата 17.3.2006, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Нет, может я непонятно объснил, но в списке хранятся ссылки на сами объекты, а не указатели на одну переменную. Т.е. FreeAndNil(Obj) - удалит объект Obj и занулит какую-то текущую ссылку на объект. А все остальные ссылки на этот же объект он не тронет.

Это сообщение отредактировал(а) GePo - 17.3.2006, 10:18
--------------------
PM MAIL WWW   Вверх
Демо
Дата 17.3.2006, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

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



Разные варианты.

1. Построить систему извещений (Notification)
Примерная схема:
Каждый объект-список при создании регистрируется в еще одном списке - список извещаемых объектов.
Любой объект, помещаемый в объекты списки должен иметь метод извещения этих списков, а списки должны уметь эти извещения обрабатывать, соответственно.

2. Использовать твою схему, но вот так:
Код

 private 
    FExists: Boolean;
 public
    property Exists: Boolean read  FExists;


в конструкторе:
Код

FExists := True;

в деструкторе:
Код

FExists := False;


Ну а проверка понятно:
Код

try    
  ....    
  if obj.Exists then    
    break;    
except    
  continute;    
end;


Я бы предпочел первый метод, так как создание исключительной ситуации для проверки не есть хорошо и быстро при работе с большим количеством объектов.


--------------------
    
PM MAIL ICQ Skype   Вверх
GePo
Дата 17.3.2006, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо огромное, сделал пока вторым способом, т.к. списков у меня много, а удаление объектов будет происходить очень редко, так что система оповещений может оказатся довольно таки накладной. Хотя может ошибаюсь, но все равно идею приму на разработку, может выйдет более качественне, чем есть сейчас и еще раз спасибо.

Это сообщение отредактировал(а) GePo - 17.3.2006, 10:34
--------------------
PM MAIL WWW   Вверх
Snowy
Дата 17.3.2006, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



3. Создать реестр объектов - отдельный , где объекты регистрируются при создании и удаляются оттуда при уничтожении. Если в реестре нет - значит мертв.
4. Реестр списков объектов. Заносить в реестр все списки, а уничтожать объекты не вручную, а через процедуру, которая сначала произведет поиск во всех списках и везде поудаляет.
PM MAIL   Вверх
GePo
Дата 17.3.2006, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ну чтож, ИМХО
3. не удобно работать
4. аналог системы оповещений, только термины другие.
--------------------
PM MAIL WWW   Вверх
Alexeis
Дата 17.3.2006, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата

уничтожать объекты не вручную, а через процедуру, которая сначала произведет поиск во всех списках и везде поудаляет.

лучше чтоб этой процедурой и был деструктор объекта.
я както делал такую штуку работает нормально.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

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

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

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

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

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


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

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


 




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


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

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