![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| GePo |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 30.3.2003 Где: Москва Репутация: нет Всего: 3 |
У меня при выполнении программы есть много объектов и списков этих объектов. Если я захочу удалить какой-нибудь объект, то мне придется искать его во всех списках, чтобы удалить и из них, но этого делать крайне не хочется.
Что сделал я: создал что-то наподибие итератора из С++, которые безопасно перебирал бы все объекты списка. Т.е., просматривая очередной объект списка, смотреть - а существует ли он? Если нет, то сразу перейти к следующему объекту, удалив фиктивный. Тогда, мне достаточно просто удалить объект один раз, а из списков он удалиться автоматически. Загвоздка вышла в том, а как определить, существует ли объект? Т.е., например у меня есть ссылка на объект obj : TMyClass, как определить, что объект в obj сущетсвует? Что сделал я:
и проверяю соотвественно так:
Так вот, проблема в том, что даже если obj не существует, Noop все равно может вызываться, возвращать значение и не генерировать исключение. Как тогда проверить, существует объект или нет? Либо есть другой способ простого удаления объекта из всех списков? --------------------
|
||||
|
|||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Удаляй объект по FreeAndNil(obj)
После этого проверить элементарно: if Assign(obj) then существует |
|||
|
||||
| GePo |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 30.3.2003 Где: Москва Репутация: нет Всего: 3 |
Нет, может я непонятно объснил, но в списке хранятся ссылки на сами объекты, а не указатели на одну переменную. Т.е. FreeAndNil(Obj) - удалит объект Obj и занулит какую-то текущую ссылку на объект. А все остальные ссылки на этот же объект он не тронет.
Это сообщение отредактировал(а) GePo - 17.3.2006, 10:18 --------------------
|
|||
|
||||
| Демо |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Разные варианты.
1. Построить систему извещений (Notification) Примерная схема: Каждый объект-список при создании регистрируется в еще одном списке - список извещаемых объектов. Любой объект, помещаемый в объекты списки должен иметь метод извещения этих списков, а списки должны уметь эти извещения обрабатывать, соответственно. 2. Использовать твою схему, но вот так:
в конструкторе:
в деструкторе:
Ну а проверка понятно:
Я бы предпочел первый метод, так как создание исключительной ситуации для проверки не есть хорошо и быстро при работе с большим количеством объектов. -------------------- |
||||||||
|
|||||||||
| GePo |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 30.3.2003 Где: Москва Репутация: нет Всего: 3 |
Спасибо огромное, сделал пока вторым способом, т.к. списков у меня много, а удаление объектов будет происходить очень редко, так что система оповещений может оказатся довольно таки накладной. Хотя может ошибаюсь, но все равно идею приму на разработку, может выйдет более качественне, чем есть сейчас и еще раз спасибо.
Это сообщение отредактировал(а) GePo - 17.3.2006, 10:34 --------------------
|
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
3. Создать реестр объектов - отдельный , где объекты регистрируются при создании и удаляются оттуда при уничтожении. Если в реестре нет - значит мертв.
4. Реестр списков объектов. Заносить в реестр все списки, а уничтожать объекты не вручную, а через процедуру, которая сначала произведет поиск во всех списках и везде поудаляет. |
|||
|
||||
| GePo |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 30.3.2003 Где: Москва Репутация: нет Всего: 3 |
ну чтож, ИМХО
3. не удобно работать 4. аналог системы оповещений, только термины другие. --------------------
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
лучше чтоб этой процедурой и был деструктор объекта. я както делал такую штуку работает нормально. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]()
|
| Правила форума "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. |