![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
Имеется наследник TObjectList с несколькими (от 1 до 50) объектами в нем. Его планируется использовать в нескольких проектах.
Один из элементов этого списка (его индекс может варьироваться) удалять/заменять нельзя под страхом смертной казни (а в процессе разработки я могу забыть про это и нарваться на грабли, посему хотелось бы сразу избежать их). Собственно - вопрос: как бы правильно (и красиво) обыграть это? Простое перекрытие TList.Delete(index) результата не даст (т.к. вызывается в том числе и в деструкторе TList через SetCount(0)), а есть еще: TList.Put; TList.SetCount(0), в котором отвратительная строчка FCount := NewCount; TList.Extract, в котором сперва объект исключается из списка, а потом вызывается TList.Delete(i); Assign и т.п (дальше просто не стал смотреть). Заранее спасибо за участие. Это сообщение отредактировал(а) kami - 8.5.2010, 01:08 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Сложно так вот в общем.
А можно ли чтобы изменялся его индекс в результате удаление предыдущих? Чем не подходит выриант с перекрытием деструктора? Почему бы не использовать Assert в местах, где наличие этого объекта необходимо? -------------------- Обижено школьников: 8 |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
kami, А как тебе такой вариант, особо не тестировал но...
-------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| kami |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
Конечно. Индекс значения не имеет. У объектов в списке есть поле ID (работает по принципу счетчика). Вот элемент с ID=0 создается автоматически и удаляться не должен. Его положение в списке может варьироваться как угодно (более того, оно, к сожалению, должно варьироваться - в интересах и для удобства пользователя). Если честно - не понял... объект с ID=0 должен содержаться в TMyObjectList от создания списка до его (списка) уничтожения. деструктор вроде тут ни при чем - т.к. список является владельцем объектов, то он и должен уничтожать их (вызов Clear в деструкторе TObjectList. Но ведь ничто не мешает вызвать Clear вне деструктора. И благодаря действиям в этом Clear оставить вживых нужный элемент не представляется возможным, нужно только перекрывать. И таких методов, перекрытие которых требуется - куча, я их перечислил в вопросе. Мне думается, должно быть более элегантное решение).
Это уже будет игра по последствиям. А нужны превентивные меры. Не подходит. Нотификация вызывается после удаления из списка (по крайней мере в D7)
Хотя... ведь можно сразу после удаления добавить его снова, ведь в notify до "попадания" в TObjectList.Notify объект жив... Это мысль. Спасибо, попробую... |
||||||
|
|||||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
Я бы написал свой класс для такого.
Если всё же хочется использовать наследника, то проще всего вынести нужный элемент в поле класса и работать с ним специальными методами. -------------------- |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Если код, использующий список под твоим контролем, то этого достаточно, чтобы ты не пропустил момент, когда накосячил.
-------------------- Обижено школьников: 8 |
|||
|
||||
![]()
|
| Правила форума "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. |