TStringList - убрать объект из списка, не удаляя его
Модератор: Модераторы
TStringList - убрать объект из списка, не удаляя его
Я забыл почти всё, что знал про freepascal...
Помню, был замечательный класс TStringList, который можно использовать как коллекцию объектов. Но вот беда: когда удаляешь объект из коллекции, сам объект уничтожается. А у меня случай, когда объект уничтожать нельзя, потому что по логике коллекция должна только временно ссылаться на объект. Ну примерно как если бы это была коллекция вида "список друзей". Если я перестаю с кем-то дружить (удаляю из списка друзей), я же его при этом не убиваю. Такое вообще возможно с TStringList? И если нет, то чем можно заменить?
Помню, был замечательный класс TStringList, который можно использовать как коллекцию объектов. Но вот беда: когда удаляешь объект из коллекции, сам объект уничтожается. А у меня случай, когда объект уничтожать нельзя, потому что по логике коллекция должна только временно ссылаться на объект. Ну примерно как если бы это была коллекция вида "список друзей". Если я перестаю с кем-то дружить (удаляю из списка друзей), я же его при этом не убиваю. Такое вообще возможно с TStringList? И если нет, то чем можно заменить?
заменить пробелом или просто пустым местом? ('')
В смысле создать пустой TObject, вставить ссылку на него вместо моего объекта, а потом удалить запись из списка? Выглядит, как велосипед с квадратными колесами, но если других вариантов нет, то сойдет на первое время.
Сними OwnsObjects (хотя она по умолчанию снята...).
Ни капельки не замечательный, ни тебе хэша, ни дерева, на десятке-сотне тысяч элементов должен вешаться.
Ни капельки не замечательный, ни тебе хэша, ни дерева, на десятке-сотне тысяч элементов должен вешаться.
О! Вот оно что! Спасибо.runewalsh писал(а):Сними OwnsObjects (хотя она по умолчанию снята...).
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
runewalsh писал(а):Ни капельки не замечательный, ни тебе хэша, ни дерева, на десятке-сотне тысяч элементов должен вешаться.
Ну, если список отсортированный, то в некотором смысле хешированный. НО так-то да, для таких дел лучше хеш списки использовать
Добавлено спустя 1 минуту 3 секунды:
Climber писал(а):О! Вот оно что! Спасибо.runewalsh писал(а):Сними OwnsObjects (хотя она по умолчанию снята...).
Только не забудь теперь очищать объекты самостоятельно
- Снег Север
- долгожитель
- Сообщения: 3071
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Для хешированных списков есть fcl-stl, который входит в стандартную поставку давненько.
runewalsh писал(а):Сними OwnsObjects (хотя она по умолчанию снята...
Упс! Что-то я запутался... Это что-же там тогда тогда творится по умолчанию? (то есть делает TObject.free или не делает? по опыту вполне очищает )
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Alex2013 писал(а):runewalsh писал(а):Сними OwnsObjects (хотя она по умолчанию снята...
Упс! Что-то я запутался... Это что-же там тогда тогда творится по умолчанию? (то есть делает TObject.free или не делает? по опыту вполне очищает )
Объекты, хранящиеся в экземпляре TStringList не очищаются по умолчанию. То есть те, что добавляются по процедуре TStringList.AddObject, к примеру. Да там иногда и не объекты хранят. Или объекты, которые не создавались в данном контексте и уничтожаться как следствие тоже не будут. Было бы странным, если бы это делалось по умолчанию.
У меня в голове тоже засело почему-то, что очищает по умолчанию, но я писал соответсвующий код лет 10 назад и не помню уже ничего вообще. Видимо, на тот момент у меня в коде была просто куча дырAlex2013 писал(а):runewalsh писал(а):Сними OwnsObjects (хотя она по умолчанию снята...
Упс! Что-то я запутался... Это что-же там тогда тогда творится по умолчанию? (то есть делает TObject.free или не делает? по опыту вполне очищает )
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Climber писал(а):У меня в голове тоже засело почему-то, что очищает по умолчанию, но я писал соответсвующий код лет 10 назад и не помню уже ничего вообще. Видимо, на тот момент у меня в коде была просто куча дыр
А понял в чем шутка при УДАЛЕНИИ память по умолчанию не освобождается, а при освобождении или очистке всего списка очень даже ...
При удалении одного элемента приходится делать что-то вроде этого .
Begin
P:=Pointer(S3DSList.Objects[II]);
T3DModel(P).Free;
S3DSList.Delete(II);
end ;
А при сбросе списка целиком по идее можно делать проще S3DSList.Free; или S3DSList.Cliar;
Climber
А почему бы не воспользоваться для этих целей дженериками? Если я правильно понял первоначальный посыл, в списке с объектами некоторые элементы должны быть помечены как "невидимые"?
Можно заюзать какой-нибудь TList<T>, используя в качестве элемента, например, запись вида
А почему бы не воспользоваться для этих целей дженериками? Если я правильно понял первоначальный посыл, в списке с объектами некоторые элементы должны быть помечены как "невидимые"?
Можно заюзать какой-нибудь TList<T>, используя в качестве элемента, например, запись вида
Код: Выделить всё
TMyRec = packed record
Visible: boolean;//"видимость" элемента
PObj: Pointer;//ссылка на объект
end;Я бы много чем воспользовался, но не на всё нашел достаточно документации и рабочих примеров. Потихоньку что-то находится, я не спешу... Когда-то давно, в прошлой жизни, видел много примеров использования TStringList, ну и привык пихать его везде. Хорошая штука ведь, универсальная.zoltanleo писал(а):А почему бы не воспользоваться для этих целей дженериками?
Нет. Идея довольно простая. Хочу написать редактор ER диаграмм. Есть объект типа "таблица", у него есть вложенные объекты типа "столбец". "Таблица" владеет "столбцами", то есть если таблица удаляется, то столбцы тоже удаляются. Или если один столбец удаляется из таблицы, то он удаляется насовсем. А есть объект типа "констрейнт", он тоже ссылается на столбцы, но не владеет ими. Если один столбец удаляется из констрейнта или весь констрейнт удаляется, столбцы остаются в таблице.zoltanleo писал(а):Если я правильно понял первоначальный посыл, в списке с объектами некоторые элементы должны быть помечены как "невидимые"?
